Hallo, bei meinem Programm läuft der Timer0 im AVR-Studio nicht an. Der Timer soll einen Output Compare A Match Interupt auslösen, über diesen sollen dann LED`s durchgeschaltet werden. Das Programm ist noch lange nicht fertig. Was ist falsch, was hab ich vergessen? Beim starten des Programms im AVR-Studio erscheint folgende Fehlermeldung: error: Operand 1 out of range: 0x6e Gruß Peter
Hi >Beim starten des Programms im AVR-Studio erscheint folgende >Fehlermeldung: >error: Operand 1 out of range: 0x6e Da steht aber auch noch eine Zeilennummer dabei. > ldi temp,0b00000010 ; Maske für Timer0 Output Compare A > out timsk0,temp ; setzen > ldi temp,0b10000000 ; Compare A Match 64 > out ocr0a,temp 'TIMSK0' ist nicht mit 'out TIMSK0' zu erreichen. Geht nur mit 'sts TIMSK0,temp' MfG Spess
Mach mal einen Doppelklick auf die Fehlermeldung, dann springt der Cursor im Editor auf die Zeile mit dem Fehler. Dann hole Dir mit F1 Hilfe zum ASM-Befehl und schau dort nach, welche Wertebereiche die zugehörigen Operanden haben und welchen Du überschritten hast. ...
Danke schon mal, das mit dem sts statt out war die Fehlermeldung. Der Timer läuft aber noch nicht an, irgendetwas fehlt da noch.
Hi >Der Timer läuft aber noch nicht an, irgendetwas fehlt da noch. Das ist eine sehr schwammige Fehlerbeschreibung. Genau wie: >Beim starten des Programms im AVR-Studio erscheint folgende >Fehlermeldung: Mit der AVR-Studio kann man den Controller Programmieren oder die Simulation starten. Woran erkennst du, das der Timer nicht läuft. Deine Interruptroutine macht doch nichts. Das 'cli' und 'sei' in der ISR kannst du dir sparen. Das passiert sowieso. Sichere lieber die Register richtig: blabla: push temp in temp, SREG push temp .... pop temp out SREG, temp pop temp reti MfG Spess
Hi >Der Timer läuft aber noch nicht an, irgendetwas fehlt da noch. Richtig > ldi temp,0b00000001 ; zum debugen prescaler 0 0b00000001" > out tccr0A,temp ; in Timer/Counter Controll Register Der Prescaler wird im Register TCCR0B eingestellt MfG Spess
Hallo Spess, das Programm läuft im Moment nur im Simulator. Wenn der Timer läuft, sollte mann das in tcnt0 sehen können. Da seh ich aber nichts. Wofür ist beim Register sichern der erste push-befehl ? der erste pop Befehl ? Ich lese doch das Statusregister in temp (int temp,sreg) und packe es auf den Stack (pusch temp), zum Schluß hole ich es vom Stack (pop temp) und schreibe es ins Statusregister zurück (out sreg,temp). Seh ich das falsch? Bin ca. 22:00 wieder da. Gruß und Danke Peter
Hi >Wofür ist beim Register sichern der erste push-befehl ? der erste pop >Befehl ? Ich lese doch das Statusregister in temp (int temp,sreg) und packe >es auf den Stack (pusch temp), zum Schluß hole ich es vom Stack (pop temp) >und schreibe es ins Statusregister zurück (out sreg,temp). Seh ich das >falsch? Der erste push-Befehl sichert 'temp' und der letzte pop-Befehl holt es wieder zurück. Der Rest ist wie bei dir. Da du nicht weisst, wann der Interrupt zuschlägt sollten alle verwendeten Register gesichert werden. Es kann ja sein, das du gerade außerhalb der ISR 'temp' verwendest, wenn der Interrupt kommt. Durch 'in temp, SREG' in der ISR wird es verändert. Das Programm macht dann mit einem falschen Wert weiter. Kann ganz lustige Effekte haben. MfG Spess
DA hast du recht, das hab ich nicht bedacht. Danke dafür. Fällt dir noch etwas ein, warum der Timer nicht läuft? Ich habe ein ähnliches Programm auf einem ATMJega 162 geschrieben, da geht es einwandfrei, da konnte ich auch timsk mit out ansprechen. Gruß Peter
Hi
>Fällt dir noch etwas ein, warum der Timer nicht läuft?
Siehe 20:38
MfG Spess
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.