Hallo zusammen,
ich habe ein Problem mit der USART-Interrupt-Routine. Beim Testen fiel
mir auf, dass der Interrupt nach dem ersten Senden immer wieder
angesprungen wird, er quasi in einer Endlosschleife hängen bleibt. Zum
Testen habe ich einfach eine Ausgabe über die Serielle Schnittstelle
geschickt. Wenn ich dort mitlogge, werden genau diese Zahlen immer
wieder gesendet. Der Code sieht momentan folgendermaßen aus (die
wesentliche Funktionalität habe ich aus debug-gründen derzeit nicht
implementiert, der Timer spielt hierbei ebenfalls keine Rolle)
1 | #include "main.h"
|
2 |
|
3 | uint8_t recstate = 0;
|
4 |
|
5 | Sensor Accx(7, "AccX");
|
6 | Sensor Accy(6, "AccY");
|
7 |
|
8 | SerialOut sout;
|
9 |
|
10 | Timer timer;
|
11 | ISR(USART0_RX_vect) {
|
12 | sout.send8(2,123);
|
13 | }
|
14 |
|
15 | ISR (TIMER0_OVF_vect){
|
16 | timer.counter++;
|
17 | if(timer.counter == 20) {
|
18 | timer.counter = 0;
|
19 | timer.msec_counter++;
|
20 | if(timer.beepactive) PORTC |= (1<<7);
|
21 | else PORTC &= ~(1<<7);
|
22 | if(timer.msec_counter==timer.counterend)
|
23 | timer.beepactive=0;
|
24 | }
|
25 |
|
26 | }
|
27 |
|
28 | int main(void) {
|
29 | sei();
|
30 | timer.beep(25);
|
31 | while(true){
|
32 | while(recstate==1){
|
33 | sout.send816(1,Accx.getvalue());
|
34 | sout.send816(2,Accy.getvalue());
|
35 | }
|
36 | }
|
37 | }
|
der Serielle Ausgang ist folgendermaßen implementiert:
serialout.cpp: (TXEN, RXEN, USR, UCSRB, UBRR, RXCIE, TXCIE, U2X, SYSCLK
sind alle in der entsprechenden Header-Datei definiert)
1 | #include "serialout.h"
|
2 |
|
3 | SerialOut::SerialOut(){
|
4 | UCR=(1 << TXEN) | (1 << RXEN);
|
5 | USR |= (1<<U2X);
|
6 | UCSRB |= (1<<RXCIE);
|
7 | UCSRB |= (1<<TXCIE);
|
8 | UBRR=(SYSCLK / (38400 * 8L) - 1);
|
9 | };
|
10 |
|
11 | void SerialOut::sendsingle16(int16_t a)
|
12 | {
|
13 | int8_t teil1=(int8_t)(a>>8);
|
14 | sendsingle8(teil1);
|
15 | int8_t teil2=(int8_t)((a<<8)>>8);
|
16 | sendsingle8(teil2);
|
17 |
|
18 | }
|
19 | void SerialOut::sendsingle8(int8_t a)
|
20 | {
|
21 | while ( !( USR & (1<<UDRE0)) ) ;
|
22 | UDR0 = a;
|
23 | }
|
24 |
|
25 |
|
26 | void SerialOut::send16(int a, int b)
|
27 | {
|
28 | sendsingle16(a);
|
29 | sendsingle16(b);
|
30 | }
|
31 | void SerialOut::send8(int a, int b)
|
32 | {
|
33 | sendsingle8(a);
|
34 | sendsingle8(b);
|
35 | }
|
36 | void SerialOut::send816(int a,int b)
|
37 | {
|
38 | sendsingle8(a);
|
39 | sendsingle16(b);
|
40 | }
|
41 |
|
42 |
|
43 | SerialOut::~SerialOut(){};
|
Wenn ich nun ein Signal sende, bekomme ich in einer Endlosschleife "2
123" zurückgesendet. Hat jemand eine Idee, woran das liegen könnte?