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
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
../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
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
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
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
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
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).
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
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