Interrupt in C für ATmega128

Gast #1286662
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.
#1286698
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
Gast #1286712
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.
#1286762
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
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren