www.mikrocontroller.net

Forum: Compiler & IDEs ATmega644P Interrupt + While


Autor: Martin S. (howie2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo liebe Community :)

Ich habe ein merkwürdiges Problem !
Ich habe eine void-Schleife in dieser werden 2 Variablen gesetzt.
Dann wird in einer Interrupt-ISR die ZAHL1 Heruntergezählt, ZAHL2 
gesetzt, wenn ZAHL1 == 0 ist...
IN der void-Schleife wird mittels eines "while(ZAHL2 != 0);" darauf 
gewartet, dass die ZAHL2 0 ist, DANN ERST soll die Schleufe enden und es 
im Main-Abschnitt  weitergehen (die Funktion "quittiert" werden)...

Code:
int Rem_Steps = 0;
int Finished = 1;


void Steps(int Steps)
{ 

  Rem_Steps = Steps;
  
  Finished = 0;

  while(Finished != 0);

}

ISR(INT0_vect)
{
  if (Finished == 0) 
  {
    if (Rem_Steps > 0) 
    {
      Rem_Steps--;
    }
    else
    {
      Finished = 1;
    }
  }

}

int main(void)
{ 

//INT0,1
EICRA = 0b00001111;
EIMSK = 0b00000011;
EIFR = 0b00000011;

sei();

Steps(100);

PORTD ^= BIT7; // Hier kommte er NICHT an !

while(1);

}

SO Das prob ist, dass entweder "Finished" nicht von der ISR wieder auf 1 
gesetzt wird, oder die while-Schleife, die darauf wartet nicht 
anspricht, warum auch immer...

An INT0 ist sozusagen ein prellfreier Taster, den ich denn ja 100x 
drücken müsste, bis PORTD-BIT7 einmal getoogelt wird...
Passiert aber nicht.

Hoffe echt ihr könnt mir helfen. kann das was mit meinem compiler zu tun 
haben oder so ?

Mfg Howie

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Siehe Interrupt, Stichwort volatile.

Autor: Martin S. (howie2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hust Das war echt zu einafch um wahr zu sein...
Du hast mir die Grübelarbeit von ca 2-3 Wochen in einem Satz 
beantwortet...
Kurz umgeschrieben, getestet, GEHT !!!
Ich muss echt mal 1000 Dank sagen, wenn ich dich mal im RL treffe 
bekommste einen Keks von mir !!!

Mfg Howie

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Martin Steffen (howie2)

>Ich muss echt mal 1000 Dank sagen, wenn ich dich mal im RL treffe
>bekommste einen Keks von mir !!!

Bin ich das Krümelmonster? Ein Bier wär mir lieber . . . ;-)

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>hust Das war echt zu einafch um wahr zu sein...
>Du hast mir die Grübelarbeit von ca 2-3 Wochen in einem Satz
>beantwortet...

http://www.mikrocontroller.net/articles/AVR_Checkliste

Das Probelm mit dem fehlenden volatile gehört zu den 
Top-3-Einsteigerproblemen, und taucht hier mindestens einmal die Woche 
auf.

Oliver

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.