www.mikrocontroller.net

Forum: Compiler & IDEs LCD: Probleme mit Cursor


Autor: funker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

nach der Initialisierung vom LCD wollte ich das Display noch löschen,
aber jedesmal wenn ich den Reset-Taster am Board drücke, spring der
Cursor eine Stelle weiter. Ist das normal, wenn ich den Cursor nicht
sage wo er hin soll?

Auch weiss ich nicht, warum der Cursor an der 2.Position erscheint.

void clear_lcd(void)
  {
  //busywait();            //Warten bis Busy=0
  instruction_write();    //RS und RW =0
  PORTD|=0x00;      //D5=1  <-High-Nibble
  lcd_enable();      //E=1 pause E=0
  PORTD|=0x01;      //N=1 und F=0 <-Low-Nibble
  lcd_enable();
  _delay_loop_2(1000);
}

main(){
lcdinit();
clear_lcd();
}

Kann das daran liegen, dass ich das Busy-Flag noch nicht kontrolliert
habe?
Bin mir mit Busy_wait noch nicht ganz sicher, vielleicht kann mir
jemand sagen, ob die Funktion dafür passt:



void busywait(void)
  {
  outp(0x00,DDRD);      //DDRC löschen
  outp(DDRD|=0x07,DDRD);
  PORTD &= RS;        //RS=0
  PORTD |= RW;        //RW=1
  _delay_loop_2(1000);
        while (bit_is_clear(PIND,PIND3));
  }

Autor: funker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe jetzt mehrere Fehler gefunden, habe eine pause in der lcd_init
gelöscht, das Display war deshalb nicht richtig initialisiert und hat
schon geblinkt, als nur lcd_init im main() stand.
DDRD = 0x07 war auch falsch, habe jetzt 0xff reingeschrieben.

Lasse ich den Busy-Flag check weg und schreibe eine pause rein, dann
funktioniert es.

Vielleicht kann mir jemand erklären, was ich beim BF-check falsch
verstehe, bzw. falsch gemacht habe.

Laut Datenblatt muss ich RS=0 und RW=1 setzen, damit ich BF lesen kann.
Dann noch eine kleine Pause, jetzt müsste doch der Befehl
while(bit_is_clear(PIND,PIND3));
dafür sorgen, dass solange keine weiteren Befehle ausgeführt werden bis
BF Null ist.
An PIND3 ist mein DatenBit7 vom LCD, also LCD-Pin14, mir scheint es,
als ob die Schleife endlos läuft. Ohne BF-check erhalte ich den Cursor,
wenn ich eine Pause reinschreibe.

Meine Pinbelegung noch:
#define DB4 0x01;
#define DB5 0x02;
#define DB6 0x04;
#define DB7 0x08;
#define RS  0x10;
#define E   0x20;
#define RW  0x40;

Autor: funker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Muss wohl am Kaffee und der Uhrzeit gelegen haben. Hat sich, wie so
vieles schon, wieder mal erledigt. Eingänge und Ausgänge, da war der
Fehler.

outp(DDRD|=0x07,DDRD);
War schon nahe dran und 0xff zu viel des guten, 0x08 und es
funktioniert. 0x0f müsste auch gehen.

Vielleicht kann jemand die Abfrage brauchen, funktioniert jetzt:


void busywait(void)
  {
  outp(0x00,DDRD);      //kann man sich wohl auch sparen
  outp(DDRD|=0x08,DDRD);//diese zeile macht ja auch das notwendige
  PORTD &= RS;
  PORTD |= RW;
  _delay_loop_2(1000);
  while (bit_is_clear(PIND,PIND3));
  }

PIND3 ist logischer Weise der DB7 Pin vom LCD.

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.