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
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).
muß denn die Initialisierung des Stackpointers unbedingt sein, auf einem Tiny12 soll das PRG so laufen? Ich bin ein ziemlicher Newbie auf diesem Gebiet
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
Danke, ich werde mich mal durch das Tutorial kämpfen und versuchen den Stackpointer zu initialisieren.
Was hast du denn nun, Tiny12 oder Mega8?? Nebenbei: da unterscheiden sich u.a. auch die Int-Vektoren.
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.
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.
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?
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:?
Und im Interruphandler SREG und die benutzten Register auf dem Stack sichern...
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.
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.
> "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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.