RoboterCC - Robotic Code Compiler
Forum Robot Kits NIBO burger NiboRoboLib 3.2 ---> usart.c

Welcome

Nachrichten

Sie sind nicht eingeloggt.

Werbung

Letzte Themen

  • Keine Beiträge vorhanden

Site-Statistic

  • 7429 private projects
  • 378 public projects
  • 16175255 lines compiled
  • 58167 builds
NIBO @ facebook YouTube Twitter
Willkommen, Gast
Benutzername: Passwort: Angemeldet bleiben:
  • Seite:
  • 1

THEMA: NiboRoboLib 3.2 ---> usart.c

NiboRoboLib 3.2 ---> usart.c 8 Jahre 5 Monate her #3264

  • Georg
  • Georgs Avatar
  • OFFLINE
  • Gold Boarder
  • Beiträge: 290
Hallo,

über die serielle Schnittstelle des NiboBurger sende ich lange Strings zum Digols-LCD. Dabei gehen Daten verloren. Um den Fehler zu beheben sollte man in der Funktion usart_putchar(char c) folgende Warteschleife einfügen:
char usart_putchar(char c) 
{
 
  while (usart_txfull()) {delay(1);}   // <<<<<<-----Diese Zeile einfügen
 
  cli();
  usart_txbuf[usart_txbuf_end] = c;
  if (++usart_txbuf_end>=USART_TXBUF_SIZE) {
    usart_txbuf_end=0;
  }
  if (usart_txbuf_end==usart_txbuf_begin) {
    usart_txbuf_end=USART_TXBUF_SIZE;
  }
  // reenable transmit register empty interrupt
  UCSRB |= _BV(UDRIE);
  sei();
  return c;
}

Viele Grüße
Georg
Der Administrator hat öffentliche Schreibrechte deaktiviert.

NiboRoboLib 3.2 ---> usart.c 8 Jahre 5 Monate her #3265

  • workwind
  • workwinds Avatar
  • OFFLINE
  • Administrator
  • Beiträge: 573
Hallo Georg,

das delay (1) in der usart_putchar() Funktion würde in Verbindung mit der MThread Bibliothek das Multi-Threading torpedieren...

Aus der Doku:
char usart_putchar (char c) - Schreibt ein einzelnes Zeichen in den Sendepuffer. Darf nur aufgerufen werden solange (usart_txfull()==false) ist.

Funktion zur String-Textausgabe aus dem SRAM bzw. Flash [ungetestet ;-)]:
// SRAM:
void printText (const char * txt) {
  while (*txt) {
    while (usart_txfull()) { /* no OS -> busy wait */ }
    usart_putchar(*txt++);
  }
}
 
// Flash:
void printText_P(PGM_P s) {
  char c;
  while ((c = pgm_read_byte(s++))) {
    while (usart_txfull()) { /* no OS -> busy wait */ }
    usart_putchar(c);
  }
}

In Verbindung mit der MThread Bibliothek muss man das Busy-Waiting durch den thread_yield() Aufruf ersetzten. Die beste Lösung wäre natürlich ein Signal aus dem IRQ - dann ist es auch schon fast ein Gerätetreiber ;-)


-workwind-
Letzte Änderung: 8 Jahre 5 Monate her von workwind.
Der Administrator hat öffentliche Schreibrechte deaktiviert.

NiboRoboLib 3.2 ---> usart.c 8 Jahre 5 Monate her #3268

  • BirgerT
  • BirgerTs Avatar
  • OFFLINE
  • Gold Boarder
  • Beiträge: 325
Hi Georg, hi workwind,

wollte auf dem Nibo Burger jetzt erst mal keine "Eigenentwicklung" in die Lib schmuggeln..

Aber was haltet Ihr davon:

Für den Nibo 2 habe ich eigene UART Routinen begonnen, bei der für die Stringausgabe nicht jedes einzelne Zeichen in den FIFO geschaufelt wird, sondern nur ein Tag und die Stringadresse. Die UDRE ISR merkt sich das Tag, macht aus den beiden Folgebytes wieder einen Pointer und holt sich das so adressierte Zeichen direkt aus dem Flash (pgm_read()) oder aus dem RAM. Bei Stringende wird das Tag wieder auf Null gesetzt, und - wenn vorhanden - das nächste Byte wieder aus dem FIFO gelesen. Das kann wieder ein Tag sein, oder ein einzelnes auszugebendes Zeichen.

Ins FIFO werden also nur 3 Byte geschrieben und bis zu 32 kByte am Stück direkt und nur von der UDRE ISR ausgegeben.

Bis jetzt funktioniert das nur für ASCII Strings mit Zeichen > '\x06'; ein TAG für Binärdaten habe ich noch nicht realisiert (Adresse und Länge im FIFO); und das mit der Grafikbufferausgabe - weiß nich', ob sich das lohnt, XBM-Grafiken im Terminalprogramm am PC darzustellen.
Für den Mega16 müssten eben die Registernamen und die Init noch umgebastelt werden..

Da finde ich den Ansatz von workwind für die Baudratenberechnung in einer Funktion doch besser, als meine über Makros berechneten Tabellen.
In der Funktion (in der nächsten Lib-Version vielleicht) sollte dann aber auch die reale Baudrate wieder zurückgegeben werden, so dass man im Programm die Fehlerrate berechnen kann, und ggf. eine Error LED leuchten lässt, wenn die Ist-Baudrate zur sehr von der Soll-Baudrate abweicht.
Der Administrator hat öffentliche Schreibrechte deaktiviert.

NiboRoboLib 3.2 ---> usart.c 8 Jahre 5 Monate her #3275

  • Georg
  • Georgs Avatar
  • OFFLINE
  • Gold Boarder
  • Beiträge: 290
Hallo Workwind,

Danke für die Info. In meiner usart_putchar (siehe oben) habe ich in der neu eingefügten Zeile jetzt das delay(1) entfernt.
char usart_putchar(char c) 
{
 
  while (usart_txfull());    // <<<<<<-----Diese Zeile einfügen
 
  cli();
  usart_txbuf[usart_txbuf_end] = c;
  if (++usart_txbuf_end>=USART_TXBUF_SIZE) {
    usart_txbuf_end=0;
  }
  if (usart_txbuf_end==usart_txbuf_begin) {
    usart_txbuf_end=USART_TXBUF_SIZE;
  }
  // reenable transmit register empty interrupt
  UCSRB |= _BV(UDRIE);
  sei();
  return c;
}
Deinen Vorschlag der printText-Funktion (SRAM) habe ich ebenfalls erfolgreich getestet.

Hallo BirgerT,
deinen Vorschlag kann ich nicht beurteilen, weil mir das nötige Fachwissen fehlt.

lg Georg
Der Administrator hat öffentliche Schreibrechte deaktiviert.
  • Seite:
  • 1
Ladezeit der Seite: 0.143 Sekunden

Werbung