Hallo, ich bin ein Frischling auf der µC-Ebene und habe mir zum Anfang ein Programm geschrieben, bei dem nacheinander alle LEDs auf dem STK-500 blinken sollen. Ich verwende einen ATMega1281v. Die Anwendung funktioniert, jedoch zu schnell. ich möchte, dass eine LED eine Sekunde lang leuchtet, dann erlischt und in diesem Moment die nächste leuchtet, dann erlischt, usw... Mit 8Bit-Registern war das kein Problem, bei 16-Bit Zählern habe ich nun das Problem, dass die von mir eingeführte Grenze von 8192 (aufgeteilt auf OCR3AH=0x20 und OCR3AL=0x00) nicht so recht akzeptiert wird. Im AVR Studio 4.17 sehe ich, dass der Wert für das niedere Byte auch brav übernommen wird (nachvollziehbar im Debugger). Das Register für das obere Byte jedoch bleibt leer, egal was ich für einen Wert für OCR3AH definieren. Es kam auch schon vor, dass da mal ne 1 drin stand, z.B wenn ich OCR3AH=0xFF oder OCR3AH=0x01 getestet, bei 0x02, war es hingegen wieder leer !?!?! Komisch... Der Prozessor läuft mit 8 MHz, ich verwende einen Vorteiler von 1024, sodass ich die Grenze für den CTC Wertvergleich auf 8192 lege, damit das dann am Ende ungefähr einer Sekunde entspricht... Warum wird der von mir gewünschte Wert nicht in das OCR3AH Register übernommen? Ich freue mich auf Eure Antworten. vG Stephan
weil der compiler folgendes daraus macht:
1 | OCR3AH=0x20; //Zählgrenze=8192 --> 0d8192=0x2000 |
2 | 112: 80 e2 ldi r24, 0x20 ; 32 |
3 | 114: 80 93 99 00 sts 0x0099, r24 |
4 | OCR3AL=0xFF; //16Bit-Zähler --> 2*8Bit-Register nutzen (L,H) |
5 | 118: 8f ef ldi r24, 0xFF ; 255 |
6 | 11a: 80 93 98 00 sts 0x0098, r24 |
und das nicht der Vorgabe aus dem Datenblatt entspricht. Ein obendrein leichter lesbares OCR3A=8192; wird zu:
1 | OCR3A=8192; //Zählgrenze=8192 --> 0d8192=0x2000 |
2 | 112: 80 e0 ldi r24, 0x00 ; 0 |
3 | 114: 90 e2 ldi r25, 0x20 ; 32 |
4 | 116: 90 93 99 00 sts 0x0099, r25 |
5 | 11a: 80 93 98 00 sts 0x0098, r24 |
was funktioniern sollte. Grüße Timo
Hallo Timo, vielen Dank für Deine rasche Antwort. Das habe ich leider auch schon probiert, zwar als hex-Variante OCR3A=0x2000; aber leider hat OCR3A=8192; ebensowenig funktioniert... Es ist komisch, ich habe mal testweise den Wert auf 259 (=256+3) gesetzt. Damit sollten vom L-Byte die Bits 0 und 1 gesetzt sein und vom H-Byte Bit 0. Das klappt auch wunderbar, man kann es im Debugger nachvollziehen. Probiere ich hingegen 515 (512+3), dann sind zwar weiterhin die L-Bits korrekt gesetzt, das H-Byte ist jedoch 0... Fällt Dir noch etwas anderes ein? Bei der verwendung anderer 16Bit Timern ist das Problem übrigens identisch... vG Stephan
ups, ich sehe gerade, dass in meinem beigefügten Quelltext das LByte natürlich falsch gesetzt ist, muss 0x00 sein... der Fehler entsprang dem Experimentierdrang! mit 0x00 gehts jedenfalls auch nicht :-) Das wollte ich nur noch hinzugefügt haben ;-) vG Stephan
Der Fehler ist unterdessen gefunden! Beim Setzten der WGM Bits für den CTC Modus ist mir ein Fehler unterlaufen. der Modus aktiviert sich per WGM32 nicht WGM31. Dann muss nur noch der Zähler TCTN0 in der Interruptroutine auf 0 zurückgesetzt werden und alles läuft bestens ;-) Dennoch danke für Euer Engagement. vG Stephan
Stephan schrieb: > Dann muss > nur noch der Zähler TCTN0 in der Interruptroutine auf 0 zurückgesetzt > werden Das ist Quatsch, das macht doch schon der CTC-Modus. >
1 | > OCR3AH=0x20; //Zählgrenze=8192 --> 0d8192=0x2000 |
2 | > OCR3AL=0xFF; //16Bit-Zähler --> 2*8Bit-Register nutzen (L,H) |
3 | >
|
Warum schreibst Du es so umständlich, rechnest Du so gerne in Hex um? Außerdem ist es falsch: 0x2000 - 1 = 0x1FFF und nicht 0x20FF Einfacher und richtig:
1 | OCR3A = 8192 - 1; |
Peter
@ Stephan Es gibt Bugreports zu älteren AVR Studio Versionen mit Problemen beim Setzen von 16-Bit Timerregistern. Kannst du den Fehler auch auf dem Chip oder in einer aktuellen AVR Studio Version nachvollziehen?
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.