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
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 "
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.
...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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.