Forum: Mikrocontroller und Digitale Elektronik Mega 8 Timer Probleme


von Holger (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich versuche gerade mit einem Mega 8 einen Umschalter zu realisieren.
Ich habe ein Beispiel PRG im Forum gefunden, aber ihrgentwie klappt das
nicht.
wer kann helfen?

Holger

von crazy horse (Gast)


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).

von Holger (Gast)


Lesenswert?

muß denn die Initialisierung des Stackpointers unbedingt sein, auf einem
Tiny12 soll das PRG so laufen? Ich bin ein ziemlicher Newbie auf diesem
Gebiet

von Mike Schultz (Gast)


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

von Holger (Gast)


Lesenswert?

Danke,
ich werde mich mal durch das Tutorial kämpfen und versuchen den
Stackpointer zu initialisieren.

von crazy horse (Gast)


Lesenswert?

Was hast du denn nun, Tiny12 oder Mega8?? Nebenbei: da unterscheiden
sich u.a. auch die Int-Vektoren.

von Holger (Gast)


Lesenswert?

Ich habe einen Mega8, dass PRG ist für einen Tiny12, ich dachte man
könnte es einfach ohne Umstände anpassen, ist wohl nicht so?
Werde dann am besten mal ganz neu anfangen.

von Rolf Magnus (Gast)


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.

von Holger (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,
ich habe jetzt den Stackpointer initialisiert.
"TIM0_OVF ist der Interrupt für den Compare-Match des
Timer/Counter2"
hmm, woran sieht man das? Die Interruptvektor-Tabelle habe ich auch
geändert, aber das ganze läuft noch nicht. Hat einer einen Tip für
mich?

von EZ81__ (Gast)


Lesenswert?

Ich habe keine Ahnung, ob/wann/wo/warum "SPM_RDY         ; Store
Program Memory Ready Handler" ausgelöst wird, aber passiert die
Stackinitialisierung in deinem Programm vor dem Init:?

von EZ81__ (Gast)


Lesenswert?

Und im Interruphandler SREG und die benutzten Register auf dem Stack
sichern...

von EZ81__ (Gast)


Lesenswert?

ergänze: ", wenn die benutzten Register keine globablen Variablen
sind."

von Wolle (Gast)


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.

von Holger (Gast)


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.

von Rolf Magnus (Gast)


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.

von Hannes L. (hannes)


Lesenswert?

Analysiere mal den Anhang dieses Beitrags:

http://www.mikrocontroller.net/forum/read-1-236259.html#236288

Das könnte einige deiner Probleme lösen.

...

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.