LCD - falsche Ausgabe

Gast #1575011
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
#1575051
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.
Gast #1575195
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.
#1575216
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren