Forum: Mikrocontroller und Digitale Elektronik Problem mit LCD Display


von FX (Gast)


Lesenswert?

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?

von Hubert G. (hubertg)


Lesenswert?

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.

von FX (Gast)


Lesenswert?

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
}

von Spess53 (Gast)


Lesenswert?

Hi

Ich benutze zwar kein C, aber das Problem dürfte lcd_string(distance); 
sein
Wie ist distance definiert?

MfG Spess

von FX (Gast)


Lesenswert?

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");

von 0815 (Gast)


Lesenswert?

LC Display nicht LC Disply Display  LCD D;)

von Spess53 (Gast)


Lesenswert?

Hi

>distances = 0;

lcd_string verlangt aber einen Zeiger auf einen String.

MfG Spess

von FX (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Blackbird (Gast)


Lesenswert?

>> 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
Noch kein Account? Hier anmelden.