Hallo ich versuche gerade das Electronic Assembly Display zu programmieren. Irgendwie habe ich Probleme zu verstehen wofür beim Power/Icon/Contrast Contral das Ion, Bon, C5 und C4 ist. Ebenso beim Contrast set das C0-C3 und beim Bias Set das 1/4 und 1/5 Habe keine richtige Erklärung in den Datenblättern gefunden und somit weiß ich nicht wie ich es einstellen soll. http://www.lcd-module.de/eng/pdf/zubehoer/st7036.pdf MfG
Die Electronic Assembly Displays werden anscheinend doch nicht so häufig benutzt wie ich dachte.
Richte Dich an die Codebeispiele im Datenblatt des Displays, dann geht's in der Regel auch. Im Datenblatt des Controllers brauchst Du überhaupt nicht herumzusuchen, es ist unübersichtlich und bringt (zumindest mir) keinen nennenswerten Informationsgewinn.
Hi >Die Electronic Assembly Displays werden anscheinend doch nicht so häufig >benutzt wie ich dachte. Eigentlich schon. Aber normalerweise reicht die Initialisierung aus dem Displaydatenblatt. C5...C0 ist der Kontrast, auf 2 Register verteilt Bias bestimmt die Anzahl Spannungsstufen der LCD-Ansteuerung (siehe S.60..64) BON Schaltet die Displayspannungserzeugung (bei 3,3V ein, bei 5V aus) MfG Spess
lcd-ler schrieb: > ich versuche gerade das Electronic Assembly Display zu programmieren. Es gibt nicht das Electronic Assembly Display, sondern viele. Solange Du also nicht den Typ angibst, wird auch keiner was dazu sagen können. Peter
>Eigentlich schon. Aber normalerweise reicht die Initialisierung aus dem >Displaydatenblatt. Es ist doch die Frage welche Einstellungen ich benütze. Die Initialisierung bezieht sich nur auf 8 Bit ich benütze aber SPI. Und ausführliche Hinweise für SPI habe ich nicht gefunden. Wie wird der Kontrast eingestellt. Alles durchprobieren und schauen was am besten ist. Wie stellt ihr den Kontrast ein. >Bias bestimmt die Anzahl Spannungsstufen der LCD-Ansteuerung. Ich habe mir das angeschaut habe aber bisschen Probleme zu verstehen was das ist und was das zeigt. >BON Schaltet die Displayspannungserzeugung (bei 3,3V ein, bei 5V aus) Was ist die Displayspannungserzeugung. Das Display hängt ja an einer 5V Quelle. Wozu brauche ich dann eine Displayspannungserzeugung. Wozu ist das ION. Auf der Seite 60...64 steht dass 540khz benützt werden. Auf einer anderen Skizze S43 steht aber dass 380khz benützt werden. Welches ist jetzt richtig? @Peter Dannegger Das Display ist ein DOGM-162. Spielt denn das eigentlich eine Rolle? Wichtig ist doch welcher Controller benützt wird und nicht welches Display. Oder täusche ich mich da. MfG
Wenn man den Typ kennt, kann man auch was finden: http://www.lcd-module.de/support.html Hier gibt es SPI-Initialisierung in C (unter AVR C für das DOG163 also 1 Zeile mehr). Bin einfach mal den Links nach ;) AVR
Hi >Initialisierung bezieht sich nur auf 8 Bit ich benütze aber SPI. Und >ausführliche Hinweise für SPI habe ich nicht gefunden. SPI sind 8-Bit. >Wie wird der Kontrast eingestellt. Alles durchprobieren und schauen was >am besten ist. Wie stellt ihr den Kontrast ein. Einfach mit dem Datenblattwert anfangen. Wenn es nicht passt dann probieren. >Was ist die Displayspannungserzeugung. Das ist die Spannung, von der die Kontrastspannung (eigentlich Betriebsspannung) zur Ansteuerung des des LCDs (nicht Controller) abgeleitet wird. > Das Display hängt ja an einer 5V >Quelle. Wozu brauche ich dann eine Displayspannungserzeugung. Bei 5V brauchst du den Booster auch nicht. Aber bei 3,3V muss VLCD auf die 5V erhöht werden. >Wozu ist das ION. ICON On. Allerdings habe ich auch nicht nicht ganz herausbekommen wozu das gut ist. Möglicherweise so etwas ähnliches wie die selbstdefinierten Zeichen. >Auf der Seite 60...64 steht dass 540khz benützt werden. Auf einer >anderen Skizze S43 steht aber dass 380khz benützt werden. Welches ist >jetzt richtig? 540khz ist der interne Clock. Andere Frequenzen müssen extern angelegt werden. MfG Spess
lcd-ler schrieb: > Das Display ist ein DOGM-162. Spielt denn das eigentlich eine Rolle? Wenn man Beispielcode sucht, schon: Beitrag "Re: Dog-M / ST7036 Routine für 1-Zeiliges Display SPI-Mode" Peter
Peter Dannegger schrieb: > Es gibt nicht das Electronic Assembly Display, es gibt gar keine Display von denen, das ist ein Händler der es darauf anlegt die Fehler in den zusammengestoppelten Datenblätter durch Unübersichtlichkeit zu übertreffen. Es gibt meist bessere wenn man ein wenig sucht und günstiger sind die dann auch oft.
Hi >es gibt gar keine Display von denen, das ist ein Händler der es darauf >anlegt die Fehler in den zusammengestoppelten Datenblätter durch >Unübersichtlichkeit zu übertreffen. Bisher hatte ich noch keine Probleme mit den Datenblättern von EA. Da gibt es zehnmal schlimmere. Und das Datenblatt vom Displaycontroller ist eh ein Muss. MfG Spess
spess53 schrieb: > Bisher hatte ich noch keine Probleme mit den Datenblättern von EA. Ich nur, hab gerade 2 Wochen gebraucht bis den Herrschaften eingefallen ist das gewisse Sachen nur im 8 Bit Modus laufen. Das Datenblatt wurde dann stillschweigend um einen Satz aktualisiert. Errat sheets sind ja uach weas für Hersteller und nicht für Händler. So was macht auch keiner der seine Display selber baut. Hab dann bei Digikey das gleiche gefunden, 30% günstiger und mit einem Datenblatt das stimmt und lesbar war und mit jeder Menge Funktionen die bei EA angeblich nicht vorhanden sind. Das war bei weitem nicht das erste mal. Da anrufen ist reine Folter, so einen miesgelaunten Schuppen findet man kein zweites mal.
Hi >Ich nur, hab gerade 2 Wochen gebraucht bis den Herrschaften eingefallen >ist das gewisse Sachen nur im 8 Bit Modus laufen. Das Datenblatt wurde >dann stillschweigend um einen Satz aktualisiert. Errat sheets sind ja >uach weas für Hersteller und nicht für Händler. Welches Display? Und die Datenblätter können und sollen nicht das Datenblatt vom Displaycontroller ersetzen. >Das war bei weitem nicht das erste mal. Da anrufen ist reine Folter, so >einen miesgelaunten Schuppen findet man kein zweites mal. Ich habe auch schon mit denen telefoniert. Waren eigentlich recht freundlich. MfG Spess
Danke für die Tipps. Habt ihr vielleicht noch eine Idee was FON und Rab ist. MfG
HI
>Habt ihr vielleicht noch eine Idee was FON und Rab ist.
Siehe S.47...51
MfG Spess
Das Datenblatt habe ich mir ja angeschaut nur so richtig nachvollziehen konnte ich es nicht. Eine andere Frage: Ich habe es versucht auf diese Art zu programmieren. Hast du vielleicht einen Tipp wieso das Display schwarz ist.
1 | void init_display() |
2 | {
|
3 | //Timer0 CTC Interrupt => 500ns
|
4 | TCCR0A |= (1<<WGM01); //CTC Einstellung |
5 | TCCR0B |= (1<<CS01) | (1<<CS00); //Teiler 64 |
6 | TIMSK0 |= (1<<OCIE0A); //Interrupt Enable |
7 | OCR0A = 124; |
8 | |
9 | |
10 | |
11 | sei(); |
12 | |
13 | //RS auf 0 schalten => Instruction Register
|
14 | DDRB |= (1<<DDB1); |
15 | PORTB &= ~(1<<PORTB1); |
16 | |
17 | //Chip select (CSB bzw. SS) deaktivieren => Low aktiv
|
18 | DDRB |= (1<<DDB2); |
19 | PORTB |= (1<<PORTB2); |
20 | |
21 | //MOSI und SCK als Ausgang setzen
|
22 | DDRB |= (1<<DDB2) | (1<<DDB3); |
23 | |
24 | //SPI Einstellung
|
25 | SPCR |= (1<<SPIE) | (1<<MSTR) | (1<<CPHA) | (1<<CPOL) | (1<<SPR0); |
26 | |
27 | |
28 | count = 0; |
29 | while(count<100) |
30 | ;
|
31 | |
32 | |
33 | //Chip select (CSB bzw. SS) aktivieren => Low aktiv
|
34 | PORTB &= ~(1<<PORTB2); |
35 | |
36 | |
37 | |
38 | //Daten per SPI ins Function set Register senden
|
39 | SPDR = 0x39; |
40 | /* Wait for transmission complete */
|
41 | while(!(SPSR & (1<<SPIF))) |
42 | ;
|
43 | |
44 | count = 0; |
45 | TCNT0 = 0; |
46 | while(count<1) |
47 | ;
|
48 | |
49 | //Daten per SPI ins Bias Register senden
|
50 | SPDR = 0x1C; |
51 | /* Wait for transmission complete */
|
52 | while(!(SPSR & (1<<SPIF))) |
53 | ;
|
54 | |
55 | count = 0; |
56 | TCNT0 = 0; |
57 | while(count<1) |
58 | ;
|
59 | |
60 | //Daten per SPI ins Power/ICON/Contrast Control Register senden
|
61 | SPDR = 0x55; |
62 | /* Wait for transmission complete */
|
63 | while(!(SPSR & (1<<SPIF))) |
64 | ;
|
65 | |
66 | count = 0; |
67 | TCNT0 = 0; |
68 | while(count<1) |
69 | ;
|
70 | |
71 | //Daten per SPI ins Follower Control Register senden
|
72 | SPDR = 0x69; |
73 | /* Wait for transmission complete */
|
74 | while(!(SPSR & (1<<SPIF))) |
75 | ;
|
76 | |
77 | count = 0; |
78 | TCNT0 = 0; |
79 | while(count<1) |
80 | ;
|
81 | |
82 | //Daten per SPI ins Contrast Set Register senden
|
83 | SPDR = 0x74; |
84 | /* Wait for transmission complete */
|
85 | while(!(SPSR & (1<<SPIF))) |
86 | ;
|
87 | |
88 | count = 0; |
89 | TCNT0 = 0; |
90 | while(count<1) |
91 | ;
|
92 | |
93 | //Daten per SPI ins Function set Register senden
|
94 | SPDR = 0x38; |
95 | /* Wait for transmission complete */
|
96 | while(!(SPSR & (1<<SPIF))) |
97 | ;
|
98 | |
99 | count = 0; |
100 | TCNT0 = 0; |
101 | while(count<500) |
102 | ;
|
103 | |
104 | //Daten per SPI ins Display ON/OFF control Register senden
|
105 | SPDR = 0x0F; |
106 | /* Wait for transmission complete */
|
107 | while(!(SPSR & (1<<SPIF))) |
108 | ;
|
109 | |
110 | count = 0; |
111 | TCNT0 = 0; |
112 | while(count<1) |
113 | ;
|
114 | |
115 | //Daten per SPI ins Clear Display Register senden
|
116 | SPDR = 0x01; |
117 | /* Wait for transmission complete */
|
118 | while(!(SPSR & (1<<SPIF))) |
119 | ;
|
120 | |
121 | count = 0; |
122 | TCNT0 = 0; |
123 | while(count<1) |
124 | ;
|
125 | |
126 | //Daten per SPI ins Entry Mode Register senden
|
127 | SPDR = 0x06; |
128 | /* Wait for transmission complete */
|
129 | while(!(SPSR & (1<<SPIF))) |
130 | ;
|
131 | |
132 | //******************************************************************************
|
133 | |
134 | //RS auf 1 schalten => Data Register
|
135 | PORTB |= (1<<PORTB1); |
136 | |
137 | |
138 | count = 0; |
139 | TCNT0 = 0; |
140 | while(count<1) |
141 | ;
|
142 | |
143 | //Daten per SPI senden
|
144 | SPDR = 'A'; |
145 | /* Wait for transmission complete */
|
146 | while(!(SPSR & (1<<SPIF))) |
147 | ;
|
148 | |
149 | |
150 | //Chip select (CSB bzw. SS) deaktivieren => Low aktiv
|
151 | PORTB |= (1<<PORTB2); |
152 | |
153 | }
|
154 | |
155 | //------------------------------------------------------------------
|
156 | |
157 | ISR (TIMER0_COMPA_vect) |
158 | {
|
159 | count++; |
160 | }
|
161 | |
162 | //------------------------------------------------------------------
|
count = 0; while(count<100) ; Das wird für alle Zeiten in der Schleife hängen bleiben. Lern C bevor du dich an Displays ran machst.
Wieso bleibt das die ganze Zeit in der Schleife hängen. Per Interrupt wird count erhöht.
>Wieso bleibt das die ganze Zeit in der Schleife hängen. Per Interrupt >wird count erhöht. Bist du da sicher? Ich seh nur unvollständige Codeschnipsel auf die man besser gar keine Antwort gibt.
Das Interrupt wird ausgeführt. Das einzige was noch fehlt bzgl. Display ist.
1 | #include <avr/io.h> |
2 | #include <avr/interrupt.h> |
3 | |
4 | volatile int count=0; |
5 | |
6 | int main (void) |
7 | {
|
8 | init_display(); |
9 | |
10 | while(1) |
11 | {
|
12 | |
13 | }
|
14 | |
15 | }
|
Muss nach jedem Byte welches gesendet wurde das CS auf High gesetzt werden oder wird der Takt auch generiert wenn das CS die ganze Zeit auf Low bleibt.
Hi Was meinst du mit Takt? CS ist Chip Select. MfG Spess
Ich muss ja CS auf Low setzen damit man die Daten überhaupt übertragen kann. Dabei erzeugt ja SCK acht Takte damit die Daten übertragen werden. Wenn ich wieder ein Byte übertragen will muss CS auf High und dann wieder auf Low gesetzt werden oder erzeugt SCK die acht Takte auch wenn CS die ganze Zeit auf Low bleibt. Ich habe schon den SCK-Prescaler runtergesetzt. Das Display macht noch immer keinen Mucks
Hi >Ich muss ja CS auf Low setzen damit man die Daten überhaupt übertragen >kann. Dabei erzeugt ja SCK acht Takte damit die Daten übertragen werden. Das LCD erzeugt keinen Takt auf SCK. Das ist ein SPI-Slave. Der Takt kommt vom Controller. Wenn keine weiteren Slaves am SPI-Bus hängen, kannst du CS auch dauerhaft auf L legen. MfG Spess
Ich mein auch dass der Takt vom Controller (Master) kommt.
Wenn du deinen Code ein wenig umschreibst, lassen sich auch Fehler leichter finden. Den Interrupt kann man sich sparen: Das SPIF-bit wird im SPSR nach der Übertragung gesetzt und eine Funktion, die ein Byte sendet reduziert den Code ungemein.
Hier ist noch einmal der Code umgeschrieben.
1 | #include <avr/io.h> |
2 | #include <avr/interrupt.h> |
3 | |
4 | |
5 | volatile int count=0; |
6 | |
7 | |
8 | void lcd_command(unsigned char command) |
9 | {
|
10 | //RS auf 0 schalten => Instruction Register
|
11 | PORTB &= ~(1<<PORTB1); |
12 | |
13 | //command per SPI senden
|
14 | SPDR = command; |
15 | /* Wait for transmission complete */
|
16 | while(!(SPSR & (1<<SPIF))) |
17 | ;
|
18 | }
|
19 | |
20 | void lcd_data(unsigned char data) |
21 | {
|
22 | //RS auf 1 schalten => Data Register
|
23 | PORTB |= (1<<PORTB1); |
24 | |
25 | //Daten per SPI senden
|
26 | SPDR = data; |
27 | /* Wait for transmission complete */
|
28 | while(!(SPSR & (1<<SPIF))) |
29 | ;
|
30 | }
|
31 | |
32 | //dauer = zeit * 500us
|
33 | void pause(int zeit) |
34 | {
|
35 | count = 0; |
36 | TCNT0 = 0; |
37 | while(count<zeit) |
38 | ;
|
39 | }
|
40 | |
41 | |
42 | //------------------------------------------------------------------
|
43 | |
44 | void init_display() |
45 | {
|
46 | //Timer0 CTC Interrupt => 0,5ms
|
47 | TCCR0A |= (1<<WGM01); //CTC Einstellung |
48 | TCCR0B |= (1<<CS01) | (1<<CS00); //Teiler 64 |
49 | TIMSK0 |= (1<<OCIE0A); //Interrupt Enable |
50 | OCR0A = 124; |
51 | |
52 | |
53 | |
54 | sei(); |
55 | |
56 | //RS auf 0 schalten => Instruction Register
|
57 | DDRB |= (1<<DDB1); |
58 | PORTB &= ~(1<<PORTB1); |
59 | |
60 | //Chip select (CSB bzw. SS) deaktivieren => Low aktiv
|
61 | DDRB |= (1<<DDB2); |
62 | PORTB |= (1<<PORTB2); |
63 | |
64 | //MOSI und SCK als Ausgang setzen
|
65 | DDRB |= (1<<DDB3) | (1<<DDB5); |
66 | |
67 | //SPI Einstellung
|
68 | SPCR |= (1<<SPE) | (1<<MSTR) | (1<<CPHA) | (1<<CPOL) | (1<<SPR1); |
69 | |
70 | |
71 | pause(100); |
72 | |
73 | |
74 | //Chip select (CSB bzw. SS) aktivieren => Low aktiv
|
75 | PORTB &= ~(1<<PORTB2); |
76 | |
77 | |
78 | |
79 | //Daten per SPI ins Function set Register senden
|
80 | lcd_command(0x39); |
81 | |
82 | pause(1); |
83 | |
84 | //Daten per SPI ins Bias Register senden
|
85 | lcd_command(0x1C); |
86 | |
87 | pause(1); |
88 | |
89 | //Daten per SPI ins Power/ICON/Contrast Control Register senden
|
90 | lcd_command(0x55); |
91 | |
92 | pause(1); |
93 | |
94 | //Daten per SPI ins Follower Control Register senden
|
95 | lcd_command(0x69); |
96 | |
97 | pause(1); |
98 | |
99 | //Daten per SPI ins Contrast Set Register senden
|
100 | lcd_command(0x74); |
101 | |
102 | pause(1); |
103 | |
104 | //Daten per SPI ins Function set Register senden
|
105 | lcd_command(0x38); |
106 | |
107 | pause(500); |
108 | |
109 | //Daten per SPI ins Display ON/OFF control Register senden
|
110 | lcd_command(0x0F); |
111 | |
112 | pause(1); |
113 | |
114 | //Daten per SPI ins Clear Display Register senden
|
115 | lcd_command(0x01); |
116 | |
117 | pause(1); |
118 | |
119 | //Daten per SPI ins Entry Mode Register senden
|
120 | lcd_command(0x06); |
121 | |
122 | pause(1); |
123 | |
124 | //******************************************************************************
|
125 | |
126 | lcd_data('A'); |
127 | |
128 | //Chip select (CSB bzw. SS) deaktivieren => Low aktiv
|
129 | PORTB |= (1<<PORTB2); |
130 | |
131 | }
|
132 | |
133 | //------------------------------------------------------------------
|
134 | |
135 | ISR (TIMER0_COMPA_vect) |
136 | {
|
137 | count++; |
138 | }
|
139 | |
140 | //------------------------------------------------------------------
|
141 | |
142 | |
143 | |
144 | |
145 | int main (void) |
146 | {
|
147 | init_display(); |
148 | |
149 | while(1) |
150 | {
|
151 | |
152 | }
|
153 | |
154 | }
|
Peter Dannegger schrieb: > lcd-ler schrieb: >> Das Display ist ein DOGM-162. Spielt denn das eigentlich eine Rolle? > > Wenn man Beispielcode sucht, schon: > > Beitrag "Re: Dog-M / ST7036 Routine für 1-Zeiliges Display SPI-Mode" > > > Peter Wenn du dem Link von Peter folgst, findest du auch von mir einen Beispielcode. Der funktioniert auf jeden Fall. Und denke daran: die Beleuchtung sollte AN sein, sonst kann es sein (je nach Modul), dass man überhaupt nichts sieht, obwohl das Display läuft. ;-)
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.