mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Interrupt wird nicht ausgeführt


Autor: abcd (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

ich verwende einen at90 Controller. Ich bräuchte einen externen 
Interrupt auf INT2. Komischerweise wird er nur am Anfang ausgeführt und 
ab dann wird er nicht mehr ausgeführt.

Tx funktioniert ohne Probleme muss man beim INT2 etwas umstellen damit 
der funtioniert.

Hier sind die Eistellungen
  PORTD |= (1<<PD7);  //auf 1 gesetzt
  PORTD &= ~((1<<PD6) | (1<<PD5) | (1<<PD4)); 
  
  DDRD |= (1<<DDD6) | (1<<DDD7) | (1<<DDD5) | (1<<DDD4); 
  DDRD &= ~(1<<DDD2);
  
  PORTB = 0xFF;
  DDRB = 0xFF;


  PORTC = 0xFF;
  DDRC = 0x00;
  
  CLKPR = 0x80; 
  CLKPR = 0x00;

  UBRR1= (8>>8); //57,6k, 8MHZ
  UBRR1= 8;
  UCSR1B= (0<<RXEN1) | (1<<TXEN1) | (0<<RXCIE1) | (1<<TXCIE1);
  UCSR1C= (0<<USBS1) | (3<<UCSZ10);



  TCCR0A &= ~((1<<WGM00) | (1<<WGM01));
  TCCR0B |= (1<<CS00);
  TCCR0B &= ~((1<<CS01) | (1<<CS02));
  TIMSK0 |= (1<<TOIE0);

  EICRA |= (1<<ISC20) | (1<<ISC21);
  EIMSK |= (1<<INT2);

  sei();


MfG

Autor: abcd (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe vergessen zu sagen dass der Interrupt bei einer steigenden Flanke 
ausgeführt werden soll

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
abcd schrieb:
> ich verwende einen at90 Controller.

Welchen?

Erspare uns bitte diese Schnipselchen-Raterei.
Das ist reine Zeitverschwendung und führt regelmäßig zu absolut 
garnichts.

Poste ein compilierbares Main + Interrupthandler.


Peter

Autor: abcd (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Es ist ein at90usb162.

Code befindet sich im Anhang.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
UCSR1B= (0<<RXEN1) | (1<<TXEN1) | (0<<RXCIE1) | (1<<TXCIE1);

Und wo sind die Interruptroutinen für RXC1 und TXC1?

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>UCSR1B= (0<<RXEN1) | (1<<TXEN1) | (0<<RXCIE1) | (1<<TXCIE1);
>
>Und wo sind die Interruptroutinen für RXC1 und TXC1?

Ups, natürlich nur TXC1:(

Autor: abcd (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die kann ich noch hinzufügen aber glaube kaum dass die eine Rolle 
spielen. Wollte den Code übersichtlicher halten. TXC1 ist kein 
Interrupt. Somit TXCIE1 auch auf 0 setzen.

Probleme macht mir aber der Interrupt INT2.

Autor: abcd (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn ich den PIN als Eingang schalte, spielt es da eine große Rolle ob 
der Pull-Up Resistor aktiviert ist?

Autor: abcd (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

auf der Seite 81 von diesem Datenblatt - müßte man eine Einstellung 
ändern damit man External Interrupts verwenden kann oder kann man 
External Interrupts und USART gleichzeitig verwenden.

http://www.datasheetdir.com/AT90USB162+download

Autor: abcd (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

kann mir vielleicht jemand sagen was an diesem Code falsch ist dass es 
nicht in den external Interrupt springt

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

void init(void)
{

  PORTB = 0x01;
  DDRB = 0xFF;  als Ausgang aktiviert für LED
  
  PORTD = 0xFF;  
  DDRD = 0x00;  als Eingang aktiviert für Interrupt Kontrolle

  EICRA = 0xFF;  steigende Flanke, Interrupt 0-3
  EICRB = 0xFF;  steigende Flanke, Interrupt 4-7
  EIMSK = 0xFF;  alle external Interrupts aktiviert 0-7


  sei();

}

ISR (INT2_vect) 
{

  if(PIND & (1<<PD2))  Je nach Flanke leuchtet die jeweilige LED
  {
    PORTB |= 0x04;
  }
  else
    PORTB |= 0x08;

}


ISR (INT1_vect) 
{

  if(PIND & (1<<PD2))
  {
    PORTB |= 0x10;
  }
  else
    PORTB |= 0x20;

}

int main (void)
{
  init();

  while(1)
  {
    if(PIND & (1<<PD2))
    {
      PORTB = 0x01;
    }
    else
    {
      PORTB = 0x02;
    }
  }
}

Danke!

MFG

Autor: Memphis (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@abcd

der springt sicher in die ISR ... aber in Deiner Mainloop überschreibst 
Du Dir ja jedes mal Dein PORTB wieder...

ciao

memphis

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

Bewertung
0 lesenswert
nicht lesenswert
abcd schrieb:
> Hallo
>
> kann mir vielleicht jemand sagen was an diesem Code falsch ist dass es
> nicht in den external Interrupt springt

Woher weißt du das?


>   EICRA = 0xFF;  steigende Flanke, Interrupt 0-3
>   EICRB = 0xFF;  steigende Flanke, Interrupt 4-7
>   EIMSK = 0xFF;  alle external Interrupts aktiviert 0-7

Dir ist aich klar, dass ein freigegebener Interrupt für den du keinen 
Handler hast, den µC resettet sollte das Interrupt auslösende Ereignis 
eintreten.

Niemals Interrupts freigeben, für die es keinen Handler gibt!

>   while(1)
>   {
>     if(PIND & (1<<PD2))
>     {
>       PORTB = 0x01;
>     }
>     else
>     {
>       PORTB = 0x02;
>     }

Und wie denkst du, das du das Aufblitzen der LEDs in der ISR sehen 
willst, wenn du hier laufend die LEDS wieder abschaltest (oder 
einschaltest. Ist aber egal, hauptsache du setzt sie auf einen fixen 
Wert)?

Autor: abcd (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Woher weißt du das?

Da ich es mit dem Simulator getestet habe. Egal ob ich Breakpoints setze 
oder auch PORTB verodere, die Pins von PORTD sind nie auf High, außer 
die von PIN 1 und 2.

Im ersten Programm was ich geschickt habe, habe ich diese Zeile stehen:

while(EIMSK & (1<<INT2))

Es bleibt immer in dieser while-Schleife hängen da im Interrupt das 
nicht auf LOW gesetzt wird.

Kann es gerne auch noch irgendwie anders testen.

>Dir ist aich klar, dass ein freigegebener Interrupt für den du keinen
>Handler hast, den µC resettet sollte das Interrupt auslösende Ereignis
>eintreten.

Egal ob ich alle frei gebe oder nur die Betreffenden=> ändert nicht 
viel.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
abcd schrieb:
> Egal ob ich alle frei gebe oder nur die Betreffenden=> ändert nicht
> viel.

Nagut und wer will denn hier Hilfe?

Du hast Tonnen von Fehlern genannt gekriegt, beseitige sie einfach.
Erst dann kann man weiter sehen.


Peter

Autor: abcd (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Nagut und wer will denn hier Hilfe?
>
>Du hast Tonnen von Fehlern genannt gekriegt, beseitige sie einfach.
>Erst dann kann man weiter sehen.

Was meinst du damit?

Ich habe es geändert. Das EICRA und EIMSK Register habe ich geändert und 
alle PORTB mit ODER verknüpft.

Wenn ich Breakpoints setze ändert das nichts und in der Simulation sind 
auch die PORTB von den ISR nicht gesetzt.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
abcd schrieb:
> Ich habe es geändert. Das EICRA und EIMSK Register habe ich geändert und
> alle PORTB mit ODER verknüpft.

Dann zeig es her (als compilierbarer Anhang).
Wie soll man sonst den Fehler sehen?


Peter

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.