www.mikrocontroller.net

Forum: Compiler & IDEs Interrupt Problem


Autor: Franz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
für mein nächstes Projekt brauche ich eine Interrupt Routine doch der 
Compiler findet 2 Fehler im Code und ich find den Fehler ned. Könnte da 
mal jemand für mich drüberschauen bitte? Habs genau so gemacht wie im 
tutorial beschrieben.

Das Programm soll starten wenn ein Interrupt am Pin 17 vom Mega 32 
eintritt, oder er über die serielle Schnittstelle das entsprechende 
Zeichen empfangen hat.

Compiler ist Win AVR und Programmierplattform AVR Studio
#define INT1_vect        _VECTOR(2)  // Interrupt INT1 definieren

void Start_Befehl (void)
{ 
  sei();                     // Interrupts einschalten             
  
  ISR(INT1_vect)             // Wenn Interrupt eintritt dann Starte
  {Start_Flag = 1;}
   
  UCSRB |= (0 << RXEN);      // Transmitter ausschalten

  _delay_ms(10);
 
  USART_Flush();             
 
  _delay_ms(10);

  UCSRB |= (1 << RXEN);      // Transmitter einschalten

  x = 0;                     // variable x auf 0 setzen

  x = getch();               // Auf Startzeichen vom Scanner warten

  if (x = X1)                // Wenn Zeichen empfangen dann vergleiche
   {Start_Flag = 1;}    

  cli();                     // Interrupts ausschalten
}

Autor: Franz (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
sry hab die Fehlermeldung vergessen

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Franz (Gast)

>mal jemand für mich drüberschauen bitte? Habs genau so gemacht wie im
>tutorial beschrieben.

Das glaube ich kaum.

>Das Programm soll starten wenn ein Interrupt am Pin 17 vom Mega 32
>eintritt, oder er über die serielle Schnittstelle das entsprechende
>Zeichen empfangen hat.

Dann lies mal was zum Thema Interrupt.

http://www.mikrocontroller.net/articles/AVR-GCC-Tu...

>#define INT1_vect        _VECTOR(2)  // Interrupt INT1 definieren

Sowas macht kein Mensch.


>  ISR(INT1_vect)             // Wenn Interrupt eintritt dann Starte
>  {Start_Flag = 1;}

Und das auch nicht! Eine ISR wird nicht wie eine Funktion aufgerfen.
Und du willst das Tutorial gelesen oder gar verstanden haben?
Eine glatte Lüge!

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Franz schrieb:
> ISR(INT1_vect)             // Wenn Interrupt eintritt dann Starte
>   {Start_Flag = 1;}

Ich weiß nicht, was Du Dir vorgestellt hast, als Du das geschrieben 
hast.  Jedenfalls kannst Du eine Interrupt-Function  nicht im normalen 
Programmablauf unterbringen.  Sie hat dort nichts verloren.  Sie ist 
eine selbständige Function und ist dorthin zu schreiben, wo Functions 
sonst auch hin gehören:  In die Hauptebene außerhalb aller anderen 
Functions.¹


(¹Und ja, ich weiß, dass der GCC sie nicht nur dort zulässt, aber keine 
Interruptroutinen.)

Autor: g457 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Habs genau so gemacht wie im tutorial beschrieben.

Wo steht das so verdreht? Das sollte man schleunigst korrigieren.

> #define INT1_vect        _VECTOR(2)  // Interrupt INT1 definieren

Das steht in jeder vernünftigen library schon drin, also nicht nochmals 
selbst definieren sondern die Originale verwenden (hier: per #include 
<avr/io.h> und -mmcu=$mmcu).

> Das Programm soll starten wenn ein Interrupt am Pin 17 vom Mega 32
> eintritt, oder er über die serielle Schnittstelle das entsprechende
> Zeichen empfangen hat.

Die ISR macht man klassischerweise ausserhalb der main(). Der Aufbau 
könnte dann etwa so aussehen:
ISR(INT1_vect)
{
   // auswerten/merken
}

ISR(USART_RX_vect)
{
   // auswerten/merken
}

int main()
{
   // uart/interrupts/.. initialisieren, interrupts einschalten

   // warten auf godot
   while (nix interrupt und nix kommando via uart)
      nixtun();

   // jetzt was sinnvolles tun
   foo(bar);
}

Im Tut[1] steht das noch ausführlicher drin.

Auf die Interrupts kannst Du verzichen sofern Du das nur zum 'starten' 
brauchst. Dann kannst Du die jeweiligen Flags auch direkt 
(busy-)abwarten. Welche das sind steht im Datenblatt :-)

HTH und HF

[1] http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial

Autor: Franz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok ist erledigt. Doch der AVR macht nix. Hab das ganze so konfiguriert, 
das der pin auf fallende Flanke reagiert. Doch er reagiert nicht.
Bits sind wie folgt konfiguriert

void interrupt (void)
{
 MCUCR |= (1<<ISC11) | (0<<ISC10);
 GIFR  |= (1<<INTF1) | (0<<INTF0) | (0<<INTF2);
 GICR  |= (1<<INT1) | (0<<INT0) | (0<<INT2);
}

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

Bewertung
0 lesenswert
nicht lesenswert
Franz schrieb:
> ok ist erledigt.

Was hast du erledigt?

> Doch der AVR macht nix.

Irgendwas macht der schon.
Die Frage ist eher: Entspricht das was du programmiert hast dem, was du 
haben willst :-)

> Bits sind wie folgt konfiguriert

Zeig dein ganzes Programm

Autor: g457 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Doch der AVR macht nix.

Dann liegt der Fehler wohl in Zeile 42 [1] :-)

HTH

[1] lies: Zeich uns den vollständigen Code.

Autor: Franz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das geht leida ned der code is 42 seiten lang^^
Also:

ISR(INT1_vect)
{
   // LED einschalten
}


ISR steht ausserhalb von main.

ich hab mir dann ein neues c-file erstellt wo ich die Bits eingestell 
habe so wie oben kopiert.

sonst hab ich nix gemacht weil ich erst mal unabhängig ob von der 
seriellen was kommt oder ned mal schauen wollte ob das mit dem interrupt 
funktioniert.

Autor: g457 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
[code herzeigen]
> das geht leida ned

Dann wird Dir wohl niemand helfen können. Der Fehler liegt 
höchstwahrscheinlich irgendwo wo Du ihn nicht erwartest.

> ich hab mir dann ein neues c-file erstellt

Das ist ein sehr gute Ansatz - das Programm so weit abspecken [1], bis 
'nur noch' das eigentliche Problem drin ist aber es immernoch 
einwandfrei compiliert (und linkt). Sodann veröffentlichst Du den 
kompletten Quellcode der ebendieses Problem aufzeigt und nochmals eine 
genaue Beschreibung des erwarteten Verhaltens, ggf. mit vollständiger 
Aussenbeschaltung. Dann helfen wir Dir gerne weiter.

HTH

[1] behelfsweise komplett neu aufsetzen - so oder so ein minimales 
Programm erstellen, das den Fehler aufzeigt

Autor: Franz (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
so hab das ganze mal zusammengeschrieben

Autor: Franz (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
sry hab was vergessen gehabt

Autor: Franz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aussenbeschaltung: der pin 17 ist Pull UP und bei Fallender Flange (GND 
an PIN 17) soll erst mal eine LED angehen.

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

Bewertung
0 lesenswert
nicht lesenswert
Bitte!

Schreib nicht einfach was zusammen.


Mach ein vollständiges, kompilierbares Programm.
Das testest du, ob sich der Fehler bei dir immer noch zeigt. Auch im 
Simulator einmal durchsteppen, ob der fragliche Code überhaupt 
ausgeführt wird, kann nicht schaden.

Im Extremfall müssen wir hier hergehen und dein Programm nehmen, bei uns 
durch den Compiler jagen und damit im Simulator auf Jagd nach Fehlern 
gehen.

Dazu brauchen wir aber ein Programm, welches bei dir nachweislich den 
beschriebenen Fehler hervorruft!

Und noch was.
Du kannst ruhig ein C-File als Attachment anhängen. Kein Grund das als 
TXT zu titulieren. Bei einem C-File greift dann nämlich das 
Syntax-Highlighting der Forensoftware.

Und noch was.
Wenn nach dem 3 mal Nachfragen nach einem vollständigem kompilierbaren 
Programm immer noch nur noch Code-Fetzen daherkommen, dann empfindet das 
die Mehrheit der Helfenden als ziemlich rüde und unhöflich.

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

Bewertung
0 lesenswert
nicht lesenswert
Wo rufst du die Funktion interrupt() eigentlich auf, die die INT 
Eingänge konfiguriert?

Autor: Franz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
okay bis morgen habt ihr den code.
stimmt das wird gar nicht aufgerufen.. werd ich gleich mal ändern und 
probieren.

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

Bewertung
0 lesenswert
nicht lesenswert
Franz schrieb:
> okay bis morgen habt ihr den code.
> stimmt das wird gar nicht aufgerufen.. werd ich gleich mal ändern und
> probieren.

Wenn du dein Beispiel soweit vollständig gemacht hättest und im 
Simulator durchgestept wärst, wär dir das sogar selbst aufgefallen.

Das ist nämlich auch eine Technik zum Bugfixen:
Es ist nicht ungewöhnlich, dass man seine eigenen Fehler sieht, wenn man 
das Programm auf das absolut Notwendige zusammenschrumpfen muss, sodass 
zwar alles andere rausfällt, der Fehler aber immer noch drinnen bleibt. 
Durch die verminderte Komplexität fallen einem plötzlich Dinge auf, die 
man im Monstercode nicht sieht.

> stimmt das wird gar nicht aufgerufen..

Das war mehr geraten als gewusst. Hätte ja auch sein können, dass der 
Aufruf irgendwo in
int main (void)
{
 init();
 sei();
 .
 .
 .
 . Mein code
 .
 .
 .
} Ende hauptprogramm

steckt (und genau deswegen sollst du solche Dinge nicht machen, sondern 
ordentlichen Code abliefern)

Autor: Franz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das war die lösung... interrupt.c wurde nirgens aufgerufen^^
etz gehts

danke

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.