Forum: Compiler & IDEs UART auf LCD-Display - Probleme


von Stefan (Gast)


Lesenswert?

Hallo Forum,

ich habe ein Problem. Ich möchte von einem GPS-Empfänger (RS232) die 
Koordinaten auf das LCD-Display ausgeben. Dazu nutze ich einen AT Mega8. 
Das RS232-Signal vom GPS-Empfänger wandele ich mit einem MAX232 auf den 
TTL-Pegel vom Mega8. Laut Oszilloskop sind diese Signale auch in Ordnung 
(invertiert und auf TTL-Pegel gewandelt).

Leider zeigt mir das Display nur irgendwelche Hyroglyphen an, nichts 
brauchbares. Ich vermute, dass ich da im Programm irgendwo einen Fehler 
habe. Unten hab ich den Quelltext angehängt. Würd mich total freuen, 
wenn mir jemand auf die Sprünge helfen kann.

Viele Grüße
Stefan


#include "lcd.c"
#include <avr/io.h>
#include <util/delay.h>
#include <stdlib.h>
#include <stdarg.h>
#include <avr/interrupt.h>
#include <avr/eeprom.h>
#include <inttypes.h>
#include <stdbool.h>
#include <avr/wdt.h>
#define F_CPU 3686400
#define UART_BAUD_RATE 4800

void initUART(void)
  {
  UBRRL = (F_CPU/UART_BAUD_RATE/ 16L)-1;
  UCSRB = (1 << RXEN);
  }

void putChar(char data)
  {
  while (!(UCSRA & 32));
  UDR = data;
  }

int main (void)
{
unsigned char Zeichen;
initUART ();
lcd_init();
DDRB=0x00;
PORTB=0xff;


while (1)
{
    if (UCSRA&(1<<RXC))
    {
    Zeichen = (UDR);
    lcd_on();
    lcd_goto(1,1);
    lcd_write_s(Zeichen);

    }
}
}

von Karl H. (kbuchegg)


Lesenswert?

Stefan schrieb:

> Leider zeigt mir das Display nur irgendwelche Hyroglyphen an, nichts
> brauchbares. Ich vermute, dass ich da im Programm irgendwo einen Fehler
> habe.

Deine Vermutung ist nicht ganz von der Hand zu weisen :-)

> Unten hab ich den Quelltext angehängt. Würd mich total freuen,
> wenn mir jemand auf die Sprünge helfen kann.

Leg erst mal dn GPS Empfänger beiseite und häng deinen Mega8 an die 
serielle Schnittstelle deines PC an.

Dann hast du unter Kontrolle was gesendet wird und kannst auf dem LCD 
vergleichen.

> #define F_CPU 3686400

dein Mega8 läuft auch wirklich mit dieser Taktfrequenz?
Hast du das kontrolliert?


> unsigned char Zeichen;

>     lcd_write_s(Zeichen);

Hmm.
Aus dem Funktionsnamen heraus würde ich jetzt erst mal vermuten, dass 
die Funktion lcd_write_s einen String ausgeben will und nicht ein 
einzelnes Zeichen

Ansonsten:
http://www.mikrocontroller.net/articles/AVR_Checkliste#UART.2FUSART

von Stefan (Gast)


Lesenswert?

Karl heinz Buchegger schrieb:
> Leg erst mal dn GPS Empfänger beiseite und häng deinen Mega8 an die
>
> serielle Schnittstelle deines PC an.

Das hab ich schon probiert. Das Problem bleibt genauso. Ich habe 
versucht mit Hyperterminal Zeichen an den µC zu senden, aber er zeigt 
auf dem Display nur Schrott an.

Ja, der Controller läuft mmit 3686400 Hz. Das ist mit dem Quarz so 
eingestellt und die Fuse-Bits sind auch richtig gesetzt.
Wie kann ich das kontrollieren??

Das mit dem String vermute ich auch. Aber wie mache ich das dann 
richtig??

Viele Grüße
Stefan

von Karl H. (kbuchegg)


Lesenswert?

Stefan schrieb:

> Das hab ich schon probiert. Das Problem bleibt genauso. Ich habe
> versucht mit Hyperterminal Zeichen an den µC zu senden, aber er zeigt
> auf dem Display nur Schrott an.

Aha.
Und weil vom PC mit seinem kontrollierbarem Sender nichts gescheites 
angezeigt wurde, bist du dann auf dsa GPS gegangen. Du hast zwar keine 
Ahnung was das GPS so sendet, aber das macht ja erst mal nichts.

Hauptsache du hast noch eine Unbekannte mehr im Fehlersuchspiel :-)
Das macht die Fehlersuche erst so richtig interessant, wenn man 
möglichst viele unkontrollierbare und unbekannte Geräte im System hat.


>
> Ja, der Controller läuft mmit 3686400 Hz. Das ist mit dem Quarz so
> eingestellt und die Fuse-Bits sind auch richtig gesetzt.
> Wie kann ich das kontrollieren??

Weils so schön war:

http://www.mikrocontroller.net/articles/AVR_Checkliste#UART.2FUSART

> Das mit dem String vermute ich auch. Aber wie mache ich das dann
> richtig??

Programmieren lernen?
Oder aber einfach mal in die lcd.h heineinschauen, sich alle Funktionen 
ansehen, die jenigen aussortieren die nur einen char oder einen unsigned 
char nehmen und anhand vom Funktionsnamen raten, welche es wohl sein 
könnte.

Man kann dann auch noch in die zugehörige Implementierung reinschauen 
und sich im Code mal ansehen, was denn die Funktion so macht.

Wenn die lcd_write_s Funktion tatsächlich einen String ausgibt, dann 
stehen die Chancen nicht schlecht, dass die Funktion im Wesentlichen 
eine Schleife beinaltet und innerhalb der Schleife die einzelnen Zeichen 
des Strings ausgegeben werden. Daran kann man ganz gut erkennen, das die 
Funktion wirklich für Strings gedacht ist. Aber: Wenn der Programmierer 
nur halbwegs was auf dem Kasten hat, dann benutzt er zur Ausgabe der 
Einzelzeichen des Strings eine Funktion, die ein einzelnes Zeichen 
ausgeben kann. Die Funktion lcd_write_s wird sich höchst wahrscheinlich 
auf eine andere Funktion stützen, die ein Einzelzeichen ausgibt.
Welche Funktion hast du nochmal gesucht?

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.