Intterrupt funktioniert nicht

Gast #918914
Lesenswert?

Hallo liebe Leute!

ich möchte sobald ein High-Pegel an INT0 meines AT90S8515 anliegt, einen 
Interrupt auslösen, der dann über den UART 0xFF schickt, sobald der 
Buffer frei ist.

Warum funktioniert das nicht?

1
#include <avr/io.h>
2
#include <inttypes.h>
3
#include <avr/interrupt.h>
4

5

6

7
ISR (INT0_vect) 
8
{
9
  
10
  while (!(UCSRA & (1<<UDRE)));          // warten bis Senden moeglich
11
    
12
 
13
    UDR = 0xFF;
14
      
15
}
16

17
int main(void) 
18
{
19
    
20
  UCSRB |= (1<<TXEN);                         //Senden aktivieren
21
  UCSRC |= (1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1);  
22

23
  UBRRH = 00;                             //Baudrate einstellen 9600 bei 8 MHz
24
  UBRRL = 51;
25

26

27
  sei();                                    //Interrupts zulassen
28

29
    while (1); 
30
  
31
    return 0;
32
}



Tastenentprellung ist noch nicht eingebaut, ist klar! Es sollte aber 
trotzdem schon was ankommen, wenn ich mit einem Draht von Vcc auf den 
Int0-PIN gehe....

Vielen Dank!
Gast #918981
Lesenswert?

Hier mal der Aktuelle Code:

 -> Funktioniert immer noch nicht.

1
#include <avr/io.h>
2
#include <inttypes.h>
3
#include <avr/interrupt.h>
4

5

6

7
ISR (INT0_vect) 
8
{
9
  
10
  while (!(UCSRA & (1<<UDRE)));          // warten bis Senden moeglich
11
 
12
    UDR = 0x67;
13
      
14
}
15

16
int main(void) 
17
{
18
  
19
    
20
  MCUCR |= (1<<ISC01) | (1<<ISC00);      // Interrupt auslösen bei steigender Flanke
21
  GICR |= (1<<INT0);
22
  
23
  UCSRB |= (1<<TXEN);                         //Senden aktivieren
24
  UCSRC |= (1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1);  
25

26
  UBRRH = 00;                             //Baudrate einstellen 9600 bei 8 MHz
27
  UBRRL = 51;
28

29
  DDRD = 0x00;
30

31

32
  sei();                                    //Interrupts zulassen
33

34
    while (1); 
35
  
36
    return 0;
37
}


Danke!
Gast #919004
Lesenswert?

Das Senden funktioniert generell schon, habe zwar auch gerade ein 
Phänomen entdeckt, siehe:

Ein Ausschnitt aus deinem Vorschlag (main-Funktion):
1
int y;
2

3
for (y=0;y<10;y++)
4
{
5
   UDR = 64;
6
}

Was kam raus: er hat nur 2 Zeichen auf dem Terminal ausgegeben.
Gast #919017
Lesenswert?

Also es funktioniert jetzt:

Mit folgendem CODE:

1
#include <avr/io.h>
2
#include <inttypes.h>
3
#include <avr/interrupt.h>
4

5

6

7
ISR (INT0_vect) 
8
{
9
  
10
  while (!(UCSRA & (1<<UDRE)));          // warten bis Senden moeglich
11
 
12
    UDR = 0x41;
13
      
14
}
15

16
int main(void) 
17
{
18
  
19
    
20
  MCUCR |= (1<<ISC01) | (1<<ISC00);      // Interrupt auslösen bei steigender Flanke
21
  GICR |= (1<<INT0);
22
  
23
  UCSRB |= (1<<TXEN);                         //Senden aktivieren
24
  UCSRC |= (1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1);  
25

26
  UBRRH = 00;                             //Baudrate einstellen 9600 bei 8 MHz
27
  UBRRL = 51;
28

29
  DDRD = 0x00;
30

31

32
  sei();                                    //Interrupts zulassen
33

34
    while (1); 
35
  
36
    return 0;
37
}



Danke!

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