Forum: Compiler & IDEs Interrupt für dummies Atmega16


von Thomas Walther (Gast)


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?

von Karl heinz B. (kbucheg)


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.

von Karl heinz B. (kbucheg)


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
}

von Thomas Walther (Gast)


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!

von Karl heinz B. (kbucheg)


Lesenswert?

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

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Veraltete_Funktionen_zur_Deklaration_von_Interrupt-Routinen

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.