Problem mit Timer0

Gast #70800
Lesenswert?

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
Lesenswert?

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
Lesenswert?

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
Lesenswert?

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
Lesenswert?

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
Lesenswert?

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren