www.mikrocontroller.net

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


Autor: Kai Scheddin (zeusosc)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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


Autor: Christoph (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Michael U. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...
powerupwait:
           rcall  delay5ms
           dec  temp3
           brne powerupwait
           ldi temp1, 0b00000011        ; muss 3mal hintereinander gesendet
           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

Autor: Kai Scheddin (zeusosc)
Datum:

Bewertung
0 lesenswert
nicht 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)
lcd_init:
           ldi  temp3,4
powerupwait:
           rcall  delay5ms
           dec  temp3
           brne powerupwait
           ldi temp1, 0b00001100        ; muss 3mal hintereinander gesendet
           out PORTC, temp1             ; werden zur Initialisierung
           rcall lcd_enable             ; 1
           rcall delay5ms 
       rcall lcd_enable             ; 2
           rcall delay50us
       rcall delay50us
       rcall delay50us
           rcall lcd_enable             ; und 3!
           rcall delay5ms

           ldi temp1, 0b00010100        ; 4Bit / 2 Zeilen / 5x8
           out PORTC, temp1
           rcall lcd_enable
           rcall delay50us
           
           ldi temp1, 0b00010000        ; Display off 
            out PORTC, temp1
           rcall lcd_enable
           rcall delay50us
       
       ldi temp1, 0b10000000        ; Display Clear
           out PORTC, temp1
           rcall lcd_enable
           rcall delay50us
        
       ldi temp1, 0b01100000        ; entry mode, no shift, increase
           out PORTC, temp1
           rcall lcd_enable
           rcall delay50us
      
               
           ldi temp1, 0b00101000        ; inkrement / kein Scrollen
           rcall lcd_command
           ret

dennoch schwarze blöcke...
ich geh nochmal die pin belegung durch,....

Autor: Michael U. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Michael U. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

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

Gruß aus Berlin
Michael

Autor: Kai Scheddin (zeusosc)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
die ausgabe ist doch gespiegelt..
DB0 = PB7
DB1 = PB6
usw...

(ja war lesbar :) )

grüüüße

Autor: Michael U. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Kai Scheddin (zeusosc)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hmmm krass,
ich habs mal getauscht,. und es funzt!!!!(????)

danke :D

(aber wieso????)

Autor: Kai Scheddin (zeusosc)
Datum:

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

Autor: Christoph (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: wulf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Kai Scheddin (zeusosc)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
jo danke jungs,.. :D

Autor: Kai Scheddin (zeusosc)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
die standart character palette kann man doch überschreiben oder?
grüüüße

Autor: Gast (Gast)
Datum:

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

Autor: Kai Scheddin (zeusosc)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Kai Scheddin (zeusosc)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Kai Scheddin (zeusosc)
Datum:

Bewertung
0 lesenswert
nicht 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:
waitbfi:
           ldi temp1,0x00
     out lcd_ddr,temp1
           sbi lcd_ctrl,lcd_RW
     sbi lcd_ctrl,lcd_E
           nop
     nop
    waitbf:
     in temp1,lcd_port
     sbrc temp1,7
     rjmp waitbf
           cbi lcd_ctrl,lcd_RW
           cbi lcd_ctrl,lcd_E
           ldi temp2,0xff
     out lcd_ddr,temp2
ret

bei der ausgabe routine hatte ich das:
lcd_data_trans:
           
  rcall waitbfi                     
;wait for cleard bf flag, and capture DDRam addy to temp1
        cpi temp1,0x08                    ;lower then 0x08?
  brlt lcd_data_trans_counter_ok
  cpi temp1,0x40
  brge lcd_data_trans_counter_ok    ;greater or equal 0x40?
           
  cpi temp1,0x08                    ;greater or equal 0x08?
  brge lcd_data_trans_set_start_of_line_2

        cpi temp1,0x48                     
;greater or equal 0x48? (should not happen, but now all possible intervalls are overlaped with subroutines)
        brge lcd_data_trans_set_start_of_line_1

lcd_data_trans_set_start_of_line_2:
        ldi temp1,0b11000000            ;set DB7 High and DDRAM addy to 40h
  out lcd_port,temp1
        rjmp lcd_data_trans                
;jmp to start of routine for circular check

lcd_data_trans_set_start_of_line_1:
        ldi temp1,0b10000000            ;set DB7 High and DDRAM addy to 00h
        out lcd_port,temp1
        rjmp lcd_data_trans
;jmp to start of routine for circular check

lcd_data_trans_counter_ok:
       sbi lcd_ctrl,lcd_RS                ;set Enable
       sbi lcd_ctrl,lcd_E                 ;set RS
       out lcd_port,lcd_data              ;set Port with Data
       nop                                
       nop
       nop
       nop
       nop
       nop
       nop
       cbi lcd_ctrl,lcd_E                 ;clear Enable
       cbi lcd_ctrl,lcd_RS                ;clear RS
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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.