Problem mit Timer0

Gast #70800
Hallo!

Ich hätte mal gerne wieder eure Hilfe in Anspruch genomen:)
Also mein Problem: Ich hab den Timer meines ATmega8 wie folgt
eingestellt:

ldi temp,0b00000001    ;timer0 no prescaler
out TCCR0,temp
ldi temp,0b00000001    ;timer0 overflow interrupt
out TIMSK,temp

des weiteren habe ich natürlich "sei" nicht vergessen und der
Interruptvektor sollte auch stimmen.
Was muss noch eingestellt werden, oder gibt es irgendwelche
Besonderheiten? Hab das Datenblatt gelesen und meiner Meinung nach
(welche aber in diesem Fall nicht ganz stimmen kann) das richtige
eingestellt.
Und noch eine kleine Frage: ist beim ATmega8 eine externe
Reset.Beschaltung nötig oder von Vorteil?

Grüsse und Danke für jeden Tip!
Gast #70803
Hallo,
du hast das falsche Timerinterruptbit gestzt,
und den Timer nicht mit einem wert geladen.
So müsste es gehen:

    ldi temp,0b00000010 <<<;timer0 overflow interrupt
    out TIMSK,temp
    ldi temp, wert
    out TCNT0, temp
    ldi temp,0b00000001    ;timer0 no prescaler
    out TCCR0,temp
    sei

Gruß,
Arno
Gast #70804
Hallo ..
Na hast du die Einsprungadresse am angang des Programms richtig
definiert?

z.b.
.org 0x0009   ;weiß jetzt nicht ob das beim Atmega auch die 9 ist
  rjmp xxx    aber das prinzip soll ja erkannt werden.


xxx wäre dann dein ziel was angesprungen werden soll
Gast #70805
Hallo!

Danke für die Hilfe, hat aber leider nichts genutzt.
Nun habe ich eine andere Mögliche Fehlerquelle: Darf man in einem
Interrupt umherdpringen, also Befehle wie breq o.ä. verwenden um in der
Interruptroutine umherzuspringen? Schreiben diese Operationen nicht
daten auf den Stack. Damit würde dann am Ende der Interruptroutine
nicht an die richtige Stelle zurückgesprungen. Oder ist das nicht so?
Gast #70806
Hallo,

Du darft in der Int-Poutine springen, nur mußt du zu jedem
"rcall" auch ein "Ret" programmieren, sonst läuft der Stack über.
Aus einer Int-Routine nicht mit "rjmp" rausspringen.

Ausserdem sollen die Int-Routinen immer so kurz wie möglich
sein und längere Sachen im Hauptprogramm erledigt werden.
Am Anfang jeder Int-Routine sollte man das Statusregister
und eventuell in der Routine auch benutzte Register auf dem
Stack sichern.

introutine:
  push temp
  in temp,sreg
        push temp
        ..........
        ..........
  pop temp
  out sreg,temp
  pop temp
  reti

Ich hoffe das hilft dir weiter.

Gruß,
Arno
Gast #70807
Hab noch was vergessen,
meine Programme für den Mega8 fangen so an:
----------------------------------------------------------------------
.nolist
.include      "m8def.inc"
.list

.EQU fq = 7372800            ;Quarzfrequenz

.def          temp      = r16

.cseg
.org  0000
  rjmp  start

.org  OVF0addr              ; Tim0_Over Overflow Interrupt Vector
  rjmp Tim0_Over

.org SPMRaddr
  reti

;-----------------------------; Programmstart ------------------------
;---------------------------------------------------------------------
start:
  ldi temp, LOW(RAMEND)  ; LOW-Byte der obersten RAM-Adresse
  out SPL, temp    ; in Stackpointer Low
  ldi temp, HIGH(RAMEND)  ; HIGH-Byte der obersten RAM-Adresse
  out SPH, temp    ; in Stackpointer High

Hier folgt dein Programm
---------------------------------------------------------------------
Gruß,
Arno
Gast #70808
Hallo!

Habs rausgefunden, lag nicht an der Initialisierung sondern an der
Interruptroutine, welche nicht korrekt verlassen wurde! Trotzdem Danke
für die Hilfe!

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 22 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.