-         

Ergebnis 1 bis 9 von 9

Thema: UART auf LCD ausgeben

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    09.01.2005
    Alter
    34
    Beiträge
    76

    UART auf LCD ausgeben

    Anzeige

    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:
    Code:
    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!

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    45
    Beiträge
    2.236
    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
    Software is like s e x: its better when its free.
    Linus Torvald

  3. #3
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    45
    Beiträge
    2.236
    Zitat Zitat von izaseba
    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 .
    Gibt es in der lib keine Funktion, die ein einfaches Zeichen auf den Display schickt ?

    sonst hilft nur z.B.

    Code:
    char kette[2];
    kette[0] = uartwert;
    kette[1] = '\0';
    lcd_puts(kette);
    ich hoffe, daß es so geht.....
    Software is like s e x: its better when its free.
    Linus Torvald

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    14.07.2004
    Beiträge
    23
    Hallo,

    Code:
    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

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    09.01.2005
    Alter
    34
    Beiträge
    76
    Hallo

    Ich hab eine Funktion gefunden lcd_putc(char c), diese schreibt anscheinend nur einzelne Zeichen auf das Display hab sie dann so verwendet:
    Code:
    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:
    Code:
    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:
    Code:
    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.

  6. #6
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    45
    Beiträge
    2.236
    Zeile 41 ist string[1]="\0";
    Ich habe oben einfache anführungzeichen genommen , schau genau hin!

    kette[1] = '\0';
    Stimmt die Baudrate denn ?
    Software is like s e x: its better when its free.
    Linus Torvald

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    09.01.2005
    Alter
    34
    Beiträge
    76
    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!

  8. #8
    Benutzer Stammmitglied
    Registriert seit
    09.01.2005
    Alter
    34
    Beiträge
    76
    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.

    \/

  9. #9
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    45
    Beiträge
    2.236
    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...
    Software is like s e x: its better when its free.
    Linus Torvald

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •