Grafikus LCD
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
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
- solti_imre
- DrótVégénSzéndarab
- Hozzászólások: 22
- Csatlakozott: 2010. december 2. csütörtök, 7:00
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?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
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)
Í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á....
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
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á....
- solti_imre
- DrótVégénSzéndarab
- Hozzászólások: 22
- Csatlakozott: 2010. december 2. csütörtök, 7:00
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!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á....
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!
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)
(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)
Faragtam neked GLCD Pontolvasó rutint.
A tesztelése a te feladatod!
Vágj bele! Menetközben majd megérted.
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]
A hozzászólást 1 alkalommal szerkesztették, utoljára kapu48 2012. július 27. péntek, 9:59-kor.
- solti_imre
- DrótVégénSzéndarab
- Hozzászólások: 22
- Csatlakozott: 2010. december 2. csütörtök, 7:00
Nagyon-nagyon köszönöm!!!!kapu48 írta:Faragtam neked GLCD Pontolvasó rutint.
A tesztelése a te feladatod!
.....
Vágj bele! Menetközben majd megérted.
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... )
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
Z80 ASM után már csak játék!
http://www.atmel.com/Images/doc0856.pdf
ASM programozás:
http://avr.tavir.hu/modules.php?name=Fo ... forum&f=24
Z80 ASM után már csak játék!
- solti_imre
- DrótVégénSzéndarab
- Hozzászólások: 22
- Csatlakozott: 2010. december 2. csütörtök, 7:00
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!"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
Z80 ASM után már csak játék!
- solti_imre
- DrótVégénSzéndarab
- Hozzászólások: 22
- Csatlakozott: 2010. december 2. csütörtök, 7:00
Sajnos már a fordítása is leáll hibaüzenettel:kapu48 írta:Faragtam neked GLCD Pontolvasó rutint.
A tesztelése a te feladatod!
"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]
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
Akkor ez a módosítás:
És javítás után mindig menteni a lib et!
A Te Progid:
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]
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.
- solti_imre
- DrótVégénSzéndarab
- Hozzászólások: 22
- Csatlakozott: 2010. december 2. csütörtök, 7:00
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!)
Ui.: Javitottam az RCall > !Call
Í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!)
Ui.: Javitottam az RCall > !Call
- solti_imre
- DrótVégénSzéndarab
- Hozzászólások: 22
- Csatlakozott: 2010. december 2. csütörtök, 7:00
Rejtélyes hiba!
Mind egy. Vedd ki a lib-ből amit bele raktunk és rakd át a Sub rutinodba.
Remélem a sok Push - Pop stimel?
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"