Korte delay loop gezocht


Hoi Arco, Is mijn inline oplossing

For X = 210 To 0 Step -1
Next X

korter ?

Guus@Sint-Michielsgestel

Dat is geen inline assembly, maar gewoon picbasic...
En die is veel langer als 210 instructies. Iedere iteratie in de For...Next loop is minstens 3 instructies. (afhankelijk van wat de compiler er van bakt)

Arco - "Simplicity is a prerequisite for reliability" - hard en software ontwikkeling: www.arcovox.com

pic asm code:


movlw .10           ; setup counts
movwf teller ;
call timer

timer decfsz teller ;teller=teller-1
goto timer          ; if teller=not zero
return              ; else

Als 't exacte timing moet zijn, moet je daarin ook de call en return instructies verrekenen/meetellen...

Arco - "Simplicity is a prerequisite for reliability" - hard en software ontwikkeling: www.arcovox.com
Hensz

Golden Member

Ik denk dat je eerst ff moet kijken hoe je assembly vanuit picbasic aanroept én wat het aan tijd kost. Dat wordt je kortste vertraging, óf het moet mogelijk zijn om werkelijk inline tussen je basic-code assembler te mogen invoegen.

Don't Panic!
buckfast_beekeeper

Golden Member

Ben je niet beter uit met een snellere processor?

@arco hier onder. Uiteraard maar klokken op 18MHz of 80MHz of 160MHz maakt toch een wereld van verschil. Een ESP32 heeft ook een dual core. Wat het weer net wat gemakkelijker kan maken.

[Bericht gewijzigd door buckfast_beekeeper op 21 november 2020 09:34:47 (66%)]

Van Lambiek wordt goede geuze gemaakt.

Zelfs met hogere cycleclock blijven zulke korte delays lastig. (1 instruction cycle op 18.45MHz is 216.45nS)

Arco - "Simplicity is a prerequisite for reliability" - hard en software ontwikkeling: www.arcovox.com

Hoi allemaal,

Heb er de scoop bijgepakt, heb op 20 MHz gedraaid voor het gemak
van tellen van de instructies.

FOR X = 0 to 4
NEXT
delay van 9.4 us
FOR X =4 to 0 step -1
NEXT
delay van 5.4 us

Ben met de laatste nog wat verder gegaan.

X = 1 geeft 2.4 us
X = 2 geeft 3.4 us
X = 3 geeft 4.4 us

conclusie: Verhoging van X geeft 1 us extra delay, oftewel 5 instructies
Dit is dus met een 20 MHz clock, maar voor 18.48MHz
blijven het 5 instructies.
Ik kan geen kortere delay maken dan 2.4us i.e 12 instucties

Als iemand het korter kan, laat dan van je horen

Guus@Sint-Michielsgestel

Ik kan geen kortere delay maken dan 2.4us

Jawel, zoals reeds enkele malen gezegd: gebruik inline assembly. (NOP is 200nS op 20MHz)
Voor exacte timing is een hogere taal niet geschikt, je bent dan afhankelijk van wat de compiler er van bakt...

[Bericht gewijzigd door Arco op 21 november 2020 11:40:27 (28%)]

Arco - "Simplicity is a prerequisite for reliability" - hard en software ontwikkeling: www.arcovox.com

UPDATE:

X = 1, 2, 3 etc
Test:
Dec X
If X > 0 Then GoTo Test

Initieel delay X = 1 1.6 us ( 8 instructies )
X = 2 2.8 us ( + 6 instructies )
X = 3 4.0 us ( + 6 instructies )

Guus@Sint-Michielsgestel
Hensz

Golden Member

Kijk in de PicBasic-handleiding hoe het precies gaat. Het kan en het staat er dus ook echt in.

Don't Panic!

Het lijkt sterk op een tweerichtings eenrichtingsverkeer. Waters zegt wat en negeert de rest. En de rest geeft zinnige tips waar waters niet op reageert.

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/

Hoi REW en de anderen.

Ik ben op zoek naar een zeer korte loop in basic die een delay geeft.
Ik ben me bewust van NOP's . Ik weet niet waar je op duidt.
Geef me alsjeblieft een hint

Guus@Sint-Michielsgestel
Hensz

Golden Member

De hint is: (zeer) kleine vertragingen kunnen niet in PicBasic

Zie verder de handleiding pagina 117:http://ww1.microchip.com/downloads/en/devicedoc/pbp_reference_manual.p…

Wat heb je tegen NOP's?

Don't Panic!

Ik weet dat kleine delays zoals in "DELAYUS 3" niet kloppen omdat de macro missc wel 17 of 18 instructies gebruikt.
Ik heb niets tegen NOP's maar ben bang dat ik in mijn applicatie er zeer veel nops moet tussen proppen .
Ik maak dus eigenlijk zelf een macro. De kortste tot nu toe is dus 1.6 us.
Dus maar 8 instructies.
Zoals al aangegeven is mijn instructie tijd 0.2164502 microseconden.
Dus kan ik ook geen gebruik maken van "DELAYUS"

Guus@Sint-Michielsgestel

Ik heb niets tegen NOP's maar ben bang dat ik in mijn applicatie er zeer veel nops moet tussen proppen .

Ja en wat is het probleem?

Op 20 november 2020 19:19:25 schreef Arco:
Hoe exact moeten ze zijn? Als het maar een paar waardes zijn kun je voor elke waarde ook een aparte sub maken.
Minimale lengte is 8 instructies voor een sub, korter kan niet.

Als je al een macro of iets kan vinden kan het dus ook onmogelijk korter dan 8 instructies zijn. Een aanroep naar een functie of macro kan dus onmogelijk korter dan dat. Dus zelfs als er wel iets zou bestaan dan zou de compiler daar toch ook gewoon NOP inzetten. Dus of je nu zelf NOP zet of de compiler wat is het verschil?

Als je timing dus zo kritisch is dan heb je de verkeerde cpu of een te langzame. Er zijn CPU die veel efficiënter zijn en in minder clock-cycles een instructie kunnen uitvoeren.
Een 10x sneller cpu kan dan waar je nu maar ruimte hebt voor max 4 instructies er 40 uitvoeren en heeft dus ineens veel tijd over. Zelfs om interrupt gestuurd te gaan.

Dan heb je het maximaal haalbare nu wel te pakken.

Misschien kan het nog net in wat kleinere stappen als je een interne timer gebruikt. De timer op kloksnelheid laten lopen, timer voor-laden met een hoog getal bijv. 65534, timer starten en dan wachten op de timer-overflow.

Misschien zou het helpen als je eens uitlegt wat je precies probeert te bereiken. (dan kunnen we misschien een betere oplossing aandragen)
Zomaar overal NOP's tussen proppen om iets werken te krijgen heb ik nog nooit gedaan: er is altijd een betere oplossing...

Arco - "Simplicity is a prerequisite for reliability" - hard en software ontwikkeling: www.arcovox.com

1) omschrijf het probleem dat je hebt. Waarom moet je wachten?
2) Omschrijf waarom je "delayus" niet kan gebruiken. Ik ben gewend dat de compiler regelt dat daar delays uitkomen die zo goed en zo kwaad als dat gaat kloppen. Ook als je klokfrequentie "raar" is.
3) Wait, what? Is het nog steeds zo dat PICs 4 klok cycli nodig hebben voor een instructie? Wat is dat voor jaren-tachtig technologie?

Edit: ondertussen schreef arco deels hetzelfde.

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/

Is het nog steeds zo dat PICs 4 klok cycli nodig hebben voor een instructie?

Alleen bij de 8 bitters... ;)
(maar die zijn er ook in 64MHz, dus veel last heb je daar niet van)

Arco - "Simplicity is a prerequisite for reliability" - hard en software ontwikkeling: www.arcovox.com

Ik wil op verschillende uitgangen 3, 5, 7 en 11 KHz laten komen.
Deze worden gebruikt om harmonischen van 1 KHZ te onderdrukken tot
een niveau van 90 tot 100 dB. Ik heb dit al gedaan voor 3e en 5e harmonischen
met een 12MHz PIC clock ( 0.3333333 us )
Toen ik 7 kHz invoegde zag ik meteen problemen.
Deze kwamen uit de onnauwkeurigheid van de 7 kHz generatie op een .33333 instructie tijd.
Omdat de nauwkeurigheid ZO HOOG moet zijn kwam ik tot de 18.48 MHz clock.
Met de 18.48 MHz kost het 231 instructies om een exact delay van 50 us temaken. 231 = 3 x 7 x 11.
Dus ik kan alleen maar werken met delays waarmee ik de poorten sequentieel kan aanzetten.

Guus@Sint-Michielsgestel

Kun je voor onderdrukken van harmonischen niet beter een goed filter gebruiken???
Als het blokgolven moeten zijn, kun je de PWM toch gebruiken? En wat noem je (on)nauwkeurig? (hoe precies moet 't zijn?)

Arco - "Simplicity is a prerequisite for reliability" - hard en software ontwikkeling: www.arcovox.com

Wat helpt het genereren van een signaal op 7kHz bij het onderdrukken van harmonischen van 1kHz? Dat snap ik niet.

Als je gaat busy-waiten, dan is het lastig om diverse signalen tegelijk te produceren. Je kan de least-common-multiple van deze getallen nemen (en omdat het priemgetallen zijn is dat gewoon vermenigvuldigen) en dan een programma maken wat 1155 cylci lang is. 105x moet je dan het 11khZ signaal togglen, 165x het 7khz signaal enz.

Ik schreef even:

c code:

#include <stdio.h>
#include <stdlib.h>


int main (int argc, char **argv)
{
  int freqs[10];
  int nfreqs;
  int i,j, s;
  int n;
  int *instr;

  freqs[0] = 3;
  freqs[1] = 5;
  freqs[2] = 7;
  freqs[3] = 11;
  nfreqs = 4;

  for (i=0, n=1;i<nfreqs;i++)
     n *= freqs[i];

  instr = calloc (sizeof (int), n);

  for (i=0;i<nfreqs;i++) {
    s = n/freqs[i];
    for (j=i;j<n;j+=s)
       instr[j] = freqs[i];
  }
  for (i=0;i<n;i++)
    printf ("%d: %d\n", i, instr[i]);
  exit (0);
}

waarbij het "begin bij i" bedoeld is om te zorgen dat ze mekaar niet tegenkomen. Dat werkt. Als je dan in deze uitvoer een "0" ziet staan moet je dat vertalen naar een "nop". Staat er een "3" dan moet je "toggle output voor 3khz" doen. enz. Op het eind moet je de laatste zoveel nops vervangen door een jump naar het begin. (afhankelijk van hoeveel nops aan tijd je jump gebruikt).

Ik ken geen pic-assembly of basic, dus ik kan dat even niet voor je doen.

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/

Het mooie van dit systeem is dat je de harmonischen met 100 dB kunt onderdrukken.
Voor de niet analoge mensen dit is een factor 100.000 dus niet even met PWM op telossen
Een filter kan dit ook en dat heb ik ook nog wel nodig maar dan een 3pole,
ipv een 9 tot 12 filter met veel componenten

Guus@Sint-Michielsgestel

Een 6 pole filter geeft op 7kHz al een 'afval' van ruim 100dB
Met het combineren van diverse signalen als 'anti-sound' loop je zeer grote kans dat het alleen maar erger wordt als alles niet exact klopt.
Wat is dat 1kHz signaal trouwens? (blokgolf of wat anders, pwm, D/A,...)

Men heeft dat in het verleden ook met uitlaatgeluid geprobeerd, is nooit een doorslaand succes geworden... ;)

Arco - "Simplicity is a prerequisite for reliability" - hard en software ontwikkeling: www.arcovox.com