Forum: Mikrocontroller und Digitale Elektronik Interrupt Routine wird nicht angesprungen GCC


von Miche (Gast)


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

von Jean P. (fubu1000)


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ß

von Miche (Gast)


Lesenswert?

@Jean Player: Danke
Leider springt nach der von dir genannten änderung das AVR Studio immer 
noch zu int main wenn der interrupt auslöst und es hat sich jetzt 
geändert, dass er auf Port C anspricht
MfG Miche

von Karl H. (kbuchegg)


Lesenswert?

Dann poste dein jetziges, vollständiges Programm.
(Und ich hoffe, dass da jetzt keine 0bxxxxx Konstanten mehr drinn 
vorkommen)

von Miche (Gast)


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
  }

von Karl H. (kbuchegg)


Lesenswert?

Miche schrieb:


> ISR (PCINT0_vekt) {

Und welche Warnung vom Compiler kriegst du hier?

von g457 (Gast)


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

von Karl H. (kbuchegg)


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.

von Miche L. (ihoid)


Lesenswert?

appears to be a misspelled Signal header :-(
oh mein Gott^^ oben im ersten Programm hab ich _VECTOR(1) benutzt obwohl 
es 3 war deshalb hat es nicht funktioniert
Danke
PS: oben muss es DDRC heißen^^
also Danke nochmal jetzt funktionierts
MfG Miche

von Simon K. (simon) Benutzerseite


Lesenswert?

Dann lerne bitte daraus und versuch solche Fehler von vornherein 
auszuschließen, indem du klare aussagekräftige Namen nicht nur für die 
Signal Handlers, sondern auch für die Bits in einem Register benutzt.

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.