Forum: Mikrocontroller und Digitale Elektronik LCD-Display AV1624 ansteuer Probleme


von Guest (Gast)


Angehängte Dateien:

Lesenswert?

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.
von spess53 (Gast)


Lesenswert?

Hi

Um welchen Controller geht es?

MfG Spess

von Guest (Gast)


Lesenswert?

Ich nutze den Atmega 8515.
Das Display, laut Datenblatt, "KS0066 or Equivalent"

von Pete K. (pete77)


Lesenswert?

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;
}

von Guest (Gast)


Lesenswert?

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;
}

von Fach Mann (Gast)


Lesenswert?

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

von Guest (Gast)


Lesenswert?

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?

von Fach Mann (Gast)


Lesenswert?

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
}

von Guest (Gast)


Lesenswert?

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

von spess53 (Gast)


Lesenswert?

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

von Fach Mann (Gast)


Angehängte Dateien:

Lesenswert?

Vielleicht mal das Timing überprüfen?

von Guest (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Fach Mann (Gast)


Lesenswert?

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?

von Fach Mann (Gast)


Lesenswert?

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.

von Fach Mann (Gast)


Lesenswert?

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.

von Guest (Gast)


Lesenswert?

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^^

von Fach Mann (Gast)


Angehängte Dateien:

Lesenswert?

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?

von Guest (Gast)


Lesenswert?

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.

von Nop (Gast)


Lesenswert?

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?

von Guest (Gast)


Lesenswert?

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

von Fach Mann (Gast)


Lesenswert?

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.

von Guest (Gast)


Lesenswert?

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.

von spess53 (Gast)


Lesenswert?

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

von Guest (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.