Hallo, bastle immer noch an meinem Display herum, läuft aber nicht. 2x16 Zeichen der Firma Displaytech mit Controller KS0070B (Reichelt LCD 162C LED). Geschrieben werden soll über ein Schieberegister 74HC164N. Damit genügen drei Anschlüsse CLK, DATA und DATA-ENABLE. Schaltung ähnlich Ulrich Radig. Schaltplan füge ich mal bei. Zur Steuerung verwende ich einen Atmega 32, Standardansteuerung PORT C. Leider tut sich da nichts auf dem Display, habe nur einen schwarzen Balken in der ersten Zeile. Verwende ich PORT D, dann kann ich die Hintergrundbeleuchtung an- und ausschalten. Leitungen zwischen Mikrocontroller und IC bzw. LCD-Display sind x-mal geprüft. Weil ich den Atmega ohne externen Quartz betreibe habe ich über "F-CPU" den Takt von 1 MHZ bis 12 MHz probiert. Wo kann da der Knackpunkt sein? Danke vorab für Eure Hilfe.
>Leider tut sich da nichts auf dem Display, habe nur einen schwarzen Balken in der
ersten Zeile.
Anzeichen auf ein nicht initialisirtes Display
>Atmega 32, Standardansteuerung PORT C. Da kann auch das JTAG Fuse dazwischenfunken. Ist das aktiviert sind einige Pins an PORTC für JTAG "reserviert" Ich glaube PC2-PC5
Ja denke auch das es nicht richtig Initialisiert ist. DB0 - DB 3 kann man/sollte man offen lassen wenn man im 4Bit Modus arbeitet. Bei welcher Spannung wird das teil betrieben, wenn diese zu niedrig ist muss man die dem LCD Display immer länger zeit geben.
@ Dietmar P. (dietmar2)
> Bild1.png
Hast du Windpocken? In deinem Schaltplan sind zuviele Punkte. Die
gehören nur an Stellen, wo sich mehr als zwei Leitungen treffen, Eagle
setzt die meist schon automatisch.
DB0..3 MÜSSEN im 4-Bit Modus offen bleiben.
MFG
Falk
Danke mal für Eure Antworten. Vorab bitte ich um Nachsicht, bin noch Anfänger. Also der Reihe nach: - Was bedeutet "nicht initialisiert" und initialisiert man? - Das mit dem JTAG an PC2-PC5 kann hinkommen. Mit einem Testprogrämmchen war ich nicht in der Lage die Pins auf low zu setzen. Habe auch schon temp. Abschalten mit 2 x MCUCSR |= (1<<JTD); leider auch keine Änderung. - Das Display wird mit 5V betrieben. - Die Leiterbahn für DB0 - 3 einfach einmal kappen? - Punkte im Eagle zu setzen habe ich mir angewöhnt, weil manchmal keine Verbindung auf der Platine hergestellt wird.
@ Dietmar P. (dietmar2) >Vorab bitte ich um Nachsicht, bin noch Anfänger. Auf ihn mit Gebrüll! ;-) >- Was bedeutet "nicht initialisiert" und initialisiert man? Man muss spezielle Kommandos an das LCD schicken, bevor man mit ihm arbeiten kann. Steht im Datenblatt und tausenden Websites. http://www.mikrocontroller.net/articles/AVR-Tutorial:_LCD >- Das mit dem JTAG an PC2-PC5 kann hinkommen. Mit einem Testprogrämmchen > war ich nicht in der Lage die Pins auf low zu setzen. > Habe auch schon temp. Abschalten mit 2 x MCUCSR |= (1<<JTD); > leider auch keine Änderung. Muss aber gehen. >- Das Display wird mit 5V betrieben. Gut. >- Die Leiterbahn für DB0 - 3 einfach einmal kappen? Ja. >- Punkte im Eagle zu setzen habe ich mir angewöhnt, weil manchmal > keine Verbindung auf der Platine hergestellt wird. Ist trotzdem Unsinn und nervt. Wenn man ein Leiterbahn an einem Pin beginnt oder beendet, wird das Pin automatisch angeshlossen. Wenn man prüfen will, ob an einem Bauteil alle Pins angeschlossen sind, clickt man es mit MOSVE an und verschiebt es leicht. Denn sieht man die Gummibänder. Das kann man einfach mit der ESC Taste abbrechen. MFG Falk
Dietmar P. schrieb: > > - Was bedeutet "nicht initialisiert" und initialisiert man? Auch das LCd benötigt eine Initialisierungssequenz * wie ist die Übertragung; 4Bit - 8Bit * Zeichengröße etc. * ... letzten Endes ist auf dem LCD auch nichts anderes als ein spezieller µC, der erst mal seine Grundkonfiguration wissen will http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/LCD-Ansteuerung > - Das mit dem JTAG an PC2-PC5 kann hinkommen. Mit einem Testprogrämmchen > war ich nicht in der Lage die Pins auf low zu setzen. > Habe auch schon temp. Abschalten mit 2 x MCUCSR |= (1<<JTD); > leider auch keine Änderung. Schalt die Fuse ab. Wenn du keinen JTAG Adapter hast, kommt die dir immer nur in die Quere. > - Das Display wird mit 5V betrieben. > - Die Leiterbahn für DB0 - 3 einfach einmal kappen? Ja > - Punkte im Eagle zu setzen habe ich mir angewöhnt, weil manchmal > keine Verbindung auf der Platine hergestellt wird. Dann solltest du dir angewöhnen, die grünen Linien immer bis auf den Pin zu ziehen. Bringt auf Dauer mehr, als diese Punktorgie. Zur Kontrolle einfach mal ein IC im Schaltplan aufnehmen und ein wenig hin und her fahren. Alle grünen Linien, die stehen bleiben sind nicht richtig angeschlossen.
Hast du schona mal ein Display an einem µC betrieben? ohne SPI, wenn nein würde ich damit mal anfangen. >DB0..3 MÜSSEN im 4-Bit Modus offen bleiben. Ich leg die immer auf Masse, funktionert problemlos. JTAG deaktivieren: Markierte Fuse im Anhang im AVR Studio löschen
Hi!
>DB0..3 MÜSSEN im 4-Bit Modus offen bleiben.
Kann mir mal jemand zeigen in welchem Datenblatt das steht, in meinen
jedenfalls nicht. Persöhnlich halte ich das für ein Gerücht, lasse mich
allerdigs gerne belehren, dann aber bitte kein blabla sondern schwarz
auf weiss.
schönen Abend noch, Uwe
Wie man das initialisiert findest Du im Datenblatt des Displays beschrieben. Nach dem Reset muss man da bestimmte Nibbels schicken und verschiedene Wartezeiten müssen eingehalten werden. Vorgehensweise zum Daten rüberschicken ist klar, oder? Erst ins Schieberegister reinschieben, dann E kurz aktivieren ( war das high oder low activ? - habs vergessen), E wieder deaktivieren und nächsten Nibbel schieben. Wird E nicht richtig gehandhabt, dann hast Du ständig resets.
Hi >Kann mir mal jemand zeigen in welchem Datenblatt das steht, in meinen >jedenfalls nicht. Persöhnlich halte ich das für ein Gerücht, lasse mich >allerdigs gerne belehren, dann aber bitte kein blabla sondern schwarz >auf weiss. Zumindest der der Urvater, der HD44780, hat interne Pull-Ups. In meinem Datenblatt S.221. Einen Reim darauf kannst du dir selbst machen. MfG Spess
Du brauchst ein Schieberegister mit einem Ausgangs-Buffer. Bei dem '164 wird offensichtlich jedes Bit seriell direkt an den Ausgängen ausgegeben. Damit kannst Du ein Lauflicht bauen, aber keinen seriell zu parallel Wandler, den Du benötigst. Oder habe ich etwas übersehen?
Hab gerade mal im Datenblatt nachgesehen: http://www.nxp.com/documents/data_sheet/74HC_HCT164.pdf Das '164 ist für Deine Anwendung völlig ungeeignet. Die seriellen Bits laufen am Ausgang wie bei einem Lauflicht durch. Ein '595 würde gehen.
Hi! @Spess >Zumindest der der Urvater, der HD44780, hat interne Pull-Ups. In meinem >Datenblatt S.221. Einen Reim darauf kannst du dir selbst machen. mache ich, wenn nicht auf GND gelegt bekommst du kein 2 zeiliges Init hin weil Eingänge als High gelesen werden und F=H=5x10 Dots kein zweizeilig zulässt. Pull Down hätte Sinn gemacht. SET FUNCTION L L L L H DL N F X X 42ms DL: H 8 bits interface; L 4 bits interface N: H 2 line display; L 1 line display F:H 5 X 10 dots; L 5 X 7 dots schönen Abend noch, Uwe
> Das '164 ist für Deine Anwendung völlig ungeeignet. > Die seriellen Bits laufen am Ausgang wie bei einem Lauflicht durch. Macht doch nichts. Interessant wirds ja erst, wenn der Enable Impuls kommt. >>> DB0..3 MÜSSEN im 4-Bit Modus offen bleiben. Sowas gibts bei mir nicht. Mit offenen unbenutzten Busleitungen gibts jedesmal Scherereien bei der EMV-Burst-Prüfung... :-/
Lothar Miller schrieb: >> Das '164 ist für Deine Anwendung völlig ungeeignet. >> Die seriellen Bits laufen am Ausgang wie bei einem Lauflicht durch. > Macht doch nichts. > Interessant wirds ja erst, wenn der Enable Impuls kommt. Sehe gerade, dass der EN nicht über den 164 läuft. Stimmt, dann geht's.
Hallo, danke für die rege Diskussion. Werde das alles einmal moreg verdauen. Noch 'nen schönen Abend. Gruß Dietmar
Hallo, bin ein Schritt weiter. JTAG temp. ausgeschaltet, hat funktioniert. DB0 - 3 waren auf GND, Leiterbahn unterbrochen, jetzt erhalte ich eine Anzeige von Zeichen. Nächstes Problem: Die Zeichen sind nicht lesbar, das sind irgendwelche Punktkombinationen. Habe mir mal im Datenblatt die "Standard Pattern" angesehen. So besteht offenbar ein "A" aus den "upper 4 bit" 0100 und den "lower 4 bit" 0001. Soweit verstanden. Entsteht das Zeichen jetzt durch senden der 2 x 4 Bits an den Controller des Displays? Wenn ja, dann haut da was in meiner Schaltung mit dem Senden bzw. der Reihenfolge nicht hin. Wieder ein paar Tipps parat? Danke im Voraus.
> Entsteht das Zeichen jetzt durch senden der 2 x 4 Bits an den Controller
Ja, du mußt erst das high-Nibble und dann das low-Nibble senden.
Denn sonst könntest du ja nur 16 Zeichen darstellen...
OK, soweit klar. Wie entstehen aber nun die 2 x 4 Bits z.B. für den Buchstaben A. Im Datenblatt stehen die ganzen Kombinationen, aber wie erfolgt die Umsetzung. Ich könnte mir vorstellen über eine Tabelle, die finde ich aber in der Software nicht. Da stehe ich noch auf dem Schlauch und um weitere Hilfe.
Im Datenblatt vom LCD steht doch der Zeichensatz; z.B. 64 bzw. 0x41 für ein 'A'. Das macht dann 4 Bits mit 0x4 (binär 0100) und vier mit 0x1 (0001).
Hi Wie sieht denn deine Ausgaberoutine aus. Übrigens, das es an PortC nicht funktioniert, liegt mit grosser Sicherheit an der JTAG-Fuse. MfG Spess
Auf die Gefahr hin, dass ich als blöd dastehe, aber ......... Das mit der Zeichen-Kombination habe ich schon verstanden. Mir fehlt der Zwischenschritt. Ich habe im Programm eine Text-Variable mit dem Zeichen A, wie komme ich jetzt zu der Bit- bzw. Hex-Kombination, mit einer Rechenroutine, aber wie, oder muss ich im Programm alle Strings die ich auf dem Display ausgeben will in der Bit-Kombination programmieren. Ich frage auch deshalb, weil die U.-Radig Software im main.c folgendes stehen hat: lcd_print(0,0,"HALLO!"); // Zeile 1 lcd_print(1,0,"2 TEST!"); // Zeile 2 Davor gibt es zwar ein lcd-init, etc., aber ich kann die Routine nicht entdecken. die aus dem HALLO die Bit-Kombination macht.
@Dietmar
>Wie entstehen aber nun die 2 x 4 Bits z.B. für den Buchstaben A?
Gaaanz einfach!
Der Buchstabe A hat den Hexwert 0x41 und steht nun im Akku!
Den wert auf den Stack ablegen.
Den Akkuinhalt musst mit 0xF0 verunden und mit SWAP high/lowbyte
vertauschen oder alternativ rechts schieben so dass 0x04 im akku steht.
den sendest dann zum LCD.
Als nächstes holst den Stackwert wieder in den Akku und verundest mit
0x0F
so das jetzt im Akku 0x01 steht und sendest es zum LCD.
Jetzt hast du ein Byte gesendet.
Wenn ich das richtig sehe musst du zusätzlich dein zu sendentes Byte
jedesmal einmal nach links schieben damit es an der richtigen stelle im
Schieberegister landet.
Ich hoffe geholfen zu haben.
Hallöchen.. So hab ich das Display angeschlossen und es funktioniert. Hier noch der Link zur Projektseite: http://www.cczwei-forum.de/cc2/thread.php?postid=24510#post24510 Gruß Rolf
OK, danke. Dann muss das doch gehen, verflixt noch mal! Also weiter basteln, verschiebe es aber auf morgen, habe schon ganz eckige Augen. Schönes Wochenende! Gruß Dietmar
Dietmar P. schrieb: > Auf die Gefahr hin, dass ich als blöd dastehe, aber ......... > > Das mit der Zeichen-Kombination habe ich schon verstanden. > Mir fehlt der Zwischenschritt. Ich habe im Programm eine Text-Variable > mit > dem Zeichen A, wie komme ich jetzt zu der Bit- bzw. Hex-Kombination, mit > einer Rechenroutine, aber wie, oder muss ich im Programm alle Strings > die ich auf dem Display ausgeben will in der Bit-Kombination > programmieren. tja und genau da liegt eben der Unterschied zwischen einem C Programmierer und einem ASM Programmierer. ASM setzt ZWINGEND ein Hardwareverständnis voraus. Wir müssen jedes Bit und Byte mit Vornamen kennen. Bei C ist das eben nicht der Fall. Deshalb tun sich auch viele C Programmierer mit ganz simplen Zusammenhängen sehr schwer (so wie ich mit C ). Aber das kommt mit der Zeit. Und vielleicht kann auch ich irgendwann mal C wenigstens richtig lesen. Gruß
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.