Grafikus LCD

Hogyha sikeresen O/PLED illetve hagyományos alfanumerikus - esetleg tán grafikus kijelzővel gyűlik meg a baja valakinek:)
Avatar
winnerbt
Elektronbűvölő
Hozzászólások: 907
Csatlakozott: 2007. március 25. vasárnap, 6:00

Hozzászólás Szerző: winnerbt »

Igen, ha van elég RAM-od. Egy 128x64 kis LCD is 1Kbyte.
A kivitelt akár Bascomban is megírhatod, elég gyors.
SPI-s EADOGM kijelző teljes frissítése kb. 20msec. Ennél már csak gyorsabban lehet, ha párhuzamosan hajtod. (ha olyan kijelződ van).
A Z80 CISC tudásod meg sajnos nem sokat használható a RISC-eknél, szenvedek én is vele. :)
Persze kérdés, mire kell Neked a POINT utasítás?
Most így hirtelen csak a FILL jut eszembe, ahol vissza kellene olvasni.
Egyéb grafikai dolgoknál a beépített függvények megcsinálják a visszaolvasást, hisz különben nem tudnának vonalat húzni sem.
Melyik is ez a kijelző?
JAni
Avatar
solti_imre
DrótVégénSzéndarab
Hozzászólások: 22
Csatlakozott: 2010. december 2. csütörtök, 7:00

Hozzászólás Szerző: solti_imre »

winnerbt írta:Igen, ha van elég RAM-od. Egy 128x64 kis LCD is 1Kbyte.
A kivitelt akár Bascomban is megírhatod, elég gyors.
SPI-s EADOGM kijelző teljes frissítése kb. 20msec. Ennél már csak gyorsabban lehet, ha párhuzamosan hajtod. (ha olyan kijelződ van).
A Z80 CISC tudásod meg sajnos nem sokat használható a RISC-eknél, szenvedek én is vele. :)
Persze kérdés, mire kell Neked a POINT utasítás?
Most így hirtelen csak a FILL jut eszembe, ahol vissza kellene olvasni.
Egyéb grafikai dolgoknál a beépített függvények megcsinálják a visszaolvasást, hisz különben nem tudnának vonalat húzni sem.
Melyik is ez a kijelző?
JAni
Vannak 644-eseim, azoknak csak elég a RAM-juk!:-) Az jutott eszembe, hogy írnék egy "kígyós" játékot - anno HomeLAB-re is megírtam, Z80-ra, úgyhogy sajnos tökéletesen tisztában vagyok vele, hogy a Z80 assembleres ismereteim semmit nem érnek az AVR-eknél!:-)) - ehhez kellene figyelni, hogy mikor hová ér a kígyó feje. A kijelzőm vezérlője SBN6400G, tehát alkalmas párhuzamos hajtásra. Konkrétan hogyan lehetne direktbe "átemelni" egy adott RAM tartományt a kijelző RAM-jába bascom-ban?
Avatar
winnerbt
Elektronbűvölő
Hozzászólások: 907
Csatlakozott: 2007. március 25. vasárnap, 6:00

Hozzászólás Szerző: winnerbt »

Ehhez Neked kell megírni a kijelző kezelését. De nyugodtan írd Basic-ben, nem kell az ASM-be belemászni. Bár meghívhatod a LIB-ben lévő adat és parancsküldő rutint is...
Az a lényeg, hogy ennél a kijelzőnél szegmentálás van, tehát ha egy sor végére érsz, akkor újra ki kell adnod egy pozícionáló parancsot.
(8 sor, a sor végén nem megy át a következő sorra)
De mivel ekkor már benne vagy az LCD kezelésében, így ki is tudod olvasni
a kurzorpozíción lévő byte-ot, tehát megvalósíthatod a POINT-ot is.
Persze belső RAMban dolgozva sokkal kényelmesebb és gyorsabb a dolog, de akkor minden függvényt meg kell írnod a karakterek kiírásától kezdve a grafikáig.
Én tömbökben tárolom a sorokat, így elég egyszerű a grafika, bár nem rövid, de van még mit optimalizálni rajta. (majd)

Kód: Egész kijelölése

Dim Sall(1024) As Byte
Dim S0(128) As Byte At Sall Overlay
Dim S1(128) As Byte At Sall + 128 Overlay
Dim S2(128) As Byte At Sall + 256 Overlay
Dim S3(128) As Byte At Sall + 384 Overlay
Dim S4(128) As Byte At Sall + 512 Overlay
Dim S5(128) As Byte At Sall + 640 Overlay
Dim S6(128) As Byte At Sall + 768 Overlay
Dim S7(128) As Byte At Sall + 896 Overlay
Így egyben is és soronként is tudsz hivatkozni a sorokra.
Vállalkozószelleműeknek jó kis feladat lenne azt átírni a LIB-ekben, hogy az LCD műveletek belső RAMra dolgozzanak.
Hja, aki ért hozzá....
Avatar
solti_imre
DrótVégénSzéndarab
Hozzászólások: 22
Csatlakozott: 2010. december 2. csütörtök, 7:00

Hozzászólás Szerző: solti_imre »

winnerbt írta:....
Vállalkozószelleműeknek jó kis feladat lenne azt átírni a LIB-ekben, hogy az LCD műveletek belső RAMra dolgozzanak.
Hja, aki ért hozzá....
Köszi, szerintem is a legjobb lenne a lib-ekben kotorászni (konkrétan: írni egy POINT() függvényt), de amíg az AVR-ek nem ismerik az "LD r,(IX+d)" utasítást, addig nem lesz kígyós játékom! :-)

Illetve most jutott eszembe egy áthidaló megoldás: A játékterek szélei cím szerint könnyen azonosíthatóak, az "alma" címét pedig eltárolom egy változópárban még kirakásakor és az azzal, ill. a szélek címeivel való egyezést figyelem... Tudom, ez enyhén szólva sem elegáns megoldás, de szerintem működni fog. "Apró" szépséghibája még, hogy a saját magába történő ütközést sem tudom így lefigyelni. De azért kipróbálom, amint elkészül, beszámolok róla! :-)
Avatar
winnerbt
Elektronbűvölő
Hozzászólások: 907
Csatlakozott: 2007. március 25. vasárnap, 6:00

Hozzászólás Szerző: winnerbt »

Miért nem elegáns? Ez teljesen normális dolog. Szerintem a kész képen kotorászni nem elegáns, bár néha egyszerűbb. Ha nem akarsz LIbekell bajlódni, nem olyan nagyon bonyolult ám SW-ből lekezelni a kijelzőt. Hajrá, már úgy is régen játszottam almás játékot :)
(amióta ilyen gyorsak a gépek a régi játékok kb így néznek ki nálam:
-akarsz játszani? Yes
-1 villanás
- Vesztettél. Mégegy játék?)
Ja, különben indexregiszteres adatmozgatás/töltés minden procban van, AVR-ben X-Y-Z indexregiszterrel operálhatsz. No, jó, LDIR az nincs (de némelyikben van DMA) :)
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

Faragtam neked GLCD Pontolvasó rutint.
A tesztelése a te feladatod!

Kód: Egész kijelölése

'----------------------------------------------------------------
' Ezek valahol a programodban legyenek
Dim Pixelread As Byte
Dim Px As Byte , Py As Byte

' GLCD Pixel olvasó rutin meghívása a programodból
Sub Spixelread()
$asm
*lds r20,{Px}    'Pont X Koordináta
*lds r21,{Py}    'Pont Y Koordináta
rcall _getpixel
$end Asm
   'Pixelread < Ban vissza kapjuk a Pixel értéket
End Sub
'------------------------------------------------------------

Kód: Egész kijelölése

' Ezek a "glcdKS108.lib" -be legyenek

; A Pontrajzoló rutint át faragtam neked.
; Pontolvasóvá.
; Az Eredeti Rutin amit meg keresel  220. sor
;[_GPIXEL]
$EXTERNAL _DIV8 ,  _GLOCATE , _ADJUST_PIN
; set or reset a single pixel
; X=R20 , Y=R21 , R25 is on/off
; .......
;[END]   Alá másolod.

;
; Pontolvasó rutin
[_getpixel]
$EXTERNAL _DIV8 ,  _GLOCATE , _ADJUST_PIN
; Read a single pixel
; X=R20 , Y=R21 ,
_getpixel:
  Push r0
  Push r1
  Push r2
  Push r3
  Push r16
    Push R25
    Push r20
    Mov r16,r21                      ; row
    Ldi R20 , 8                      ; 8 Bits In Byte
    call _Div8                       ; r16 contains proper Y/row address now
    Mov r0, r24                      ; save remainder
    Pop r20                          ; get X back
  Mov r21,r16                      ; y data location
  mov r2,r20                       ; save for later
  mov r3,r21
  rcall _setcol                    ; use the code from locate

  rcall _gread_data                ; return data in r1

* sts {Pixelread},r1             ; Elmentjük a beolvasot Pixelt

  Pop r25
  Pop r16
  Pop r3
  Pop r2
  Pop r1
  Pop r0
ret
[END]
Vágj bele! Menetközben majd megérted.

:wink:
A hozzászólást 1 alkalommal szerkesztették, utoljára kapu48 2012. július 27. péntek, 9:59-kor.
Avatar
solti_imre
DrótVégénSzéndarab
Hozzászólások: 22
Csatlakozott: 2010. december 2. csütörtök, 7:00

Hozzászólás Szerző: solti_imre »

kapu48 írta:Faragtam neked GLCD Pontolvasó rutint.
A tesztelése a te feladatod!
.....
Vágj bele! Menetközben majd megérted.
Nagyon-nagyon köszönöm!!!! :D :D
Hétvégén letesztelem és beszámolok az eredményről!
(Jól látom, hogy a regiszterek letárolásánál {} jelek vannak és nem sima () ? Igen, ennyire nem vagyok képben az AVR-ak asm-ében... :cry: )
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

8-bit AVR Instruction Set:
http://www.atmel.com/Images/doc0856.pdf

ASM programozás:
http://avr.tavir.hu/modules.php?name=Fo ... forum&f=24

8)

Z80 ASM után már csak játék!
:lol:
Avatar
solti_imre
DrótVégénSzéndarab
Hozzászólások: 22
Csatlakozott: 2010. december 2. csütörtök, 7:00

Hozzászólás Szerző: solti_imre »

kapu48 írta:8-bit AVR Instruction Set:
http://www.atmel.com/Images/doc0856.pdf
ASM programozás:
http://avr.tavir.hu/modules.php?name=Fo ... forum&f=24
8)
Z80 ASM után már csak játék!
:lol:
Köszi a linkeket, a "játék"-kal is egyetértek, csak így 60 felé már nem annyira játékos hajlandóságú az ember...:-) De "jó pap holtig tanul!" :-)
Avatar
solti_imre
DrótVégénSzéndarab
Hozzászólások: 22
Csatlakozott: 2010. december 2. csütörtök, 7:00

Hozzászólás Szerző: solti_imre »

kapu48 írta:Faragtam neked GLCD Pontolvasó rutint.
A tesztelése a te feladatod!
:wink:
Sajnos már a fordítása is leáll hibaüzenettel:
"Label not found [_GETPIXEL ]"

A lib-be illesztett rész:

Kód: Egész kijelölése

;
; Pontolvasó rutin
[_GETPIXEL]
$EXTERNAL _DIV8 ,  _GLOCATE , _ADJUST_PIN
; Read a single pixel
; X=R20 , Y=R21
_GETPIXEL:
  Push r0
  Push r1
  Push r2
  Push r3
  Push r16

  Push r25
  Push r20
  Mov r16,r21                      ; row
  Ldi R20 , 8                      ; 8 Bits In Byte
  call _Div8                       ; r16 contains proper Y/row address now
  Mov r0, r24                      ; save remainder
  Pop r20                          ; get X back
  Mov r21,r16                      ; y data location
  mov r2,r20                       ; save for later
  mov r3,r21
  rcall _setcol                    ; use the code from locate

  rcall _gread_data                ; return data in r1

* sts {Pixelread},r1   		   ; Elmentjük a beolvasot Pixelt

  Pop r16
  Pop r3
  Pop r2
  Pop r1
  Pop r0
ret
[END]
A tesztprogram:

Kód: Egész kijelölése

$regfile = "m16def.dat" 
$crystal = 8000000
$lib "glcdSBN6400.lbx"

Config Graphlcd = 128 * 64sed , Dataport = Portb , Controlport = Portd , Ce = 0 , Ce2 = 1 , Cd = 4 , Rd = 3 , Reset = 2 , Enable = 5

Setfont Font8x8

Declare Sub Spixelread(px As Byte , Py As Byte)
Dim Pixelread As Byte
Dim Px As Byte , Py As Byte


Cls
Pset 5 , 5 , 1
Px = 4
Py = 5

Call Spixelread(px , Py)

If Pixelread = 1 Then
   Lcdat 8 , 1 , "1"
   Else
   Lcdat 8 , 1 , "0"
End If

Sub Spixelread(px , Py)
$asm
*lds r20,{Px}
*lds r21,{Py}
RCall _getpixel
$end Asm
End Sub

$include "font8x8.font"
End
Már vagy 5x átnéztem, de nem tudok rájönni, mit csinálhattam rosszul... :(
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

Akkor ez a módosítás:

Kód: Egész kijelölése

; Pontolvasó rutin
;[_getpixel]
;$external _div8 , _glocate
; Read a single pixel
; X=R20 , Y=R21 ,
_getpixel:
  Push r0
  Push r1
  Push r2
  Push r3
  Push r16
    Push R25
    Push r20
    Mov r16,r21                      ; row
    Ldi R20 , 8                      ; 8 Bits In Byte
    call _Div8                       ; r16 contains proper Y/row address now
    Mov r0, r24                      ; save remainder
    Pop r20                          ; get X back
  Mov r21,r16                      ; y data location
  mov r2,r20                       ; save for later
  mov r3,r21
  rcall _setcol                    ; use the code from locate

  rcall _gread_data                ; return data in r1

* sts {Pixelread},r1             ; Elmentjük a beolvasot Pixelt

  Pop r25
  Pop r16
  Pop r3
  Pop r2
  Pop r1
  Pop r0
ret
[END]
És javítás után mindig menteni a lib et!

A Te Progid:

Kód: Egész kijelölése


 $regfile = "m16def.dat"
 $crystal = 8000000

 Dim Pixelread As Byte
 Dim Px As Byte , Py As Byte

 $lib "glcdSBN6400.lib"

 Config Graphlcd = 128 * 64sed , Dataport = Portb , Controlport = Portd , Ce = 0 , Ce2 = 1 , Cd = 4 , Rd = 3 , Reset = 2 , Enable = 5

 Setfont Font8x8

 Declare Sub Spixelread()


 Cls
 Pset 5 , 5 , 1

 Px = 4
 Py = 5
 Call Spixelread()

 If Pixelread = 1 Then
    Lcdat 8 , 1 , "1"
    Else
    Lcdat 8 , 1 , "0"
 End If

 Sub Spixelread()
 $asm
 *lds r20,{Px}
 *lds r21,{Py}
   !Call _getpixel
 $end Asm
 End Sub

 $include "font8x8.font"
 End
A hozzászólást 1 alkalommal szerkesztették, utoljára kapu48 2012. július 27. péntek, 11:35-kor.
Avatar
solti_imre
DrótVégénSzéndarab
Hozzászólások: 22
Csatlakozott: 2010. december 2. csütörtök, 7:00

Hozzászólás Szerző: solti_imre »

kapu48 írta:Akkor ez a módosítás:
Sajnos a helyzet változatlan... Pedig a lib managerben ha ráállok a szerkesztett libre, akkor mutatja, hogy van _GETPIXEL nevű modul.
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

Nem azt csinálod, amit írtam!

Írok kommentet az előző Hszbe. és átjavítom.

Csak az nem lesz ilyen villám gyorsan készen,,majd később olvas vissza!

(Általában érdemes visszaellenőrizni a Hozzá szólásaimat! Mert rossz szokásom, hogy utólag javítom, ha hibát találok bennük!)
:roll:

Ui.: Javitottam az RCall > !Call
Avatar
solti_imre
DrótVégénSzéndarab
Hozzászólások: 22
Csatlakozott: 2010. december 2. csütörtök, 7:00

Hozzászólás Szerző: solti_imre »

kapu48 írta:Nem azt csinálod, amit írtam!

Ui.: Javitottam az RCall > !Call
Sajna a !Call sem javított a helyzeten... :cry:
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

Rejtélyes hiba!

Mind egy. Vedd ki a lib-ből amit bele raktunk és rakd át a Sub rutinodba.

Kód: Egész kijelölése

 
' GLCD_KS108_01.bas

 $regfile = "m16def.dat"
 $crystal = 8000000
' Az ASM-nak átadandó változókat előre kell létrehozni, Nem lehet a Sub rutinokban
 Dim Pixelread As Byte
 Dim Px As Byte , Py As Byte

' $lib "glcdSBN6400.lib"

 $lib "glcdKS108.lib"

 Config Graphlcd = 128 * 64sed , Dataport = Portb , Controlport = Portd , Ce = 0 , Ce2 = 1 , Cd = 4 , Rd = 3 , Reset = 2 , Enable = 5
  Cls

 Setfont Font8x8

 Declare Sub Spixelread()                                   ' GLCD Pontolvasó rutin


 Cls
 Pset 5 , 5 , 1

 Px = 5                                                     'Érték adás
 Py = 5
 Spixelread                                                 'Rutin hívás

 If Pixelread = 1 Then                                      'Eredmény feldolgozása
    Lcdat 8 , 1 , "1"                                       '
    Else
    Lcdat 8 , 1 , "0"
 End If
 Pset 5 , 5 , 0

 Px = 5                                                     'Érték adás
 Py = 5
 Spixelread                                                 'Rutin hívás

 If Pixelread = 1 Then                                      'Eredmény feldolgozása
    Lcdat 8 , 5 , "1"                                       '
    Else
    Lcdat 8 , 5 , "0"
 End If

 End                                                        ' IDE KEL EZ! Mert rá fut a programod a Subra


' Read a single pixel
' X=R20 , Y=R21
 Sub Spixelread()                                           ' GLCD Pontolvasó rutin
 $asm
  Push r20
  Push r21
*lds r20,{Px}               ' Bascom változó át adása ASM regiszternek
*lds r21,{Py}

  Push r0
  Push r1
  Push r2
  Push r3
  Push r16
  Push R25
  Push r20
  Mov r16,r21                      ; row
  Ldi R20 , 8                      ; 8 Bits In Byte
  !call _Div8                       ; r16 contains proper Y/row address now
  Mov r0, r24                      ; save remainder
  Pop r20                          ; get X back
  Mov r21,r16                      ; y data location
  mov r2,r20                       ; save for later
  mov r3,r21
  !call _setcol                    ; use the code from locate   Távoli Rutin hívás

  !call _gread_data                ; return data in r1

* sts {Pixelread},r1             ; Elmentjük a beolvasot Pixelt

  Pop r25
  Pop r16
  Pop r3
  Pop r2
  Pop r1
  Pop r0
  Pop r21
  Pop r20
 $end Asm
 End Sub

 $include "font8x8.font"
Remélem a sok Push - Pop stimel?
:idea:
Válasz küldése