Forum: Mikrocontroller und Digitale Elektronik Interrupt in C für ATmega128


von Stefan (Gast)


Lesenswert?

Hallo zusammen!

Bin noch ein Neuer in sachen C programmierung. Hab einen ATmega128 und 
das AVRstudio.
Hab schon einige Dinge mit Erfolg ausprobiert (Einfache Verknüpfungen, 
Schleifen, Portabfragen/setzen, etc.). Jetzt möchte ich aber tiefer 
reinschauen und mich mit Interrups auseinander setzen.

Meine Frage ist, bei der ich um Hilfe bitte, wie programmiere ich für 
meinen controller einen einfachen Interrupt der einen Port abfragt (z.B. 
Port A0) und wenn an diesem Port ein Signal angelegt (z.B. durch einen 
Taster) wird, dass in eine andere Stelle/Schleife gesprungen wird oder 
an den Anfang des Programmes (Programmabbruch).

Vielleicht kann mir da mal jemand ein Beispiel posten und dieses 
beschreiben. Welche Programmzeile wofür und was macht, damit ich bei 
zukünftigen Interrups dann bescheid weiß wie man die einbaut.

Danke schon einmal im Voraus für Eure Bemühungen.

von Falk B. (falk)


Lesenswert?

@  Stefan (Gast)

>Meine Frage ist, bei der ich um Hilfe bitte, wie programmiere ich für
>meinen controller einen einfachen Interrupt der einen Port abfragt (z.B.

Warum Interrupt? Sowas kann man im Programmablauf bzw. der State Machine 
direkt abfragen, Interrupts nutzt man für Taster nur selten.

MFG
Falk

von Matthias R. (matsch)


Lesenswert?

Ein einfacher Weg währe z.B. so:
1
ISR( TIMER0_COMPA_vect ){
2
  //
3
  // Taster abfragen (polling)
4
  //
5
  if ( (PIND & 1<<PIND7) ){  // Wenn Taster 1 nicht betätigt
6
    S1betatigt = 0;
7
  }
8
  else{// sonst
9
    S1betatigt = 1;
10
  }
11
}

Die ISR wird ca. alle 1ms aufgerufen.
Die Variablen 'S1betätigt' kann an anderer Selle verarbeitet werden 
(globale Variable)
Matsch

von Stefan (Gast)


Lesenswert?

Danke erstmal Falk!

Wie gesagt bin da noch nicht Fit welche Variaten es so gibt. Warum wären 
Interrups für die Tasteabfrage nicht so geeignet und was ist genau State 
Mashine und wie wird das dann verarbeitet und programmiert?

von Stefan (Gast)


Lesenswert?

Hallo Match, danke auch dir erstmal!

Muss ich ihm für den Interrupt keine Kopfdatei aufrufen? So Frage ich 
dann einen Eingang ab und gebe dann in einer if-Schleife Anweisungen. 
Kann ich ihm dann auch Anweisungen zum verlassen einer Schleife oder 
springen zu einer Stelle geben. Hab schon gelesen, dass das mit dem 
Springen so wieso so eine Sache ist.

von Matthias R. (matsch)


Angehängte Dateien:

Lesenswert?

Der Interrupt muss initialisiert werden. Siehe hierzu Beispiel (! 
ATMega88 !) im Anhang.
Oder auch hier in den Artikeln:
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Die_Timer.2FCounter_des_AVR

Fang doch erst einmal noch einfacher an. Du lässt einfach einen Pin im 
Interrupt toggeln. z.B. Pin5 von Port B.
Das kannst Du in deiner ISR so machen
1
PORTB ^= _BV(PB5);
An dem Pin kannst Du dann eine LED anschließen und das Blinken 
(vorausgesetzt der Interrupt wird nicht zu schnell nacheinander 
ausgelöst) beobachten.
Matsch

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.