Forum: Mikrocontroller und Digitale Elektronik CTC Timer funktioniert im Studio auf MEGA128 nicht


von Thomas K. (dlt)


Angehängte Dateien:

Lesenswert?

Hallo Forum,

hab mich jetzt schon lange mit dem timer gespielt aber komme auf keinen 
gruenen zweig

ev. kennt ja jemand das problem

16 bit timer1 wird initialisiert auf 1s@16mhz und CTC

im interrupt wird bei time jeweils 1s dazugezaelt

im studio wird auch perfekt jede sekunde ein interrupt ausgeloest rest 
ist auch ok

auf µC wird nur einmal 1s gewartet danach wird immer sofort der 
timer-interrupt ausgeloest!

hab ich was uebersehen? gibts da ev. noch so was wie ne dumme fuse die 
ich setzen stellen muss dass er gleich arbeitet wie im studio

die Mega103 kompatibilitaets fuse hab ich schon richtig gesetzt

anbei gesammter code, gut dokumentiert

vielen dank!!

thomas

von Stephan (Gast)


Lesenswert?

wird das Interruptflag zurückgesetzt ????
Muß der Timer neu geladen oder gestartet werden ???

Bin mit AVR nicht so sehr vertraut.
Sind aber so die üblichen "Verdächtigen "

von johnny.m (Gast)


Lesenswert?

Du schreibst das Compare-Register OCR1A bei der Initialisierung in der 
falschen Reihenfolge! Du musst beim Schreibzugriff erst das High-Byte 
und dann das Low-Byte schreiben. Wundert mich eigentlich, dass da 
überhaupt was  mit einer Sekunde rauskommt, wenn auch nur einmal.

von johnny.m (Gast)


Lesenswert?

...Das selbe gilt übrigens auch für TCNT1, wobei das in diesem Falle 
egal ist, weil eh null reinkommt. Schau Dir im Datenblatt mal den 
Abschnitt "Accessing 16 Bit Registers" an (der steht irgendwo bei der 
Beschreibung der Timer). Grundsätzlich gilt bei (den meisten) 
16-Bit-Registern:

Lesen: erst Low-, dann High-Byte
Schreiben: erst High-, dann Low-Byte

Das liegt daran, dass diese Register synchron über ein temporäres 
Register bearbeitet werden und beim Zugriff auf das Low-Byte jeweils 
beide Teilregister verarbeitet werden.

Beim Lesen bedeutet das, dass beim Zugriff auf das Low-Byte gleichzeitig 
das High-Byte in das temporäre Register geladen wird. Wird jetzt das 
High-Byte gelesen, greift man nicht direkt auf das High-Byte, sondern 
auf dieses temporäre Register zu.

Beim Schreibzugriff gilt das ganze dann umgekehrt: Schreibt man das 
High-Byte, wird der Wert in das temporäre Register übernommen. Erst in 
dem Moment, in dem das Low-Byte geschrieben wird, werden beide Teile 
synchron in die Timer-Register geschrieben.

Bei Deiner Version im Programm wird das Low-Byte übernommen, während Du 
das High-Byte anschließend in das temporäre Register schreibst, wo es 
bleibt, da das Low-Byte im Anschluss nicht mehr geschrieben wird.

von Thomas K. (dlt)


Lesenswert?

kann ich erst am abend probieren,
bin zuversichtlich...
falls es was anderes war, meld ich mich am dienstag wieder

VIELEN DANK!


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.