Forum: Compiler & IDEs Problem bei Interrupt - falscher Code wird ausgeführt (mega


von D. D. (daniel_dd)


Angehängte Dateien:

Lesenswert?

Hallo,

ich habe ein prinzipielles Problem mit der verwendung von Interrupts
und hoffe, dass mir Jemand helfen kann.

In meinem Quellcode will ich, dass die Interruptroutine durch einen
Taster ausgelöst wird Das erspare ich mir zu Testzwecken indem ich INT0
Softwaremäßig auslöse - funktioniert aber auch per Taster).

Mein Problem:
Wenn der Interrupt-0 ausgelöst wird, wird nicht der Code in :

SIGNAL(SIG_INTERRUPT0)
{
...
}

sondern der in main() ausgeführt.

Ich habe schon jegliche Variante (Vor allem in verwendung der
Interrupts des USARTs) versucht! Auch Beispielcode aus dem Netz hat bei
mir nicht funktioniert. Liegt das an meinen FUSEs oder gar an meinem
Prozessor?

Ich verwende einen AVRmega8 mit AVR-GCC auf einem
EmbedIT-Application-Board.

Danke für schelle Hilfe!!!

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

> ...sondern der in main()

Das heißt, dass der default-Interruptvektor zugeschlagen hat.

Mit welcher Kommandozeile linkst du denn, steht da ein -mmcu=atmega8
mit drin?

Btw., ein externer Interrupt für einen Taster ist mittelmäßig
unsinnig, da mechanische Taster immer prellen.  Da man das nur
zeitgesteuert entprellen kann, kann man für die Abfrage des
Tasters dann auch gleich den Timerinterrupt benutzen.

von D. D. (daniel_dd)


Lesenswert?

> Mit welcher Kommandozeile linkst du denn, steht da ein -mmcu=atmega8
> mit drin?

Ich erstelle mein Programm wie folgt:
C:\Programme\WinAVR\bin\avr-gcc.exe
C:\HOME\MICROCONTROLLER\C\INTERRUPT-1\INTERRUPT-1.CPP
-mmcu=atmega8
-oC:\HOME\MICROCONTROLLER\C\INTERRUPT-1\INTERRUPT-1.HEX

(Ich weiß, besser währ es mit einem Makefile, damit werde ich mich in
Zukunft noch befassen)

> Btw., ein externer Interrupt für einen Taster ist mittelmäßig
>unsinnig,...

Du hast Recht! Habe es jetzt einfachheitshalber nur so gemacht um
schnell mal zu Testzwecken einen Interrupt auszulösen. Sonst hättte ich
die Interrupts vom USART verwendet, da das leider auch noch nicht geht,
fange ich erst mal simpel an.

Danke

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Ups, und du bist dir sicher, dass bei obigem Konstrukt ein
Intel-Hex-File rauskommt?  Ich denke, dass du damit nur ein
ELF-File produzierst.

Klemmt eigentlich deine CAPSLOCK-Taste? :-)

Ich bin mir übrigens gar nicht ganz sicher, ich denke mal, dass
.CPP keine offizielle Dateiendung ist, die der GCC vernünftig
interpretiert.  .cpp würde er als C++ interpretieren, aber ist
das eigentlich, was du willst?

> Ich weiß, besser währ es mit einem Makefile

Wenn du ein WinAVR hast, ist doch nun wirklich alles dabei, was
du zur Erstellung eines Makefiles brauchst.  Die ganzen dummen
Kasperfallen werden dir dabei praktisch automatisch abgenommen.
Aber Vorsicht!, bitte gewöhn' dir eine vernünftige Groß-/Klein-
Schreibung an.

von Kai Klenovsek (Gast)


Lesenswert?

da hat Jörg vollkommen Recht. Einfacher als mit dem Demo Makefile oder
mit MFile gehts nun wirklich nicht mehr. Du brauchst lediglich Deinen
Controllertypen eintragen und Deine *.c Quelldateien. Desweiteren ist
alles schön dokumentiert.

Ciao,
Kai

von Rolf Magnus (Gast)


Lesenswert?

> Ich bin mir übrigens gar nicht ganz sicher, ich denke mal, dass
> .CPP keine offizielle Dateiendung ist, die der GCC vernünftig
> interpretiert.  .cpp würde er als C++ interpretieren, aber ist
> das eigentlich, was du willst?

Übrigens würde auch .C als C++ interpretiert werden. Es müßte schon .c
sein, damit er es als C-Code sieht. Alternativ kann man auch mit dem
Kommandozeilenparameter -x die Sprache explizit angeben.
Außerdem sollte man, wenn es wirklich C++ ist, mit g++ arbeiten statt
mit gcc.

von D. D. (daniel_dd)


Lesenswert?

Ich habe jetzt endlich Zeit gefunden eure Tipps auszuprobieren.

Der Tipp mit dem Makefile hat mein Problem SOFORT gelöst! Da wird
gleich der Code gleich viel kleiner!

Faulheit und kleine Fehler werden beim Programmieren echt böse bestraft
;-)

DANKESCHÖN für die promte Hilfe!!!

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.