Ich habe ein LCD-Display 2x20 mit den oben genannten Chipsatz drauf. Ich möchte es im 4-Bit-Modus betreiben. Allerdings bekomme ich die Intialisierung nur auf 1 Zeile hin. An die zweite komme ich nicht ran, ob nun mit direkter Speicheraddressierung oder ewigen schreiben. Was mache ich falsch? Hier der Header und im Anhang das C-File: #ifndef LCD_H_INCLUDED #define LCD_H_INCLUDED #ifdef __cplusplus extern "C" { #endif #define LCD_ADDR_LINE1 0x00 #define LCD_ADDR_LINE2 0x40 #define LCD_CMD_SET_4BIT (0x20 | 0x08) /* 4 bit control, 2 lines display */ #define LCD_CMD_CLEAR 0x01 #define LCD_CMD_HOME 0x02 #define LCD_CMD_DISPLAY_OFF (0x08 | 0x00) #define LCD_CMD_DISPLAY_ON (0x08 | 0x02) #define LCD_CMD_DISPLAY_BLINK (0x08 | 0x01) #define LCD_CMD_CURSOR_SET 0x80 #define LCD_E_INIT DDRC |= 1<<PC0 #define LCD_E_SET PORTC |= 1<<PC0 #define LCD_E_CLR PORTC &= ~(1<<PC0) #define LCD_RS_INIT DDRC |= 1<<PC1 #define LCD_RS_SET PORTC |= 1<<PC1 #define LCD_RS_CLR PORTC &= ~(1<<PC1) #define LCD_RW_INIT DDRE |= 1<<PE1 #define LCD_RW_SET PORTE |= 1<<PE1 #define LCD_RW_CLR PORTE &= ~(1<<PE1) #define LCD_DATA_OUT_INIT DDRD |= 0xF0 #define LCD_DATA PORTD #define LCD_DATA_IN_INIT DDRD &= 0x0F #define LCD_DATA_IN PIND #define LCD_LIGHT_INIT DDRB |= 1<<PB6 | 1<<PB7 void lcd_init(void); void lcd_set(uint8_t option, uint16_t value); void lcd_putc(unsigned char c); #ifdef __cplusplus }; #endif #endif
och ne.... über welches Thema wurde schon mehr geredet als darüber? Ponyprog funktioniert nicht richtig? PortC Mega16/32 funktioniert nicht richtig? Auf Platz 3 bist du bestimmt mit deiner Frage. Bemühe mal die Forumssuche. Hier wurde schon (fast) jedes Display zum Laufen gebracht.
Dann muss ich wohl bis jetzt 3Threads erwischt haben, wo es nicht der Fall war... Naja ich habe auch noch nicht die Forumsuche benutzt. Wollte ich auch nur so anmerken...
Ja ich habe auch schon gesucht, aber nicht so das richtige gefunden. Wer nicht antworten will, brauch es ja nicht tun. Ist ja alles freiwillig. Wer helfen kann und will tut das eben.
Nja Ich kann zwar noch nicht Asm in AVR aber sowie das Aussieht kann ich mir nur schwer vorstellen, daß das geht. #define LCD_E_INIT DDRC |= 1<<PC0 #define LCD_E_SET PORTC |= 1<<PC0 #define LCD_E_CLR PORTC &= ~(1<<PC0) Warum um Himmelswillen schiebst Du die Ports? Warum für jeden PORT die gleiche vereinbarung? Worin besteht der unterschied zwischen #define LCD_E_INIT DDRC |= 1<<PC0 und #define LCD_E_SET PORTC |= 1<<PC0 Macht für mich keinen Sinn! Zudem kann dises Codefragment wohl kaum alles von deiner Initialisierung vom Display sein. Erklär mal was Du da vorhattest! Gruß Klaus
@A.K.: Auf 4 MHz habe ich noch nicht getestet. Da wäre ich gespannt, ob die ganze Schaltung überhaupt läuft. Der Display-Teil ist nur ein kleiner Teil der gesamten Ansteuerung. @Klaus: Ich programmiere ja auch nicht in Assembler, sondern in C. Das da ist nur der Header. Das C-File ist im Anhang. ;) Ich schiebe auch keine Ports, sondern die Pins. LCD_E_INIT ist ein Makro und bedeutet. PC0 auf Ausgabe, LCD_E_SET bedeutet PC0 auf High setzen, LCD_E_CLR, PC0 auf Low setzen. Die ganzen Makros gehen schon. Nur eben das Problem mit der 2. Zeile ....
@Ronny! Schau mal in das PDF ich denke es wird dir weiter helfen. Ist was schönes drin wegen Adressverteilung vielleicht geht dir dann ein Licht auf. Gruß Klaus
Vielen Dank! Die Anleitung ist sehr schön. Ich werde mich damit nochmal ganz genau auseinander setzen. Also alles nochmal lesen und schauen, wo der Fehler liegt. Wobei ich gerade sehe die Adressen stimmen. Aber nochmal lesen kann ja nichts schaden.
Kaum läuft es, gibt es schon wieder merkwürdige Fehler. Ich habe das jetzt hinbekommen. Abfrage läuft mit Busy-Flag lesen und auch ein CR und LF wird mittels Addresspointer umgesetzt. Was jetzt allerdings sehr merkwürdig ist, nach dem Umbau der Hardware: Ich habe den Kontrast als auch die Hinterleuchtung mittels PWM geregelt. Nund hatte ich den Kontrast noch über ein 10k-Poti laufen. Grundsätzlich dachte ich aber nicht, dass das wirklich sinnvoll ist. Also Poti raus und mittels Drahtbrücke ersetzt. Die Einstellung des Kontrastes funktioniert auch so wunderbar. Nur eben in einem anderen Regelbereich, was aber durchaus in Ordnung ist. Was aber jetzt komischerweise passiert ist, dass der Text nicht mehr richtig ordentlich ist. Einige Zeichen (ist immer verschieden) sind einfach durch ein anderes ersetzt. Also es werden eben falsche Zeichen ausgegeben. Woran kann denn das liegen? Bzw. was ist da durch den Umbau passiert? Beispiel: Normal: "Control" Falsch: "Congrol"
@Ronny! Da musst Du wohl ein Orakel fragen vielleicht! Ohne Code keine chance! Aber ich Tippe das deine Ausgabe-Routine nicht richtig funzt oder Timing passt dazu nicht richtig vor allem Enable! Debuggen kann da hilfreich sein! Wenn Du dir sicher bist das deine Zeichen aus dem Codespeicher richtig an den Datenport am Display ankommt solltest dann Timing Enable prüfen ( RS muss vorher gesetzt sein) Gruß Klaus
@Klaus: Ja ein Orakel wär cool. Aber im ernst. Vorher ging es. Mir ging schon durch den Kopf, dass das Kabel evtl. zu lang ist (ca. 30cm). Da könnten ja solche Zufälle dann auftreten. Nur kann man das ja durch Verlängerung der Timings wieder ausgleichen. Aber auch das bringt nichts. Ich hatte mal probiert die lcd_enable() - Routine zu verzögern: delay_us(10); LCD_E_SET; delay_us(10); LCD_E_CLR; delay_us(10); Leider auch hier kein Erfolg. Der Code ist mal anhängig. @Simon: Ohne die PWMs kann ich doch garnichts auf dem Display sehen.
Die PWMs stören den normalen Datentransfer, wenn sie durch das gleiche Kabel (Flachband?) gejagt werden. PWM-Leitungen von den anderen absetzen und mit eigenen Masse-Rückleitungen versorgen.
Du hast recht mit dem PWM. Ich habe das mal deaktiviert. Sieht zwar von Helligkeit und Kontrast total blöd aus, aber zum testen reicht es. Die Daten stimmen jetzt. Welchen Einfluss allerdings der Poti vorher hatte, weiß ich auch nicht. War im Prinzip ja mehr oder weniger einfach nur ein Pull-Down und ein Widerstand in der Leitung vor dem Flachbandkabel. Ich vermute mal, er hat die Pegel etwas kleiner gemacht, sodass jetzt die "Schmerzgrenze" überschritten wurde. Jetzt ist es aber an der Zeit das Problem reel zu lösen. Ich jage da knapp 4kHz rüber, weil es auf Grund der anderen Timer nicht niedriger geht. Ein Tiefpass kommt wahrscheinlich nicht wirklich in Frage, weil es schwer möglich ist die genaue Leistungsaufnahme des Display zu ermitteln. Zumal das Display flexibel austauschbar sein soll. Auch zusätzliche Masseleitungen sind nicht möglich, weil die ja im Stecker des Displays nicht vorgesehen sind. Was könnte man also tun?
dann nimmste nen tiefpass+opamp als impedanzwandler. Also auf die verrückte Idee, als Kontrastspannung ne PWM zu nehmen, bin ich auch noch nicht gekommen. Ist doch vorprogrammiert dass das stört. Schließlich geht die PWM dann auf irgndnen Draht auf der Platine, die sehr dicht aneinander herlaufen... Stell den Kontrast doch einmal gut ein, dann passts. Ich hab bei meinem 4x27 einen Spindeltrimmer neben die anschlüsse gelötet.
Die grundsätzliche Idee, dass so zu machen ist einfach, dass ich das ganze sowieso mit einem Mikrocontroller ansteuere, Konfigurationen im EEPROM speichere und ich nachher ohnehin nicht so gut an die Leiterplatte mehr rankomme. Und irgendwie ist es einfacher im Terminal einzugeben "display contrast xxx", also irgendwo da an einem Poti zu drehen. Zumal das gleich ja auch mit dem Backlight passiert. Die OP-Stufe mit dem Impedanzwandler habe ich schon für eine andere Funktionalität drauf. Die könnte ich nehmen. Es wird dann nur wieder etwas eng vom Platz und umfangreich. Ich bräuchte dann mindestens einen Doppel-Op, 2 Widerstände und 2 Kondensatoren für Kontrast und Backlight. Ich habe das alles auch nochmal ausprobiert. Ich habe das Problem nur mit dem PWM des Kontrastes. Und das seitdem ich das Poti ausgelötet habe. Die LCD-Treiber ziehen ja recht wenig Strom. Wäre es vorstellbar, dass der PWM für den Kontrast mehr oder weniger rumschwingt? Ich will mal probieren da evtl. ein Pull-Down von 10k reinzubauen. Evtl. reicht das ja aus. Oder denke ich da jetzt komplett falsch?
Ein passives RC-Glied sollte reichen. Dein Poti hat ja auch schon die Flanken etwas gedämpft, wodurch es keine Störungen gab. Nimm also einen Widerstand (probieren, mit etwa 470 Ohm beginnen) in Reihe und dann einen Elko 1µF...22µF gegen GND, dann stellt sich am Elko halbwegs die gewünschte Spannung ein. Der noch vorhandene "Hub" wird kaum noch Störungen erzeugen, da keine steilen Flanken mehr da sind. ...
>24 525592492 459-6634 10,35 9,83 9,21
Heftig. Das Ding kostet ja sogar bei einer Stückzahl von mehr als 11
über 9 und bei Pollin bekommt man es in einem Bausatz für 3E
beigelegt...
@Freak5: Muss ich das jetzt verstehen? Worauf bezieht sich dein Posting? ...
Sicher irgendwie im falschen Thread. Ich hatte noch eine andere Idee, weil ich wirklich nicht unbedingt mit den Filtern herumexperimentieren will - schon allein wegen der Kompatibilität zu anderen Displays. Wie sieht es denn mit einem einfachen Frequenzteiler aus? Funktionieren würde es sicher schon, wenn ich die 4kHz durch 10 oder 20 teile. Damit sind die "hohen" Frequenzen vom Flachbandkabel weg. Allerdings will ich auch kein 16poligen IC da raufsetzen. Gibt es da nicht was kleineres, das den Takt teilt? Alternativ wäre natürlich interessant welche Möglichkeiten ich über den ATmega selbst habe. Grundsätzlich benötige ich 4 (OC1, OC3) der Timer auf 4kHz. OC0 ist anderweitig extern belegt und OC2 benutze ich als Software-Timer um einige Sachen getimt zu "pollen". Die 2 anderen von OC1 hätte ich frei. Nun kann ich da nicht den Takt ändern. Aber gibt es da vielleicht andere Ansatzmöglichkeiten?
Hast du das einfache RC-Glied schon probiert? Es geht nicht um die Frequenz, sondern um die Flankensteilheit. Idealerweise würde das Display für Kontrast ja Gleichspannung benötigen, allerdings mit nur geringer Belastung (10k oder etwas mehr als Spannungsteiler reicht ja). Also gib ihm doch eine (noch etwas unsaubere) Gleichspannung aus einem Elko, den die PWM über einen Widerstand durch Aufladen und Entladen auf dem gewünschten Wert hält. Diese Gleichspannung mit aufmoduliertem Dreieck wird kaum Störungen verursachen und ist für das LCD immer noch besser als PWM (zerhackte Gleichspannung) mit ihren steilen Flanken. Ein Frequenzteiler würde zwar die Frequenz verringern, aber die steilen Flanken nicht. Also würden die Störungen erhalten bleiben. ...
Okay das mit dem RC probiere ich einfach mal aus. Beim Kontrast geht es ja. Beim Backlight allerdings nicht, da an dem Widerstand zuviel Strom abfällt. Wieso ist das Problem mit den steilen Flanken überhaupt? Grundsätzlich ist doch jedes Signal über den Kabel ein Wechselspannungssignal. Da sind dann doch auch steile Flanken. Also wird es doch eher ein Problem mit der Frequenz sein. Das ist mein Gedankenproblem.
Noch immer habe ich das ganze nicht ausprobiert. ABER ich habe gerade mal kurz den Kontrast verändert (mit PWM). Erstaunlich ist, dass die Schrift total merkwürdig aussieht, wenn ich den Kontrast herabsenke. Anscheinend kommt der mit der Frequenz nicht klar. Die Schrift läuft dann so farbig durch. Kann ich kaum erklären - erinnert so wie beim alten Fenerseher, wenn da nur so Balken laufen.
Das sind Interferenzen. Die entstehen durch Überlagerung zweier Frequenzen. Die LCD-Aisgabe ist ja kein statisches Bild, sondern ein pulsierendes. Wenn die Beleuchtung schon gepulst sein muss (muss sie das wirklich?), dann sollte die Frequenz schon sehr weit von der Ausgabefrequenz des LCDs entfernt sein. ...
>>Wieso ist das Problem mit den steilen Flanken überhaupt? >>Grundsätzlich ist doch jedes Signal über den Kabel ein >>Wechselspannungssignal. Da sind dann doch auch steile Flanken. Also >>wird es doch eher ein Problem mit der Frequenz sein. Das ist mein >>Gedankenproblem. Das kommt drauf an. Wenn einigermaßen viel Strom fließt, dann wirken sich auch niedrigere Frequenzen störend auf Nachbarleitungen aus (Induktion). Die Datenleitungen, die CMOS mit hochohmigen PullUps darstellen, ziehen kaum Strom und dadurch stört dann auch nicht so viel. Du kannst natürlich auch jede 2. Flachbandader auf Masse legen, das bringt Dich dann auch nochmal ein Stück weiter. Vielleicht probierst Du doch erstmal ein paar Anregungen durch und meldest Dich mit den Ergebnissen.
Ich hätte da eine Idee. Ist nicht sonderlich schön, aber so als Workaround: Kurz vor dem Enable die PWM einfach abschalten, nach dem Enable wieder einschalten. Die Enable Pulse sind so kurz, da wird das ja wohl kaum auffallen, oder?
Initialisieren kann man das LCD auch im unbeleuchteten Zustand. Aber ich denke mal, dass die Störungen auch beim Senden von Daten auftreten werden. Und dann die Beleuchtung jedesmal abschalten, das sieht sicherlich dumm aus... Ich würde auf die PWM komplett verzichten und stattdessen mit 2 oder 3 verschiedenen Vorwiderständen 3 bzw. 7 verschiedene Helligkeiten vorsehen, die durch Transistoren (oder ULN2x03) ausgewählt werden. Wenn die Ströme gut aufeinander abgestimmt sind (1:2:4), kann man damit sicher leben. ...
Warum kann man den PWM denn nicht vorher glätten? Man braucht doch nur eine Drosselspule und einen Kondensator, oder?
Weil dann der Vorteil der PWM, Energie (Verlustleistung) zu sparen, im Eimer wäre. Ein für PWM dimensionierter Transistor würde dann den Wärmetod sterben... Sicher kann man mit der geglätteten PWM eine steuerbare Stromquelle ansteuern, aber die erzeugt nunmal Wärme, und das möchte nicht Jeder. ...
? Jetzt erzähl mir nochmal, du kannst es sehen, wenn die Hintergrundbeleuchtung für ein paar µ-Sekunden abgestellt wird. Einfache Routine: PWM aus (Zustand halten) NOP Enable ein NOP Enable aus NOP PWM ein ferig! Wahlweise geht das als Makro.
Die Idee mit dem abschalten ist ganz clever. Nur das Problem liegt nicht beid er Hintergrundbeleuchtung, sondern beim Kontrast. Das Problem mit der Hintergrundbeleuchtung liesse sich sehr leicht regeln, weil davor noch ein FET liegt, den man mit einen kleinen Filter (RC: 100k, 220n) schon glätten könnte. Allerdings macht der keine Zicken, sondern der Kontrast. Da gab es Probleme mit den Interferenzen, sodass auch das abschalten nichts bringen würde. Ich habe jetzt die Hardware geändert: Laut Hannes seinen Anweisungen. 470 Ohm Widerstand und 10uF ELKO vor dem Kontrast am LCD und schon war alles super. Die Spannung ist danach superglatt (auch mit Oszi geschaut). Vielen Dank für eure Hilfe. Am Anhang findet sich der Schaltplan mit dem LCD-Stecker.
@...HanneS... Lux (HanneS): So meinte ich das nicht. Ich meine, dass man sich soetwas wie einen Step-Downregler damit baut. Der Kondensator mit der Spuele muss hinter dem Transistor sein und nicht davor. Man kann die PWM-Frequenz, die sonst das Display bekommen würde, doch durch eine Drosselspule leiten. Dadurch müsste der Strom eigentlich geglättet werden und ohne einen veränderlichen Strom gibt es kein Magnetfeld und ohne Magnetfeld gibt es keine Induktion. Den Strom, den das Display benötigt kennt man doch ~. Natürlich bleibt noch ein Teil des PWMs, aber das Problem wäre schon einmal nicht mehr so groß. Wenn man genug Energie übrig hat kann man natürlich auch durch einen Ohmischen Widerstand das gleiche Resultat bekommen. Für ein Kleines Display wäre das ja auch nicht schlimm, besonders wenn man es nur zum Basteln brauchen würde.
............................................................ Laut Hannes seinen Anweisungen. 470 Ohm Widerstand und 10uF ELKO vor dem Kontrast am LCD und schon war alles super. Die Spannung ist danach superglatt (auch mit Oszi geschaut). ............................................................ Das meinte ich doch. Aber ist es nicht so, dass für das Übersprechen der Strom und nicht der Kondensator verantwortlich ist? Außerdem verursacht ein welliger Strom eine höhere Verlustleistung am Kondensator, denke ich. Meine Vermutung dazu war, dass eine kleine Spule vor dem Kondensator das Resultat weiter verbessert.(Mit Blick auf das Übersprechen und auf die Verlustleistung) Praktisch gesehen braucht man das natürlich nicht mehr, wenn es schon funktioniert. Liege ich hier aber theoretisch richtig?
@Freak5: Zu einem Schaltregler gehört etwas mehr, als nur Spule und Kondensator. Vor allem muss der exakt dimensioniert und an die PWM-Frequenz angepasset werden. Wenn du das kannst, dann ist ja gut. Ich kann das (derzeit noch) nicht. Ich empfehle Anderen auch keine kritischen Schaltungen. OT: Was macht dein Grafik-LCD? Funktioniert es nun endlich? Wenn ja, woran lag es nun? ...
Was mir noch fehlt ist wirklich eine Berechnungsgrundlage. Ich habe das jetzt zusammengefrickelt und es geht. Aber viel besser ist es, wenn ich das auch nachrechnen kann. Die gesamte Schaltung auf der Leiterplatte ist auch nicht ausexperimentiert, sondern berechnet. Ich habe grundsätzlich folgende Angaben: - PWM-Frequenz (wenn 50/50): 3906 Hz - Betriebsspannung: 5V - Stromaufnahme des LCD-Drivers: 0,5 mA (kann sicher nach Display variieren) Theoretisch wären meine Gedankengänge folgende: - 3906 Hz entsprechen einer Periodendauer von 256ns - tau = R * C - um eine vernünftige Glättung zu haben sollte die Ladezeit vom Kondensator ca. 5 tau haben - LCD-Driver entspricht bei 5V und 0,5mA etwa einem 10k Widerstand - somit gilt bei 50/50 halbe Periodendauer von 128ns - R gebe ich mal mit 470 Ohm vor -> 5 * tau = R * C -> 5 * tau / R = C -> 5 * 128ns / R = C -> 640ns / 470 = C Ja und da haperts .. so richtig komme ich nicht weiter. Welchen Einfluss nämlich das LCD noch hat ist zu klären wegen der Last, Eben wegen der Entladung. Noch was anderes: Was ich jetzt noch gefunden habe, dass bei den Reichelt-LCDs die PWM-Frequenz des Backlights mit angegeben ist (400 - 1000 Hz) und auch da bin ich weit drüber ...
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.