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)); }
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;
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.