ATmega32u4 Interrupts funtkionieren nicht

OP #4062051
Lesenswert?

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
Angehängte Dateien:
#4062076
Lesenswert?

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.
OP #4062103
Lesenswert?

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.
Gast #4062121
Lesenswert?

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?
#4062126
Lesenswert?

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.
Gast #4062152
Lesenswert?

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?
Gast #4062157
Lesenswert?

nimm mal hier das sei(); raus
1
static void init_timer(void){
2
    OCR0A = 0x26; //0x26
3
    TCCR0A |= _BV(WGM01) | _BV(WGM02) | _BV(COM0A0);
4
    TIMSK0 = _BV(OCIE0A);
5
    sei();
6
    TCCR0B |= _BV(CS01) | _BV(CS00);
7
}

und setze es hier ein:
1
SET_HIGH(F7);
2
sei();
Gast #4062219
Lesenswert?

?!? 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?
Gast #4062318
Lesenswert?

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:
1
LDFLAGS     = -mmcu=$(DEVICE) -Wl,--relax
und schon klappt's ;-)
Gast #4062402
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren