Forum: Mikrocontroller und Digitale Elektronik Problem mit Timer0


von Pfi (Gast)


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!

von wolli (Gast)


Lesenswert?

Was ist denn nun das Problem? ATmega8 braucht keinen Resetschaltkreis,
einfach RC-Glied wie im Tutorial anschließen.

von Pfi (Gast)


Lesenswert?

Achja, völlig vergessen das Problem zu schildern, irgendwie klappt heute
garnichts...:)
Also, der TimerOverflowInterrupt wird nie ausgelöst...

von Conlost (Gast)


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

von Alex (Gast)


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

von Pfi (Gast)


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?

von Conlost (Gast)


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

von Conlost (Gast)


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

von Pfi (Gast)


Lesenswert?

Hallo!

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

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
Noch kein Account? Hier anmelden.