Forum: Compiler & IDEs Intterrupt funktioniert nicht


von Meik (Gast)


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!

von Andreas K. (a-k)


Lesenswert?

Wie wär's, wenn du INT0 überhaupt erst einmal als Interrupt-Eingang 
definierst?

Dazu kommt, dass der Anschluss schon vorher high sein kann, wenn er 
offen ist und keiner da ist, der ihn runterzieht.

von Meik (Gast)


Lesenswert?

also ich hab noch die Zeile   "DDRD = 0x00;" eingefügt. Funktioniert 
trotzdem nicht. Habe die Spannung zwischen GND und INT0 gemessen, ist 0V 
potenzial.


funktioniert also nicht ;)

von Stefan E. (sternst)


Lesenswert?

Nein, was Andreas meint, ist, dass du den INT0-Interrupt noch 
freischalten musst.

von Andreas K. (a-k)


Lesenswert?

Meik wrote:

> Habe die Spannung zwischen GND und INT0 gemessen, ist 0V
> potenzial.

Miss mal die Spannung zwischen VCC und INT0. Wetten dass da auch 0V 
rauskommt?

von Meik (Gast)


Lesenswert?

ja da haste Recht.

hm....Ich dachte mit sei() würde man das Interrupt Enable Flag setzen? 
Was benötigt man denn noch außer diesem Makro?

von Meik (Gast)


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!

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Meik wrote:

>  -> Funktioniert immer noch nicht.

Lässt sich nichtmal compilieren, da du allerlei Registernamen benutzt,
die es beim AT90S8515 gar nicht gibt.

von Meik (Gast)


Lesenswert?

sorry, es ist ein ATMega8515 und kein AT90S8515!

von Stefan E. (sternst)


Lesenswert?

1) Pulldown an den Port hängen.
2) Versuch mal in main was zu senden, um zu sehen, ob das Senden 
generell funktioniert.

von Meik (Gast)


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.

von Thomas B. (detritus)


Lesenswert?

>>  while (!(UCSRA & (1<<UDRE)));          // warten bis Senden moeglich

von Meik (Gast)


Lesenswert?

Also jetzt mal konkret:

Welche Flags in welchen Registern benötige ich für einen INT0 bei 
steigender Flanke?

Findet man nicht wirklich im Tutorial.

Was stimmt noch nicht?


Danke

von Meik (Gast)


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!

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.