Hallo.
Hat schonmal jemand versucht die Displaydaten zu lesen um auf Pixelebene zu arbeiten? Ich bekomme es nicht hin (AVR-Assembler-Beginner).
Ich habe Albundys LIB als Basis genommen und wollte zum Test mal den Display-Inhalt invertieren. Teilweise gelingt das auch, aber pro Display-Spalte immer nur bei ein paar (meist aufeinanderfolgenden) Bits. Pro Display-Speicher-Seite dann aber auch unterschiedlich viele (mal 3, mal 4, 5). So habe ich ein hübsches Streifenmuster (siehe Anhang)
Habe das Kabel schon auf 6cm gekürzt um Übersprechen auszuschliessen.
Hier ist der Code
Code:
;----------------------------------------Modifizierte Kopie Von Seddata
[sedread]
$external Seddelay , Sedkonst
Sedread:
ldi r18,$00
Out Data_port , R18 ; Pull -ups Aus
Out Data_direction , R18 ; Datenport Auf Eingabe
ldi r18, (2^Pin_Res+2^Pin_A0+2^Pin_rw) ;High for Reset + A0 + RW
Out Ctrl_port , R18
rCall Seddelay
ldi r18, (2^Pin_Res+2^Pin_A0+2^Pin_E+2^Pin_rw) ;High for Reset + A0 + E + RW
Out Ctrl_port , R18
rCall Seddelay
ldi r18, (2^Pin_Res+2^Pin_A0+2^Pin_CS1+2^Pin_rw) ;High for Reset + A0 + CS1 + RW
Out Ctrl_port , R18
rcall Seddelay
in r24,data_port_in ;Datenport nach R24 lesen
ldi r18,$ff ;Datenport wieder auf Ausgabe
Out Data_direction , R18
ret
[end]
;----------------------------------------Modifizierte Kopie Von Grcls
[grinv]
$external Sedctrl , Seddata , Sedread , Sedkonst
Grinv:
clr r24 ;Arbeitsregister
clr r25 ;Seiten-Register
clr r26 ;Spalten-Register
Grinv10:
mov r24,r25 ;Seite ins Arbeitsregister
ori r24,$B0 ;SET-PAGE-Befehl dazu (oberes Nibble, unteres = Seite 0-7)
Out Data_port , R24
rcall Sedctrl
ldi r24,$10 ;SET-COLUMN-Befehl (Hi-Nibble der Spalte im unteren 4 Bits)
Out Data_port , R24
rcall Sedctrl
clr r24 ;2. Teil der Spaltenadresse (Lo-Nibble), hier auch 0
Out Data_port , R24
rcall Sedctrl
ldi r24,$e0 ;Read-Modify-Write-Befehl
Out Data_port , R24
rcall Sedctrl
Grinv20:
rcall Sedread ;Daten nach R24 lesen
com r24 ;Daten invertieren
Out Data_port , R24
rcall Seddata ;Daten zurueckschreiben
inc r26 ;naechste Spalte
cpi r26,128 ;schon bei 128, Dann Seite fertig!
brne grinv20 ;sonst weiter machen
ldi r24,$ee ;Ende Read-Modify-Write-Befehl (um SET-COLUMN aufrufen zu können)
Out Data_port , R24
rcall Sedctrl
clr r26 ;wieder bei Spalte 0 anfangen
inc r25 ;naechste Seite
cpi r25,8 ;schon bei 8, Dann komplett fertig!
brne grinv10 ;sonst weiter machen
ret
[end]
Hab ich irgendwo ein Timingproblem mit den Displaydaten?
Ich wäre für etwas Hilfe wirklich dankbar.
Lesezeichen