Hey, Ich habe ein Problem mit meinem LCD Display. Orientieren tue ich mich an folgendem Tutorial: http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/LCD-Ansteuerung Schreibe ich ein Init und dann einen String ist alles wunderbar. Mache ich ein Init, Text, gefolgt von einem clear und wieder ein Text, dann sind das irgendwelche anderen Zeichen... Koreanisch, chinesisch, ich weiß es nicht. Ich möchte und kann aber auch nicht immer wieder den ganzen Init durchlaufen lassen, da dort ziemlich viele delays enthalten sind. Jemand eine Idee?
Du könntest z.B. den Code hier hereinstellen, dann kann man sich das ansehen und nicht nur raten. Du kannst aber auch den Code von Peter Fleury probieren.
Den Code sieht man ja bei dem Link den ich gepostet habe. Laufen tut es wie folgt:
1 | lcd_init(); |
2 | lcd_string(distance); |
Das Problem dabei ist, dass jedes mal ein erneuter Init blöd ist. Daher würde ich gerne zu begin der main() einmal ein init machen und dann nur noch den clear Befehl aufrufen:
1 | lcd_clear(); |
2 | lcd_string(distance); |
Nur dann kommen eben immer nur chinesische Zeichen. Ich copy/paste einfach mal die init und clear Funktion in den Beitrag:
1 | void lcd_clear( void ) |
2 | {
|
3 | lcd_command( LCD_CLEAR_DISPLAY ); |
4 | _delay_ms( LCD_CLEAR_DISPLAY_MS ); |
5 | }
|
1 | void lcd_init( void ) |
2 | {
|
3 | // verwendete Pins auf Ausgang schalten
|
4 | uint8_t pins = (0x0F << LCD_DB) | // 4 Datenleitungen |
5 | (1<<LCD_RS) | // R/S Leitung |
6 | (1<<LCD_EN); // Enable Leitung |
7 | LCD_DDR |= pins; |
8 | |
9 | // initial alle Ausgänge auf Null
|
10 | LCD_PORT &= ~pins; |
11 | |
12 | // warten auf die Bereitschaft des LCD
|
13 | _delay_ms( LCD_BOOTUP_MS ); |
14 | |
15 | // Soft-Reset muss 3mal hintereinander gesendet werden zur Initialisierung
|
16 | lcd_out( LCD_SOFT_RESET ); |
17 | _delay_ms( LCD_SOFT_RESET_MS1 ); |
18 | |
19 | lcd_enable(); |
20 | _delay_ms( LCD_SOFT_RESET_MS2 ); |
21 | |
22 | lcd_enable(); |
23 | _delay_ms( LCD_SOFT_RESET_MS3 ); |
24 | |
25 | // 4-bit Modus aktivieren
|
26 | lcd_out( LCD_SET_FUNCTION | |
27 | LCD_FUNCTION_4BIT ); |
28 | _delay_ms( LCD_SET_4BITMODE_MS ); |
29 | |
30 | // 4-bit Modus / 2 Zeilen / 5x7
|
31 | lcd_command( LCD_SET_FUNCTION | |
32 | LCD_FUNCTION_4BIT | |
33 | LCD_FUNCTION_2LINE | |
34 | LCD_FUNCTION_5X7 ); |
35 | |
36 | // Display ein / Cursor aus / Blinken aus
|
37 | lcd_command( LCD_SET_DISPLAY | |
38 | LCD_DISPLAY_ON | |
39 | LCD_CURSOR_OFF | |
40 | LCD_BLINKING_OFF); |
41 | |
42 | // Cursor inkrement / kein Scrollen
|
43 | lcd_command( LCD_SET_ENTRY | |
44 | LCD_ENTRY_INCREASE | |
45 | LCD_ENTRY_NOSHIFT ); |
46 | |
47 | lcd_clear(); |
48 | }
|
Hi Ich benutze zwar kein C, aber das Problem dürfte lcd_string(distance); sein Wie ist distance definiert? MfG Spess
Stimmt, wenn ich einfach nur "Test" nehme geht es auch mit clear. So wird distance erstellt: (Also in diesem Fall würde ich lcd_string(dist); ausgeben)
1 | int16_t dist = distances / SRF02_WERT_MITTELWERTANZAHL; |
2 | distances = 0; |
3 | |
4 | char dist[] = "Distance: "; |
5 | char unit[] = " cm"; |
6 | char Buffer[5]; |
7 | |
8 | itoa(x, Buffer, 10); |
9 | strcat(dist, Buffer); |
10 | strcat(dist, " cm"); |
Hi
>distances = 0;
lcd_string verlangt aber einen Zeiger auf einen String.
MfG Spess
Hab das problem gefunden :( Ich hatte zum Debugging von einer anderen Sache (da noch LED's) auf PortD 0xFF geschickt... nur an PortD ist jetzt das LCD und das hat dem LCD wohl nicht gefallen! :D Aber danke für die Hilfe :)
FX schrieb: >
1 | int16_t dist = distances / SRF02_WERT_MITTELWERTANZAHL; |
2 | > distances = 0; |
3 | >
|
4 | > char dist[] = "Distance: "; |
5 | > char unit[] = " cm"; |
6 | > char Buffer[5]; |
7 | >
|
8 | > itoa(x, Buffer, 10); |
9 | > strcat(dist, Buffer); |
10 | > strcat(dist, " cm"); |
11 | >
|
Und jetzt gehst du gleich mal her und machst das Array dist größer. Der Compiler hat dir das Array so dimensioniert, dass "Distance: " da gerade noch reingeht. Du kannst da nicht noch hinten einige Dinge drann hängen. Dein Array ist dafür nicht groß genug! D.h. können tust du technisch gesehen schon. Nur bügelst du dann im Speicher Dinge über den Haufen, die nicht mehr zum Array gehören. Dem strcat ist das egal. Der beschreibt den Speicher einfach ohne Rücksicht auf Verluste.
>> Laufen tut es wie folgt:lcd_init(); >> lcd_string(distance); "distance" wird auch in seinem anderen Posting nicht deklariert, sondern nur verwendet und zugewiesen. "dist[]" ist was Anderes als "distance". Wir wissen also immer noch nicht, von welchem Type "distance" ist. Aber der Fehler lag ja wieder ganz woanders. Blackbird
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.