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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.