Forum: Compiler & IDEs EA W162B Problem beim Initialisieren


von Max (Gast)


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

von Max (Gast)


Lesenswert?

Áso ich nutze überings einen Atmega16 mit dem internen 8Mhz Clock. :-)

von Max (Gast)


Lesenswert?

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!

von Max (Gast)


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 ;)

von holger (Gast)


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.

von Max (Gast)


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 */

von Max (Gast)


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...

von holger (Gast)


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?

von Max (Gast)


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

von Max (Gast)


Lesenswert?

Und noch ein Beispiel. Wenn ich die 5 ausgeben will kommt das!

00000
0xxxx
0000x
xxxx0
00000
0xxxx
0000x
xxxx0

von Max (Gast)


Lesenswert?

Keiner eine Idee? Ist der Controller vom LCD kaputt oder liegt es 
einfach daran, dass das Timing nicht richtig ist?

von Peter D. (peda)


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

von Max (Gast)


Lesenswert?

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

von Max (Gast)


Lesenswert?

Um euch mehrere Seiten Code zu ersparen habe ich einfach mal den Code 
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#LCD-Ansteuerung

eingefügt und ausprobiert. Das selbe Phänomen. Wobei ich jetzt auch das 
RW auf GND gelegt habe!

Wie warscheinlich ist es denn das der HD44780 kaputt ist. Wohl bemerkt 
bei einem neuen LCD...

von Max (Gast)


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?

von MarkusB (Gast)


Lesenswert?

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

von Max (Gast)


Lesenswert?

Jo! Hab ich dran. Hab das STK 500 btw. Könnte man mal versuchen. Aber so 
wie es aussieht ist der Display irgendwie über den Jordan gegangen... :)

von Malte P. (maltep87)


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

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.