Forum: Mikrocontroller und Digitale Elektronik AtMega 128 uart sendet string nicht sofort


von Andreas M. (chillymu)


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

von Peter (Gast)


Lesenswert?

Leider hat du die Funktion at128_sys_func_uart_write_string nicht 
mitgeschickt.

Bist du sicher das dein Terminalprogramm dir keinen streich spielt?

von Karl H. (kbuchegg)


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.

von Stefan E. (sternst)


Lesenswert?

Ein Ser/USB-Wandler könnte auch noch ein Kandidat für eine Verzögerung 
sein. Der könnte so eingestellt sein, dass die Daten erst zum PC gehen, 
wenn eine gewisse Mindestanzahl vorliegt.

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


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...

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
Noch kein Account? Hier anmelden.