Interrupt Routine wird nicht angesprungen GCC

Gast #1540512
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
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
@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
Gast
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
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
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.
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.