www.mikrocontroller.net

Forum: Compiler & IDEs Interrupt für dummies Atmega16


Autor: Thomas Walther (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin!

Wollte ein einfaches Testprogramm schreiben mit dem ich über einen 
Externen Interrupt eine LED einschalten möchte.
Folgender Code:

int main( void )
{
  Hw_Ini();
  PORTD = 0x00;   // alle Pins aus

  while( 1 ) {
  }
}


int Hw_Ini (void)
{
DDRD =  0x20;   // Den Port D, Pin 5 als Ausgang

//Interrupts aktivieren
SREG = (1<<7);  //Globales Interrupt Bit auf 1
MCUCR = 0x0A;  //Flankenerkennung für INT1 und INT0 auf negative
                     gestellt
GICR = 0xC0;  //INT1 und INT0 aktiviert
}

SIGNAL (EXT_INT0)
{
 PORTD = (1<<5);    //Ausgang Pin 5 setzen
 while( 1 ) {
  }
 }

SIGNAL (EXT_INT1)
{
 PORTD = (1<<5);    //Ausgang Pin 5 setzen
 while( 1 ) {
  }
 }

Compiliert wird das ganze ohne Probleme, aber funktionieren tut nichts. 
Hab mich jetzt schon stundenlang durchs Datenblatt gequält aber ich werd 
nicht schlauer.
Das mit dem Register SREG hab ich iwo aus dem Internet. Ich habe 
keinerlei Beschreibung im Datenblatt gefunden, immer nur einen Hinweis 
auf dieses Register.
Kann mir vielleicht jmd weiterhelfen?

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Fang mal damit an, dass du die Endlosschleifen aus
den Interrupt Handlern rausnimmst.

Das SREG Register könnte man zwar direkt beeinflussen.
Üblich ist es aber, anstatt dem
  SREG = (1<<7);  //Globales Interrupt Bit auf 1

einfach

  sei();

aufzurufen. Dadurch werden alle Interrupts scharf gestellt.

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Woher hast du die Bezeichnung EXT_INT0?

Probier mal:
#include <avr/io.h>
#include <avr/interrupt.h>

int Hw_Ini (void)
{
  DDRD =  0x20;   // Den Port D, Pin 5 als Ausgang

  MCUCR = 0x0A;  //Flankenerkennung für INT1 und INT0 auf negative gestellt
  GICR = 0xC0;  //INT1 und INT0 aktiviert
  sei();
}

int main( void )
{
  Hw_Ini();
  PORTD = 0x00;   // alle Pins aus

  while( 1 ) {
  }
}

ISR (INT0_vect)
{
 PORTD = (1<<5);    //Ausgang Pin 5 setzen
}

ISR (INT1_vect)
{
 PORTD = (1<<5);    //Ausgang Pin 5 setzen
}

Autor: Thomas Walther (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke!
So funktioniert es. EXT_INT0 hatte ich aus dem Datenblatt, hab gedacht 
das wär der Name des Interrupts...
Verwendet man jetzt eigentlich ISR oder SIGNAL? Wo ist da der 
Unterschied? Funktionieren tut beides.

Mann ist das immer mühseelig, da steht man als Anfänger immer ganz schön 
blöd da wenn man zum Beispiel GIMSK verwenden will und es heißt 
mittlerweile GICR usw... ;)

Naja, werd versuchen mich da mal weiter durchzukämpfen :)

Vielen Dank nochmal!

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Verwendet man jetzt eigentlich ISR oder SIGNAL? Wo ist da der
> Unterschied? Funktionieren tut beides.

http://www.mikrocontroller.net/articles/AVR-GCC-Tu...

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.