EA W162B Problem beim Initialisieren

Gast #1087662
Lesenswert?

Hallo Zusammen!

Ich hab mal wieder ein Problem! :-) Und zwar möchte ich gern mit Hilfe 
der Peter Fleury Lib ein EA W162b-N3LW ansprechen. Leider bleibt er bei 
der Initialisierung hängen! Folgendes Testprogramm habe ich geschrieben 
und hab es dadurch rausgefunden! :-)
1
#include <stdlib.h>
2
#include <avr/io.h>
3
#include <util/delay.h>
4
#include "lcd.h"
5

6
int main(void)
7
{
8

9
    /* LEDtest */
10
    DDRD =0xFF;
11
    PORTD = 0xFE;
12
    _delay_ms(1000);
13
    PORTD &= 0xFC;
14
    _delay_ms(1000);
15
    PORTD &= 0xF8;
16
    _delay_ms(3000);
17
    PORTD = 0xFF;
18

19
  /* Initialisiere Display, Cursor aus */
20
    lcd_init(LCD_DISP_ON);
21
  PORTD = 0xFE;
22

23
    /* loesche das LCD Display und Cursor auf 1 Zeile, 1 Spalte */
24
    lcd_clrscr();
25
    PORTD &= 0xFC;
26
      
27
    /* String auf Display anzeigen */
28
    lcd_puts("Hello world.");
29
    PORTD &= 0xF8;
30

31
    while(1);
32
}

Woran könnte das liegen?

Lieben Dank!
Max
Gast #1087691
Lesenswert?

So ich kann es schon was Grenzen! :-)
1
#if KS0073_4LINES_MODE
2
    /* Display with KS0073 controller requires special commands for enabling 4 line mode */
3
  lcd_command(KS0073_EXTENDED_FUNCTION_REGISTER_ON);
4
  lcd_command(KS0073_4LINES_MODE);
5
  lcd_command(KS0073_EXTENDED_FUNCTION_REGISTER_OFF);
6
#else
7
  PORTD = 0xFE;
8
  lcd_command(LCD_FUNCTION_DEFAULT);      /* function set: display lines  */
9
  PORTD = 0xFC;
10
#endif

die LED 0 leuchtet die LED 1 nicht ;)
Gast #1087697
Lesenswert?

>Und zwar möchte ich gern mit Hilfe
>der Peter Fleury Lib ein EA W162b-N3LW ansprechen.

>Ach so sollte ich noch erwähnen. Es geht ja erst LED 0, dann LED 1, dann
>LED 2 an und dann wieder aus. Nach der richtigen Init vom LCD sollte er
>LED 0 angehen. Geht Sie leider aber nicht!

Tja, so ohne Quellcode wird das hier nix.
Ich vermute einfach mal: Falsch angeschlossen.
Wie die bei den meisten anderen Deppen auch.
Gast #1087711
Lesenswert?

Wie ohne Quellcode?! Ist doch da oben. Und nein ich habe ihn nicht 
falsch angeschlossen! Habe ich zich mal kontrolliert! Aber nett das du 
mich als "Depp" bezeichnest.

Hängen tut das Programm an der while schleife!
1
static uint8_t lcd_waitbusy(void)
2

3
{
4
    register uint8_t c;
5

6
    /* wait until busy flag is cleared */
7
    while ( (c=lcd_read(0)) & (1<<LCD_BUSY)){}
8

9
    /* the address counter is updated 4us after the busy flag is cleared */
10
    delay(2);
11

12
    /* now read the address counter */
13
    return (lcd_read(0));  // return address counter
14
    
15
}/* lcd_waitbusy */
Gast #1087718
Lesenswert?

1
#define LCD_PORT         PORTB        /**< port for the LCD lines   */
2
#define LCD_DATA0_PORT   LCD_PORT     /**< port for 4bit data bit 0 */
3
#define LCD_DATA1_PORT   LCD_PORT     /**< port for 4bit data bit 1 */
4
#define LCD_DATA2_PORT   LCD_PORT     /**< port for 4bit data bit 2 */
5
#define LCD_DATA3_PORT   LCD_PORT     /**< port for 4bit data bit 3 */
6
#define LCD_DATA0_PIN    1            /**< pin for 4bit data bit 0  */
7
#define LCD_DATA1_PIN    3            /**< pin for 4bit data bit 1  */
8
#define LCD_DATA2_PIN    5            /**< pin for 4bit data bit 2  */
9
#define LCD_DATA3_PIN    7            /**< pin for 4bit data bit 3  */
10
#define LCD_RS_PORT      LCD_PORT     /**< port for RS line         */
11
#define LCD_RS_PIN       2            /**< pin  for RS line         */
12
#define LCD_RW_PORT      LCD_PORT     /**< port for RW line         */
13
#define LCD_RW_PIN       4            /**< pin  for RW line         */
14
#define LCD_E_PORT       LCD_PORT     /**< port for Enable line     */
15
#define LCD_E_PIN        6            /**< pin  for Enable line     */

So haben ich meine Pins verteilt. Ist auf dem STK für mich angenehmer...
Gast #1087721
Lesenswert?

>Hängen tut das Programm an der while schleife!
>static uint8_t lcd_waitbusy(void)

Hast du den RW Pin auch angeschlossen?
Wenn ja, warum nicht ;)
Wie sieht der Rest der Schaltung aus?
Wo sind welche Pins angeschlossen?
Gast #1087753
Lesenswert?

Ja doch doch! ;-) Der Peter Fleury hat ja gesagt, dann man die RW 
Leitung anschließen soll :-) Also habe ich das auch gemacht. In der 
lcd_waitbusy(void) brauch man das Signal ja...

Ich hab jetzt einfach mal spaßeshalber die lcd_waitbusy(void) zu 
testzwecken umgeschrieben...
1
static uint8_t lcd_waitbusy(void)
2

3
{
4
  register uint8_t c;
5

6
    /* wait until busy flag is cleared */
7
    //while ( (c=lcd_read(0)) & (1<<LCD_BUSY)){}
8

9
    /* the address counter is updated 4us after the busy flag is cleared */
10
    _delay_ms(1000);
11

12
    /* now read the address counter */
13
    //return (lcd_read(0));  // return address counter
14
  return 0;
15
    
16
}/* lcd_waitbusy */

und meine Main habe ich auch jetzt modifiziert.
1
#ifndef F_CPU
2
#define F_CPU 8000000UL
3
#endif
4

5
#include <stdlib.h>
6
#include <avr/io.h>
7
#include <util/delay.h>
8
#include "lcd.h"
9

10
int main(void)
11
{
12
  /* Initialisiere Display, Cursor aus */
13
    lcd_init(LCD_DISP_ON_CURSOR_BLINK);
14
  PORTD &= 0xFE;
15

16
    /* loesche das LCD Display und Cursor auf 1 Zeile, 1 Spalte */
17
    lcd_clrscr();
18
    PORTD &= 0xFC;
19
      
20
    /* String auf Display anzeigen */
21
    lcd_puts("0");
22
  PORTD &= 0xF8;
23

24
  while(1);
25
}

Die Null bekomme ich öhm nicht wirklich zusehen. Aber der Curser blinkt! 
;-)

Ich hab versuch ein Bild zu machen, allerdings sieht man nicht was ich 
haben will... Ich versuch das jetzt mal anders zu zeigen, wie der 
Display das anzeigt.


x000x
0xxx0
0xx00
0x0x0
x000x
0xxx0
0xx00
0x0x0

Sprich 5x8 :) und da nehmen Blink munter der der Curser
#1089654
Lesenswert?

Schau dochmal in das Datenblatt Deines Controllers, welchem Code Deine 
Pixelmuster entsprechen.

Bzw. stell erstmal fest, was für ein Controller in Deinem LCD ist, ob er 
HD44780 kompatibel ist oder irgendwelche Anomalien dazu hat.

Zur Fleury Lib kann ich nichts sagen, da ich sie noch nie benutzt habe 
(ist mir viel zuviel Code).
Ich benutze meine Minimalversion im 4Bit-Mode ohne RW an 6 völlig 
beliebigen IO-Pins.


Falls Du keinen Fehler findest, poste mal das komplette Projekt mit 
deiner Fleury Lib.
Oftmals sieht man den Fehler nur im Kontext und nicht in verstreuten 
Codeschnipselchen.

Meistens hat der Poster auch eine eingeschränkte Sicht auf sein Problem 
und postet nur solche Schnipselchen, die den Fehler garantiert nicht 
enthalten (Murphy’s Law).
Oder welche, die er so nicht verwendet (da nicht copy&paste seines 
Originalcodes).


Peter
Gast #1093298
Lesenswert?

Hab heute einen vergleichbaren LCD von einem Kollegen bekommen! Und 
siehe da das Programm läuft. Also ist warscheinlich mein LCD kaputt. Der 
gleiche LCD ist heute bei Reichelt rausgegangen. Mal schauen, was der 
sagt. Ist eine Garantie auf solchen LCD's?
#1145870
Lesenswert?

hi, hatte auch das problem mit dem aufhänger in der waitbusy routine.
das ganze passiert, weil lcd_read dem display nicht genug zeit lässt die 
daten auf den port zu schieben. habe das behoben indem ich die 
zeitschleife nach dem enable verändert habe:
1
//#define lcd_e_delay()   __asm__ __volatile__( "rjmp 1f\n 1:" );
^^ den hier auskommentieren
1
#define lcd_e_delay()   delay(1);
^^ und auf die schnelle nen einfaches delay rein

läuft gut, wobei es die bessere lösung währe hier die assembler routine 
anzupassen. vllt hat ja jemand mehr plan von assembler als ich und weiß 
wie man da ein paar mehr takte rausbekommt... Mein µC läuft auf 12MHz.

MfG

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