Hallo Leute,
ich hoffe ihr könnt mir weiter helfen. Ich habe in einem ATmega 128
einen Uart intergriert. Das funktioniert auch im Grund alles super.
Ich habe nur ein Problem. Wenn ich einen String in einer Funktion an
meine Terminal-Programm sende, dann wird es erst am Ende einer jeden
Funktion angezeigt.
Ich mir dafür ein Beispiel-Programm geschrieben um es zu testen.
Hier der Code:
Initialisierung:
1 | void at128_sys_func_uart_init(){
|
2 |
|
3 | long ubbrr_val, baud_real, baud_error;
|
4 |
|
5 |
|
6 | // check Baud-Rate
|
7 | ubbrr_val = ((F_CPU + BAUD * 8) / (BAUD * 16) - 1); // clever runden
|
8 | baud_real = F_CPU/(16*(ubbrr_val+1)); // Reale Baudrate
|
9 | baud_error = ((baud_real * 1000)/ BAUD - 1000); // Fehler in Promille, 1000 = kein Fehler.
|
10 |
|
11 | if ((baud_error>10) || (baud_error<-10)) // max. +/-10 Promille Fehler
|
12 | return;
|
13 |
|
14 |
|
15 | // Interrupts kurz deaktivieren
|
16 | cli();
|
17 |
|
18 |
|
19 | //USBS=1: Asynchron, UCSZ=11: 8 bit, 2 stop bits
|
20 | UCSR0C |= (1<<USBS)|(1<<UCSZ01)|(1<<UCSZ00)|(0<<UPM01)|(0<<UPM00);
|
21 |
|
22 |
|
23 | // Calculate UBRR correctly using large temp variables
|
24 | // set baud rate
|
25 |
|
26 | UBRR0H = ubbrr_val >> 8;
|
27 | UBRR0L = ubbrr_val;
|
28 |
|
29 | UCSR0B = (1<<TXEN0) | (1<<RXEN0);
|
30 |
|
31 | // Interupt bit
|
32 | UCSR0B |= (1<<RXCIE0); // |(1<<UDRIE1);
|
33 |
|
34 | // Flush Receive-Buffer (entfernen evtl. vorhandener ungültiger Werte)
|
35 | do
|
36 | {
|
37 | // UDR auslesen (Wert wird nicht verwendet)
|
38 | UDR0;
|
39 | }
|
40 | while (UCSR0A & (1 << RXC0));
|
41 |
|
42 | // Rücksetzen von Receive und Transmit Complete-Flags
|
43 | UCSR0A = (1 << RXC0) | (1 << TXC0);
|
44 |
|
45 | // Turn interrupts on
|
46 | sei();
|
47 |
|
48 | _delay_ms(500);
|
49 |
|
50 | }
|
Sende Funktion:
1 | void at128_sys_func_uart_write_char (unsigned char ucchar_value)
|
2 | {
|
3 | while ( !( UCSR0A & (1<<UDRE0)) ){ }
|
4 |
|
5 | UDR0 = ucchar_value;
|
6 |
|
7 | }
|
Test Funktion:
1 | unsigned char mod_func_test_test_func(char *pcParm){
|
2 |
|
3 | at128_sys_func_uart_write_string("start1 ");
|
4 |
|
5 | _delay_ms(5000);
|
6 |
|
7 | at128_sys_func_uart_write_string("start2 ");
|
8 |
|
9 | return 0;
|
10 | }
|
Im Terminal Programm kommt dann beim Ausführen der Testfunktion nach 5s
"start1 start2"
Woran liegt das und wie bekomme ich es hin, dass die einzelnen strings
sofort gesendet werden.
Danke für eure Hilfe
Gruß chillymu