www.mikrocontroller.net

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


Autor: Andreas Müller (chillymu)
Datum:

Bewertung
0 lesenswert
nicht 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:
void at128_sys_func_uart_init(){
  
  long ubbrr_val, baud_real, baud_error;
  

  // check Baud-Rate
  ubbrr_val = ((F_CPU + BAUD * 8) / (BAUD * 16) - 1); // clever runden
  baud_real = F_CPU/(16*(ubbrr_val+1));        // Reale Baudrate
  baud_error = ((baud_real * 1000)/ BAUD - 1000);      // Fehler in Promille, 1000 = kein Fehler.
  
  if ((baud_error>10) || (baud_error<-10))       // max. +/-10 Promille Fehler
      return;


  // Interrupts kurz deaktivieren 
    cli();

  
  //USBS=1: Asynchron, UCSZ=11: 8 bit, 2 stop bits 
  UCSR0C |= (1<<USBS)|(1<<UCSZ01)|(1<<UCSZ00)|(0<<UPM01)|(0<<UPM00);


  // Calculate UBRR correctly using large temp variables 
    // set baud rate
  
  UBRR0H = ubbrr_val >> 8;
  UBRR0L = ubbrr_val;
  
  UCSR0B = (1<<TXEN0) | (1<<RXEN0);

  // Interupt bit
  UCSR0B |= (1<<RXCIE0); // |(1<<UDRIE1);

  // Flush Receive-Buffer (entfernen evtl. vorhandener ungültiger Werte) 
    do
    {
        // UDR auslesen (Wert wird nicht verwendet) 
        UDR0;
    }
    while (UCSR0A & (1 << RXC0));

  // Rücksetzen von Receive und Transmit Complete-Flags 
    UCSR0A = (1 << RXC0) | (1 << TXC0);

  // Turn interrupts on
  sei(); 
  
  _delay_ms(500);

}

Sende Funktion:

void at128_sys_func_uart_write_char (unsigned char ucchar_value)
{
  while ( !( UCSR0A & (1<<UDRE0)) ){  }    
  
  UDR0 = ucchar_value;

}


Test Funktion:
unsigned char mod_func_test_test_func(char *pcParm){

  at128_sys_func_uart_write_string("start1 ");

  _delay_ms(5000);

  at128_sys_func_uart_write_string("start2 ");

  return 0;
}

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

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Leider hat du die Funktion at128_sys_func_uart_write_string nicht 
mitgeschickt.

Bist du sicher das dein Terminalprogramm dir keinen streich spielt?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.