Problem mit LCD Display

Gast #3219639
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?
Gast #3219673
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
}
Gast #3219725
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");
Gast #3219756
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 :)
#3220065
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.
Gast #3220174
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren