mikrocontroller.net

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


Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Matthias R. (matsch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ein einfacher Weg währe z.B. so:
ISR( TIMER0_COMPA_vect ){
  //
  // Taster abfragen (polling)
  //
  if ( (PIND & 1<<PIND7) ){  // Wenn Taster 1 nicht betätigt
    S1betatigt = 0;
  }
  else{// sonst
    S1betatigt = 1;
  }
}

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

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Matthias R. (matsch)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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-Tu...

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

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.