hoi, ich habe das gleiche problem wie der thread öffner von: Beitrag "Re: Display (HD4478099) zeigt nur Kästchen" meine pin belegung: lcd atmega32 1 GND 2 VCC (5V) 3 PD5 ( wird per PWM geregelt) 4 PB0 5 PB1 6 PB2 7 PC7 . . 14 PC0 15 PD4 16 GND (das lcd hat zwar BL connects, ist aber nicht die 161A LED version) der Atmega32 läuft mit 16MHz, ich nehme die lcd routinen aus dem tutorial.. die leicht abgeändert wurden, da 16Mhz statt 8MHz, und die Pinbelegung anders ist.. die belegung PC7-PC0 an DB0-DB7 wird durch eine fkt Mirrordata behoben. die source dateien findet ihr im anhang... grüüüße und danke
Nur kurz mal reingeguckt... aber wenn ich mich recht erinnere steuern die Routinen aus dem Tutorial das LCD im 4-Bit-Mode an. Wenn du schon 8 Pins für die Daten "opferst" solltest du das LCD auch im 8-Bit-Mode initialisieren.
Hallo, Du nimmst die 4Bit-Routinen, da Du alle 8 Bit dran hast, wäre 8Bit sicher sinnvoller, wie oben schon geschrieben. Prinzipiell würde der 4Bit-Mode erstmal nicht stören, wenn...
1 | powerupwait: |
2 | rcall delay5ms |
3 | dec temp3 |
4 | brne powerupwait |
5 | ldi temp1, 0b00000011 ; muss 3mal hintereinander gesendet |
6 | rcall mirrordata |
Die daten werden hier füe eine 4-Bit-Beschaltung mit D4...D7 an PB0...PB3 bereitgestellt. Init beginnt mit 0b00110000 wenn die Daten auf den richtigen Bits des Displays landen sollen. Entweder init anpassen oder den Kram komplett auf 8Bit umstellen, wenn Du sowieso alle Leitungen dran hast. Gruß aus Berlin Michael
hmm ok danke, aber DB4-DB7 wird auf PC3-PC0 (gespiegelt) bereitgestellt ich habe die initroutine nun überschrieben,.. und gehe nach der initialsisierung ausm datasheet (s.6 initialisation by instruction)
1 | lcd_init: |
2 | ldi temp3,4 |
3 | powerupwait: |
4 | rcall delay5ms |
5 | dec temp3 |
6 | brne powerupwait |
7 | ldi temp1, 0b00001100 ; muss 3mal hintereinander gesendet |
8 | out PORTC, temp1 ; werden zur Initialisierung |
9 | rcall lcd_enable ; 1 |
10 | rcall delay5ms |
11 | rcall lcd_enable ; 2 |
12 | rcall delay50us |
13 | rcall delay50us |
14 | rcall delay50us |
15 | rcall lcd_enable ; und 3! |
16 | rcall delay5ms |
17 | |
18 | ldi temp1, 0b00010100 ; 4Bit / 2 Zeilen / 5x8 |
19 | out PORTC, temp1 |
20 | rcall lcd_enable |
21 | rcall delay50us |
22 | |
23 | ldi temp1, 0b00010000 ; Display off |
24 | out PORTC, temp1 |
25 | rcall lcd_enable |
26 | rcall delay50us |
27 | |
28 | ldi temp1, 0b10000000 ; Display Clear |
29 | out PORTC, temp1 |
30 | rcall lcd_enable |
31 | rcall delay50us |
32 | |
33 | ldi temp1, 0b01100000 ; entry mode, no shift, increase |
34 | out PORTC, temp1 |
35 | rcall lcd_enable |
36 | rcall delay50us |
37 | |
38 | |
39 | ldi temp1, 0b00101000 ; inkrement / kein Scrollen |
40 | rcall lcd_command |
41 | ret |
dennoch schwarze blöcke... ich geh nochmal die pin belegung durch,....
Hallo, irgendwas stimmt da nicht. Du bist irgendwie ein Bit zu weit rechts? hier mal aus einer meiner alten Sourcen rausgeschnitten: [/avrasm] lcd_init: rcall lcd_reset cbi LCD_CTRL,LCD_RS ldi TEMP_A,$38 ; 8Bit - Mode, 2 Zeilen rcall lcd_control ldi TEMP_A,$80 ; DDRAM auf Anfang rcall lcd_control ldi TEMP_A,$01 ; Display löschen rcall lcd_control rcall wait_5ms ldi TEMP_A,$06 ; Increment, Not Shiftet rcall lcd_control ldi TEMP_A,$10 ; Cursor Move, Shift off rcall lcd_control ldi TEMP_A,$0C ; Display an, Cursor aus rcall lcd_control ret lcd_reset: rcall wait_5ms rcall wait_5ms rcall wait_5ms cbi LCD_CTRL,LCD_RS ; Register auf Control ldi TEMP_A,$30 out LCD_OUT,TEMP_A rcall lcd_clock rcall wait_5ms rcall lcd_clock rcall wait_5ms rcall lcd_clock rcall wait_5ms ret lcd_clock: sbi LCD_CTRL,LCD_E ; E auf 1 nop nop nop cbi LCD_CTRL,LCD_E ; E auf 0 ret [/avrasm] Gruß aus Berlin Michael
Hallo, *****ß Copy & Paste. ;) Naja, ist ja noch lesbar. Gruß aus Berlin Michael
die ausgabe ist doch gespiegelt.. DB0 = PB7 DB1 = PB6 usw... (ja war lesbar :) ) grüüüße
Hallo, Du sendet hier rcall delay5ms dec temp3 brne powerupwait ldi temp1, 0b00001100 ; muss 3mal hintereinander gesendet das muß aber eigentlich 0b00110000 sein... Gruß aus Berlin Michael
hmmm krass, ich habs mal getauscht,. und es funzt!!!!(????) danke :D (aber wieso????)
jo hi, ich nochmal,.. bei mir funktionieren nur die ersten 8 zeichen,.. muss ich das display shiften? grüüüße kai
Erste und zweite Zeile liegen im Speicher nicht direkt beieinander. Um in die zweite Zeile zu kommen musst du an eine bestimmte Adresse springen. Sollte im Datenblatt stehen, war glaub ich 0x40 oder so.
Kai Scheddin wrote: > bei mir funktionieren nur die ersten 8 zeichen,.. > muss ich das display shiften? Ich vermute, das Display hat zwei logische Zeilen à 8 Zeichen. Die zweite Zeile (also die letzten 8 Zeichen) fängt dann vermutlich bei Adresse 0x40 an.
Das Display 161A (meins ist von Reichelt) ist in zwei Bereiche geteilt! Siehe Datenblatt; dort steht die Adressierung. Ich machs so, dass wenn eine gewisse Anzahl an Zeichen überschritten wird (8, es wird immer mitgezählt), dann setze ich eben eine neue Adresse und schreibe weiter.
die standart character palette kann man doch überschreiben oder? grüüüße
Nein, mit den (chinesischen?) Schriftzeichen musst du wohl leben ;-) Du hast aber 8 frei definierbare Zeichen
jo hallo, ich nochmal, ich habe ein bisschen rumgespielt um die zeichen halt positionsgenau zu setzen, ohne für mich ersichtlichen grund hat das display dann immer nur zweimal hintereinander dieses delta (oder was es darstellen mag) angezeigt, egal wie ich den µC geproggt habe. Naja stromquelle aus, stromquelle wieder an und bums nur diese kontrasst hintergrund zeichen sind wieder da.... danach habe ich den source versucht wieder in einem zustand zu bringen wie es alles mal funktioniert hat, leider funktioniert wieder nichts, Es währ nett wenn ihr euch mal den source durchseht, danke und grüüüße der kai
ok, leider hat sich bis jetzt niemand gemeldet, aber ich herausgefunden das der source sich in der init routine in eine endlosschleife verfängt, die background kästchen sind weg, aber auf der anzeige tut sich immer noch nüscht,... naja ich werde nachher nochmal ein frischen source anhängen grüüüüße :D
Guten morgen :) ich habe noch eine frage zum Busy Flag und dem ddram zeiger,.. anstatt immer ein delay abzuwarten wollte ich gucke ob das bf noch gesetzt ist und den dd-ram zeiger zur positionsbestimmung abfragen, dammit ich nicht selber immer mitzählen muss,.. leider scheint das net sooo zu klappen,... hier der source von der bf routine:
1 | waitbfi: |
2 | ldi temp1,0x00 |
3 | out lcd_ddr,temp1 |
4 | sbi lcd_ctrl,lcd_RW |
5 | sbi lcd_ctrl,lcd_E |
6 | nop |
7 | nop |
8 | waitbf: |
9 | in temp1,lcd_port |
10 | sbrc temp1,7 |
11 | rjmp waitbf |
12 | cbi lcd_ctrl,lcd_RW |
13 | cbi lcd_ctrl,lcd_E |
14 | ldi temp2,0xff |
15 | out lcd_ddr,temp2 |
16 | ret |
bei der ausgabe routine hatte ich das:
1 | lcd_data_trans: |
2 | |
3 | rcall waitbfi |
4 | ;wait for cleard bf flag, and capture DDRam addy to temp1 |
5 | cpi temp1,0x08 ;lower then 0x08? |
6 | brlt lcd_data_trans_counter_ok |
7 | cpi temp1,0x40 |
8 | brge lcd_data_trans_counter_ok ;greater or equal 0x40? |
9 | |
10 | cpi temp1,0x08 ;greater or equal 0x08? |
11 | brge lcd_data_trans_set_start_of_line_2 |
12 | |
13 | cpi temp1,0x48 |
14 | ;greater or equal 0x48? (should not happen, but now all possible intervalls are overlaped with subroutines) |
15 | brge lcd_data_trans_set_start_of_line_1 |
16 | |
17 | lcd_data_trans_set_start_of_line_2: |
18 | ldi temp1,0b11000000 ;set DB7 High and DDRAM addy to 40h |
19 | out lcd_port,temp1 |
20 | rjmp lcd_data_trans |
21 | ;jmp to start of routine for circular check |
22 | |
23 | lcd_data_trans_set_start_of_line_1: |
24 | ldi temp1,0b10000000 ;set DB7 High and DDRAM addy to 00h |
25 | out lcd_port,temp1 |
26 | rjmp lcd_data_trans |
27 | ;jmp to start of routine for circular check |
28 | |
29 | lcd_data_trans_counter_ok: |
30 | sbi lcd_ctrl,lcd_RS ;set Enable |
31 | sbi lcd_ctrl,lcd_E ;set RS |
32 | out lcd_port,lcd_data ;set Port with Data |
33 | nop |
34 | nop |
35 | nop |
36 | nop |
37 | nop |
38 | nop |
39 | nop |
40 | cbi lcd_ctrl,lcd_E ;clear Enable |
41 | cbi lcd_ctrl,lcd_RS ;clear RS |
42 | ret ;return |
also die routine zeigt mir ohne zusätzliche delay func. erst mal gar nix an, und wenn die drinn ist zeigt sie nur in einem bereich an,.. hmmm kann mir jemand bitte etwas dazu sagen? thx leuts
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.