Hallo ich habe folgedes Problem. Ich möchte Temperatur mit einem DS18s20 messen und das Ergebnis unter anderem auf dem Display darstellen - soviel nur als Hintergrundinfo - also eigentlich ein ganz simple Aufgage. Mein Problem ist nun dass ich die Displayansteuerung einfach aus AVR-Tutorial:LCD abgekupfert habe (den C-Code) und diesen zur Ansteuerung verwende(4bit Mode). Das funktioniert auch - jedoch nur in der ersten Zeile. Ich komme nicht um die Burg in die zweite. Weder indem ich die ddram Adresse setze noch indem ich einfach weiter Zeichen ausgebe. Ich weiß die zweite Zeile kommt erst bei 40...... Hat jemand vllt den Code aus dem dem AVR-Tutorial schon ausprobiert/vllt sogar auf dem 16x2 Display von Neuhold???
du musst den command an den controller senden, dass er in die 2. zeile springen soll! in assembler ist das ldi temp1, 0b11000000 rcall lcd_command binär= 0b11000000 Hexadezimal = 0xC0
wie das jetzt aber in C funktioniert, weiß ich nicht, da ich selber grad mit AVRs und LCDs anfange und nur in Assembler damit gearbeitet habe
binär= 0b11000000 Hexadezimal = 0xC0 ist ja ein Sprung auf 0x40 b1000000. Das weiß ich schon dass das so funktionieren sollte - tut es aber nicht! ein Sprung inerhalb der ersten Zeile funktioniert. ==> meine Überlegung es muss irgendwie ein Fehler in der initialisierung sein - aber mir fällt nix mehr ein!!! Hier die Initialisierung aus AVR-Tutorial LCD // muss 3mal hintereinander gesendet werden zur Initialisierung PORT_LCD &= 0xF0; PORT_LCD |= 0x03; // 0b00000011 lcd_enable(); PORT_LCD |= 0x03; lcd_enable(); PORT_LCD |= 0x03; lcd_enable(); // 4bit-Modus einstellen PORT_LCD |= 0x02; // 0b00000010 lcd_enable(); _delay_ms(5); // 4Bit 2 Zeilen 5x8 lcd_command(0x28); // 0b00101000 // Display ein Cursor aus kein Blinken lcd_command(0x0C); // 0b00001100 // inkrement / kein Scrollen lcd_command(0x04); // 0b00000100
Lass folgendes mal weg: // 4bit-Modus einstellen PORT_LCD |= 0x02; // 0b00000010 lcd_enable(); _delay_ms(5);
Tut mir leid, es so krass sagen zu müssen, aber die C-Init des Tutorials, die Du verwendet hast, ist grober Unfug. Erstmal fehlen da die (unbedingt nötigen) Pausen zwischen den drei gleichen Init-Befehlen, und dann bringt das "4bit-Modus einstellen" in der gegebenen Formulierung absolut gar nichts, weil PORT_LCD |= 2 den vorherigen Wert (3) gar nicht verändert. Also versuch mal // muss 3mal hintereinander gesendet werden zur Initialisierung PORT_LCD = 0x03; // 0b00000011 lcd_enable(); _delay_ms(5); lcd_enable(); _delay_ms(5); lcd_enable(); _delay_ms(5); // 4Bit 2 Zeilen 5x8 lcd_command(0x28); // 0b00101000 und dann weiter. Und wenn danach das Umsetzen des Cursors auf Zeile 2 immer noch nicht funzt, sag nochmal Bescheid.
Funktioniert leider immer noch nicht. Meine jetztig Initialisierung: unsigned char temp3 = 50; while(temp3 != 0) { _delay_ms(5.0); // 5ms = 250ms warten temp3 = temp3 - 1; } PORTA = 0x03; // 0b00000011 lcd_enable(); _delay_ms(5); lcd_enable(); _delay_ms(5); lcd_enable(); _delay_ms(5); // 4Bit 2 Zeilen 5x8 lcd_command(0x28); // 0b00101000 // Display ein Cursor aus kein Blinken //lcd_command(0x0C); // 0b00001100 // inkrement / kein Scrollen //lcd_command(0x04); // 0b00000100 Ich komme immer noch nicht in die zweite Zeile - wenn ich im ddram ewig weiterschreibe überschreibe ich mir irgendwann wieder die erste Zeile, aber die zweite bleibt leer! Vllt hat jemand noch einen Tipp
PORTA = 0x03; // 0b00000011 lcd_enable(); _delay_ms(5); lcd_enable(); _delay_ms(5); lcd_enable(); _delay_ms(5); Hier musst du schon zwischen den einzelnen Loops den Befehl ausgeben! Außerdem muss 0x30 geschrieben werden! unsigned char i=3; do{ PORTA = 0x30; // 0b00000011 lcd_enable(); _delay_ms(5); }while(--i); Weiters würd ich drauf achten ob RS (bevor du Befehle sendest)wirklich Null ist. Ansonsten schickst du Daten und keine Befehle (Datenblatt)! Lg und good luck
0x30 weil du ja den 4Bit Modus willst. Zuerst wird also das higher nibble(halbes Byte) gesendet und dann das low nibble
Funktioniert irgendwie immer noch nicht - hab da gerade noch eine andere Überlegung: müssten wenn ich die Kontrastspannung nach oben drehe nicht beide Zeilen schwarz werden? Bei mir wird es nur die erste!
naja... die zweite zeile qürde ein wenig (bis mittel) sichtbar werden. Du kannst am Port net nur die Daten anlegen. Falls PortA 8Bit breit ist (ka ahnung da ich keine megas proge) musst du die Daten schieben. Ich stell dir mal mein LCD File rein. Kannst mal gucken wie das für den 4Bit mode funzt. Lg
Also ich weiß nicht ob ich deinen Hinweis jetzt richtig verstehe aber wenn du damit meinst dass ich jedes Byte in zwei Nibble (Big Endian) zerteilen muss um dem Display die Daten zu schicken - dass hab ich/das Programm schon gemacht indem ich das Byte um <<4 shifte! Ich bin inzwischen der Meinung dass mein Display einfach defekt ist und ich werde mein Glück am Wochenende mit nem anderen versuchen! Falls jemandem natürlich sonst noch einen sachdienlicher Hinweis hat bin ich auf jeden Fall dankbar. lg
Hi, arbeite im Moment auch mit einem LCD Display. Ich habe auch die init-Sequenz aus dem Tutorial. Ich verwende folgende 2 Funktionen:
1 | void lcd_home1(void) // Cursor auf Stelle 1 |
2 | {
|
3 | lcd_send(0x80,1); |
4 | }
|
5 | |
6 | void lcd_home2(void) // Cursor auf Stelle 1 Zeile 2 |
7 | {
|
8 | lcd_send(0xC0,1); |
9 | }
|
funktioniert bei mir einwandfrei. Einziger Unterschied: Das Display selbst: Ich habe ein "2-zeiliges LC-Display mit integriertem Controller KS0066 (HD44780 kompatibel)." Gruß Andreas
Zur Lösung meines Problems: Es war schlicht und einfach mein Display kaputt!!! Ärger Neues Display rein - und siehe da in der zweiten Zeile steht was!
Zur Lösung meines Problems: Es war schlicht und einfach mein Display kaputt!!! Ärger Neues Display rein - und siehe da in der zweiten Zeile steht was! Danke trotzdem an alle für Eure Antworten!!! lg
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.