Interrupt mit Pin als Eingang will nicht

Gast #2092042
Lesenswert?

Hallo Jungs, ich stehe mal wieder aufm Schlauch.
Ich möchte das wenn Pin A1 auf GND geht ein Interrupt ausgelöst wird und 
di eLED an Pin A0 leuchtet.
Dazu habe ich folgenden Code getippt:
1
ISR(INT1_vect)
2
{
3
  GICR &= ~(1 << INT1);
4
  PORTA |= (1 << PA0);
5

6
};
7

8

9
int main(void)
10
{
11

12

13
//Timer initialisieren
14
 /*  TCCR0 |= (1<<CS00)|(1<<CS02);
15
   TIMSK =(1<<TOIE0);
16
*/
17
   DDRA = (1 << DDA0);
18
   DDRA &= ~(1 << DDA1);
19
   PORTA |= (1 << PA1);
20
   MCUCR = (1 << ISC11);
21
   GICR = (1 << INT1);
22
   sei();

Leider geht ier nie in den Interrupt.
Wo liegt mein Fehler?
Muss bestimmt noch in irgendein Register ein Bit setzen aber weis nicht 
wo noch?

Für einen Tip wäre ich dankbar.

Grüße Christian
#2092056
Lesenswert?

Du schreibst nicht welchen Uc du benutzt.
Bei einem Atmega8(8) (den kenne ich ein bisschen), sind die externen 
Interrupts über PD2 bzw PD3 ansteuerbar.
Dann zB so:
1
ISR (INT0_vect) {
2
    dosomething();
3
}
4

5
int main() {
6
    DDRD  &= ~(1<<PD2);                    // Port als Eingang
7
    PORTD &= ~(1<<PD2);                    // Pull Up an PD2 = INT0 aktivieren
8
    GICR |=(1<<INT0);                    // Ext. Interrupt an INT0
9
    MCUCR |=(0<<ISC01) | (0<<ISC00);            // Interrupt, wenn INT0 = GND
10
    sei();
11

12
    while(1) {
13
    }
14
}
#2092164
Lesenswert?

Der PIN A1 liegt beim 162 als PCINT1 vor... Das ist ein Pin Change 
Interrupt, das ist nicht das selber wie der externe Interrupt.

Um ihn zu initialisieren mußt du:
1
GICR   = (1<<PCIE0)     //Pin Change Interrupt 0 ein
2
PCMSK0 = (1<<PCINT1)    //Pin Change von PCINT0 - PortA Pin 1
3

4
...
5

6
ISR (0x008) {           //Interrupt Reg 0x008
7
    dosomething();
8
}

Darauf achten das der PCINT JEDEN logischen Wechsel detektiert, quasi 
von low zu high und von high zu low. Dies mußt du in der Software 
auswerten ob PA1 nun high oder low ist.

EDIT: SREG - I muß natürlich auch gesetzt sein!
Gast #2093209
Lesenswert?

Soweit hab ichs jetzt aber die LED geht leider nicht an wenn der 
Pinzustand gewechselt wird.
1
ISR(PCINT1_vect)
2
{
3
  if (PINA & (1 << PINA1))
4
  {
5
    GICR &= ~(1 << PCIE0);
6
      PORTA |= (1 << PA0);
7
    //wdt_enable (WDTO_2S);
8
  }
9

10

11

12
  }
13

14
int main(void)
15
{
16

17
   DDRA = (1 << DDA0);
18
   DDRA &= ~(1 << DDA1);
19
   PORTA |= (1 << PA1);
20
   GICR   = (1<<PCIE0);     //Pin Change Interrupt 0 ein
21
   PCMSK0 = (1<<PCINT1);    //Pin Change von PCINT0 - PortA Pin 1
22

23
   MCUCR = (1 << ISC11);
24
   //SREG = (1 << I);
25
   initialisierung();
26
   sei();
27
.
28
.
29
.
30
}
#2093308
Lesenswert?

Christian schrieb:
> PCMSK0 = (1<<PCINT1);

Muß PCINT0 sein! EDIT: Nee ist richtig... PCINT1 nehmen.

Versuch erstmal in deiner ISR jede Zustandsänderung zu toggeln. Um zu 
sehen ob sie da überhaupt läuft. Welchen Compiler nutzt du eigentlich? 
und...

Christian schrieb:
> MCUCR = (1 << ISC11);

Benötigst du nicht...

Übrigens mit sei() wird das SREG I Bit gesetzt. Bei meinem Compiler muß 
ich das von Hand machen ;)

Christian schrieb:
> GICR &= ~(1 << PCIE0);

Und diesen bitte ebenfalls rauswerfen.

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