Forum: Mikrocontroller und Digitale Elektronik Display HD44780-Controller - 4-Bit-Modus - Init geht nicht


von Sebastian M. (mccrazy)


Lesenswert?

Hallo Leute,
ich versuche gerade ein Display mit einem HD44780-Controller in Betrieb 
zu nehmen aber irgendwie funktioniert das nicht so ganz.
Habe mir mal eine Init geschrieben wo nach meiner Meinung nach
Beendigung dieser der Cursor auf Position 1 blinken müsste.
Mehr will ich ja für den Anfang mal nicht ;-)
Vielleicht sieht ja einer von euch denn Fehler auf anhieb.
Lg
Sebastian

P.S. der Code:

#define F_CPU 16000000

#include <avr/io.h>
#include <avr/delay.h>
#include <avr/interrupt.h>

//**************Definitionen***********************

#define dport  PORTA
#define RS  PA0
#define RW  PA1
#define E   PA2

#define D4  PA4
#define D5  PA5
#define D6  PA6
#define D7  PA7




void display_init()
{
  _delay_ms(50);
  dport = (1<<D4) | (1<<D5);
  display_enable();
  _delay_ms(10);
  display_enable();
  _delay_ms(10);
  display_enable();
  _delay_ms(10);
  dport = (1<<D5);
  display_enable();
    _delay_ms(10);

  //**************Function Set*********************
  display_enable(); //4-Bit-Interface einstellen
  _delay_ms(10);
  dport = (1<<D7);  //2-Zeilig - 5x7 Pixel
  display_enable();
  _delay_ms(10);

  //*************Display OFF***********************
  dport = 0;
  display_enable();
  _delay_ms(10);
  dport = (1<<D7) | (1<<D6) | (1<<D5) | (1<<D4);   //Display ein // 
Cursor ein // Cursor blinken ein
  display_enable();
  _delay_ms(10);

  //*************Display Clear*********************
  dport = 0;
  display_enable();
  _delay_ms(10);
  dport = (1<<D4); //Display wird gelöscht und der Cursor auf Position 0 
gesetzt
  display_enable();
  _delay_ms(10);

  //*************Entry-Mode-Set********************
  dport = 0;
  display_enable();
  _delay_ms(10);
  dport = (1<<D6) | (1<<D5) | (1<<D4);    //Cursor-Position um 1 erhöhen 
wenn Zeichen geschrieben wird //Display wird gescrollt
  display_enable();
  _delay_ms(10);
  dport = 0;


}

void display_enable()
{
           dport |= (1<<E);
       _delay_us(10);
           dport |= (0<<E);
       _delay_us(10);
}


int main(void)
{
  display_init();

    while(1)
    {
        //TODO:: Please write your application code
    }
}

von Matthias (Gast)


Lesenswert?

Sebastian Müller schrieb:
> dport |= (0<<E);

Überleg mal, was diese Zeile in display_enable bewirkt

von (prx) A. K. (prx)


Lesenswert?

Sebastian Müller schrieb:

>            dport |= (1<<E);
>        _delay_us(10);
>            dport |= (0<<E);
>        _delay_us(10);

So wird das nix.

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Ver.C3.A4ndern_von_Registerinhalten

von Sebastian M. (mccrazy)


Lesenswert?

Oh........ was für ein dummer Fehler......
Bin aber noch ein blutiger Anfänger ;-)

Ok habe nun die Zeile abgeändert in:

void display_enable()
{
           dport |= (1<<E);
       _delay_us(10);
            dport &= ~(1 << E);
       _delay_us(10);
}

Ah...... hab den 2. Fehler......
Vielleicht sollte man den PORTA noch als Output konfigurieren ;-)
Danke euch 2.

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.