Hallo liebe Forengemeinde,
nachdem ich mich dank euch und den wirklich guten Tutorials auf dieser
Seite in die µC-Technik eingearbeitet habe, stehe ich nun vor einer
schier unüberwindbaren Hürde und hoffe das ihr mir helfen könnt. In der
Suchfunktion finde ich leider nur Infos für nicht GLCD Displays.
Ich möchte über ein 128x64 Pixel GLCD Display die Daten, die ich vom
Navilock 552ettl GPS-Empfänger erhalte, anzeigen. Der C-Code
funktioniert fast unverändert bei einem 16x2 LCD Display. Lediglich die
Funktion lcd_puts_p wird dort durch lcd_string ersetzt.
Ich hoffe ihr könnt mir helfen. Im Anhang das Mainprogramm, welches sehr
stark an Tutorials bzw. Forenbeiträge angelehnt ist.
Vielen Dank schonmal.
Nun ja, das Problem liegt nicht in dem gezeigten Code. Wenn lcd_puts
nichts ausgibt, klemmt es zwischen GLCD-lib und dem GLCD.
LCD richtig angeschlossen? GLCD-Lib richtig parametriert? usw...
Oliver
Danke für die Antwort Oliver.
Das GLCD ist richtig angeschlossen. Die Anzeige "Line" geht auch. Habs
etliche Male geprüft. Den Funktionscode hänge ich heute abend mit dran.
Alex schrieb:> while(NextChar != '*' && StringLen < MaxLen - 1)
Einige Klammern würden dem C-Compiler deutlich machen, was in welcher
Reihenfolge womit verglichen werden soll ...
do{
NextChar = uart_getc();
}while(NextChar != 0); // Warte auf erstes Zeichen
Sicher das du da nicht in einer Endloschleife kleben bleibst?
NMEA schickt so weit ich weiss keine binäre 0.
Habe es mal auf die Empfangsroutine (in dieser Form funktionierend)
reduziert:
In lcd_puts steht jetzt natürlich nur ein Platzhalter ...
Die Klammern im Ausdruck "while((NextChar != '\n') && (StringLen <
(MaxLen - 1)))" müssen IN DIESEM FALL nicht sein, dienen aber (für mich)
der Lesbarkeit. Ich setze IMMER Klammern, dann weiß ich auch sicher, wie
verglichen etc. wird.
Die Abfrage auf "*" habe ich auf Line-Feed angepasst, da der NMEA-String
immer durch CR/LF abgeschlossen wird. CR lese ich auch ein, überschreibe
es aber dann mit dem String-Ende-Marker.
@holger: Meinst Du mich?
Alex soll es sagen, dass die "vorgestellte" Empfangsroutine sicher
funktioniert und er seine LCD-Ausgaben Schritt für Schritt dazupacken
kann.
Ich verwende den ATMEGA32, da mir die Register bekannt vorkamen und Alex
vermutlich auch einen ATMEGAxx einsetzt.
Hallo Dieter,
danke für die Mühe. Leider ist das Ergebnis unverändert. Ich besitze ein
KS0108 compatibles 128x64 Grafik LCD Display. Ich muss doch bei lcd_gets
noch die Schriftart dazu reinschreiben oder? (sprich:
lcd_gets(Schriftart, Char-Array).
Ich bin bald echt am verzweifeln. Das Ganze ist für ein Schulprojekt zum
Elektrotechniker. Bin kurz davor ein 4x20 Zeilen Display zu nehmen,
wobei man natürlich mit nem GLCD wesentlich mehr machen könnte. Ich
hoffe euch fällt da noch was ein wie ihr mich auf die richtige Spur
bringt. Habe Spaßeshalber mal nach Deklarierung des Char Arrays (somit
vor Beginn der While(1) Schleife sowie nach der uart_gets(...) Zeile
eine einfache Textzeile eingefügt. Der Text nach der uart_gets wird
nicht angezeigt. Das bedeutet doch das er uart_gets nicht abarbeitet
oder irre ich mich da?
Ich nutze übrigens einen Atmega16. Momentan noch mit 8Mhz internen Takt.
Alexander Plöger schrieb:> Der Text nach der uart_gets wird> nicht angezeigt. Das bedeutet doch das er uart_gets nicht abarbeitet> oder irre ich mich da?
Lass dir doch über irgendwelche freien Pins Signale ausgeben, anhand
derer du auf einem Oszi oder LA verfolgen kannst, wo sich das Programm
gerade rumtreibt. Textausgaben können das Timing des Programms ziemlich
durcheinander bringen.
Alexander Plöger schrieb:> Das bedeutet doch das er uart_gets nicht abarbeitet> oder irre ich mich da?
Hallo Alexander,
ich bin sicher (mit HTERM als "GPS-Ersatz" ausprobiert), dass die
USART-Routinen in meinem angepassten Beispiel funktionieren.
Mit der Lib, die Du verwendest, habe ich noch nicht gearbeitet. Ich
vermute, Du nutzt die von
Author: Andre Fabricius (mailto:master.andre@web.de)
Date: 13.08.08 18:32
Ich habe nur diese, relativ alte, Version gefunden. Die Angabe der
Schriftart ist bei LCD_PUT.. immer erforderlich, soweit ich sehe.
Nimm doch mal bitte die Definition
char gps_data[128];
aus main() raus und stelle diese im Anschluss die #include-Statements
ein. Ich bin mir da nicht sicher, aber ggf. liegt es an der fehlenden
globalen Definition dieser String-Variablen, dass LCD_PUT.. nichts damit
macht.
Im Schlimmst-Fall kannst Du mir auch mal das komplette Programm (falls
Du nicht "öffentlich" werden willst auch per PN) senden und ich debugge
es mal (habe ein JTAGICE). Ich verfüge zwar nicht über das entsprechende
Display, aber ich kann schauen, wie die Funktionen aufgerufen werden
bzw. mit welchen Inhalten.
Also, ich habe nun das Char Array aus Main rausgenommen... keine
Änderung. Danke für dein Angebot Dieter. Ich hab dir ne PN geschickt.
Ich würd dir für die Lösung sogar mein Display zukommen lassen ;)
(kleiner Spaß).
Danke schonmal für die Mühe. Auch allen anderen für die Antworten. Ein
wirklich sehr gutes und kompetentes Forum :)
Gruß
returnUDR;// Zeichen aus UDR an Aufrufer zurueckgeben
5
}
eine zusätzliche Ausgabe des gerade empfangenen Zeichens einbauen.
Mitlesen zu können, was vom GPS kommt und ab wann es dann klemmt, könnte
einigen Aufschluss darüber geben, was da im System los ist.
Alexander Plöger schrieb:> Ich hab dir ne PN geschickt.
Hallo Alexander,
mache ich heute Abend. Ein virtuelles Weizenbier ist immer willkommen
:-)
Gruß
Dieter
Hallo Alexander,
aus einem anderen Post hier habe ich:
In der wait_while_chip_is_busy() Funktion muss es statt
1
LCD_CMD_PORT&=~(1<<CD);
2
LCD_CMD_PORT|=(1<<RW)|(1<<EN);
3
_delay_us(1);
heissen:
1
LCD_CMD_PORT&=~(1<<CD);
2
LCD_CMD_PORT|=(1<<RW);
3
LCD_CMD_PORT|=(1<<EN);
4
_delay_us(1);
Macht Sinn (und ist lt. Datenblatt auch erforderlich), dass zunächst
Read/Write gewählt wird und etwas später (Tasu - ist zwar im Datenblatt
gezeichnet aber nicht in ns angegeben) - ich würde mal mindestens 10 ns
analog Tah nehmen - der Enable-Impuls kommt.
Die Ausführungszeit der Zuweisung LCD_CMD_PORT |=(1<<RW); reicht dafür
dann (bei 8 MHz Takt) wahrscheinlich aus.
Die busy-Flag-Abfrage nutze ich eigentlich nie bei den LCD-Displays
(weil ich auch mit SPI-Ansteuerung "herumspiele") und setze statt dessen
immer auseichende _delay(..)-Statements ein. Wird im vorgenannten Post
auch beschrieben.
Ist aber egal, wenn mit dieser Korrektur alles läuft kannst Du ja auch
nicht meckern :-)
Falls ich keine Erfolgsmeldung von Dir lese debugge ich heute Abend ...
Gruß
Dieter
Alexander Plöger schrieb:> Ich nutze übrigens einen Atmega16. Momentan noch mit 8Mhz internen Takt.
Ist der Takt für die Baudrate vielleicht nicht genau genug?
Außerdem vermisse ich
Also ich hab nun die Lösungsvorschläge eingearbeitet und ausprobiert.
Alle ohne Erfolg. Ich komm einfach nicht drauf, wieso er in den Code
geschriebene Texte und zB von Int nach String umgewandelte Variablen
anzeigt aber das GPS Signal nicht....
>Also ich hab nun die Lösungsvorschläge eingearbeitet und ausprobiert.>Alle ohne Erfolg. Ich komm einfach nicht drauf, wieso er in den Code>geschriebene Texte und zB von Int nach String umgewandelte Variablen>anzeigt aber das GPS Signal nicht....
Zeig dein komplettes Programm. Woher soll jemand wissen
welchen Bockmist du da jetzt schon wieder eingebaut hast?
Niveau wird nicht in blauen Dosen verkauft Holger. Außer nicht
konstruktiver Kritik kam von dir hier auch noch nichts! Spar sie dir für
jemand anderen um dort dein Unwissen zu verbergen.
>Niveau wird nicht in blauen Dosen verkauft Holger. Außer nicht>konstruktiver Kritik kam von dir hier auch noch nichts!
Doch, aber unter anderem Namen.
>Spar sie dir für>jemand anderen um dort dein Unwissen zu verbergen.
Kein Sourcecode, keine Antworten.
Mal sehen wer länger durchhält.
Ja, schauen wir mal.
@ Dietrich. Danke für den Hinweis :) Im Code isses eingetragen,
anscheinend hats das (hab ich es zwinker ) hierher aber nicht
übertragen.
Gruß
Alex
>Der Text nach der uart_gets wird>nicht angezeigt. Das bedeutet doch das er uart_gets nicht abarbeitet>oder irre ich mich da?
Richtig. Der bleibt scheinbar einfach hängen.
>Ich nutze übrigens einen Atmega16. Momentan noch mit 8Mhz internen Takt.
Hast du mal kontrolliert ob der auch mit 8MHz läuft?
Vieleicht läuft der ja nur mit 1MHz. Fuses?
Dann stimmt die Baudrate nicht. Oder es kommt gar kein
GPS Signal am ATMega an.
Das sind die Dinge die du kontrollieren musst.
Hi
>Dann stimmt die Baudrate nicht. Oder es kommt gar kein>GPS Signal am ATMega an.
Mit dem internen RC-Oszillator ist die korrekte Baudrate eher
Glückssache.
MfG Spess
Ich danke Dieter auf diesem Wege auch nochmals für die Lösung meines
Problems :)
Es lag an verschiedenen Kleinigkeiten. U.a. das die Schriftart static
und nicht const war.
Danke dir. Prost :D
Alex