Forum: Compiler & IDEs ISR für INT0 wird nicht ausgeführt


von M. H. (dbzwerg)


Lesenswert?

Hallo,

bin Neuling in sachen µc programmierung in C.

Habe zum Test folgendes vor.

LED 1 ist ständig an
Bei Steigender Flanke an INt0 soll meine 2. LED leuchten.

ZUm Einsatz kommt ein Atmega16 auf einen Pollin Experimentiertboard.
Die Port Einstellungen für die LEDS sind korrekt, auch bekomm ich einen 
Highpegel an PD2 wenn ich meinen Taser drücke.

Hier mein Code:
1
 
2
 
3
#include <avr/io.h>
4
#include <avr/interrupt.h>
5
6
7
           
8
ISR(INT0_vect) // Folgende Code wird bei Interrupt VON int0 AUSGEFÜHRT
9
  {
10
  
11
    PORTD = 0b01000000;// LED 2 ist an
12
13
  }
14
15
int main (void) {            
16
  DDRD  = 0b01100000;//POrtD.6 und portD.7 auf Ausgang, rest von PortD auf Eingang
17
  
18
  
19
  //KOnfig INT0
20
  MCUCR |= (1<< ISC01); //Interrupt bei Steigener Flanke
21
  MCUCR |= (1<< ISC00); //Interrupt bei Steigener Flanke
22
  
23
  GCICR |= (1<<INT0);   // INT0 Interrupt einschalten
24
  
25
  
26
  //Hauptschleife
27
  while(1)
28
     {
29
     sei(); // schaltet global Interrupts ein
30
   
31
      
32
                  
33
    PORTD = 0b00100000;// LED 1 ist an
34
  
35
  }
36
   return 0;               
37
}

Hoffe jemand kann mir meinen Fehler zeigen.


MFG

von Marius W. (mw1987)


Lesenswert?

Weil deine LED nur für ein paar Taktzyklen an ist. In deiner 
main-Schleife machst du die LED sofort wieder aus.

Lies dir mal die Wiki-Artikel zum Thema Bitmanipulation durch!

MfG
Marius

von Krapao (Gast)


Lesenswert?

>     PORTD = 0b00100000;// LED 1 ist an

Schaltet sofort LED2 aus!
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
4
ISR(INT0_vect) 
5
{
6
  PORTD |= (1<<PD6); // LED 2 ist an
7
}
8
9
int main (void) 
10
{            
11
  DDRD = (1<<PD7) | (1<<PD6);
12
 
13
  // Konfig INT0
14
  MCUCR |= (1<< ISC01); // Interrupt bei Steigener Flanke
15
  MCUCR |= (1<< ISC00); // Interrupt bei Steigener Flanke
16
  GCICR |= (1<<INT0);   // INT0 Interrupt einschalten
17
  sei(); // schaltet global Interrupts ein
18
  
19
  //Hauptschleife
20
  while(1)
21
  {
22
    PORTD |= (1<<PD6); // LED 1 ist an
23
  }
24
  return 0;               
25
}

Konfig INT0 habe ich nicht geprüft.

von Krapao (Gast)


Lesenswert?

Mist. Copy&Paste Faheler. Muss heissen
1
ISR(INT0_vect) 
2
{
3
  PORTD |= (1<<PD7); // LED 2 ist an
4
}

von M. H. (dbzwerg)


Lesenswert?

Super danke für die Hilfe...hat ich total übersehen das ich den ganzen 
Port in der main wieder setze...

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.