Interrupt Routine wird nicht angesprungen GCC

Gast #1540512
Lesenswert?

Hi, ich arbeite mich gerade durch das GCC Tutorial und habe nun beim 
Thema Interrupts folgendes Problem, wenn ich das Programm mit AVR Studio 
simuliere:
ich habe in der Simulation den Controller ATMega 48 eingestellt und 
wollte den Pin Change Interrupt testen. Wenn ich nun den Pin B 0 Setze, 
dann springt er immer sofort wieder in die Zeile int main (void) anstatt 
die Interrupt Routine an.
Was mache ich falsch?
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3

4

5

6
ISR (_VECTOR(1)) {
7
  PORTB = 0b00000010; 
8
  }
9

10
int main (void) {
11
    DDRB = 0b00000010;
12
    PCICR = 0b00000001; //Im Pin Change Interrupt Controll Register wird Pinchange Interrupt 0 aktiviert
13
    PCMSK0 = 0b00000001; //für den Pinchange Interrupt 0 wird im Pin Change Mask 0 Register der Pin PCInt 0 (PB0) ausgewählt
14
    sei(); //Aktiviert Interrupts
15
      while(1) {
16
      };
17
    return 0;
18
  }

PS: habe auch die Sufu benutzt und mir andere Codes angesehen, hab den 
Fehler allerdings nicht gefunden :-(
MfG
Miche
#1540574
Lesenswert?

Miche schrieb:
> PCICR = 0b00000001; //Im Pin Change Interrupt Controll Register wird Pinchange 
Interrupt 0 aktiviert
>     PCMSK0 = 0b00000001; //für den Pinchange Interrupt 0 wird im Pin Change Mask 
0 Register der Pin PCInt 0 (PB0) ausgewählt

Nehmen wir einfach mal an du benutzt einen TGFP / Dip .
Dann ware für PCICR und PCMSK0 die richtige Lösung:
1
PCICR |= (1<<PCIE1);   //0b00000010
2
PCMSK1 |= (1<<PCINT12); // oder (1<<PCINT14) für DIP Gehäuse .....

Interrupt Vektor ist:
1
ISR(PCINT1_vect)
2
{
3
   ....
4
}


Gruß
Gast #1540927
Lesenswert?

hier das vollständige Programm
extra ohne 0bxxxxx Konstanten :-D
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3

4

5

6
ISR (PCINT0_vekt) {
7
  PORTC = (1<<PC1); 
8
  }
9

10
int main (void) {
11
    DDRB = (1<<PB0);
12
    PCICR = (1<<PCIE0); //Im Pin Change Interrupt Controll Register wird Pinchange Interrupt 0 aktiviert
13
       PCMSK0 = (1<<PCINT0); //für den Pinchange Interrupt 0 wird im Pin Change Mask 0 Register der Pin PCInt 0 (PB0) ausgewählt
14

15
    sei(); //Aktiviert Interrupts
16
      while(1) {
17
        };
18
    return 0;
19
  }
Gast #1540941
Lesenswert?

Miche schrieb:
> ISR (PCINT0_vekt) {
                ^- das sollte eigentlich einen Error werfen.. oder 
wenigstens eine Warning.. sowas wie
1
warning: ‘PCINT0_vekt’ appears to be a misspelled signal handler
Und wenn Du schon dabei bist: heisst der wirklich PCINT*0*_..?

HTH und HF
#1540946
Lesenswert?

Und schau dir auch nochmal die Bedeutung der Data Direction Register an.
Du schaltest Port B0 auf Ausgang und willst ihn mit einem Pin Change 
Interrupt überwachen? Das kann man schon tun, aber dann muss das 
Programm den Ausgang von 0 auf 1 bzw. umgekehrt umschalten. Extern 
kannst du den Pin nur umschalten, indem du ihn kurzschliesst.

Auf der anderen Seite willst du an PC1 offenbar etwas ausgeben, hast 
aber diesen Pin nicht auf Ausgang gestellt. In Wirklichkeit schaltest du 
damit nur den Pullup Widerstand dazu. Nicht sehr zuverlässig um damit zb 
eine LED ein/aus zu schalten.

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