Ich habe hier eine kleine FW geschrieben (Anhang) die über die UART-Schnittstelle Zeichen einliest und wieder zurücksendet (die FW wird später noch erweitert). Folgendes Problem ist aufgetreten: Wenn ich in der Main _delay_us(1); wegkommentiere werden keine Zeichen gesendet. Mir ist das unerklärlich warum das sein könnte. Folgende Daten: Atmega32, 8MHz Takt Hat da jemand eine Idee??
fragender schrieb: > Hat da jemand eine Idee?? Die da sollten auf jedenfall volatile-deklariert sein, sonst kann es Probleme mit der Optimierung geben: uint8_t uart_complete=0; char data_string[200]; Sie werden im Interrrupt verändert und das kann in der Main-Loop Probleme machen.
Nee nicht ganz so. Die Variable sind local und werden nach jedem Durchlauf vernichtet.
1 | unsigned char next_byte; |
2 | uint8_t uart_str_count = 0; |
Richtig ist das Schlüsselwort static.
1 | uart_str_count++; |
Außerhalb der der IF-Abfrage ist auch falsch!
1 | if (uart_str_count<=200){ |
2 | // ....
|
3 | } else { |
4 | // ....
|
5 | }
|
6 | uart_str_count++; |
Da gibts einiges zu verbessern. Schau mal folgende schnell gebastele Variante von mir an:
1 | #define F_CPU 8000000UL
|
2 | #define UART_BAUD_RATE 9600L
|
3 | #define UART_BAUD_CALC(UART_BAUD_RATE,F_CPU) ( (F_CPU)/(UART_BAUD_RATE*16L)-1 )
|
4 | |
5 | |
6 | #include <stdio.h> |
7 | |
8 | #include <avr/io.h> |
9 | #include <avr/interrupt.h> |
10 | #include <util/delay.h> |
11 | #include <avr/eeprom.h> |
12 | #include <stdbool.h> |
13 | |
14 | volatile _Bool bReady = false; |
15 | volatile char aucData[200]; |
16 | volatile uint8_t ucPos = 0; |
17 | |
18 | int uart_putc(unsigned char c){ |
19 | while (!(UCSRA & (1<<UDRE))); |
20 | |
21 | UDR = c; |
22 | return 0; |
23 | }
|
24 | |
25 | void uart_puts (const char *s) |
26 | {
|
27 | while (*s) { |
28 | uart_putc(*s++); |
29 | }
|
30 | }
|
31 | |
32 | int main(void) |
33 | {
|
34 | lcd_ini(); |
35 | |
36 | DDRB=0xFF; |
37 | |
38 | UCSRB|= (1<<RXEN) | (1<<TXEN) | (1<<RXCIE); |
39 | UCSRC|= (1<<UCSZ0) | (1<<UCSZ1); |
40 | |
41 | UBRRH= (uint8_t) (UART_BAUD_CALC(UART_BAUD_RATE,F_CPU)>>8); |
42 | UBRRL= (uint8_t) UART_BAUD_CALC(UART_BAUD_RATE,F_CPU); |
43 | |
44 | sei(); |
45 | |
46 | while(1){ |
47 | if (bReady){ //Es soll gesendet werden? |
48 | uart_puts(aucData); //String senden |
49 | ucPos = 0; //Bufferposition auf 0 setzen |
50 | bReady = false; //Empfang wieder freigeben |
51 | }
|
52 | }
|
53 | }
|
54 | |
55 | |
56 | |
57 | ISR (USART_RXC_vect) |
58 | {
|
59 | char ucVal; |
60 | |
61 | ucVal=UDR; |
62 | |
63 | if(bReady) //Sendet gerade? |
64 | return; //Empfangenes Zeichen ignorieren |
65 | |
66 | if(ucPos == 199) //Letzte freie Position? |
67 | ucVal = '\0'; //Zeichen zu Stringende konvertieren |
68 | |
69 | aucData[ucPos++] = ucVal; //Zeichen abspeichern |
70 | |
71 | if(ucVal == '\0'){ //Stringende erhalten? |
72 | bReady = true; //String senden! |
73 | }
|
74 | }
|
Beitrag #5235173 wurde von einem Moderator gelöscht.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.