Forum: Compiler & IDEs LCD - falsche Ausgabe


von Josef (Gast)


Lesenswert?

Hi

Habe ein Problem mit dem LCD

C Code vom Tutorial funktioniert.
1
int variable = 42;
2
3
int main(void)
4
{
5
    lcd_init();
6
 
7
    // Ausgabe des Zeichens dessen ASCII-Code gleich dem Variablenwert ist
8
    // (Im Beispiel entspricht der ASCII-Code 42 dem Zeichen *)
9
    // http://www.code-knacker.de/ascii.htm
10
    lcd_data(variable);
11
 
12
    set_cursor(0,2);
13
 
14
    // Ausgabe der Variable als Text in dezimaler Schreibweise
15
    {
16
       // ... umwandeln siehe FAQ Artikel bei www.mikrocontroller.net
17
       // WinAVR hat eine itoa()-Funktion, das erfordert obiges #include <stdlib.h>
18
       char Buffer[20]; // in diesem {} lokal
19
       itoa( variable, Buffer, 10 ); 
20
 
21
       // ... ausgeben  
22
       lcd_string( Buffer );
23
    }
24
 
25
    while(1)
26
    {
27
    }
28
 
29
    return 0;
30
}

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:
1
void LCD(float wert){
2
  
3
  lcd_data(wert);
4
  set_cursor(0,2);
5
  
6
  char b[20];
7
8
  itoa(wert,b,10);
9
  lcd_string(b);
10
11
}
12
13
14
int main(void){
15
16
 UBRRH = 0;     // Baudrate auf 9600
17
 UBRRL = 51;
18
19
 UCSRB = (1<<RXEN) | (1<<TXEN);    // RX und TX einschalten
20
21
 UCSRC |= (1<<URSEL) | (3<<UCSZ0); // 8N1
22
 // UCSRC = (1<<URSEL) | (1<<USBS) | (1<<UCSZ0);
23
24
25
26
 DDRC = 0xff;
27
 //PORTC = 0xff;  
28
 
29
 float a;
30
 
31
 lcd_init();
32
33
34
 while(1){
35
   
36
   while(UCSRA & (1<<RXC)){ 
37
     
38
      a = UDR;
39
    
40
41
      LCD(a);
42
     
43
   }
44
 }
45
46
}

Warum zeigt das Display nicht die erwarteten Zeichen an ?
Danke

von Karl H. (kbuchegg)


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.

von Josef (Gast)


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.

von Karl H. (kbuchegg)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.