Hallo ihr Lieben,
beim Versuch den Timer1 des ATMega8515 zu benutzen ist mir Dank des
AVRStudio Simulators folgendes aufgefallen:
1 | ...
|
2 | (1) TIMSK |= (1<<TOIE1); //Interrupt bei Überlauf Timer/Counter1 erlauben
|
3 | (2) TIMSK &= (1<<OCIE1A); //Kein Interrupt bei Vergleichswert A (Timer/Counter1)
|
4 | ...
|
Befehl (1) wurde korrekt ausgeführt.
Befehl (2) löschte auch das vorher gesetzte Bit TOIE1.
Somit funktioniert mein Mikrocontroller natürlicht nicht mehr wie er
soll.
Ich habe im Datenblatt eine Erklärung gesucht, sie jedoch nicht
gefunden. Dabei habe ich allerdings nicht jede der 251 Seiten gründlich
durchgelesen.
Kann mir jemand dieses Verhalten erklären?
Ich habe Befehl (2) einfach auskommentiert, da nach einem Reset sowieso
alle Werte auf 0 gesetzt sind. Schreibt man nur einsen, dann geht alles
glatt. So funktioniert es.
Was jedoch, wenn ich nun nach einiger Zeit meinen Timer1 umstellen und
anders nutzen möchte?
Es scheint nun also nicht zu funktionieren die entsprechend zu ändernden
Bits auf 1 oder 0 zu setzen.
Aber kann ich mir andersherum sicher sein, dass bei einem setzen eines
Bits auf 0 alle Bits gelöscht werden? Kann ich mich darauf verlassen und
danach nur noch die einsen schreiben?
Um sicher zu gehen, dass alles wie gedacht gesetzt wird müsste ich
zuerst alle nullenden Befehle aufrufen und dann erst all jene, die auf 1
setzen.
Das führt zu einem Recht unübersichtlichem Kuddelmuddel das ich gerne
vermeiden wollen würde.
Oben wird ein Teil der Clockselect Bits auf Null gesetzt, dann kommt
etwas ganz anderes was auf null gesetzt wird, und noch viel viel weiter
unten wird dann ein anderer Teil der Clockselect Bits auf eins gesetzt.
Ein unangenehmes Durcheinander würde das.
Ich hoffe auf fachkundige und erleuchtende Erklärungen.
Vielen Dank
Schmidt