Forum: Mikrocontroller und Digitale Elektronik 16 Bit CTC: OCR3AH wird nicht beschrieben, OCR3AL schon


von Stephan (Gast)


Angehängte Dateien:

Lesenswert?

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

von Timo S. (kaffeetas)


Lesenswert?

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

von Stephan (Gast)


Lesenswert?

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

von Stephan (Gast)


Lesenswert?

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

von Stephan (Gast)


Lesenswert?

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

von Peter D. (peda)


Lesenswert?

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

von Stefan B. (Gast)


Lesenswert?

@ 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
Noch kein Account? Hier anmelden.