Mega 8 Timer Probleme

Gast #227556
Lesenswert?

nicht alles genau angesehen - auf alle Fälle fehlt erstmal die
Initialisierung des Stackpointers. Ausserdem sollte in einer ISR min.
das SREG gesichert werden (spätere Problem sind sonst vorprogrammiert).
Gast #227558
Lesenswert?

Die Initialisierung sollte auf jeden Fall sein, der Tiny12 hat keine RAM
also auch keine Stackpointer (hier gibt es nur eine Hardwarestack und
den braucht man glaube ich nicht initialisieren).

Mike
Gast #227562
Lesenswert?

Beim Mega8 muß der Stackpointer initialisiert werden, sofern man den
Stack benutzt (also praktisch immer - in deinem Programm auch, da es
Interrupts benutzt). Beim Tiny12 gibt es keinen Stackpointer, weil der
Stack da anders implementiert ist, also keine Initialisierung.
Die Interruptvektor-Tabelle passt übrigens nicht zum Mega8. Dein
TIM0_OVF ist der Interrupt für den Compare-Match des Timer/Counter2.
Was mir weiterhin auffällt: Du benutzt r29 in der Hauptschleife und in
der Timer-ISR. Was, wenn zwischen

  ldi R29, 0b00100000
und
  out MCUCR, R29       ; Sleep zulassen, Sleepmode setzen

der Timer-Interrupt ausgelöst wird? Welcher Wert kommt dann ins MCUCR?

PS: Du solltest dir angewöhnen, die Werte, die du in die Register
lädst, mit Namen anzusprechen statt mit Bitkolonnen. Das macht's
lesbarer.
Gast #227567
Lesenswert?

Die allererste Anweisung ist "rjump init" und damit wird erstmal der
Stack nicht initialisiert.
Ausserdem fehlt hinter den Labeln jeweils ein "ret". Es wird ein
Label angesprungen, das keine Anweisungen hat, wie es weitergehen soll.
Gast #227568
Lesenswert?

Da hast Du recht, hab schon soviel vom Tuto im Kopf das ich die
Initialisierung vor Init gesetzt habe, habs jetzt hinter Init
verschoben und siehe da, wenn eine Taste gedrückt wird  blinken die
LEDS wenigstens.
Ich hab mir schon das Tuto Timer im GCC bereich angesehen, aber
geholfen hat es mir auch nicht wirklich.
Werde jetzt mal versuchen die Sachen im Stack zu sichern.
Gast #227569
Lesenswert?

> "TIM0_OVF ist der Interrupt für den Compare-Match des
> Timer/Counter2"
> hmm, woran sieht man das?

Am Datenblatt. Dein TIM0_OVF war vorher der vierte Eintrag, und das ist
eben der für Compare-Match vom Timer/Counter2.

> Die Interruptvektor-Tabelle habe ich auch geändert, aber das ganze
> läuft noch nicht. Hat einer einen Tip für mich?

Warum hast du denn deine Hauptschleife auskommentiert? Dadurch läuft
dein AVR nach der Initialisierung direkt weiter in die
Interrupt-Routine, die an der Stelle ja eigentlich nicht ausgeführt
werden darf.
Übrigens: dein Sleep-Mode in der Hauptschleife stimmt auch nicht.
Abgesehen davon, daß du den Sleep-Mode gar nicht aktivierst (Dazu müßte
das SE-Bit auf 1 gesetzt werden), ist auch der falsche Modus ausgewählt.
So würde der AVR in den Power-Down-Modus geschaltet. In diesem bleibt
aber der Timer stehen. Es müßte eher heißen:

  ldi R23, 1 << SE
  out MCUCR, R23
  sleep

Das schaltet den AVR in den idle-Modus, in dem der Timer weiterläuft.
Aber für den Anfang kannst du den Sleep-Mode auch einfach weglassen und
eine ganz einfache Endlosschleife machen. Den Sleep-Mode kannst du
nachher immer noch aktivieren, wenn der Rest erstmal geht.

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