mikrocontroller.net

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


Autor: Stephan (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Timo S. (kaffeetas)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
weil der compiler folgendes daraus macht:
OCR3AH=0x20; //Zählgrenze=8192 --> 0d8192=0x2000
 112:  80 e2         ldi  r24, 0x20  ; 32
 114:  80 93 99 00   sts  0x0099, r24
  OCR3AL=0xFF; //16Bit-Zähler --> 2*8Bit-Register nutzen (L,H)
 118:  8f ef         ldi  r24, 0xFF  ; 255
 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:
OCR3A=8192; //Zählgrenze=8192 --> 0d8192=0x2000
 112:  80 e0         ldi  r24, 0x00  ; 0
 114:  90 e2         ldi  r25, 0x20  ; 32
 116:  90 93 99 00   sts  0x0099, r25
 11a:  80 93 98 00   sts  0x0098, r24

was funktioniern sollte.

Grüße
 Timo

Autor: Stephan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stephan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stephan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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.

>
> OCR3AH=0x20; //Zählgrenze=8192 --> 0d8192=0x2000
> OCR3AL=0xFF; //16Bit-Zähler --> 2*8Bit-Register nutzen (L,H)
> 

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:
  OCR3A = 8192 - 1;


Peter

Autor: Stefan B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.