PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : UART auf LCD ausgeben



Maverick83
07.10.2006, 10:21
Hallo Zusammen

Ich habe einen GPS Empfänger an den UART meines ATmega32 gehängt und möchte gerne als 1. Schritt,
dass er mir die empfangenen ASCII Zeichen auf dem LCD ausgibt.

Im Moment gibt er mir nur irgendwelche kryptischen Zeichen aus, also gehe ich davon aus, dass die UART-Verbindung I.O ist.

Für das LCD verwende ich die library von Peter Fleury, ich hab scho ein paar Sachen ausprobiert aber es will nicht recht.

Ich habe es so versucht:

while(1){
lcd_puts(USART_Receive());
delay_1(500);
}

Dabei bekomme ich die Warnung:
mainFile.c:38: warning: passing arg 1 of `lcd_puts' makes pointer from integer without a cast

lcd_puts() erwartet ein *char als Parameter und USART_Receive() gibt ein unsigned char zurück. Kann es daran liegen?
Oder mach ich sonst etwas falsch?

Danke für Eure Hilfe!

izaseba
07.10.2006, 11:11
Das Problem wird hier immer wieder behandelt...
lcd_puts erwartet wohl einen Zeiger auf einen nullterminierten String und Du übergibst einfach ein unsugned char, das geht nicht.
Du mußt Deinen Wert, den Du vom UART empfangen hast in eine Zeichenkette wandeln.
aus z.B. 123 muß {'1','2','3','\n'} werden.

Dazu ist die Funktion itoa aus der stdlib.h sehr gut geeignet.

Gruß Sebastian

izaseba
07.10.2006, 11:20
Das Problem wird hier immer wieder behandelt...
lcd_puts erwartet wohl einen Zeiger auf einen nullterminierten String und Du übergibst einfach ein unsugned char, das geht nicht.
Du musst Deinen Wert, den Du vom UART empfangen hast in eine Zeichenkette wandeln.
aus z.B. 123 muß {'1','2','3','\n'} werden.

Dazu ist die Funktion itoa aus der stdlib.h sehr gut geeignet.

Gruß Sebastian

EDIT:

Quatsch, UART liefert dier doch schon ein ASCII Zeichen, sorry 8-[ .
Gibt es in der lib keine Funktion, die ein einfaches Zeichen auf den Display schickt ?

sonst hilft nur z.B.



char kette[2];
kette[0] = uartwert;
kette[1] = '\0';
lcd_puts(kette);


ich hoffe, daß es so geht.....

Hans Meier
07.10.2006, 13:59
Hallo,



lcd_putc((unsigned char)dein_einzelnes_zeichen)


schreibt ein (!) Zeichen auf das Display. Also einfach in der UART Empfangsroutine nach jedem empfangenen Zeichen aufrufen und alles wird gut.

Björn

Maverick83
07.10.2006, 17:15
Hallo

Ich hab eine Funktion gefunden lcd_putc(char c), diese schreibt anscheinend nur einzelne Zeichen auf das Display hab sie dann so verwendet:

while(1){
lcd_putc(USART_Receive());
delay_1(500);
}
Es kommen auch da nur Zeichensalat.

Dann habe ich den Vorschlag von izaseba mit dem "\0" ausprobiert und da kommt:


char string[2];
...
while(1){
string[0]=USART_Receive();
string[1]="\0";
lcd_puts(string);
delay_1(500);
}

mainFile.c:41: warning: assignment makes integer from pointer without a cast
Zeile 41 ist string[1]="\0";

Ein Char ist doch ein einzelnes Zeichen, sind dann "\0" nicht 2 Zeichen?

Versuch von Hans Meier:
Ich komme bei deinem Vorschlag nicht recht mit. Was steht in der Variable "dein_einzelnes_zeichen" und was für ein Datentyp ist das und wieso muss ich das in ein unsigned char casten? lcd_putc erwartet ein char.

Ich habe das mal so interpretiert:

lcd_puts((unsigned char)USART_Receive());

Dann kommt aber wieder:
mainFile.c:42: warning: passing arg 1 of `lcd_puts' makes pointer from integer without a cast

Danke für die Vorschläge aber es geht nicht, ich dreh durch.
Ich habe das GPS auch an denn PC angehängt und mit dem Hyperterminal angeschaut, es kommen wirklich ASCII Zeichen.

izaseba
07.10.2006, 18:12
Zeile 41 ist string[1]="\0";

Ich habe oben einfache anführungzeichen genommen , schau genau hin!


kette[1] = '\0';

Stimmt die Baudrate denn ?

Maverick83
07.10.2006, 19:00
Ach so ein blöder Fehler, für was bedeuten denn die einfachen Anführungzeichen?

Jetzt schreibt er jedes Zeichen einzeln auf das Display aber immerno ein Salat. ich hasse das Ding!

Maverick83
07.10.2006, 19:15
Kann mich bitte mal jemand schlagen? ](*,)

Ich hab den Fehler gefunden, man muss halt das Datenblatt richtig lesen. Ich hab den Code für die Initialisierung vom ATmega Datenblatt kopiert und dort gibt man die baud Rate mit. Nun ja man sollte halt nicht "9600" mitgeben sondern wie im Datenblatt gesagt "6"!!!

Ein ganzen Tag für die Katze, aber danke für Eure Hilfe, dank dem habe ich mir mal die baud Rate angesehen.

\:D/

izaseba
07.10.2006, 19:24
Jetzt schreibt er jedes Zeichen einzeln auf das Display aber immerno ein Salat. ich hasse das Ding!


Was soll er sonst schreiben ?
Ich dachte, es wäre Dein Vorhaben :


dass er mir die empfangenen ASCII Zeichen auf dem LCD ausgibt.

Du kannst Dir sicherlich auch ein Puffer anlegen, wo Du z.B. erst 10 Zeichen empfängst und dann in einem Rutsch auf des Display schiebst.

Oder ein Ringpuffer und alles direkt auf das Display schaufeln, nur irgendwie mußt Du Dir merken wann Das Display zu Ende ist.

So oder so, eine Funktion, die ein Zeichen auf dem Display anzeigt wäre ja ganz gut, warum klappt denn die lcd_putc(char c) nicht ?

Gruß Sebastian

EDIT: Na dann, doch die Baudrate...