Hallo, ich versuche das Display AC1624 anzusteuern und an der ersten Position des Displays eine "0" auszugeben. Allerdings klappt dies nicht. Beim Initialisieren sehe ich die erste Zeile komplett schwarz während die zweite aus ist und danach sind beide Zeilen aus. Ich hoffe ihr könnt den entsprechenden Fehler in meiner SW (Anhang) finden. Vielen Dank vorab und ein schönes Wochenende Gruß
Beitrag #5222036 wurde von einem Moderator gelöscht.
Ich nutze den Atmega 8515. Das Display, laut Datenblatt, "KS0066 or Equivalent"
Schau Dir das noch einmal an: void uc_Init() { Disp_DDR = (1<<DB0_Pin) | (1<<DB1_Pin) | (1<<DB2_Pin) | (1<<DB3_Pin) | (1<<DB4_Pin) |(1<<DB5_Pin) | (1<<DB6_Pin) | (1<<DB7_Pin); //Portc Alle als Outout Exe_DDR = (1<<R_W_Pin) | (1<<Enable_Pin) | (1<<RS_Pin); //PortA teils als Output return; }
Ich bin mir nicht sicher. Meinst du den | Strich vor dem = Zeichen? Habe ich eingefügt. Ergab aber keine Besserung void uc_Init() { Disp_DDR |= (1<<DB0_Pin) | (1<<DB1_Pin) | (1<<DB2_Pin) | (1<<DB3_Pin) | (1<<DB4_Pin) |(1<<DB5_Pin) | (1<<DB6_Pin) | (1<<DB7_Pin); //Portc Alle als Outout Exe_DDR |= (1<<R_W_Pin) | (1<<Enable_Pin) | (1<<RS_Pin); //PortA teils als Output return; }
Wenn man die Daten Bit-reverse anschliesst muss man sie auch Bit-reverse ausgeben.
1 | #define DB0_Pin PC7
|
2 | #define DB1_Pin PC6
|
3 | #define DB2_Pin PC5
|
4 | #define DB3_Pin PC4
|
5 | #define DB4_Pin PC3
|
6 | #define DB5_Pin PC2
|
7 | #define DB6_Pin PC1
|
8 | #define DB7_Pin PC0
|
Ok, wie gibt man denn die Daten bit-reverse aus? Bzw. verstehe ich das Problem nicht. Ich setzt in der SW ja bsp. "DB7_Pin", ob diesem nun PC0 oder PC7 zugeorndet wird ist noch egal, hauptsache der entsprechnde Pin ist auch an DB7 des Display angeschlossen. Bzw. wo liegt mein Gedankenfehler?
Guest schrieb: > Bzw. wo liegt mein Gedankenfehler? Zumindest in allen Fällen an denen <Disp_Port> direkt mit 8 Bit beschrieben wird. <Exe_Port> pauschal auf Null zu setzen wird auch nicht zielführend sein.
1 | void Write_Data() //0 an erster Stelle im Display ausgeben |
2 | {
|
3 | Exe_Port=0x00; |
4 | Disp_Port=0x00; |
5 | Exe_Port |= (1<<RS_Pin); |
6 | Disp_Port = 0x30; |
7 | Enable(); |
8 | return; |
9 | }
|
Ja in Write_Data hast du recht. Das kann so nicht gehen. Aber die Änderung auf Disp_Port = 0x33; was zur Ausgabe einer 3 führen sollte macht keinen Unterschied. Ich sehe weiterhin beim Initialisieren die erste Zeile komplett schwarz und danach sind beide zeilen komplett leer. Nicht einmal das Blinken des Cursors, was ja eingeschaltet ist, kann ich sehen
Hi >Ja in Write_Data hast du recht. Das kann so nicht gehen. Aber die >Änderung auf Disp_Port = 0x33; was zur Ausgabe einer 3 führen sollte >macht keinen Unterschied. Nö. Dazu müsstest du 0xCC ausgeben. >Ich sehe weiterhin beim Initialisieren die erste Zeile komplett schwarz >und danach sind beide zeilen komplett leer. Dann hast du nichts Initialisiert. MfG Spess
Zunächst einmal danke bishier in für euere Hilfe, es geht mittlerweile zumindest zum Teil. Allerdings kann ich nicht nachvollziehen warum. Ich habe meine SW nochmal angehängt und ein Bild meiner Schaltung. Ich weiß HW-technisch nicht das beste... Ich habe die Verbindungen uc und Display gedreht weil mich dieses Bit-reverse nervt. Das Bild soll nur zeigen, ich verwende wirklich einen Atmega8515 und das PC7 an DB7 angeschossen ist (zu erkennen am Flachbandkabel mit der roten Markierung). Merkwürdig an der Geschichte ist, dass ich die zuordnung der einzelnen Pins des uc zum Display in der SW nicht geändert habe. Ich frage mich also, wieso gibt er mir jetzt genau das aus was ich auch haben will, nämlich ein "A" an der ersten Stelle des Displays? Und warum, obwohl es eingestellt ist, nichts auf dem Display blinkt. Im Befehl Display_On sage ich doch, dass das Display blinken soll. Vielleicht kann mir einer dabei auch noch helfen. Ich wünsche euch einen schönen Sonntag.
Guest schrieb: > Vielleicht kann mir einer dabei auch noch helfen. Solange du gutgemeinte Ratschläge ignorierst .... wird dir nicht wirklich zu helfen sein. Fach Mann schrieb: > Vielleicht mal das Timing überprüfen?
Guest schrieb: > Ich habe meine SW nochmal angehängt und ein Bild meiner Schaltung. Was ist das für eine wilde Schaltung an Port A0? Das Bild gibt die genaue Verdrahtung nicht her, aber es sieht so aus also ob du das Display über Port A0 versorgst. Erklär das erst mal bevor wir weiter spekulieren. Am besten gleich mit einem detaillierten Schaltplan.
Guest schrieb: > Ich habe meine SW nochmal angehängt und ein Bild meiner Schaltung. Fach Mann schrieb: > Was ist das für eine wilde Schaltung an Port A0? Jedenfalls gibt das Bild her dass PA1, PA2 und PA3 dein LCD steuern, und nicht wie in der Header Datei angegeben:
1 | #define Enable_Pin PA0
|
2 | #define R_W_Pin PA1
|
3 | #define RS_Pin PA2
|
wobei ich nach wie vor behaupte: Fach Mann schrieb: > <Exe_Port> pauschal auf Null zu setzen wird auch nicht > zielführend sein.
1 | void Write_Data() //0 an erster Stelle im Display ausgeben |
2 | {
|
3 | Exe_Port=0x00; |
4 | Disp_Port=0x00; |
5 | Exe_Port |= (1<<RS_Pin); |
6 | Disp_Port = 0x30; |
7 | Enable(); |
8 | return; |
9 | }
|
Aber wenn man Ratschläge nicht hören will hilft da gar nix.
Hallo, das Timing ist, denke ich, mehr als ausreichend, da ich mindestens die doppelte Zeit warte wie im Datenblatt angegeben. Und ich habe das Timing vorher auch deutlich erhöht (faktor 10)--> gab keine Änderung. Habe ich nicht geschrieben weil ich es schlicht vergessen habe aber ich versuche schon alle Ratschläge zu testen. Ich setzte vorher immer alles Null weil ich mir dann nie Gedanken machen muss welche Leitung nun welchen Status hat. Sie haben zu beginn eines Befehls immer den selben nämlich 0 und ich brauche nur die High setzen die es sein sollen. So kann es mir nicht passieren, dass aus versehen eine Leitung noch High ist, die es nicht sein soll. Ich bin für alles offen wie man das umgehen kann. Auf dem Bild siehst du bei PortA ein rotes und 3 schwarze Kabel. Das rote geht an Pin 40 des uc und ist VCC vom uc und Display Pin 2. Die 3 schwarzen sind PA0-2 und entsprechen der Header-Datei. PA0 auf Pin 6 vom Display PA1 auf Pin 5 PA2 auf Pin 4 Was ich eigentlich ausdrücken wollte ist: Die Zuordnung in der HW nämlich PC7 auf Pin 14 also DB7 bis PC0 auf DB0 entspricht nicht der, in der Header-Datei. Dort ist die Zuordnung verdreht und trotzdem kommt das raus, was ich haben will. Das ist es was ich nicht verstehe. Gut warum das Display nicht blinkt obwohl es das eigentlich sollte verstehe ich auch nicht^^
Guest schrieb: > Habe ich nicht geschrieben weil ich es schlicht vergessen habe aber ich > versuche schon alle Ratschläge zu testen. Tipps verlangen und nicht drauf eingehen, man kann das als Beratungsresistenz verstehen. Guest schrieb: > Ich bin für alles offen wie man das umgehen kann. Indem du ein Bit löschst genau dann wenn es null sein soll, und indem du es setzt genau dann wenn es 1 sein soll. Guest schrieb: > Auf dem Bild siehst du bei PortA ein rotes und 3 schwarze Kabel. Das > rote geht an Pin 40 des uc und ist VCC vom uc und Display Pin 2. > Die 3 schwarzen sind PA0-2 und entsprechen der Header-Datei. > PA0 auf Pin 6 vom Display > PA1 auf Pin 5 > PA2 auf Pin 4 Wenn man das fehlerhaft interpretiert dann liegt das hier nicht am Leser sondern an demjenigen der so beschissene Fotos macht. Guest schrieb: > das Timing ist, denke ich, mehr als ausreichend, da ich mindestens die > doppelte Zeit warte wie im Datenblatt angegeben. Auch das man kann das als Beratungsresistenz verstehen. Wo sind denn in deiner Source die Wartezeiten die das Datenblatt vorgibt?
Ich bin sehr sehr froh über deine Hilfe und wollte dich gewiss nicht verärgern. Schließlich opferst du deine Freizeit um mir zu helfen. Fach Mann schrieb: > Tipps verlangen und nicht drauf eingehen, man kann das > als Beratungsresistenz verstehen. Fach Mann schrieb: > Wenn man das fehlerhaft interpretiert dann liegt das hier > nicht am Leser sondern an demjenigen der so beschissene > Fotos macht. Ja, da habe ich in beiden fällen einen Fehler gemacht und mein Anliegen schlecht beschrieben. Ich hoffe dies nicht zu wiederholen. Fach Mann schrieb: > Indem du ein Bit löschst genau dann wenn es null sein > soll, und indem du es setzt genau dann wenn es 1 sein > soll. Es erschien mir leichter zu sein einfach alle 0 zu setzen und nur die benötigten dann high zu setzen. Fach Mann schrieb: > Wo sind denn in deiner Source die Wartezeiten die das > Datenblatt vorgibt?
1 | void Disp_Init(void) |
2 | {
|
3 | Exe_Port =0x00; //Erstmal alle auf 0 |
4 | Disp_Port =0x00; |
5 | |
6 | Warte_ms(80); |
7 | Disp_Port |= (1<<DB5_Pin) | (1<<DB4_Pin); |
8 | Enable(); |
9 | |
10 | Enable(); |
11 | |
12 | Enable(); |
13 | |
14 | Warte_ms(100); |
15 | Set_Function(); |
16 | Disp_Off(); |
17 | Clear_Disp(); |
18 | Set_Entry_Mode(); |
19 | Ret_Home(); |
20 | return; |
21 | }
|
22 | |
23 | void Enable(void) //Puls auf Enable-Pin |
24 | {
|
25 | Exe_Port |= (1<<Enable_Pin); |
26 | Warte_us(10); |
27 | Exe_Port &=~ (1<<Enable_Pin); |
28 | Warte_ms(100); |
29 | return; |
30 | }
|
Zu beginn warte ich 80ms, da wo mind. 40ms gefordert sind beim Anstieg der Spannungsversorgung. Danach warte ich im Enable Befehl jedesmal 100ms. Obwohl nur 4,1ms bzw 100us gefordert werden.
Was sagt denn das Datenblatt Deines Displays eigentlich zur maximalen rise/fall-time beim enable-Signal? Die sind gerne mal kritisch. Wie lang ist Deine enable-Leitung, gemessen vom Controller bis zum Display?
Nop schrieb: > Was sagt denn das Datenblatt Deines Displays eigentlich zur maximalen > rise/fall-time beim enable-Signal? Die sind gerne mal kritisch. Wie lang > ist Deine enable-Leitung, gemessen vom Controller bis zum Display? 25ns und 7cm
Guest schrieb: > Zu beginn warte ich 80ms, da wo mind. 40ms gefordert sind beim Anstieg > der Spannungsversorgung. Danach warte ich im Enable Befehl jedesmal > 100ms. Obwohl nur 4,1ms bzw 100us gefordert werden. Ok sorry das habe ich übersehen, da es völlig unüblich und hinderlich ist nach jedem Enable Zyklus zu warten. "Man" wartet dann wenn man es wirklich braucht.
Naja im Prinzip muss ich doch nach jedem Enable ein bisschen warten. Zumindest solange wie das Busy-Flag gesetzt ist. Und ich dachte mir wenn ich nach jedem Enable ein bissl warte dann brauche ich das Busy-Flag nicht nach jedem Befehl abfragen, weil ich eh lang genug warte. Deshalb die 100ms delay bei jedem Enable. Ist es denn besser das Busy-Flag abzufragen als einfach pauschal zu warten? Pauschal warten fand ich im ersten Moment schlicht weg einfacher und schneller umzusetzen.
HI >Pauschal warten fand ich im ersten Moment schlicht weg einfacher und >schneller umzusetzen. Muss man nicht pauschal machen. Es gibt Datenblätter mit den Ausführungszeiten der Befehle. MfG Spess
Ok ich versuche meine SW ersteinmal umzuschreiben und sie euren Vorschlägen nach zu optimieren. Sollte es dann immer noch nicht gehen werde ich mir mal ein neues Display kaufen. Nicht das dieses hier schon irgendeinen Schaden durch mich erhalten hat und deshalb nicht läuft. Sollte es dann immer noch nciht gehen melde ich wieder^^ Ich hoffe, dass ich nicht allzu lange dafür benötige. Danke bis hierher für eure tolle Hilfe, auch wenn ich es euch nicht immer ganz einfach gemacht habe.
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.