programmiere seit kurzem den ATmega32 (habe bereits C167 programmiert) und hab folgendes Problem:
Ich will zwei Stepper zyklisch laufen lassen (Treiberstufe aus L297/L298 wie hier schon des öfteren besprochen) und will dazu mit dem Timer1 Compare Interupt das Enable Signal der beiden Treiberstufen toggeln.
Ich habe mir die einzelnen Config Register aus dem Datenblatt zusammengebaut, aber ich komme mit der Interupt Behandlung nicht ganz klar (zumindest denke ich dass das Problem hier liegt).
Ich habe den Code hinten angefügt, wäre super wenn jemand mal einen kurzen blick darauf werfen würde um mir bei meinem Denkfehler weiterzuhelfen.
Anmerkungen zum Code:
Timer0 erzeugt den Takt für Stepper 1
Timer2 erzeugt den Takt für Stepper 2
Timer1 erzeugt Interupt
Fragen:
- Stimmt das TIMSK Register?
- Stimmt die Verzweigung im Interupt Vektor?
- Muss ich mich um das TIFR Register kümmern? (Hab das Datenblatt so interpretiert, dass hier nur Flags angezeigt werden wenn ein Interupt wirklich auftritt)
--------
Und dann hätte ich nebenbei gleich noch eine Frage:
Ich programmiere im AVR Studio und flashe den µC per Ponyprog und ISP. Das ganze dauert aber je Durchgang 5min. Gibts ne Einstellung mit ich den "Verify" Vorgang unterdrücken kann?
Ich hatte die Interrupt-Vector-Tabelle von einem kleineren mega kopiert und die zusätzlichen Vektoren dazwischen eingefügt. dabei ist anscheinend was mit der relativen Adressierung schief gelaufen.
Mit .org Sprüngen an die richtige Stelle im Speicher funkioniert die Sache
beim mega32 ist in der Interruptvektortabelle Platz für JMP - Befehle, den es beim mega8 ja nicht gibt, weil da der RJMP reicht um den ganzen Speicher zu adressieren. JMP belegt allerdings 4 byte, RJMP nur 2 byte. Dadurch verschiebt sich die Tabelle komplett, wenn Du beim mega32 RJMP nimmst. RETI direkt in der Interruptvektortabelle erzeugt das gleiche Problem, da es auch nur 2 byte lang ist.
Lesezeichen