mikrocontroller.net

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


Autor: Miche (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?
#include <avr/io.h>
#include <avr/interrupt.h>



ISR (_VECTOR(1)) {
  PORTB = 0b00000010; 
  }

int main (void) {
    DDRB = 0b00000010;
    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
    sei(); //Aktiviert Interrupts
      while(1) {
      };
    return 0;
  }

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

Autor: Jean Player (fubu1000)
Datum:

Bewertung
0 lesenswert
nicht 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:
PCICR |= (1<<PCIE1);   //0b00000010
PCMSK1 |= (1<<PCINT12); // oder (1<<PCINT14) für DIP Gehäuse .....

Interrupt Vektor ist:
ISR(PCINT1_vect)
{
   ....
}


Gruß

Autor: Miche (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: Miche (Gast)
Datum:

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



ISR (PCINT0_vekt) {
  PORTC = (1<<PC1); 
  }

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

    sei(); //Aktiviert Interrupts
      while(1) {
        };
    return 0;
  }



Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Miche schrieb:


> ISR (PCINT0_vekt) {

Und welche Warnung vom Compiler kriegst du hier?

Autor: g457 (Gast)
Datum:

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

HTH und HF

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Miche L. (ihoid)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.