www.mikrocontroller.net

Forum: Compiler & IDEs Variable ändern mit Interrupt


Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!
In folgendem Beispielprogramm habe ich folgendes Problem: Durch den 
externen Interrupt soll die Variable >zahl< auf 1 gesetzt werden. Leider 
macht das Programm beim Verlassen der Interruptroutine mit dem alten 
Wert von >zahl< weiter. Wo ist der Fehler?


#include <io.h>
#include <interrupt.h>
#include <sig-avr.h>

unsigned char zahl;

void inczahl (void)
{
zahl++;            //zahl wird inkrementiert
for(i=0;i<5000;i++)     //
{                       //Zeitschleife
for(j=0;j<50;j++);      //
}
}

SIGNAL(SIG_INTERRUPT0)
{
zahl=1;
}

void main (void)
{
    outp (0xff,DDRB);  // Port B als Ausgang
    outp (0x00,DDRD);  // Port D als Eingang
    outp (0xFF,PORTD);  //Pullups aktiv
zahl=0;                 //Anfangswert
sbi(GIMSK, INT0);       //enable externer Interrupt 0
cbi(MCUCR, ISC00);      //
sbi(MCUCR, ISC01);      //Interrupt bei fallender Flanke
sei();                  //enable alle Ints
while(1)
{
inczahl();              //zahl inkrementieren
outp(zahl, PORTB);      //zahl ausgeben
}
}

Vielen Dank für Eure Hilfe!

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Siehe FAQ auf
http://savannah.nongnu.org/download/avr-libc/doc/a..., 
erste Antwort.

volatile unsigned char zahl;

Autor: Joerg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das dürfte übrigens die FAQ schlechthin sein. ;-)  Ist
nicht umsonst an allererster Stelle dort...

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Super - vielen Dank für die schnelle Hilfe

Autor: Milchknilch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Könnte mir jemand freundlicher weise mal ein code beispiel posten. Ich 
krieg das nicht gebacken :(

Autor: BAB (Kai K.) (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ist auch kein wunder da du bei jedem interrupt die variable zahl auf 
eins zurücksetzt.

eretzte doch mal in der interruptroutine "zahl=1;" mit zahl++;
und schmeiss die funktion "void inczahl (void)" rauss.

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.