www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Interruptbetrieb + Atmega 16


Autor: Martin Worzfeld (viper_1988)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute.

Hab mit ATMEGA Interrupts noch wenig Erfahrung. Hab mich gerade an 
meinem ersten interrupt versucht.

Kann mir bitte jemand sagen wieso der nicht funktioniert?

Mfg Martin

#include<avr/io.h>
#include<avr/interrupt.h>
#include <avr/signal.h>



ISP(INT0_vect)
{
  PORTA = 0xFF;
}

int main()
{
  DDRA = 0xFF;    //Port A auf Ausgang
  DDRC = 0xFF;    //Port C auf Ausgang

MCUCR = (1<<ISC01);        //The falling edge of INT1 generates an 
interrupt request.
GICR = (1<<INT0);                //ExtInterrupt 0 Aktivieren

while(1);
return(0);
}

Autor: INT (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Global Int. freigeben vergessen.

SETI();

Autor: Martin Worzfeld (viper_1988)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
schalt ich mit SETI alle interrupts frei?
oder nur die für die externen Interrupts

Autor: INT (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So natürlich!
  sei();

  cli();

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Alle

Autor: Martin Worzfeld (viper_1988)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also "sei" für alle interrupts freischalten
und cli() für was?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Martin Worzfeld wrote:
> schalt ich mit SETI alle interrupts frei?
> oder nur die für die externen Interrupts

globale Interruptfreigabe == alle Interrupts.

Und das Zeugs heist sei() und nicht SETI

int main()
{
   .....

   sei();

   .....

}

"Set Enable Interrupt"
 -   -      -

Autor: Martin Worzfeld (viper_1988)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#include<avr/io.h>
#include<avr/interrupt.h>
#include <avr/signal.h>



ISR(INT0_vect)
{
  PORTA = 0xFF;
}

int main()
{
  DDRA = 0xFF;    //Port A auf Ausgang
  DDRC = 0xFF;    //Port C auf Ausgang

MCUCR = (1<<ISC01);        //The falling edge of INT1 generates an
interrupt request.
GICR = (1<<INT0);                //ExtInterrupt 0 Aktivieren

sei();

while(1);
return(0);
}



würde also mein Source so stimmen oder?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Martin Worzfeld wrote:
> also "sei" für alle interrupts freischalten
> und cli() für was?

Rate mal.

Autor: INT (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Alle Ints.
sei(); ist die Globale interruptfreigabe.
Muß in Main stehen gleich nach der Initialisierung von was auch immer.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Martin Worzfeld wrote:

> würde also mein Source so stimmen oder?

Wir würden dir den Spass des ausprobierens nehmen :-)

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
BTW:
"SETI" ist ein US-Programm für die Suche nach außerirdischem 
(intelligentem) Leben (Search for ExtraTerrestrial Intelligence). Damit 
wirst Du keine Interrupts freigegeben bekommen...;-)

Autor: INT (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wer sagt das Außerirdische nichts mit Interrupts zu tun haben????

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Im Simulator geht das nur, wenn du im Single Step
Betrieb durch das Programm gehst (F10). Du drückst
also immer wieder F10 bis der Simulator in der
while Schleife angelangt ist.
Danach toggelst du den richtigen Pin am D-Port
und beim nächsten F10 sollte die ISR angesprungen
werden.

Autor: Falk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Karl heinz Buchegger

>Und das Zeugs heist sei() und nicht SETI

>"Set Enable Interrupt"

<Krümelkacke>

sei() ist vom ASM Befehl sei abgeleitet. Und der heisst ausgeschrieben

SEt I flag

Dementsprechend heisst ja auch cli()

CLear I flag

</Krümelkacke>

;-)
Falk

Autor: Martin Worzfeld (viper_1988)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab jetzt mal versucht einen Interrupt mit dem INTF0 Flag zu simulieren. 
Bin mir nicht sicher ob das stimmt. Jedenfalls springt mein Programm 
dann nicht in die ISR sondern an den BEginn meiner MAIN  - Schleife. 
Kann mir dass jemand erklären?

Danke für Antworten.

mfg Martin

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Martin Worzfeld wrote:
> Hab jetzt mal versucht einen Interrupt mit dem INTF0 Flag zu simulieren.
> Bin mir nicht sicher ob das stimmt. Jedenfalls springt mein Programm
> dann nicht in die ISR sondern an den BEginn meiner MAIN  - Schleife.
> Kann mir dass jemand erklären?

Das ist ein Zeichen dafür, dass mit der ISR Definition
was nicht stimmt.

Schmeiss als erstes mal den
#include "signal.h"
raus.

Dann als nächstes Überprüfen, ob der in
ISR( xxx )
angegebene Name xxx korrekt und richtig ist.

Danach überprüfen, ob auch wirklich der richtige
Interrupt freigegeben wurde.

Ein Sprung an den Beginn von main() ist immer ein
Zeichen dafür, dass ein Interrupt erkannt wurde
und auch ausgelöst hat, dass aber die 'Verbindung
zur ISR' fehlerhaft ist.

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast Du den richtigen Controller im Makefile oder AVRStudio angegeben?

Autor: Martin Worzfeld (viper_1988)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich teste derzeit nur softwaremäßig. I verwend einen ATMEGA 16. und der 
is auch eingestellt

Autor: Falk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Martin Worzfeld

>IN meinem Fall möchte ich den Externen Interrupt 0 ansprchen.
>Hab im AVR tutorial für xxx INT0_vect gelesen. Das müsste doch für den
>extint 0 stimmen oder nicht.

Sollte passen. Hast du auch nicht wieder ISP statt ISR geschrieben? 
Stell mal deinen Code KOMPLETT als Anhang hier rein. Nix kopieren.

MfG
Falk

Autor: Martin Worzfeld (viper_1988)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die restlichen header braucht ihr ned. Haben aber nix mit interrupts 
oder sonstigem zum tun.

danke für eure hilfe

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Martin Worzfeld wrote:
> Ich teste derzeit nur softwaremäßig. I verwend einen ATMEGA 16. und der
> is auch eingestellt

Der Vollständigkeit halber: Auch im Simulator richtig eingestellt?

Im Simulator gibt es eine extra Einstellung für den Prozessortyp.
Wenn man ein neues Projekt erzeugt, stellt AVR Studio beide
Einstellungen richtig ein, aber nachschauen kostet nichts.


Autor: Falk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Martin Worzfeld

>mal die main

Das reicht nicht ganz. Und für deine Test würde ich erstmal die ganzen 
überflüssigen includes auskommentieren.
Step by Step.
Was macht Initialize_Interrupts();?
Das mit den Schleifen

  for(j= 0; j<= 2000; j++){}    //Wait bevor Initialisierung begonnen 
wird

ist ne schlechte Idee, die fliegen spätestends bei der Optimierungsstufe 
-0s raus. Für sowasnimmt man die _delay_ms() oder _delay_us(), siehe 
Doku der libc.

MFG
Falk

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> void ISP(INT0_vect)

Da steht immer noch ISP.
Das Teil heist ISR und hat keinen Returntyp

ISR( INT0_vect )
{
  // Code
}

Autor: Falk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Karl heinz Buchegger

>Da steht immer noch ISP.

Hehe, wusste ichs doch ;-)

MfG
Falk

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.