www.mikrocontroller.net

Forum: GCC Problem mit Displayausgabe


Important announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Meier (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Hallo,

ich möchte auf meinem Display einen Messwert ausgegeben. Controller ist 
ein Attiny26. Als Display nutz ich ein 20x4 HD44780 mit der "einfachen 
Routine aus der FAQ.

Allerdings tritt hierbei das Problem auf, dass bei der Zahl die 
ausgegeben werden soll die Ziffern auf dem LCD vertauscht --> Anstatt 58 
und 85 angezeigt.

Hier ein Ausschnitt aus dem Source Code:
  lcd_init();

  //Text in einzelnen Zeichen ausgeben
  lcd_setcursor(0,1);
  lcd_string("Temperatur:");
  
  lcd_setcursor(0,2);
  
  
  
  uint8_t variable = 58;
  char Buffer[20]; // in diesem {} lokal
  itoa(variable, Buffer, 10 );
  
  
  lcd_string( Buffer );
  
  // Die Ausgabemarke in die 2te Zeile setzen
  lcd_setcursor(0,3);
  //lcd_string("Duty Cyle:");


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

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Bitte zeig deinen ganzen Code, so wie er tatsächlich auf dem µC läuft.

Wenn auf deinem LCD der Text "Temperatur" richtig ausgegeben wird, dann 
funtkioniert lcd_string schon mal richtig. Und dass itoa da einen Fehler 
hat, können wir wohl getrost erst mal als unwahrscheinlich abtun.

D.h. der Fehler liegt in deinem Code. Und meistens ist es ein Fehler, 
der durch nicht berücksichtigte Effekt beim Überschreiben von Zahlen 
entstehen. Wird eine 2-stellige Ausgabe "88" mit lediglich nur 1 Stelle 
überschrieben "5"
          +---+---+--+--+--+-...
 Vorher   | 8 | 8 |  |  |  |
          +---+---+--+--+--+-...

dann überschreiben mit "5"

          +---+---+--+--+--+-...
 Nachher  | 5 | 8 |  |  |  |
          +---+---+--+--+--+-...

dann steh auf dem Display 'für dich als Mensch' nun mal 58, obwohl du 
nur "5" ausgegeben hast. Der Fehler besteht nicht darin, dass da 
irgendwie fälschlich "58" ausgegeben wird, sondern dass vergessen wurde, 
dass von einer vorhergehenden Ausgabe an der 2. Stelle noch eine 8 
steht, die natürlich mit einem Leerzeichen überschrieben werden muss, 
wenn die Anzeige von 2-stellig auf 1-stellig wechselt.


Ist aber nur eine Vermutung, was da passiert sein könnte. Daher: 
Richtigen, echten, vollständigen Code zeigen!

Autor: Meier (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Hallo,

vielen Dank für die schnelle Rückmeldung!

Beim geposteten Code handelt es sich um den vollständigen Code
#include <avr/io.h>

int main(void)
{
  
  lcd_init();

  //Text in einzelnen Zeichen ausgeben
  lcd_setcursor(0,1);
  lcd_string("Temperatur:");
  
  lcd_setcursor(0,2);
  
  
  
  uint8_t variable = 58;
  char Buffer[20]; // in diesem {} lokal
  itoa(variable, Buffer, 10 );
  
  
  lcd_string( Buffer );
  
  // Die Ausgabemarke in die 2te Zeile setzen
  lcd_setcursor(0,3);
  //lcd_string("Duty Cyle:");
  
  
    while(1)
    {
        //TODO:: Please write your application code 
    }
}

Das ist alles was auf dem uC derzeit läuft!

"Temperatur" wird richtig ausgeben, nur es steht immer 58 anstatt 85 da.

Kann es was mit der Reihenfolge der Ausgabe der itoa() Funktion in das 
Ausgabearray zu tun haben?

Autor: Meier (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Hab noch gerade was getestet. Bei

lcd_data(Buffer[0]) --> wird eine 8 ausgegeben
lcd_data(Buffer[1]) --> wird eine 5 ausgegeben

Ist das so die richtige Reihenfolge der itoa() Funktion??

Autor: Stefan Ernst (sternst)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Meier schrieb:
> Ist das so die richtige Reihenfolge der itoa() Funktion??

Nein.

itoa Ausgabe verkehrt herum?
Ich hatte da eine ganz vage Erinnerung, das schon mal gelesen zu haben, 
und bin fündig geworden:
http://www.avrfreaks.net/index.php?name=PNphpBB2&f...

Autor: Peter Dannegger (peda)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Meier schrieb:
> Allerdings tritt hierbei das Problem auf, dass bei der Zahl die
> ausgegeben werden soll die Ziffern auf dem LCD vertauscht --> Anstatt 58
> und 85 angezeigt.

Ja, der Fehler ist bekannt, es ist ein Bug im ATtiny26.
Aber weder Atmel wird den Bug beheben, noch der AVR-GCC einen 
Würg-Around erhalten.

Also bleibt als saubere Lösung nur den ATtiny261 zu nehmen.

Hier gibt es auch einen Thread darüber.


Peter

Autor: Peter Dannegger (peda)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert

Autor: Meier (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Danke!

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




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 erkennst du die Nutzungsbedingungen an.

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net