PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Zeitschleife Mikrocontroller



sisi
14.08.2015, 18:02
Hallo Forumnutzer,

ich habe folgende Code für eine Zeitschleife aus AVR: http://www.mikrocontroller.net/articles/AVR-Tutorial:_LCD

Längere Pause für manche Befehle
delay5ms: ; 5ms Pause
ldi temp1, $21
WGLOOP0: ldi temp2, $C9
WGLOOP1: dec temp2
brne WGLOOP1
dec temp1
brne WGLOOP0
ret ; wieder zurück


Was hier vorgeht, habe ich soweit verstanden. Jetzt möchte ich auch eine Zeitschleife für 5ms Pause von 16 Mhz (Attiny 26). Das Problem liegt bei der Bestimmung der Durchläufe. Kann mir jemand erklären, wie ich diese bestimmen kann? T=((1)/!6Mhz)= 65,2 ns-->(5ms)/(65,2ns)= 80000 Taktzyklen notwendig...weiter weiß ich nicht


Mfg

avr_racer
15.08.2015, 14:02
Man erkennt das du einen AVR programmierst... der hat bestimmt ein Datenblatt in dem unter InstructionSet, alle Befehle nachschauen kannst.
Es wird anhand der Takte die Zeitschleife bestimmt und mit 80000 Taktzyklen bist du schon mal auf dem richtigen Weg....

Dec hat glaube ich 1Takt und brne = 2 Takte, 1Durchlauf = 3Takte * 62,5ns = 187,5ns

16Mhz keine 65,2ns sondern 62,5ns, Zyklus bitte nachgucken habe gerade kein DB zur Hand...

White_Fox
04.10.2015, 10:59
Die Instruction Set Summary befindet sich übrigens auf Seite 169. ;)

oberallgeier
04.10.2015, 13:45
.. Zeitschleife für 5ms .. (Attiny 26) .. Längere Pause für manche Befehle .. Was hier vorgeht, habe ich soweit verstanden .. 80000 Taktzyklen notwendig ..Ok, einmal hier der Link zum Datenblatt 1477K–AVR–08/10 (http://www.atmel.com/Images/doc1477.pdf) als *.pdf für den tiny26.

Vorsicht bei 80 000 Zyklen. Der tiny26 ist ein 8Bitter, d.h. seine Register sind 8 Bit breit, können also nur bis max 255 zählen. Zwar gibt es 16bittige Register
.. Six of the 32 registers can be used as 16-bit pointers for indirect memory access. These pointers are called the X-, Y-, and Z-pointers ..aber eben nur für Adressaufgaben. Macht hier (fast) nix, da zu ja zwei geschachtelte Zählschleifen bis max je 255 benutzt. Mit temp1 = 254 und temp2 = 157 wirst Du bei 16 MHz Controllertakt haarscharf um die 80 000 Zyklen liegen.
>> Keine Gewähr, keine Haftung - kein garnix.

White_Fox
08.10.2015, 21:44
Wobei es vollkommen egal ist wie weit der Tiny mit einem Register zählen kann. Wenn man die Schleife in die länge ziehen will kommt vor dem Sprung noch ein Nop, und noch eins...und wenn das nicht reicht baut man noch eine Schleife drumherum:



In R16, 255
In R17, 255

Schleife1:
dec R16
breq R16, 0
rjmp Ende

Schleife2:
dec R17
breq R17, 0
rjmp Schleife2
breq R16, 0
rjmp Schleife1

Ende:


So oder so ähnlich...hab schon ne Weile nicht mehr in ASM programmiert und bin abeitsbedingt grad leider etwas VBA-versaut. :(