www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Mega 8 Timer Probleme


Autor: Holger (Gast)
Datum:
Angehängte Dateien:

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

Autor: crazy horse (Gast)
Datum:

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

Autor: Holger (Gast)
Datum:

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

Autor: Mike Schultz (Gast)
Datum:

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

Autor: Holger (Gast)
Datum:

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

Autor: crazy horse (Gast)
Datum:

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

Autor: Holger (Gast)
Datum:

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

Autor: Rolf Magnus (Gast)
Datum:

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

Autor: Holger (Gast)
Datum:
Angehängte Dateien:

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

Autor: EZ81__ (Gast)
Datum:

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

Autor: EZ81__ (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und im Interruphandler SREG und die benutzten Register auf dem Stack
sichern...

Autor: EZ81__ (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ergänze: ", wenn die benutzten Register keine globablen Variablen
sind."

Autor: Wolle (Gast)
Datum:

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

Autor: Holger (Gast)
Datum:

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

Autor: Rolf Magnus (Gast)
Datum:

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

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Analysiere mal den Anhang dieses Beitrags:

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

Das könnte einige deiner Probleme lösen.

...

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.