www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ATmega32 Interupt Problem


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

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

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)


Vielen Dank erstmal

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zunächst mal ist Deine Interrupt-Vektortabelle falsch. Bei allen AVRs 
mit mehr als 8 KB Flash sind die Interrupt-Vektoren zwei Worte breit 
(also 32 Bit). Da rjmp und reti je nur 16 Bit haben, stimmen die 
Adressen nicht mehr. Am besten übernimmst Du die Vektortabelle aus dem 
Datenblatt. Die sollte nämlich stimmen. Ansonsten anstatt "reti" ein 
"nop reti" schreiben und statt "rjmp" "jmp" benutzen.

Autor: Dieter Werner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich programmiere zwar keine ATmega, aber wenn ich mich richtig an andere 
Beiträge in diesem Forum erinnere, liegen die Interrupt Vektoren im 
2-Wort Abstand.
RJMP und RETI belegen aber nur jeweils ein Befehlswort.

Es hat sich auch als brauchbar herausgestellt, alle unbenutzten Int's 
auf einen error handler springen zu lassen.

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> - Stimmt die Verzweigung im Interupt Vektor?
Ob sie "stimmt", kann ich nicht sagen. Man kann es aber so machen. 
Wichtig ist, dass ein reti das ganze beendet, und das ist schließlich 
gegeben.

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> - Muss ich mich um das TIFR Register kümmern?
Nein, wenn Du die Interrupts aktiviert und auch den Rest korrekt 
konfiguriert hast, dann werden die Interrupt-Flags beim Einsprung in den 
Interrupt-Vektor automatisch gelöscht.

Autor: Michael U. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

meine Variante (ohne Error-Handler) ohne ständige Rechnerei:
.include "m8def.inc"

;********** Verktor-Liste ***********

.CSEG
  rjmp  Reset

.ORG    OVF0addr
  rjmp  irq_1ms

;******* Programm-Beginn ************

;************************************
;  Initialisierungsroutine
;************************************

.ORG    INT_VECTORS_SIZE

; Hardware initialisieren

Reset:
  ldi  TEMP_A,low(RAMEND)          ; Stack an das interne Ram-Ende
  out  SPL,TEMP_A
  ldi  TEMP_A,high(RAMEND)
  out  SPH,TEMP_A


Erspart Rechnerei...

Gruß aus Berlin
Michael

Autor: FireFly (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank an alle!

Problem war wohl, dass ich mir eine fertige Int-Vector Tabelle eines 
kleineren megas geholt, und die zusätzlichen Ints des 32er (zB INT2) 
einfach dazwischen geschrieben habe (zwar eigentlich nach Datenblatt, 
aber da wird das Problem wohl wie erwähnt mit der relativen Adressierung 
zusammenhängen).

Mit .org's an die jeweilige Stelle wie von Michael vorgeschlagen 
funktioniert die Sache jetzt!

Nebenbei: Das AVR-Studio meckert die Konstante INT_VECTORS_SIZE an!? 
aber mit .org $02A klappts

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.