mikrocontroller.net

Forum: Compiler & IDEs EA W162B Problem beim Initialisieren


Autor: Max (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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! :-)
#include <stdlib.h>
#include <avr/io.h>
#include <util/delay.h>
#include "lcd.h"

int main(void)
{

    /* LEDtest */
    DDRD =0xFF;
    PORTD = 0xFE;
    _delay_ms(1000);
    PORTD &= 0xFC;
    _delay_ms(1000);
    PORTD &= 0xF8;
    _delay_ms(3000);
    PORTD = 0xFF;

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

    /* loesche das LCD Display und Cursor auf 1 Zeile, 1 Spalte */
    lcd_clrscr();
    PORTD &= 0xFC;
      
    /* String auf Display anzeigen */
    lcd_puts("Hello world.");
    PORTD &= 0xF8;

    while(1);
}

Woran könnte das liegen?

Lieben Dank!
Max

Autor: Max (Gast)
Datum:

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

Autor: Max (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Max (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So ich kann es schon was Grenzen! :-)
#if KS0073_4LINES_MODE
    /* Display with KS0073 controller requires special commands for enabling 4 line mode */
  lcd_command(KS0073_EXTENDED_FUNCTION_REGISTER_ON);
  lcd_command(KS0073_4LINES_MODE);
  lcd_command(KS0073_EXTENDED_FUNCTION_REGISTER_OFF);
#else
  PORTD = 0xFE;
  lcd_command(LCD_FUNCTION_DEFAULT);      /* function set: display lines  */
  PORTD = 0xFC;
#endif

die LED 0 leuchtet die LED 1 nicht ;)

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Max (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!
static uint8_t lcd_waitbusy(void)

{
    register uint8_t c;

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

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

    /* now read the address counter */
    return (lcd_read(0));  // return address counter
    
}/* lcd_waitbusy */

Autor: Max (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#define LCD_PORT         PORTB        /**< port for the LCD lines   */
#define LCD_DATA0_PORT   LCD_PORT     /**< port for 4bit data bit 0 */
#define LCD_DATA1_PORT   LCD_PORT     /**< port for 4bit data bit 1 */
#define LCD_DATA2_PORT   LCD_PORT     /**< port for 4bit data bit 2 */
#define LCD_DATA3_PORT   LCD_PORT     /**< port for 4bit data bit 3 */
#define LCD_DATA0_PIN    1            /**< pin for 4bit data bit 0  */
#define LCD_DATA1_PIN    3            /**< pin for 4bit data bit 1  */
#define LCD_DATA2_PIN    5            /**< pin for 4bit data bit 2  */
#define LCD_DATA3_PIN    7            /**< pin for 4bit data bit 3  */
#define LCD_RS_PORT      LCD_PORT     /**< port for RS line         */
#define LCD_RS_PIN       2            /**< pin  for RS line         */
#define LCD_RW_PORT      LCD_PORT     /**< port for RW line         */
#define LCD_RW_PIN       4            /**< pin  for RW line         */
#define LCD_E_PORT       LCD_PORT     /**< port for Enable line     */
#define LCD_E_PIN        6            /**< pin  for Enable line     */

So haben ich meine Pins verteilt. Ist auf dem STK für mich angenehmer...

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Max (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...
static uint8_t lcd_waitbusy(void)

{
  register uint8_t c;

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

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

    /* now read the address counter */
    //return (lcd_read(0));  // return address counter
  return 0;
    
}/* lcd_waitbusy */

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

#include <stdlib.h>
#include <avr/io.h>
#include <util/delay.h>
#include "lcd.h"

int main(void)
{
  /* Initialisiere Display, Cursor aus */
    lcd_init(LCD_DISP_ON_CURSOR_BLINK);
  PORTD &= 0xFE;

    /* loesche das LCD Display und Cursor auf 1 Zeile, 1 Spalte */
    lcd_clrscr();
    PORTD &= 0xFC;
      
    /* String auf Display anzeigen */
    lcd_puts("0");
  PORTD &= 0xF8;

  while(1);
}

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

Autor: Max (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und noch ein Beispiel. Wenn ich die 5 ausgeben will kommt das!

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

Autor: Max (Gast)
Datum:

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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Max (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Max (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Um euch mehrere Seiten Code zu ersparen habe ich einfach mal den Code 
http://www.mikrocontroller.net/articles/AVR-GCC-Tu...

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

Autor: Max (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: MarkusB (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Max (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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... :)

Autor: Malte Pöggel (maltep87)
Datum:

Bewertung
0 lesenswert
nicht 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:
//#define lcd_e_delay()   __asm__ __volatile__( "rjmp 1f\n 1:" );
^^ den hier auskommentieren
#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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.