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


von abcd (Gast)


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
1
  PORTD |= (1<<PD7);  //auf 1 gesetzt
2
  PORTD &= ~((1<<PD6) | (1<<PD5) | (1<<PD4)); 
3
  
4
  DDRD |= (1<<DDD6) | (1<<DDD7) | (1<<DDD5) | (1<<DDD4); 
5
  DDRD &= ~(1<<DDD2);
6
  
7
  PORTB = 0xFF;
8
  DDRB = 0xFF;
9
10
11
  PORTC = 0xFF;
12
  DDRC = 0x00;
13
  
14
  CLKPR = 0x80; 
15
  CLKPR = 0x00;
16
17
  UBRR1= (8>>8); //57,6k, 8MHZ
18
  UBRR1= 8;
19
  UCSR1B= (0<<RXEN1) | (1<<TXEN1) | (0<<RXCIE1) | (1<<TXCIE1);
20
  UCSR1C= (0<<USBS1) | (3<<UCSZ10);
21
22
23
24
  TCCR0A &= ~((1<<WGM00) | (1<<WGM01));
25
  TCCR0B |= (1<<CS00);
26
  TCCR0B &= ~((1<<CS01) | (1<<CS02));
27
  TIMSK0 |= (1<<TOIE0);
28
29
  EICRA |= (1<<ISC20) | (1<<ISC21);
30
  EIMSK |= (1<<INT2);
31
32
  sei();


MfG

von abcd (Gast)


Lesenswert?

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

von Peter D. (peda)


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

von abcd (Gast)


Angehängte Dateien:

Lesenswert?

Es ist ein at90usb162.

Code befindet sich im Anhang.

von holger (Gast)


Lesenswert?

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

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

von holger (Gast)


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:(

von abcd (Gast)


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.

von abcd (Gast)


Lesenswert?

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

von abcd (Gast)


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

von abcd (Gast)


Lesenswert?

Hallo

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

1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
4
void init(void)
5
{
6
7
  PORTB = 0x01;
8
  DDRB = 0xFF;  als Ausgang aktiviert für LED
9
  
10
  PORTD = 0xFF;  
11
  DDRD = 0x00;  als Eingang aktiviert für Interrupt Kontrolle
12
13
  EICRA = 0xFF;  steigende Flanke, Interrupt 0-3
14
  EICRB = 0xFF;  steigende Flanke, Interrupt 4-7
15
  EIMSK = 0xFF;  alle external Interrupts aktiviert 0-7
16
17
18
  sei();
19
20
}
21
22
ISR (INT2_vect) 
23
{
24
25
  if(PIND & (1<<PD2))  Je nach Flanke leuchtet die jeweilige LED
26
  {
27
    PORTB |= 0x04;
28
  }
29
  else
30
    PORTB |= 0x08;
31
32
}
33
34
35
ISR (INT1_vect) 
36
{
37
38
  if(PIND & (1<<PD2))
39
  {
40
    PORTB |= 0x10;
41
  }
42
  else
43
    PORTB |= 0x20;
44
45
}
46
47
int main (void)
48
{
49
  init();
50
51
  while(1)
52
  {
53
    if(PIND & (1<<PD2))
54
    {
55
      PORTB = 0x01;
56
    }
57
    else
58
    {
59
      PORTB = 0x02;
60
    }
61
  }
62
}

Danke!

MFG

von Memphis (Gast)


Lesenswert?

@abcd

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

ciao

memphis

von Karl H. (kbuchegg)


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)?

von abcd (Gast)


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.

von Peter D. (peda)


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

von abcd (Gast)


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.

von Peter D. (peda)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.