AtMega 128 uart sendet string nicht sofort

OP #1364037
Lesenswert?

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
#1364056
Lesenswert?

Andreas Müller schrieb:

> Woran liegt das und wie bekomme ich es hin, dass die einzelnen strings
> sofort gesendet werden.

Gesendet werden sie mit Sicherheit sofort. Schliesslich kann das kleine 
UDR Register mit seinem 8 Bit nicht einen ganzen String 
zwischenspeichern.

Könnte natürlich auch sein, dass dein Terminalprogramm den String erst 
dann anzeigt, wenn es einen \n erhält, oder in einem Timeout läuft.

Probier doch mal:
  at128_sys_func_uart_write_string("start1\n");

Dann solltest du die Einstellungen des Terminalprogramms mal 
durchforsten oder ein anderes Terminalprogramm nehmen.
(Firma: TravelRec.) Persönliche Seite #1364098
Lesenswert?

Bei HTerm hatte ich es schon, daß nur alle paar Bytes etwas neues auf 
dem Schirm angezeigt wurde. Alles war komplett richtig, kam aber 
bröckchenweise. Der PC selbst war nicht der schnellste und dessen 
COM-Schnittstelle war wohl der Grund für die Verzögerung. Witzig war, 
daß man nie genau sagen konnte, wieviele Bytes man schicken musste, 
damit wieder ein Bröckchen ankam...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren