LCD Display read

OP #2214446
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
OP #2215974
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?
#2215982
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.
OP #2217272
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
#2217355
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.

...
Persönliche Seite #2217369
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
#2218103
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).

...
Angehängte Dateien:

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