ATtiny13A Pin Change Interrupt

Gast #3162854
Lesenswert?
• ▲
▼
Hi,

ich versuche vergeblich im AtmelStudio 6.1 Simulator einen Pinchange 
Interrupt auszulösen. Mein code:
#include <avr/io.h>

void powerDown(void){
  GIFR |= (1<<PCIF); // Clear eventually occurred previous interrupts
  GIMSK |= (1<<PCIE); // Activate Pin change interrupts
  PINB |= (1<<PB4);
  PINB |= (1<<PB4);
  PINB |= (1<<PB4);
  GIMSK &= (0<<PCIE); // Deactivate Pin change interrupts
}

ISR(PCINT0_vect) {
  PINB |= (1<<PB4);
  PINB |= (1<<PB4);
}

int main(void)
{
  //SREG &= 0B01111111; //Disables Interrupts globally during setup
  PORTB |= (1<<PB0)|(1<<PB1)|(1<<PB2); //Setting outputs to zero, 
activating pullups on inputs
  DDRB |= (1<<PB3)|(1<<PB4)|(1<<PB5); //0, 1, 2 are inputs, 3, 4, 5 are 
outputs

  //GIMSK = (1<<PCIE); // Activate Pin change interrupts
  PCMSK |= (1<<PCINT0)|(1<<PCINT1)|(1<<PCINT2); // Sets the Pin change 
interrupt mask, only PB0,1,2 will trigger the PCINT once it it enabled 
before sleep
    //MCUCR = (1<<ISC00)|(0<<ISC01);

  SREG |= (1<<SREG_I); //Enables Interrupts globally after setup
  while(1)
    {
        //TODO:: Please write your application code
    PINB |= (1<<PB4);
    powerDown();
    }
}


Mit PINB |= (1<<PB4); toggle ich einen Pin, um einfach irgendwas zu 
machen ;) powerDown soll später mal Sleep aktivieren und dann soll der 
Mikro per Pinchange Interrupt wieder aus dem Schlaf zurück geholt 
werden. Sorry für die Wahrscheinlich total einfache Frage, aber ich 
fange gerade erst an mit Mikrocontrollern und kenne mich noch nicht gut 
aus.

Während der drei
PINB |= (1<<PB4);
PINB |= (1<<PB4);
PINB |= (1<<PB4);
ändere ich manuell den State eines der drei Inputs im single Step Modus, 
aber es passiert garnichts und der Code wird weiter normal ausgeführt, 
ohne in die ISR zu springen.
Gast #3163075
Lesenswert?
• ▲
▼
Also es lag daran, dass ich die avr/interrupt.h nicht included hatte;) 
Jetzt funktioniert es. Eine Sache ist mir jedoch aufgefallen, wenn 
innerhalb von

void powerDown(void){
  GIFR |= (1<<PCIF); // Clear eventually occurred previous interrupts
  GIMSK |= (1<<PCIE); // Activate Pin change interrupts
  PINB |= (1<<PB4);
  PINB |= (1<<PB4);
  PINB |= (1<<PB4);
  GIMSK &= (0<<PCIE); // Deactivate Pin change interrupts
}

bzw während der drei PINB |= (1<<PB4); ein Pin geändert wird, springt 
der Mikro erst beim/nach dem Aufruf von GIMSK &= (0<<PCIE); in die ISR!? 
Ist das normal oder mache ich etwas falsch? Ich dachte Interrupts würden 
wirklich sofort interrupten.

Antwort schreiben

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.

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.