Forum: Compiler & IDEs Interrupt Problem


von Franz (Gast)


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
1
#define INT1_vect        _VECTOR(2)  // Interrupt INT1 definieren
2
3
void Start_Befehl (void)
4
{ 
5
  sei();                     // Interrupts einschalten             
6
  
7
  ISR(INT1_vect)             // Wenn Interrupt eintritt dann Starte
8
  {Start_Flag = 1;}
9
   
10
  UCSRB |= (0 << RXEN);      // Transmitter ausschalten
11
12
  _delay_ms(10);
13
 
14
  USART_Flush();             
15
 
16
  _delay_ms(10);
17
18
  UCSRB |= (1 << RXEN);      // Transmitter einschalten
19
20
  x = 0;                     // variable x auf 0 setzen
21
22
  x = getch();               // Auf Startzeichen vom Scanner warten
23
24
  if (x = X1)                // Wenn Zeichen empfangen dann vergleiche
25
   {Start_Flag = 1;}    
26
27
  cli();                     // Interrupts ausschalten
28
}

von Franz (Gast)


Angehängte Dateien:

Lesenswert?

sry hab die Fehlermeldung vergessen

von Falk B. (falk)


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-Tutorial#Programmieren_mit_Interrupts

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

von Hc Z. (mizch)


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

von g457 (Gast)


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:
1
ISR(INT1_vect)
2
{
3
   // auswerten/merken
4
}
5
6
ISR(USART_RX_vect)
7
{
8
   // auswerten/merken
9
}
10
11
int main()
12
{
13
   // uart/interrupts/.. initialisieren, interrupts einschalten
14
15
   // warten auf godot
16
   while (nix interrupt und nix kommando via uart)
17
      nixtun();
18
19
   // jetzt was sinnvolles tun
20
   foo(bar);
21
}

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

von Franz (Gast)


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

von Karl H. (kbuchegg)


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

von g457 (Gast)


Lesenswert?

> Doch der AVR macht nix.

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

HTH

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

von Franz (Gast)


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.

von g457 (Gast)


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

von Franz (Gast)


Angehängte Dateien:

Lesenswert?

so hab das ganze mal zusammengeschrieben

von Franz (Gast)


Angehängte Dateien:

Lesenswert?

sry hab was vergessen gehabt

von Franz (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


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.

von Karl H. (kbuchegg)


Lesenswert?

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

von Franz (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


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
1
int main (void)
2
{
3
 init();
4
 sei();
5
 .
6
 .
7
 .
8
 . Mein code
9
 .
10
 .
11
 .
12
} Ende hauptprogramm

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

von Franz (Gast)


Lesenswert?

das war die lösung... interrupt.c wurde nirgens aufgerufen^^
etz gehts

danke

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.