Forum: Compiler & IDEs Problem mit LCD bei AVR und P. Fleury Lib.


von Mark (Gast)


Lesenswert?

Hallo

Ich weis, das Thema wurde schon öfters behandelt, ich fand auch was in 
der SUFU, aber da trotz aller Sucherei mein Code immer noch nicht geht 
wende ich mich mal an euch...

Also folgendes.
Ich habe ein 4*20 Zeichen Display an einem KS0073 Controller an einen 
ATmega128 angeschlossen.

Ich habe das Display zum Test unter BASCOM angesteuert, da funktioniert 
alles wunderbar. Unter C klappt das jedoch noch nicht.

Meine Beschaltung:

AVR -> LCD
-----------
PA0 -> D4
PA1 -> D5
PA2 -> D6
PA3 -> D7
PA4 -> E
PA5 -> RS
       RW -> GND

Weil RW des LCDs mit GND verbunden ist, habe ich an Anlehnung dieses 
Threads Beitrag "Re: DIP162 2x16 LCD Display von Conrad + Fleury"
die Funktion lcd_waitbusy() umgeschrieben.

Hier meine Codes:

Ausschnitt aus lcd.h
1
/**
2
 * @name  Definition for LCD controller type
3
 * Use 0 for HD44780 controller, change to 1 for displays with KS0073 controller.
4
 */
5
#define LCD_CONTROLLER_KS0073 1  /**< Use 0 for HD44780 controller, 1 for KS0073 controller */
6
7
/** 
8
 *  @name  Definitions for Display Size 
9
 *  Change these definitions to adapt setting to your display
10
 */
11
#define LCD_LINES           4     /**< number of visible lines of the display */
12
#define LCD_DISP_LENGTH    20     /**< visibles characters per line of the display */
13
#define LCD_LINE_LENGTH  0x40     /**< internal line length of the display    */
14
#define LCD_START_LINE1  0x00     /**< DDRAM address of first char of line 1 */
15
#define LCD_START_LINE2  0x40     /**< DDRAM address of first char of line 2 */
16
#define LCD_START_LINE3  0x14     /**< DDRAM address of first char of line 3 */
17
#define LCD_START_LINE4  0x54     /**< DDRAM address of first char of line 4 */
18
#define LCD_WRAP_LINES      0     /**< 0: no wrap, 1: wrap at end of visibile line */
19
20
21
#define LCD_IO_MODE      1         /**< 0: memory mapped mode, 1: IO port mode */
22
23
24
#define LCD_PORT         PORTA        /**< port for the LCD lines   */
25
#define LCD_DATA0_PORT   LCD_PORT     /**< port for 4bit data bit 0 */
26
#define LCD_DATA1_PORT   LCD_PORT     /**< port for 4bit data bit 1 */
27
#define LCD_DATA2_PORT   LCD_PORT     /**< port for 4bit data bit 2 */
28
#define LCD_DATA3_PORT   LCD_PORT     /**< port for 4bit data bit 3 */
29
#define LCD_DATA0_PIN    0            /**< pin for 4bit data bit 0  */
30
#define LCD_DATA1_PIN    1            /**< pin for 4bit data bit 1  */
31
#define LCD_DATA2_PIN    2            /**< pin for 4bit data bit 2  */
32
#define LCD_DATA3_PIN    3            /**< pin for 4bit data bit 3  */
33
#define LCD_RS_PORT      LCD_PORT     /**< port for RS line         */
34
#define LCD_RS_PIN       5            /**< pin  for RS line         */
35
#define LCD_RW_PORT      LCD_PORT     /**< port for RW line         */
36
#define LCD_RW_PIN       7            /**< pin  for RW line         */
37
#define LCD_E_PORT       LCD_PORT     /**< port for Enable line     */
38
#define LCD_E_PIN        4            /**< pin  for Enable line     */



Ausschnitt aus lcd.c (P. Fleurys externem c-File)

Hier sieht man wie ich die lcd_waitbusy() manipuliert habe. Das sind 
alle Änderungen im File.
1
#include <util/delay.h>
2
3
/*
4
** constant definitions
5
*/
6
#ifndef F_CPU
7
  #define F_CPU 14745600  // CPU frequency
8
#endif
9
10
...
11
12
13
static uint8_t lcd_waitbusy(void)
14
{
15
    _delay_ms( 10 );
16
17
  return 0;
18
    
19
}/* lcd_waitbusy */

Und dann noch meine Ansteuerung in meinem eigenen c-File:
1
int main(void)
2
{
3
    /* Initialisiere Display, Cursor aus */
4
    lcd_init(LCD_DISP_ON);
5
6
    /* loesche das LCD Display und Cursor auf 1 Zeile, 1 Spalte */
7
    lcd_clrscr();
8
9
        
10
    /* String auf Display anzeigen */
11
    lcd_puts("Hello world.");
12
  _delay_ms(10000); 
13
  while(1)
14
  {
15
16
  }
17
  return 0;     
18
19
20
}

Warum geht das nicht?
Ich habe die Delaytime auch schon etliche male variiert. Von 50µs bis 
den 10ms war alles dabei...

Für mich stellt sich noch die Frage ob die Verdrahtung richtig ist. Ist 
z.B.

#define LCD_DATA0_PIN    0            /**< pin for 4bit data bit 0  */

das nun D4 oder D7 des LCDs?

von Mark (Gast)


Lesenswert?

Habe gerade einen ersten kleinen Erfolg!!

Wenn ich die lcd_waitbusy() umschreibe in:
1
static uint8_t lcd_waitbusy(void)
2
{
3
   delay( 3000 );
4
   return 0;
5
    
6
}/* lcd_waitbusy */

Dann zeigt er mir anstatt

"Hello World." folgendes an:
" el&%$="

Also 2 Buchstaben stimmen ("el"), der Rest sind irgendwelche komischen 
Zeichen...

von Boris (Gast)


Lesenswert?

Hi,

im rclineforum gibt es eine angepasste Version der Library.
http://www.rclineforum.de/forum/thread.php?threadid=109986&sid=

Boris

von Mark (Gast)


Lesenswert?

Hallo

Ich bin dem gerade mal nachgegangen aber auch das scheint bei mir nicht 
zu funktionieren. Zumal dieser Code für mich furchtbar undurchsichtig 
ist, da viele Stellen des originalen Codes von Fleury durch anderen Code 
ersetzt wurden ohne diesen umzukommentieren/kennzeichnen.

Aber er zeigt bei mir komplette Zeichen an!!
Allerdings kommt er mit den Zeilen und Zeilenumbrüchen überhaupt nicht 
zurecht und das wird nach längerem herumschrauben auch nicht besser 
wegen der undurchsichtigkeit des Codes...

von Daniel Held (Gast)


Lesenswert?

Ursache für die nicht funktionierenden Zeilenumbrüche könnten die 
Startadressen der Zeilen sein, hast Du die schon mal mit dem Datenblatt 
gegengecheckt?

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.