Forum: Compiler & IDEs UART Interrupt löst nicht aus


von Muli (Gast)


Lesenswert?

Hallo

Ich will auf einem ATmega32 eine UART/RS232 Verbindung einrichten. Ich 
nutze die Lib von P. Fleury
Soweit alles schön und gut. Kann wunderbar Zeichen empfangen und auch 
Senden. Allerdings will ich jetzt mit einem Interrupt arbeiten.

Ich will erstmal erreichen, dass mir mein Mega32 beim Receive Complete 
Interrupt, also dann wenn er ein neues Byte im Buffer hat, in eine ISR 
springt.


Folgendes haben ich bisher gemacht:
1
int main(void)
2
{
3
...
4
  sei();
5
6
  UCSRB |= (1<<RXCIE);          // Activate UART receive complete interrupt
7
8
9
...
10
11
   return 0;
12
}
13
14
15
ISR(UART0_RECEIVE_INTERRUPT)
16
{
17
  set_leds(LED_RECEIVING,LED_ON);
18
  _delay_ms(1000);
19
}
20
21
[c]
22
23
Das Synonym "UART0_RECEIVE_INTERRUPT" ist in der uart.c von Fleury zu finden:
24
25
[c]
26
 #define UART0_RECEIVE_INTERRUPT   SIG_UART_RECV

Es ist also ein Synonym für den Interruptvector in der Mega32 
Headerdatei.


So, egal was ich nun dem AVR schicke, der geht partou nicht in diese ISR 
rein. Woran kann das liegen?

von Stefan E. (sternst)


Lesenswert?

Du hast zwar den Receive-Interrupt freigeschaltet, aber den Receiver 
selber nicht eingeschaltet.

von Muli (Gast)


Lesenswert?

Hi

Stimmt, aber daran liegts nicht.
Soweit ich das im Kopf hab wird das von der Lib von P Fleury übernommen. 
Habs gerade auch "zu Fuß" probiert, ohne Ergebnis.

von Stefan E. (sternst)


Lesenswert?

Aha, du benutzt also "nebenbei" auch noch die Fleury-Lib weiter. Dann 
kann das auch nichts werden, weil die Fleury-Lib den Interrupt schon 
selber verwendet. Fehlermeldung vom Linker einfach ignoriert?

von Muli (Gast)


Lesenswert?

Oh ja, hätte mir die Lib mal früher anschauen sollen ;-)

Stimmt. Naja, mal schauen ob ich da noch irgendwas verschlimmbessern 
kann ;-)

von Werner A. (homebrew)


Lesenswert?

apropos verschlimmbessern...
Du könntest die delayroutine im Interrupt noch länger machen

von Michael H* (Gast)


Lesenswert?

sei();?

von Chris L. (kingkernel)


Lesenswert?

Was habt ihr nur dauerns mit der delay-Routine? Die geht doch bei über 5 
sekunden noch genau, dachte ich. allerdings muss man dafür die 
util/delay.h einbinden!

von Stefan E. (sternst)


Lesenswert?

Christian L. wrote:
> Was habt ihr nur dauerns mit der delay-Routine?

Man verwendet kein delay in einer Interruptroutine (schon gar nicht in 
der Größenordnung). Interrupts sollen immer so kurz wie irgend möglich 
sein. Bei einem Test, ob der Interrupt überhaupt aufgerufen wird, ist es 
aber ok.

von Chris L. (kingkernel)


Lesenswert?

Achso, es ging gar nicht im das delay selbst, sondern darum, wo es 
eingesetzt wird. Alles klar!

von Muli (Gast)


Lesenswert?

Das delay war auch nur zum Test da und kam danach auch wieder artig raus 
;-)

Ansonsten ist die delay-Routine schon extrem genau, da kann man nicht 
meckern ;-)

von Matthias L. (Gast)


Lesenswert?

>Ansonsten ist die delay-Routine schon extrem genau, da kann man nicht
>meckern ;-)

Nur legt sie praktisch den µC lahm. Und da muss man meckern..
=> Timer

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.