Hallo!
Ich wollte bei meinem ATmega32u4 einen Timer(0) im CTC Modus betreiben
um eine bestimmte Frequenz zu erzeugen. Da ich mehrere Pins togglen
möchte, wollte ich eine ISR nutzen. Was dabei rausgekommen ist: main.c
mit board.h und iocomfort.h.
So. Ich stellte fest dass sich mein Chip immer resetteet und nicht mein
Programm ausführt. Daraufhin stellte ich fest, dass ich folgendes
Problem habe:
Code läuft nicht wenn:
1
ISR(irgendein_vector){
2
//garnix
3
}
in meinem Code ist. Es spiel keine Rolle, welchen Interrupt ich abfrage,
nur das ISR "stört". Dies verifizierte ich dadurch, es
auszukommentieren:
1
//ISR(irgendein_vector){
2
//garnix
3
//}
=> Daraufhin läuft mein Programm und der Chip resettet nicht immer
wieder.
Ich hänge mal meine FIRMWARE.MAP und Makefile noch mit 'ran.
Falls es etwas mit zursache tut, Fuses (E:C3, H:D0, L:FC) Lockbits
(0x2F)
Ich hoffe jemand kann mir helfen!
EDIT: Ich habe ausversehen die main.c zweimal angehangen, bitte nur die
2. angucken!
MfG, Martin
> nur das ISR "stört". Dies verifizierte ich dadurch, es> auszukommentieren:
Sicher, dass es an der ISR liegt und nicht am sei()? Implementier mal
den BADISR.
Wenn eine ISR nicht definiert ist, und der Interrupt auftritt, wird
BADISR aufgerufen, und wenn BADISR nicht existiert, wird resettet.
Bist du dir sicher das alles in iocomfort.h stimmt?
Versuch es mal ohne.
Besonders die CONCAT Konstrukte machen beim Präprozessor häufig
Probleme.
edit:
mit gcc -E
kannst du nur den Präprozessor durchlaufen lassen, und den generierten
C-Code anschauen.
Christian K. schrieb:> Wenn eine ISR nicht definiert ist, und der Interrupt auftritt, wird> BADISR aufgerufen, und wenn BADISR nicht existiert, wird resettet.
Was soll das denn sein?
Das spielt alles keine Rolle!
Auch wenn ich im ISR keine Operationen durchführe klappt es nicht.
Außerdem kommt es nicht auf den Timer-Interrupt an, auch bei Externen
klappt es nicht - bei keinem, solange ISR im code ist.
iocomfort.h ist nicht von mir und verifiziert korrekt!
Also irgendetwas an meiner makefile klappt vermutlich nicht ganz.
Wenn du unter Linux arbeitest, probiere mal Eclipse CDT mit
"AVR-Eclipse"-Plugin
Benutze ich sowohl unter Windows als auch unter Linux.
aus Eclipse kann du dann auch direkt AVRDude aufrufen.
Daher dass nix klappt und wenn ich einen bootloader nutze daran dass er
immer neustartet. Und ich bin kein absoluter Anfänger und nehme daher
nicht sowas wie Eclipse, was soll der Quark!?
Naja deine Angeben sind etwas Wage. Welche Software nimmst du?
Vielleicht solltest du die Register direkt ansprechen und nicht mit dem
ganzen Quatsch Drumherum. Als Anfänger ist das eher zu verstehen.
Schalte doch mal einfach den Port ein und aus. Dann bau den Timer ein
und schau was passiert. Wie ist dein Aufbau?
Martin Fischer schrieb:> Daher dass nix klappt und wenn ich einen bootloader nutze daran dass er> immer neustartet. Und ich bin kein absoluter Anfänger und nehme daher> nicht sowas wie Eclipse, was soll der Quark!?
Genau, du bist Pro und nimmst lieber den vi.
Nein im ernst.
Am Anfang hat mir auch ein einfacher Editor mit Syntaxhighlighting
gereicht. Aber wenn die Projekte größer werden kommt man um eine IDE
nicht mehr herum, und man will nachher auf die Komfortfunktionen nicht
mehr verzichten.
Was denkt ihr wie doof ich bin? Dieses Forum verliert auch immer mehr an
Qualität! Würdet ihr einmal mein Code angucken würded ihr sehen dass ich
eine Debug-LED eingebaut habe und ich sagte schon dass das klappt und
ads alles klapp außer wenn ein ISR mit im Code ist.!
Martin Fischer schrieb:> eine Debug-LED eingebaut habe
aja? Sollen wir hellsehen? Wenn am F7 die Debug LED dran sein soll, dann
wird die wohl immer leuchten. oder ich wiederhole, mit welcher Frequenz
läuft der Atmega?
Martin Fischer schrieb:> Was denkt ihr wie doof ich bin?
Das ist die Frage. Nur die kannst nur du beantworten. Meine Glaskugel
ist in der Reinigung.
ich sehe da keine Debug-LED im Code.
Meine Kristallkugle ist leider kaput, woher so man wissen das hier
eventuell eine Indikator LED angeschlossen sein könnte
1
SET_HIGH(F7);
Des weiteren werden durch deine Konstrukte wie
#define F7 F,7
und den Makros in iocomfort.h der Code eher schlechter lesbar als
besser.
1. Wo ist das .lss ? Das hilft bei so Späßen mit Interrupt oft weiter.
2. Der Mega32U2 hat JTAG, damit kannst du Schritt für Schritt deinen
Code nachverfolgen.....
Ich habe aber keinen JTAG und ich nutze das ADAFRUIT ATMEGA32U4 Breakout
Board! 16MHz! Die Debug-LED F7 leuchtet nie und wie ich schon sagte mein
Code funktioniert nicht wenn ein ISR drin vorkommt!
Max D. schrieb:> 2. Der Mega32U2 hat JTAG,
selbst wenn er das nicht nutzen will und wie vermutet wird an F7 die
"Debug LED" hängt, kann er das ja auch so machen. Nur sollte unser
"Profi" erst mal damit anfangen die LED zum Blinken zu bekommen um zu
verstehen. Erst dann kann er gern mit dem Code hier anfangen.
Und noch mal, mit welcher Frequenz läuft der Atmega?
Martin Fischer schrieb:> 16MHz!
Außerdem bin ich über "Hello Blink!" hinweg, ich bin kein vollidiot! Es
geht darum dass iwas mit dem compilieren net stimmt also guckt euch
nicht mehr den code an, er ist korrekt! Meine Güte ..
Martin Fischer schrieb:> Martin Fischer schrieb:>> 16MHz!
naja und dann bei Teiler 64 ist knapp 1khz und einer LED wirst du nicht
viel sehen, außer die ist immer an oder immer aus.
Beide annahmen führen ins leere: a) ich prüfe mit Oscillskop, aber das
ist egal denn debug-led sollte angehen
b) ohne bootloader klappts auch nicht, ich glaube wirklich das makefile
was falsch macht
Markus Weber schrieb:> Für mich hört sich das eher nach einem Hardware-Problem an. Vielleicht> fehlt der Kondensator zwischen VCC und GND?
Nur um das von mir vermutete Problem auszuschließen – hast du einen
Schaltplan für uns?
Ahh ne die L led ist die bootloader LED, aber was soll mit der sein, die
benutze ich doch gar nicht. Also, es funktioniert, auch der timer, blos
nicht wenn in meinem code ein ISR steht, dann läuft gar nix!
Steffen schrieb:> na die geht irgendwo an die Steckleiste und dann?,> zumindest die LED die mit L bezeichnet ist.
Die geht an PE6, steht doch dran.
Aber an PF7 hängt keine LED.
?!? schrieb:> Steffen schrieb:>> na die geht irgendwo an die Steckleiste und dann?,>> zumindest die LED die mit L bezeichnet ist.> Die geht an PE6, steht doch dran.
ja stimmt auch wieder. Hab zu schnell drüber geschaut :-D
> Aber an PF7 hängt keine LED.
Stimmt...
Martin Fischer schrieb:> Also, es funktioniert, auch der timer, blos> nicht wenn in meinem code ein ISR steht, dann läuft gar nix!
Woher weißt du das er Timer läuft?
kurz und knapp schrieb:> Das Lesen macht keinen Spaß. Ich schieße daher ins Blaue: Wird die> Vektortabelle mit über tragen? Das sieht nämlich so aus, als ob die> fehlt.
Würde der to mal das .lss liefern, dann wüssten wir mehr.
Sebastian: Klappt nicht mit wechsel, anderes probiere ich später
Bin mal ne runde draußen, bis später, vielleicht findet jemand ne
lösung, ich checke mit dem Handy das forum!
Martin Fischer schrieb:> Sebastian: Klappt nicht mit wechsel, anderes probiere ich später
Dein Linker kennt das Target nicht und erzeugt eine 16Bit IVT, statt
einer 32Bit IVT, wie's für den ATM32U4 richtig wäre.
Ändere die erste Zeile der LDFLAGS in:
MWS schrieb:> Dein Linker kennt das Target nicht
Hätte dann nicht vom Linker eine Fehlermeldung kommen müssen?
Er kann doch nicht ohne jeden Kommentar eine andere Tabelle erzeugen.
Ich vermute, daß Martin diese Meldung ignoriert hat, oder?
Nachtrag
Wenn man ein per se korrektes Makefile von AVR-Studio 4.18 (über Build
-> Export Makefile) verwendet und diesem die vorhandene MCU-Definition
aus den LDFLAGS wegnimmt, dann gibt's auch kein Mecker, selbst nicht mit
-pedantic -v
Die einzige Warnung war eine fehlende F_CPU-Definition, trägt man die
nach, dann scheint alles in schönster Ordnung zu sein.
Bis eben auf die unbrauchbare IVT.
Das ist bei AVR-Studio 4.18 und auch bei 6.1 so.
Martin Fischer schrieb:> Hat geklappt, danke
Bitte.
> wenigstens wusste ich dass das Problem in der Makefile war :D
Und warum hast Du es dann nicht mit einem Standard-Makefile/Vorgabe des
AVR-Studios probiert?