mikrocontroller.net

Forum: Compiler & IDEs externer Interrupt


Autor: udo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

der Interrupt wird nicht ausgelöst, weil der Befehl sei(); das "I" Flag 
nicht setzt. In AVR Studio kann ich das verfolgen. Wenn ich aber

GICR |= (1<<INT0) | (1<<INT1);


deaktiviere, dann wird der Befehl sei(); ausgeführt. Ich muss doch 
sowohl die Bits INT0 und INT1 und das "I"-Flag setzen. Aber die stören 
sich gegenseitig. Warum?


Es wird der MEGA16 eingesetzt.
#include <avr/io.h>
#include <avr/interrupt.h>


#define F_CPU 7372800UL       

#include <util/delay.h> 


ISR(TIMER0_OVF_vect)
    
  {
  PORTA=0xdd;
  }


ISR(TIMER1_OVF_vect)

  { 
  PORTA=0xaa;
  }


void init(void)

{
 
        TCCR1B = _BV(CS11); 


  GICR |= (1<<INT0) | (1<<INT1);    // Interrupt Enable

 
  DDRD &= ~( ( 1 << PIND2 ) | ( 1<<PIND3) ); //INT0 und INT1 Eingang

  
  PORTD=_BV(INT0) | _BV(INT1); //Pullups aktibieren

  sei();

  DDRA = 0xff;

}   


int main(void)
{
   
  uint8_t i = 0;

  init();  
  
    for(;;)
    {

              for(i=0;i<255;i++)
      {
         PORTA = i;    
           _delay_ms(50); 
      }

    for(i=255;i>0;i--)
      {
         PORTA = i;    
           _delay_ms(50); 
      }
    }
    return 0;
}


Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
udo wrote:

> weil der Befehl sei(); das "I" Flag
> nicht setzt. In AVR Studio kann ich das verfolgen.

Vermutung oder Gewissheit? Das wär ja mal was Neues. Nicht mehr 
"Compilerfehler" sondern "Prozessorfehler".

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du musst Dich erstmal entscheiden, welche Interrupts Du benutzen willst! 
Du gibst zwei externe Interrupts frei, hast aber für die gar keine 
Interrupt Handler geschrieben. Stattdessen hast Du zwei Interrupt 
Handler für Timer-Interrupts da stehen, die schon aus dem Grunde 
unsinnig sind, weil die Interrupts nirgends freiegegeben werden und auch 
nirgends ein Timer initialisiert wird.

TIMER0_OVF_vect und TIMER1_OVF_vect haben nichts mit externen 
Interrupts zu tun. Und ein freigegebener Interrupt ohne dazu passenden 
Handler führt bei Auftreten zwangsläufig zu einem Programmneustart. Und 
von der Sorte gibt's in Deinem Programm gleich zwei...

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>  PORTD=_BV(INT0) | _BV(INT1); //Pullups aktibieren
Das ist z.B. auch Unsinn. INT1 und INT0 sind die Nummern der lokalen 
Freigabebits der Interrupts im GICR. Die haben nichts mit der 
Pinbelegung am Port zu tun. Wenn das funktioniert, dann nur zufällig!

(Beim ATMega16 z.B. funktioniert es definitiv nicht, weil INT1 == 7 und 
INT0 == 6, die Pins am Port D aber, wie Du eine Zeile weiter oben ja 
auch richtig geschrieben hast, an Stelle 3 bzw. 2 liegen)

Autor: udo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,

Kommando zurück!

Habe beim Kopieren Codeschnipsel durcheinander geschmissen. Ich meinte 
nicht den TIMER Interrupt in der ISR, sondern den externen Interrupt.

Also, ich checke noch mal durch.

Und hier:

PORTD=_BV(INT0) | _BV(INT1); //Pullups aktibier


Klar!!!! Anfängerkrimskrams. Learning by doing. Muss man (noch) mit 
leben.



Danke zunächst.

Udo

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
udo wrote:
>
> 
> PORTD=_BV(INT0) | _BV(INT1); //Pullups aktibier
>                                        ^^^^^^^^
> 
Aktibier? Ist das Actimel für Leute mit Lactose-Unverträglichkeit?

Oder meinst Du vielleicht aktivieren ?

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.