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ß
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;
}
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
voidWrite_Data()//0 an erster Stelle im Display ausgeben
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
voidWrite_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
voidDisp_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
voidEnable(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.