Forum: Projekte & Code AVR: Delay 7 ... 65542 Zyklen


von Peter D. (peda)


Angehängte Dateien:

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

von Andreas S. (andreas) (Admin) Benutzerseite


Angehängte Dateien:

Lesenswert?

Und wenn man nicht Zyklen sondern Zeiten angeben will, siehe Anhang.

von Peter D. (peda)


Angehängte Dateien:

Lesenswert?

Wie es scheint, hat das noch keiner ausprobiert.

Es hat sich nämlich ein Fehler eingeschlichen, die Loop dauert 4 Zyklen 
und nicht 3.

Anbei nun das richtige Programm.



Peter

von mikki merten (Gast)


Lesenswert?

@andreas
Macro calls Macro ist ja in der Form beim ATMEL AVR Studio in dieser 
Form ja nicht möglich.

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Tatsächlich? Ich verwende tavrasm, da ist es kein Problem.

von Klaus 2. (klaus2m5)


Angehängte Dateien:

Lesenswert?

Meine Version für kurze Delays von 1 Taktzeit bis 38µs mit Einberechnung 
der bereits verbrauchten und auf die Wartezeit anrechenbaren Takte. 
Leichte Umstellung auf andere CPU-Frequenz ohne Veränderung des Timings.

von Bernd (Gast)


Lesenswert?

Bekomme ich dieses Macro auch in C Unter eclipse eingebunden ?
Wenn ja wie mache ich das?

Gruss und Danke
Bernd

von Klaus 2. (klaus2m5)


Lesenswert?

Glaube ich nicht, ist ja ein Assembler Macro und läuft im Assembler vom 
Atmel.

von Simon K. (simon) Benutzerseite


Lesenswert?

Bei WinAVR sind entsprechende Funktionen dabei.
_delay_us & _delay_ms

von gtf (Gast)


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

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Hi, ich hatte mal was gebastelt, das von 0 Ticks bis 0x5000007 = 
83.886.087 Ticks ein passendes Delay erzeugt (für den GNU-Assembler 
avr-as), das auch von C aus anwendbar ist:

Beitrag "Re: Delay: Exakt n Ticks erzeugen (avr-gcc)"

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.