Forum: Mikrocontroller und Digitale Elektronik LCD Display read


von Godi S. (godi22)


Lesenswert?

Hallo!

Ich habe hier einen Atmega 32 und ein Displaytech162 (Controller 
HD44780)  LCD Display im 4-Bit Modus.

Das übertragen von einzelnen Zeichen funktioniert soweit mal.
Jetzt will ich überprüfen ob auch das richtige Zeichen am Display 
angezeigt wird. Dazu will ich mit folgender Funktion das Display 
auslesen:
1
/**
2
 * This function read the data from LCD controller
3
 * Input:    rs     1: read data    
4
 *                  0: read busy flag / address counter
5
 * Returns:  byte read from LCD controller
6
 */
7
8
uint8_t lcd_read(uint8_t rs) {
9
    uint8_t data; 
10
        
11
    if (rs)
12
        lcd_rs_high();                       /* RS=1: read data      */
13
    else
14
        lcd_rs_low();                        /* RS=0: read busy flag */
15
    
16
    lcd_rw_high();                           /* RW=1  read mode      */
17
              
18
    LCD_DDR_DB &= ~(0x0F << LCD_DB);     /* configure data pins as input */
19
        
20
    lcd_en_high();
21
    _delay_us(LCD_ENABLE_US);  
22
    data = LCD_PORT_DB << 4;     /* read high nibble first */
23
    lcd_en_low();
24
      
25
    _delay_us(LCD_ENABLE_US);                       /* Enable 500ns low       */
26
 
27
    lcd_en_high();
28
    _delay_us(LCD_ENABLE_US);     
29
    data |= LCD_PORT_DB & 0x0F;    /* read low nibble        */
30
    lcd_en_low();
31
  
32
  //initialize to the preconfiguration
33
  LCD_DDR_DB |= (0x0F << LCD_DB);     /* configure data pins as output */
34
  lcd_rs_low();
35
  lcd_rw_low();
36
  
37
    return data;
38
}

Leider kommt beim high nibble auch immer der Wert vom low nibble zurück.
Also wenn ich ein 'L' auslesen möchte dann kommt nicht 0x4C zurück 
sondern 0xCC.

Weiß jemand warum das so ist?

godi

von Godi S. (godi22)


Lesenswert?

Hat da niemand eine Idee warum das so ist?

Der Cursor springt auch noch ein Feld weiter wenn ich diese Funktion 
aufrufe.

von der Tscheche (Gast)


Lesenswert?

Beim 8bit-Modus funktioniert's?

von Helfer (Gast)


Lesenswert?

wie ist LCD_PORT_DB definiert? Möglicherweise liest du nicht PINx aus 
sondern PORTx, d.h. den Zustand der Pullups...

von Godi S. (godi22)


Lesenswert?

Helfer schrieb:
> wie ist LCD_PORT_DB definiert? Möglicherweise liest du nicht PINx aus
> sondern PORTx, d.h. den Zustand der Pullups...

Belegung für das LCD:
1
//  LCD DB4-DB7 <-->  PORTA Bit PA0-PA3
2
#define LCD_PORT_DB   PORTA
3
#define LCD_DDR_DB    DDRA
4
#define LCD_DB        PA0
5
#define LCD_BUSY      7      // DB7: LCD is busy

Also lese ich da die Pullup Widerstände aus?

von Karl H. (kbuchegg)


Lesenswert?

godi godi schrieb:
> Helfer schrieb:
>> wie ist LCD_PORT_DB definiert? Möglicherweise liest du nicht PINx aus
>> sondern PORTx, d.h. den Zustand der Pullups...
>
> Belegung für das LCD:
>
1
> //  LCD DB4-DB7 <-->  PORTA Bit PA0-PA3
2
> #define LCD_PORT_DB   PORTA
3
> #define LCD_DDR_DB    DDRA
4
> #define LCD_DB        PA0
5
> #define LCD_BUSY      7      // DB7: LCD is busy
6
>
>
> Also lese ich da die Pullup Widerstände aus?

Yep.

von Godi S. (godi22)


Lesenswert?

Hallo!

Ich bin schon total am verzweifeln und schon verwirrt...

Jetzt habe ich schon einiges herumprobiert aber es mag nicht so richtig 
funktionieren.

Momentan habe ich die zwei Zeilen zum auslesen der Pins folgend 
Programmiert:
1
 /* read high nibble first */   
2
data = (LCD_PIN_DB & 0x0F) << 4;
3
4
//und
5
6
/* read low nibble        */  
7
data |= (LCD_PIN_DB & 0x0F);

LCD_PIN_DB ist als PINA definiert.

Da sollte ja jetzt das richtige herauskommen!?

godi

von Hannes L. (hannes)


Lesenswert?

Keine Ahnung von C, aber ich denke, Du musst DDRx umschalten 
(Datenrichtung, Eingang/Ausgang), um das Display lesen zu können.

Hatte ich mal in ASM gemacht, aber später wieder verworfen, weil mir 
LCD-Update im Hintergrund (timergesteuert, also ohne Busywait) aus einem 
im AVR-SRAM liegenden Bildschirmspeicher besser gefällt.

...

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Mach es so wie hannes und spar' dir das Auslesen...
Du erhältst dadurch keine "zuverlässigere" Darstellung. Wenn das 
Schreiben schief geht, dann höchstwahrscheinlich wegen Fehlern in der 
Software oder auf dem Bus... erstens ändert also ein erneutes Schreiben 
nix an dem zustand, und zweitens sind die zurück-gelesenen Daten dann 
ebenfalls nicht verlässlich.
Dieses Feature des zurücklesen ist nur Praktisch wenn man 
Memmory-Mapped-IO nutzt und dann den Bildschirmspeicher wie normales RAM 
anspricht, oder wenn man so knapp am Speicher ist, dass man das 
Controller-RAM an seinen wenigen freien Stellen als Speicher missbraucht 
;P

von Godi S. (godi22)


Lesenswert?

Hallo,
danke für eure Antworten!

Ja das auslesen werde ich mir wohl ersparen obwohl es interessant wäre.
Und es ist ein Projekt für die Uni.

Aber falls ich es doch noch zum laufen bekomme dann sag ich bescheid.

godi

von Hannes L. (hannes)


Angehängte Dateien:

Lesenswert?

Ich hänge Dir mal meine 6 Jahre alten und schon lange nicht mehr 
benutzten LCD-Routinen an, die mit Busywait arbeiten und zum Rücklesen 
ausgebaut werden können.
Vielleicht hilft Dir die Analyse der Busywait-Routine ja etwas. Ich 
meine dabei speziell die Zugriffe auf das Datenrichtungsregister 
(lcdport-1).

...

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.