Forum: Mikrocontroller und Digitale Elektronik ATmega32u4 Interrupts funtkionieren nicht


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Martin F. (martin_f70)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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:
ISR(irgendein_vector){
    //garnix
}

in meinem Code ist. Es spiel keine Rolle, welchen Interrupt ich abfrage, 
nur das ISR "stört". Dies verifizierte ich dadurch, es 
auszukommentieren:
//ISR(irgendein_vector){
    //garnix
//}
=> 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)


Bewertung
0 lesenswert
nicht 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)


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

von Christian K. (the_kirsch)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
Ist in der interrupt.h definiert.

ISR(BADISR_vect){
//...
}

von Martin F. (martin_f70)


Bewertung
0 lesenswert
nicht 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)


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

von Christian K. (the_kirsch)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
-1 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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
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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
nimm mal hier das sei(); raus
static void init_timer(void){
    OCR0A = 0x26; //0x26
    TCCR0A |= _BV(WGM01) | _BV(WGM02) | _BV(COM0A0);
    TIMSK0 = _BV(OCIE0A);
    sei();
    TCCR0B |= _BV(CS01) | _BV(CS00);
}

und setze es hier ein:
SET_HIGH(F7);
sei();

von Martin F. (martin_f70)


Bewertung
0 lesenswert
nicht lesenswert
Klappt nicht. Selbes Problem

von Steffen (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
vielleicht ist es der Bootloader

von Martin F. (martin_f70)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
und du bist sicher das ein Blink Code auf läuft?

von ?!? (Gast)


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

Wo soll er auflaufen?

von Martin F. (martin_f70)


Bewertung
0 lesenswert
nicht lesenswert
Warte, ich checke das!

von Martin F. (martin_f70)


Bewertung
0 lesenswert
nicht lesenswert
Ahh, btw, wenn ich das ISR auskommentiere dann klappts ja auch!

von Martin F. (martin_f70)


Bewertung
0 lesenswert
nicht lesenswert
Blink code klappt!

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


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
und der ist auch mit Timer als Pausenerzeugung?

von Martin F. (martin_f70)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
aber die LED hängt in der Luft...

von Martin F. (martin_f70)


Bewertung
0 lesenswert
nicht lesenswert
hä? was meinst du damit?

von Steffen (Gast)


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

von Martin F. (martin_f70)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
1. Oscilloskop, 2. wenn ich ihn ganz langsam einstelle led

von Steffen (Gast)


Bewertung
0 lesenswert
nicht lesenswert
check mal das hier:
TCCR0A |= _BV(WGM01) | _BV(WGM02) | _BV(COM0A0);

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

CTC ist nur WGM1

von Steffen (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Steffen schrieb:
> CTC ist nur WGM1

also WGM01

von Martin F. (martin_f70)


Bewertung
0 lesenswert
nicht lesenswert
Klappt trotzdem nicht, außer wenn ich ISR auskommentiere

von Steffen (Gast)


Bewertung
0 lesenswert
nicht 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:

Bewertung
0 lesenswert
nicht lesenswert
Hier ist er

von Steffen (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Martin Fischer schrieb:
> Hier ist er

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


von kurz und knapp (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
und das auch wieder raus...
        TOGGLE(F7);
        _delay_ms(100);


von Max D. (max_d)


Bewertung
0 lesenswert
nicht 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)


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

von Martin F. (martin_f70)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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:
LDFLAGS     = -mmcu=$(DEVICE) -Wl,--relax
und schon klappt's ;-)

von ?!? (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.