Interrupt für dummies Atmega16

Gast #432255
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?
#432290
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.
#432293
Lesenswert?
• ▲
▼
Woher hast du die Bezeichnung EXT_INT0?

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

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

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

13
int main( void )
14
{
15
  Hw_Ini();
16
  PORTD = 0x00;   // alle Pins aus
17

18
  while( 1 ) {
19
  }
20
}
21

22
ISR (INT0_vect)
23
{
24
 PORTD = (1<<5);    //Ausgang Pin 5 setzen
25
}
26

27
ISR (INT1_vect)
28
{
29
 PORTD = (1<<5);    //Ausgang Pin 5 setzen
30
}
Gast #432302
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!

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