Forum: Mikrocontroller und Digitale Elektronik Nach ISR() dauerreset


von Carsten (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich beschäftige mich zurzeit mit UART und einem ATmega2561 (mit 16MHz).
Die Funktion des UARTS und das setzen der Bits bereitet mir nun keine 
schwierigkeiten mehr, dafür aber nun der ISR().

Da ich in einem Projekt von Holger Klabunde die serial.c und serial.h 
gesehen habe und diese genau das enthalten, was ich möchte, habe ich 
versucht das ganze auf meinen ATmega2561 zu portieren.

Leider ohne erfolg, der ISR() löst ständig einen reset aus. In der *.lss 
wird mehrmals "0x10e <__bad_interrupt>" angezeigt. Leider kann ich den 
Grund dafür nicht finden.

Wie im Tutorial beschrieben habe ich den iom2561.h entprechend ergänzt, 
damit SIG_UART1_TRANS dem Vector 39 zugewiesen wird. Der Compiler warnt 
auch nicht an dieser Stelle.

Könnt ihr mir da weiterhelfen? Ich sehe meinen Fehler leider nicht oder 
besser gesagt ich verstehe nicht.

Gruß
Carsten

von Oliver (Gast)


Lesenswert?

Da wird ein Interrupt ausgelöst, für den es keine ISR gibt. Entweder 
hast du den falschen Interrupt freigegeben, oder die ISR falsch benannt.

Prüf das nochmals nach.

Carsten schrieb:
> In der *.lss
> wird mehrmals "0x10e <__bad_interrupt>" angezeigt.

Das allerdings soll so sein. Alle Vektoren, die keine ISR zugeordnet 
haben, bekommen __bad_interrupt.

Wenn in der Tabelle gar kein anderer Vektor eingetragen ist, dann ist 
deine ISR-Bezeichnung falsch.

Oliver

von holger (Gast)


Lesenswert?

../serial.c:34: warning: 'SIG_UART1_RECV' appears to be a misspelled 
signal ../serial.c:45: warning: 'SIG_UART1_TRANS' appears to be a 
misspelled signal

Die heissen

SIG_USART1_RECV
SIG_USART1_TRANS

von Peter D. (peda)


Lesenswert?

Falls es immer noch einen geben sollte, der verschlafen hat, wie die 
Interruptvektoren beim AVR-GCC heißen:

- gehe ins Datenblatt
14.1 Interrupt Vectors in ATmega640/1280/1281/2560/2561

- Copy&paste die gewünschte Source
  "USART0 RX"

- ersetze Leerzeichen durch "_"
  "USART0_RX"

- hänge "_vect" ran
  "USART0_RX_vect"

- fertig.


Peter

von Carsten (Gast)


Lesenswert?

Hallo,

ich komme erst heute Abend dazu es erneut zu testen aber schonmal danke 
für die Hinweise und Hilfe.

@Peter
Ob es da etwas verschlafe habe kann ich nicht sagen. Ich habe mir aus 
dem Datenblatt die Vektornummer gesucht und das Tutorial studiert und 
die iom8.h als Vorlage genommen, in die iom2561.h entsprechende Zeilen 
kopiert und die Vektornummer angepast.

Heute Abend werde ich mir das nochmal genauer anschauen und werde ich 
notfalls weiter mit meinen Fragen quälen ;)

Gruß
Carsten

von Oliver (Gast)


Lesenswert?

Carsten schrieb:
> die iom8.h als Vorlage genommen, in die iom2561.h entsprechende Zeilen
> kopiert und die Vektornummer angepast.

Das war überhaupt keine gute Idee.

Für den mega2561 sind alle Vectoren, die dieser kennt, da schon richtig 
drin. Das sind andere, als beim Mega8, das ist halt ein anderer 
Prozessor, da musst du dein Programm entsprechend anpassen.

Oliver

von Carsten (Gast)


Lesenswert?

Hallo Oliver,

>Für den mega2561 sind alle Vectoren, die dieser kennt, da schon richtig
>drin.

Leider nein, die iom2561.h hat nicht eine definition für Vektoren 
enthalten, d.h. mein Idee mit copy and paste. Die Datei enthielt nur 
einige definitionen zur Signatur des Controllertyps, an den Rest kann 
ich mich nicht entsinnen.

Kann es sein das ich die richtige Datei am falschen Ort editiert habe?

Ich hängte die Datei heute Abend mit an, dann erklärt sich vieleicht 
schon alles.

Gruß
Carsten

von Hc Z. (mizch)


Lesenswert?

Carsten schrieb:
> Leider nein, die iom2561.h hat nicht eine definition für Vektoren
> enthalten,

ziemlich am Beginn von iom2561.h steht die Zeile
1
#include <avr/iomxx0_1.h>
was diese Datei enthält, brauche ich wohl nicht auszuschmücken.  Aber 
noch einfacher wäre ein Blick in die Dokumentation zur avr-libc gewesen 
(es empfiehlt sich sowieso, die bereit zu haben).

von Oliver (Gast)


Lesenswert?

Carsten schrieb:
> Kann es sein das ich die richtige Datei am falschen Ort editiert habe?

Das wird wohl so sein. Lass die System-Header besser in Ruhe.

Hier gibts die Doku zur den für alle AVR's in der avrlibc definierten 
Interrupt-Vektoren:

http://avr-libc.nongnu.org/user-manual/group__avr__interrupts.html

Da findest du auch alle für den Mega2561.

Oliver

von Carsten (Gast)


Lesenswert?

Hallo,

danke für die Hinweise. Nachdem ich die ursprüngliche iom2561.h wieder 
hergestellt habe und mir die iomxx0_1.h genauer angeschaut habe, 
verstehe ich nun meinen Fehler.

Die Vektoren SIG_USART1_RECV und SIG_USART1_TRANS habe ich sinngemäß 
eingetragen und siehe da -> alles läuft.

Die Dokumentation zur avrgcc-lib muss ich mir dann auch mal genauer 
anschauen.

Vielen dank für eure ausdauernde Hilfe.

Gruß
Carsten

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.