Forum: Mikrocontroller und Digitale Elektronik ATmega32u4 Interrupts funtkionieren nicht


von Martin F. (martin_f70)


Angehängte Dateien:

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

von g457 (Gast)


Lesenswert?

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

von Steffen (Gast)


Lesenswert?

Was macht es denn überhaupt? Läuft es vielleicht zu schnell? Mit welcher 
Frequenz betreibst du den Atmega?

von Christian K. (the_kirsch)


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.

: Bearbeitet durch User
von Steffen (Gast)


Lesenswert?

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?

von Christian K. (the_kirsch)


Lesenswert?

Ist in der interrupt.h definiert.

ISR(BADISR_vect){
//...
}

von Martin F. (martin_f70)


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.

von Steffen (Gast)


Lesenswert?

Wie erkennst du was dein Code macht? Woher weißt du dass er ein Reset 
macht?

von Christian K. (the_kirsch)


Lesenswert?

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.

: Bearbeitet durch User
von Martin F. (martin_f70)


Lesenswert?

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!?

von Steffen (Gast)


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?

von Markus W. (Firma: guloshop.de) (m-w)


Lesenswert?

Für mich hört sich das eher nach einem Hardware-Problem an. Vielleicht 
fehlt der Kondensator zwischen VCC und GND?

von Christian K. (the_kirsch)


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.

von Martin F. (martin_f70)


Lesenswert?

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.!

von Steffen (Gast)


Lesenswert?

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.

von Christian K. (the_kirsch)


Lesenswert?

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.

: Bearbeitet durch User
von Max D. (max_d)


Lesenswert?

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

von Martin F. (martin_f70)


Lesenswert?

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!

von Steffen (Gast)


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?

von Martin F. (martin_f70)


Lesenswert?

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

von Steffen (Gast)


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();

von Martin F. (martin_f70)


Lesenswert?

Klappt nicht. Selbes Problem

von Steffen (Gast)


Lesenswert?

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.

von Steffen (Gast)


Lesenswert?

vielleicht ist es der Bootloader

von Martin F. (martin_f70)


Lesenswert?

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

von Steffen (Gast)


Lesenswert?

und du bist sicher das ein Blink Code auf läuft?

von ?!? (Gast)


Lesenswert?

Steffen schrieb:
> und du bist sicher das ein Blink Code auf läuft?

Wo soll er auflaufen?

von Martin F. (martin_f70)


Lesenswert?

Warte, ich checke das!

von Martin F. (martin_f70)


Lesenswert?

Ahh, btw, wenn ich das ISR auskommentiere dann klappts ja auch!

von Martin F. (martin_f70)


Lesenswert?

Blink code klappt!

von Markus W. (Firma: guloshop.de) (m-w)


Lesenswert?

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?

von Steffen (Gast)


Lesenswert?

und der ist auch mit Timer als Pausenerzeugung?

von Martin F. (martin_f70)


Lesenswert?

Aso ne delay, aber was ich noch sagen kann!!!

CTC timer funktioniert mit purem Hardwaretimer, also dass OC0A direkt 
vom timer getoggelt wird!

Halt blos mit ISR net

Schaltplan ist auf adafruits seite: 
https://raw.githubusercontent.com/adafruit/Atmega32u4-Breakout-Board/master/atmega32u4bbsch.png

von Steffen (Gast)


Lesenswert?

aber die LED hängt in der Luft...

von Martin F. (martin_f70)


Lesenswert?

hä? was meinst du damit?

von Steffen (Gast)


Lesenswert?

na die geht irgendwo an die Steckleiste und dann?, zumindest die LED die 
mit L bezeichnet ist.

von Martin F. (martin_f70)


Lesenswert?

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!

von ?!? (Gast)


Lesenswert?

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.

von Steffen (Gast)


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?

von Martin F. (martin_f70)


Lesenswert?

1. Oscilloskop, 2. wenn ich ihn ganz langsam einstelle led

von Steffen (Gast)


Lesenswert?

check mal das hier:
1
TCCR0A |= _BV(WGM01) | _BV(WGM02) | _BV(COM0A0);

WGM 1 und 2 = Reseved lt. Datenblatt S.97

CTC ist nur WGM1

von Steffen (Gast)


Lesenswert?

Steffen schrieb:
> CTC ist nur WGM1

also WGM01

von Martin F. (martin_f70)


Lesenswert?

Klappt trotzdem nicht, außer wenn ich ISR auskommentiere

von Steffen (Gast)


Lesenswert?

Martin Fischer schrieb:
> Klappt trotzdem nicht, außer wenn ich ISR auskommentiere

häng mal noch mal den aktuellen Code an

von Martin F. (martin_f70)


Angehängte Dateien:

Lesenswert?

Hier ist er

von Steffen (Gast)


Lesenswert?

Martin Fischer schrieb:
> Hier ist er

dreh mal die beiden noch um:
1
   TIMSK0 = _BV(OCIE0A);
2
   TCCR0B |= _BV(CS01) | _BV(CS00);

von kurz und knapp (Gast)


Lesenswert?

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.

von Steffen (Gast)


Lesenswert?

und das auch wieder raus...
1
        TOGGLE(F7);
2
        _delay_ms(100);

von Max D. (max_d)


Lesenswert?

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.

von Sebastian W. (b_a_s_t_i_w)


Lesenswert?

Schalte mal per PRR Register den USB-Controller aus, dann sollte es 
funktionieren.

von Martin F. (martin_f70)


Lesenswert?

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!

: Bearbeitet durch User
von MWS (Gast)


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 ;-)

von ?!? (Gast)


Lesenswert?

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?

von MWS (Gast)


Lesenswert?

?!? schrieb:
> Ich vermute, daß Martin diese Meldung ignoriert hat, oder?

Nö, bei mir kommt auch keine Warnung mit dem oben verlinkten Makefile.

von MWS (Gast)


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.

von Martin F. (martin_f70)


Lesenswert?

Danke MWS!

Hat geklappt, danke, seit 5 Tagen habe ich die Lösung gesucht, 
wenigstens wusste ich dass das Problem in der Makefile war :D

von MWS (Gast)


Lesenswert?

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?

von Martin F. (martin_f70)


Lesenswert?

Ich hatte mit eienr funktionierenden Makefile verglichen, diesen Fehler 
aber nicht gesehen

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.