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
Und wenn man nicht Zyklen sondern Zeiten angeben will, siehe Anhang.
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
@andreas Macro calls Macro ist ja in der Form beim ATMEL AVR Studio in dieser Form ja nicht möglich.
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.
Bekomme ich dieses Macro auch in C Unter eclipse eingebunden ? Wenn ja wie mache ich das? Gruss und Danke Bernd
Glaube ich nicht, ist ja ein Assembler Macro und läuft im Assembler vom Atmel.
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 |
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.