atmega168 timer0 läuft nicht an

OP #1339116
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
Angehängte Dateien:
Gast
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
Gast
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.

...
Gast
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
Gast
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
OP
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
Gast
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
OP
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.