Forum: Mikrocontroller und Digitale Elektronik Displaytech 161A schwarze kästchen


von Kai S. (Firma: ZeuSWarE GmbH) (zeusosc)


Angehängte Dateien:

Lesenswert?

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


von Christoph (Gast)


Lesenswert?

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.

von Michael U. (Gast)


Lesenswert?

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

von Kai S. (Firma: ZeuSWarE GmbH) (zeusosc)


Lesenswert?

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,....

von Michael U. (Gast)


Lesenswert?

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

von Michael U. (Gast)


Lesenswert?

Hallo,

*****ß Copy & Paste. ;)
Naja, ist ja noch lesbar.

Gruß aus Berlin
Michael

von Kai S. (Firma: ZeuSWarE GmbH) (zeusosc)


Lesenswert?

die ausgabe ist doch gespiegelt..
DB0 = PB7
DB1 = PB6
usw...

(ja war lesbar :) )

grüüüße

von Michael U. (Gast)


Lesenswert?

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

von Kai S. (Firma: ZeuSWarE GmbH) (zeusosc)


Lesenswert?

hmmm krass,
ich habs mal getauscht,. und es funzt!!!!(????)

danke :D

(aber wieso????)

von Kai S. (Firma: ZeuSWarE GmbH) (zeusosc)


Lesenswert?

jo hi, ich nochmal,..
bei mir funktionieren nur die ersten 8 zeichen,..
muss ich das display shiften?
grüüüße kai

von Christoph (Gast)


Lesenswert?

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.

von Johannes M. (johnny-m)


Lesenswert?

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.

von wulf (Gast)


Lesenswert?

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.

von Kai S. (Firma: ZeuSWarE GmbH) (zeusosc)


Lesenswert?

jo danke jungs,.. :D

von Kai S. (Firma: ZeuSWarE GmbH) (zeusosc)


Lesenswert?

die standart character palette kann man doch überschreiben oder?
grüüüße

von Gast (Gast)


Lesenswert?

Nein, mit den (chinesischen?) Schriftzeichen musst du wohl leben ;-)
Du hast aber 8 frei definierbare Zeichen

von Kai S. (Firma: ZeuSWarE GmbH) (zeusosc)


Angehängte Dateien:

Lesenswert?

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

von Kai S. (Firma: ZeuSWarE GmbH) (zeusosc)


Lesenswert?

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

von Kai S. (Firma: ZeuSWarE GmbH) (zeusosc)


Lesenswert?

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