www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Problem mit Timer0


Autor: Pfi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: wolli (Gast)
Datum:

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

Autor: Pfi (Gast)
Datum:

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

Autor: Conlost (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Pfi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Conlost (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Conlost (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Pfi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.