Externer Interrupt beim ATmega48

OP #3153518
Hallo zusammen,

ich experimentiere gerade, um diesen Baustein zu verstehen, mit Lampe an 
- Lampe aus. INT0/1 funktionieren. Nun habe ich den Code um den PCINT17 
erweitert -> Resultat ist nieder schmetternd. Ich glaube, ich habe es 
nicht so richtig verstanden.
Hier der Code:

/*
 * Ext_Int.c
 *
 * Created: 01.05.2013 11:14:40
 *  Author: Ich
 */


#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/delay.h>
#include <avr/sleep.h>

int Lampe = 0;

ISR(INT0_vect)
{
  PORTB |= (1<<PB0);  // Lampe an
}

ISR(INT1_vect)
{
  PORTB &= ~(1<<PB0);  // Lampe aus
}

ISR(PCIE2)
{
  if Lampe == 0
  (PORTB |= (1<<PB1); Lampe = 1;)  // Lampe an
  if Lampe == 1
  (PORTB &= ~(1<<PB1); Lampe = 0;  // Lampe aus
}

int main(void)
{
  DDRB |= (1<<PB0) | (1<<PB1);  // Pin C0/1 ist Ausgang
  PORTD |= (11<<PD1) | (1<<PD2) | (1<<PD3); // Pull Up Widerstände 
gesetzt

  EICRA |= (1<<ISC11) | (1<<ISC01);  // IT0/1 konfigurieren; fallende 
Flanke
  EIMSK |= (1<<INT0) | (1<<INT1);    // INT0 und INT1 aktivieren
  PCICR |= (1<<PCIE2);        // INT 16-23 erlaubt
  PCMSK2 |= (1<<PCINT17);        // PCINT17 aktivieren
  sei();  // Globaler Interrupt erlauben

    while(1)
    {
        set_sleep_mode(SLEEP_MODE_PWR_DOWN);  // Einschlafen lassen ;-)
    }
}

Was habe ich falsch gemacht?!

Danke für eure Hinweise.
#3153557
Hugo Hugoson schrieb:
> ISR(PCIE2)

Gemäß Datenblatt heißt der Interruptvektor für den Pin-Change-Interrupt2 
"PCINT2".

Beim AVR-GCC muß bei der Definition der ISR an den Namen noch das Suffix 
"_vect" angehängt werden:
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Programmieren_mit_Interrupts
Also:
1
ISR(PCINT2_vect)
2
{
3
...
4
}

Wurde Deine Version denn überhaupt ohne Fehler- bzw. Warnmeldungen 
kompiliert?
OP #3153846
Danke, jetzt geht's :-)
Mit dem 'if' ist klar ->

ISR(PCINT2_vect)
{
  if (Lampe == 0)
  {
    PORTB |= (1<<PB1);
    Lampe = 1;  // Lampe an
  }
  else
  {
    Lampe = 0;
    PORTB &= ~(1<<PB1);  // Lampe aus
  }
}

Nur noch eine Frage: Wie kann ich die Interrupts in Priroritäten 
staffeln?
Gast #3153922
Bernd S. schrieb:
> Da kannst du nachschauen. Die sind nach Priorität angeordnet.

Wobei grundsätzlich erst einmal gilt: First come, first serve.

Wenn du die Interrupts in einer ISR wieder freigibst (was du nur tun 
solltest, wenn du genau weißt, was du tust), unterbricht die jeder 
andere Interrupt, sobald er auftritt.

Die Prioritäten kommen nur zum tragen, wenn mehrere Interrupts 
gleichzeitig anstehen. Dann entscheidet die Priorität, welcher als 
nächstes ausgeführ wird.

Oliver

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 13 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.