EA W162B Problem beim Initialisieren

Gast #1087662
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
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
>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
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
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
>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
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
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 #1090014
Ok werde ich machen... Dachte halt das die Fleury ohne Probleme geht. 
Vielleicht bau ich mir besser doch auch so eine minimal Lib! :-) Die vom 
Fleury ist in der Tat der groß...

LG Max
Gast #1093298
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?
Gast #1093357
Hast du den ISP dranhängen wenn du testest? Ein guter ISP sollte nicht 
stören, aber ein Billigprogrammer kann da Probleme machen. Zieh ihn 
einfach mal ab
#1145870
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

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.