Hi, ich bin grad dabei mir eine kleine uart-empfangsroutine zu schreiben und häng an einem Problem fest. Also die uart läuft ohne probleme und löst auch interrupts aus.
1 | #define rx_buffer_len 32
|
2 | |
3 | unsigned char rx_buffer[rx_buffer_len]; |
4 | unsigned char *ptr_read = rx_buffer; |
5 | unsigned char *ptr_write = rx_buffer; |
6 | |
7 | |
8 | void init_uart (void){ |
9 | UBRRH = (unsigned char)(bauddivider>>8); |
10 | UBRRL = (unsigned char)bauddivider; |
11 | |
12 | UCSRA = (1<<U2X); |
13 | UCSRB = (1<<RXCIE)|(1<<RXEN)|(1<<TXEN); |
14 | UCSRC = (1<<UCSZ1)|(1<<UCSZ0); |
15 | |
16 | }
|
17 | |
18 | |
19 | void uart_putchar(unsigned char c) |
20 | {
|
21 | while( !( UCSRA & (1<<UDRE))); |
22 | UDR = c; |
23 | }
|
24 | |
25 | |
26 | |
27 | ISR(USART_RX_vect) |
28 | {
|
29 | *ptr_write= UDR; |
30 | ptr_write++; |
31 | if(ptr_write == rx_buffer + rx_buffer_len) ptr_write = rx_buffer; |
32 | |
33 | while ( !( UCSRA & (1<<UDRE)) ); |
34 | |
35 | }
|
36 | |
37 | |
38 | int main(void){ |
39 | |
40 | DDRB = 0x1F; |
41 | PORTB = 0xFF; |
42 | |
43 | DDRD = 0x30; |
44 | PORTD = 0x00; |
45 | |
46 | init_uart(); |
47 | |
48 | sei(); |
49 | |
50 | while(1){ |
51 | |
52 | for(unsigned char i = 0 ; i < rx_buffer_len ; i++) |
53 | uart_putchar(rx_buffer[i]); |
54 | |
55 | |
56 | uart_putchar(*ptr_write); |
57 | uart_putchar(*ptr_read); |
58 | |
59 | |
60 | _delay_ms(5000); |
61 | |
62 | |
63 | }
|
64 | |
65 | }
|
also wie schon erwähnt senden und empfangen funtioniert sehr gut. wenn ich das programm starte bekomm ich folgendes auf dem 232-Term: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 also der Buffer-inhalt + die zwei zeigerinhalte alles 00 ... soweit so gut sende ich jetzt ein zeichen (z.B. 0xAA) bekomm ich so etwas: AA 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 AA AA das Zeichen 0xAA steht am anfang vom Buffer. Der lesezeiger (ptr_read) zeigt auf das erste element, was auch so sein soll ... aber wiso zeigt der zweite Zeiger auf das gleiche Zeichen? wenn ich jetzt aber 0xff sende bekomm ich folgendes: AA FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 AA AA der ptr_write zeigt also immer auf das nächste element im speicher.. aber nur in der ISR .. sonst immer auf das erste... kamm mir da einer weiterhelfen? Was mache ich da falsch? gruß Mathias