AVR: Delay 7 ... 65542 Zyklen

OP #8445
Lesenswert?

Oft werden kurze Verzögerungszeiten benötigt.

Manche Softwareentwickler stehen jedoch mit der Mathematik auf Kriegsfuß 
und haben damit so ihre Schwierigkeiten, solche Verzögerungsschleifen zu 
berechnen.

Was liegt da näher als das den Assembler selbst erledigen zu lassen.

Mit dem beiliegenden Macro können alle Verzögerungen im Bereich
von 7 ... 65542 Zyklen generiert werden.

Größere Zeiten muß man ja eh mit einem Timerinterrupt machen, sonst wäre 
die CPU zu lange blockiert.


Peter
Angehängte Dateien:
Gast #2029111
Lesenswert?

8 Jahre später...
Vielen Dank an Peter und Andreas für die tollen Routinen.
@ Andreas
in deinem Post vom (Datum: 15.12.2002 11:41) ist ein Fehler enthalten,
weil deine Routine(mdelay) wohlmöglich eine Ergänzung zum ersten Post 
von Peter ist.

Korrigierter Version:
1
.listmac
2

3
;delay 8 ... 65543 cycle
4

5
.macro  mdelay
6
  ldi    r24, low( @0 - 8 )
7
  ldi    r25, high( @0 - 8 )
8
  sbiw  r24, 4
9
  brcc  pc - 1
10
  cpi    r24, 0xFD
11
  brcs  pc + 4
12
  breq  pc + 3
13
  cpi    r24, 0xFF
14
  breq  pc + 1
15
.endmacro
16

17

18

19
.macro delayus
20
  mdelay ((MCU_CLK * @0) / 1000000)
21
.endmacro
22

23
.macro delayms
24
  mdelay ((MCU_CLK * @0) / 1000)
25
.endmacro
26

27

28

29
/*********************************************************************/
30
//  *****Beispiele für Programmaufrufe:*****
31

32
//  1) Wenn eine feste Zyklenzahl erforderlich ist
33

34
   mdelay 10    // Verzögern um 10 Taktzykle
35

36
//  2) Wenn eine Verzögerung in µSekunden(10^-6) erforderlich ist
37

38
  delayus 8    // Verzögerung von 8 µSec
39

40
//  3) Wenn eine Verzögerung in Milisekunden(10^-3) erforderlich ist
41

42
  delayms 8    // Verzögerung von 8 mSec

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren