mikrocontroller.net

Forum: Compiler & IDEs LCD - falsche Ausgabe


Autor: Josef (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Habe ein Problem mit dem LCD

C Code vom Tutorial funktioniert.
int variable = 42;

int main(void)
{
    lcd_init();
 
    // Ausgabe des Zeichens dessen ASCII-Code gleich dem Variablenwert ist
    // (Im Beispiel entspricht der ASCII-Code 42 dem Zeichen *)
    // http://www.code-knacker.de/ascii.htm
    lcd_data(variable);
 
    set_cursor(0,2);
 
    // Ausgabe der Variable als Text in dezimaler Schreibweise
    {
       // ... umwandeln siehe FAQ Artikel bei www.mikrocontroller.net
       // WinAVR hat eine itoa()-Funktion, das erfordert obiges #include <stdlib.h>
       char Buffer[20]; // in diesem {} lokal
       itoa( variable, Buffer, 10 ); 
 
       // ... ausgeben  
       lcd_string( Buffer );
    }
 
    while(1)
    {
    }
 
    return 0;
}

Möchte nun mittels UART und dem Programm hterm die Zahl 42 an den µC 
senden.

Erwarte mir wie im Tutorial in Zeile 1: '*'
                               Zeile 2:'42'

Am LCD erscheint in Zeile 1: '4'
                    Zeile 2: '502'

Hier der wichtige Teil des C Codes:


void LCD(float wert){
  
  lcd_data(wert);
  set_cursor(0,2);
  
  char b[20];

  itoa(wert,b,10);
  lcd_string(b);

}


int main(void){

 UBRRH = 0;     // Baudrate auf 9600
 UBRRL = 51;

 UCSRB = (1<<RXEN) | (1<<TXEN);    // RX und TX einschalten

 UCSRC |= (1<<URSEL) | (3<<UCSZ0); // 8N1
 // UCSRC = (1<<URSEL) | (1<<USBS) | (1<<UCSZ0);



 DDRC = 0xff;
 //PORTC = 0xff;  
 
 float a;
 
 lcd_init();


 while(1){
   
   while(UCSRA & (1<<RXC)){ 
     
      a = UDR;
    

      LCD(a);
     
   }
 }

}

Warum zeigt das Display nicht die erwarteten Zeichen an ?
Danke

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

Bewertung
0 lesenswert
nicht lesenswert
Josef schrieb:

> void LCD(float wert){
           *****

>   itoa(wert,b,10);
    ****

Das passt schon mal nicht zusammen.
Aber warum machst du wert überhaupt als float?

>  float a;

>    while(UCSRA & (1<<RXC)){

Mööp.
Nochmal ins UART Tutorial und genau nachsehen!

>       a = UDR;

Wenn du am Hyperterminal die Tasten 4 und 2 drückst, kriegst du auch 2 
Zeichen übertragen. Das eine hat den ASCII Code für '4' und das andere 
den ASCII Code für '2'

> Warum zeigt das Display nicht die erwarteten Zeichen an ?

Weil du
* nicht wartest, bis ein Zeichen angekommen ist, sondern das UDR
  ausliest, solange kein Zeichen angekommen ist

* du zwar einen ASCII Code empfängst den du direkt aufs LCD ausgeben
  könntest, du das aber nicht machst, sondern dir stattdessen die
  Codezahl selber ausgeben lässt.

* der Umweg über float: Da hattest du Glück, dass sich das selber
  regelt. Aber im Grunde ist der Umweg unnötig.

Autor: Josef (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das float war noch vom vorigen Programm drinnen. Das ist aber der 
geringere Fehler.

Verwende nicht Hyperterminal von Windows XP, sondern das Programm HTerm 
0.8.1beta. Dabei gebe ich die Zahl 42 direkt ein, erst beim Drücken auf 
den Button ASend wird 42 übertragen.

Habe mir den Code vom UART Tutorial durchgelesen, bin aber nicht 
wirklich weiter gekommen. Nehme an, dass der Fehler hier while(UCSRA & 
(1<<RXC)) liegt. Wie muss ich den Code verändern, damit der gleiche 
Effekt wie im LCD Tutorial autritt? Weiß nicht wie ich fortfahren soll.

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

Bewertung
0 lesenswert
nicht lesenswert
Josef schrieb:

> Verwende nicht Hyperterminal von Windows XP, sondern das Programm HTerm
> 0.8.1beta. Dabei gebe ich die Zahl 42 direkt ein, erst beim Drücken auf
> den Button ASend wird 42 übertragen.

OK.
Du sendest also das Zeichen, dessen ASCII Code 42 beträgt.


> wirklich weiter gekommen. Nehme an, dass der Fehler hier while(UCSRA &
> (1<<RXC)) liegt.

Ich denke, du hast das UART Tutorial gelesen.
Dann vergleich doch einfach mal deine 3 Zeilen mit den 3 Zeilen im Tut. 
in der dort angegebenen Funktion uart_getc()


> Wie muss ich den Code verändern, damit der gleiche
> Effekt wie im LCD Tutorial autritt?

> Weiß nicht wie ich fortfahren soll.

Erst mal musst du das Zeichen korrekt empfangen.
Dann stopfst du das was du aus dem UDR ausliest, ganz einfach in die 
lcd_data hinein. Fertig. Wenn du im HTerm dann den Code für 'A' 
abschickst, erscheint auf dem LCD dann auch ein A

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.