Interrupt wird nicht ausgeführt

Gast #1757979
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
Gast #1758155
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.
Gast #1759043
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
#1759135
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)?
Gast #1759447
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.
Gast #1759540
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren