Grafikus LCD
- solti_imre
- DrótVégénSzéndarab
- Hozzászólások: 22
- Csatlakozott: 2010. december 2. csütörtök, 7:00
winnerbt!
Milyen Igazad van!
Én mostanában imádok Grafikus lib-eket fabrikálni!
Milyen Igazad van!
Én mostanában imádok Grafikus lib-eket fabrikálni!
A hozzászólást 1 alkalommal szerkesztették, utoljára kapu48 2012. július 26. csütörtök, 16:53-kor.
- solti_imre
- DrótVégénSzéndarab
- Hozzászólások: 22
- Csatlakozott: 2010. december 2. csütörtök, 7:00
"Én mostanában imádok Grafikus lib-eket fabrikálni! Nagyon boldog"
Akkor megszoborhatnád az OLEDemhez a LIBet.
Anno nekifogtam, de már az INIC-nél elvérzett a dolog,
aztán hagytam a fenébe, előbb a rutinok legyenek készen.
(mondjuk nem sok időt szántam a LIB bogarászásra,
de eléggé ráz a hideg a RISC-ektől)
Bárcsak tudná a Bascom a SHORT tip. változót...jóljönne.
JAni
Akkor megszoborhatnád az OLEDemhez a LIBet.
Anno nekifogtam, de már az INIC-nél elvérzett a dolog,
aztán hagytam a fenébe, előbb a rutinok legyenek készen.
(mondjuk nem sok időt szántam a LIB bogarászásra,
de eléggé ráz a hideg a RISC-ektől)
Bárcsak tudná a Bascom a SHORT tip. változót...jóljönne.
JAni
Pontos OLED típus? (Bár ez a terület még ismeretlen előttem.)
Mit értesz „SHORT” alatt? (2 Bytes egész szám?)
Van helyette ez:
• Integer (two bytes). Integers are stored as signed sixteen-bit binary numbers ranging in value from -32,768 to +32,767.
• Word (two bytes). Words are stored as unsigned sixteen-bit binary numbers ranging in value from 0 to 65535
Mit értesz „SHORT” alatt? (2 Bytes egész szám?)
Van helyette ez:
• Integer (two bytes). Integers are stored as signed sixteen-bit binary numbers ranging in value from -32,768 to +32,767.
• Word (two bytes). Words are stored as unsigned sixteen-bit binary numbers ranging in value from 0 to 65535
Szia!
BL12864GERNHn . SOSnél kapható aranyáron
A vezérlő: SSD1303
Van valami nagyon hasonló lib, legalább is a lapozás tekintetében, de asszem 16 gray-scale-s a cucc ez meg "csak" FF.
Igaz van benne egy csavar, mert 2 sor lehet blokkonként szürkeárnyalatos, de azt még nem tököltem ki.
A SHORT az előjeles byte. A 3D elforgatáshoz bőven elég a +-127-es SIN/COS tábla, de integerrel van most, mert nagyon megbonyolítja az előjelek kezelése, ha magam akarom kitalálni, mikor +/- az eredmény. Ez elég bosszantó, főleg, hogy negatív számok nem is léteznek igazándiból, szóval jól jött volna. Mások azt mondták, hogy minden más fordítóban van...
A rutinok direkt ekkora kijelzőhöz vannak vésve így nagyon gyorsak, minden byte-os (kivéve a 3D forgatást), így beleférek átvitellel együtt (sajnos bascomban nem tudom a Carry-t lekezelni ugye). De lehet, hogy a sebesség rovására át kell vésni a tér leképezéseket integerre és külön kell választani a 2D/3D cuccokat a berögződött szokások miatt (hol a 0,0 coordináta, negatív szövegkezdési hely megadása stb.).
De majd szép lassan ...
JAni
BL12864GERNHn . SOSnél kapható aranyáron
A vezérlő: SSD1303
Van valami nagyon hasonló lib, legalább is a lapozás tekintetében, de asszem 16 gray-scale-s a cucc ez meg "csak" FF.
Igaz van benne egy csavar, mert 2 sor lehet blokkonként szürkeárnyalatos, de azt még nem tököltem ki.
A SHORT az előjeles byte. A 3D elforgatáshoz bőven elég a +-127-es SIN/COS tábla, de integerrel van most, mert nagyon megbonyolítja az előjelek kezelése, ha magam akarom kitalálni, mikor +/- az eredmény. Ez elég bosszantó, főleg, hogy negatív számok nem is léteznek igazándiból, szóval jól jött volna. Mások azt mondták, hogy minden más fordítóban van...
A rutinok direkt ekkora kijelzőhöz vannak vésve így nagyon gyorsak, minden byte-os (kivéve a 3D forgatást), így beleférek átvitellel együtt (sajnos bascomban nem tudom a Carry-t lekezelni ugye). De lehet, hogy a sebesség rovására át kell vésni a tér leképezéseket integerre és külön kell választani a 2D/3D cuccokat a berögződött szokások miatt (hol a 0,0 coordináta, negatív szövegkezdési hely megadása stb.).
De majd szép lassan ...
JAni
Ez nem jó neked?
+/- Vizsgálat:
Kód: Egész kijelölése
;---------------------------------- _bCos: ------------------------------
[_BCOS]
; Sin and cos for Byte-Value for first Quarter of circle 0 to 90°
; Input 0 to 255 = 0 to < 90°,
; Output 0 to 255 = 0 to 1 for real sin/cos function
; algo: use a table of 16 points (90°/16), values between this points
; are interpolated
; Date-table at Code-label: _bsin_table
; Input in r20, result in r25
; uses r16, r21, r24, r25
; Code from Josef Franz Vögel
$EXTERNAL _LPMBYTE , _MUL8
_bCos:
neg r20
breq _bsin9a
_bSin:
mov r24, r20
andi r24, &HF0
mov r25, r24
swap r25
* ldi zl, low(_bsin_table*2)
* ldi zh, high(_bsin_table*2)
add zl, r25
clr r25
adc zh, r25
call _LPMByte
mov r25, r0
cp r24, r20
breq _bsin9
call _LPMByte
mov r16, r0
sub r16, r25
sub r20, r24
swap r20
call _mul8
rol r20
adc r25, r21
_bsin9:
ret
_bsin9a:
ser r25
ret
_bsin_table:
.db 0 , 25 , 50 , 74 , 98 , 120 , 142 , 162 , 180 , 197 , 212 , 225 , 236 , 244 , 250 , 254 , 255
[END]
Kód: Egész kijelölése
BRMI K Branch if Minus if (N = 1) then PC = PC + k + 1 None 1 / 2
BRPL K Branch if Plus if (N = 0) then PC = PC + k + 1 None 1 / 2
Nem tudom, milyen gyors a CALL-ok miatt, de előjelet nem ad vissza.
Én úgy csináltam, hogy illeszkedjen a byte-okhoz, hogy egy kör 0-360fok=> 0-255, a visszadott érték meg végül is SHORT, +-127. Az előjel lekezelése után *2 és egy word LOW-ba kerül, ezután szorzás, és a WORD felső byteja megadja a bemenő érték sin(x)-el való szorzatát. tehát a kettedes pont igazából a word közepén van. Egy ilyen felbontású kijelzőn bőven hibahatáron belül van az eredmény.
Csak az a tökölés, hogy figyelembe kell venni a SIN/COS előjelét, a pont koordinátája a nézőponttól merre van (+ vagy - a különbség) és még ezeket szorozgatni... Szóval a "pluszszor plusz az minusz szor minusz az minusz plusz különbség minusz-e, akkor plusz...Brrrr" agyalást nagyon megkönnyítené a SHORT tip. változó.
De végül is kívánatos lett az integer, mert a képsíkot metsző egyenes furcsa túlcsordulási hibákat okoz, no meg a nagyobb számábrázolás miatt a képernyőn kívülre eső részek kezelése is sokkal egyszerűbb. Van még mit tanulni ebben a témában, egyelőre a takarásról pl. ötletem sincs.
Kicsit ASM szerű, de ilyen lett pl. :
Én úgy csináltam, hogy illeszkedjen a byte-okhoz, hogy egy kör 0-360fok=> 0-255, a visszadott érték meg végül is SHORT, +-127. Az előjel lekezelése után *2 és egy word LOW-ba kerül, ezután szorzás, és a WORD felső byteja megadja a bemenő érték sin(x)-el való szorzatát. tehát a kettedes pont igazából a word közepén van. Egy ilyen felbontású kijelzőn bőven hibahatáron belül van az eredmény.
Csak az a tökölés, hogy figyelembe kell venni a SIN/COS előjelét, a pont koordinátája a nézőponttól merre van (+ vagy - a különbség) és még ezeket szorozgatni... Szóval a "pluszszor plusz az minusz szor minusz az minusz plusz különbség minusz-e, akkor plusz...Brrrr" agyalást nagyon megkönnyítené a SHORT tip. változó.
De végül is kívánatos lett az integer, mert a képsíkot metsző egyenes furcsa túlcsordulási hibákat okoz, no meg a nagyobb számábrázolás miatt a képernyőn kívülre eső részek kezelése is sokkal egyszerűbb. Van még mit tanulni ebben a témában, egyelőre a takarásról pl. ötletem sincs.
Kicsit ASM szerű, de ilyen lett pl. :
Kód: Egész kijelölése
'Y-tengely körüli forgatás, Y marad
Forgat:
'X számítás
If Szog_y = 0 Then Goto Forx '0 foknál nem foglalkozunk vele
Integercos = Lookup(szog_y , Cosinus128int) 'Szög cos
Integersin = Lookup(szog_y , Sinus128int) 'Szög sin
Integer1 = Px - Forgpont_x 'Pont(x)- Forgatási pont(x)Különbség
Integer2 = Integer1 * Integercos '*cos (szog_y)
Integer2 = Integer2 / 128 'Lehúzás alulra
Integer3 = Pz - Forgpont_z 'Pont(Z) és forgatási pont különbsége
Integer4 = Integer3 * Integersin '*sin(szog_y)
Integer4 = Integer4 / 128 'Lehúzás hogy byte legyen majd belőle
Integer5 = Integer2 - Integer4 'X=y*cos(szog)-Z*sin(szog)
Integer5 = Integer5 + Forgpont_x 'Forgatási ponthoz visszadjuk
Px = Integer5 'Byte a Px, amit meg lehet jeleníteni
'Z számítás
Integer1 = Px - Forgpont_x 'Különbség
Integer2 = Integer1 * Integersin
Integer2 = Integer2 / 128
Integer3 = Pz - Forgpont_z
Integer4 = Integer3 * Integercos
Integer4 = Integer4 / 128
Integer5 = Integer2 + Integer4
Integer5 = Integer5 + Forgpont_x
Pz = Integer5
Szerintem luxus ez a sok 128-al osztás!
Legegyszerűbb Rotálni 1 szer balra az Integert, és H Byte-jét berakni Bx-be
(Igy kidobod az előjelt)
vagy rotálni 7-al jobbra, és L Byte az eredmény.
Mindkettő gyorsabb, mint az osztás.
Legegyszerűbb Rotálni 1 szer balra az Integert, és H Byte-jét berakni Bx-be
(Igy kidobod az előjelt)
vagy rotálni 7-al jobbra, és L Byte az eredmény.
Mindkettő gyorsabb, mint az osztás.
A hozzászólást 1 alkalommal szerkesztették, utoljára kapu48 2012. július 26. csütörtök, 20:26-kor.
Én is azt hittem elsőre
(persze lehet, hogy benéztem...)
Az azért van mert:
- szükségem van az előjelre, ezért nem jöhetett szóba a rotálás
- 127-ig van a SIN/COS tábla, de nekem 255-ig kell
a szorzás miatt. (igazából itt van 2-vel megszorozva a SIN értéke és az előjel megmaradása mellett alulra pakolva egyszerre)
Nem néztem, hogyan csinálja ASMben, lehet, hogy 1-2 logikai művelettel gyorsabb lenne, de kipróbálom.
Itt a cél még csak az, hogy egyáltalán működjön a cucc és ne szaladjak ki a tartományokból, mert azt debugolni igen nehéz.
(nem megy még fejben az elforgatás kiszámolása, de ha így haladok, már azt is megtanulom, mint anno TTL IC-atlaszt)
Sajnos a 2D/3D konvertert is át kell vésni integerre, amit nagyon nem akartam és jó is byte-osan, de igen könnyű elküldeni az erdőbe egy hibás koordinátával és ránézésre nem jössz rá, melyik a hibás.
JAni
(persze lehet, hogy benéztem...)
Az azért van mert:
- szükségem van az előjelre, ezért nem jöhetett szóba a rotálás
- 127-ig van a SIN/COS tábla, de nekem 255-ig kell
a szorzás miatt. (igazából itt van 2-vel megszorozva a SIN értéke és az előjel megmaradása mellett alulra pakolva egyszerre)
Nem néztem, hogyan csinálja ASMben, lehet, hogy 1-2 logikai művelettel gyorsabb lenne, de kipróbálom.
Itt a cél még csak az, hogy egyáltalán működjön a cucc és ne szaladjak ki a tartományokból, mert azt debugolni igen nehéz.
(nem megy még fejben az elforgatás kiszámolása, de ha így haladok, már azt is megtanulom, mint anno TTL IC-atlaszt)
Sajnos a 2D/3D konvertert is át kell vésni integerre, amit nagyon nem akartam és jó is byte-osan, de igen könnyű elküldeni az erdőbe egy hibás koordinátával és ránézésre nem jössz rá, melyik a hibás.
JAni
Nem egészen értem!
Valami ilyesmire gondolsz?
Valami ilyesmire gondolsz?
Kód: Egész kijelölése
'Sin_Cos.bas
$regfile = "m128def.dat"
$crystal = 11059200
$hwstack = 40
$swstack = 32
$framesize = 32
$sim
Const Egyseg = 360 / 255 'Fok
Dim I As Byte
Dim S As Single , X As Single
Print "0 - 360 fok Sin - Cos szamitasa 255 értékig"
Print " Fok Növelése: " ; Egyseg
Print
'Sinus
X = 0
For I = 1 To 255
X = X + Egyseg
S = Sin(x)
Print I ; " " ; X ; " fok Sinusa= " ; S
Next I
X = 0
Print
' COS
For I = 1 To 255
X = X + Egyseg
S = Cos(x)
Print I ; " " ; X ; " fok CoSinusa= " ; S
Next I
End 'end program
- solti_imre
- DrótVégénSzéndarab
- Hozzászólások: 22
- Csatlakozott: 2010. december 2. csütörtök, 7:00
Igen, a kör 255 részre van osztva, egy lépés 360/255.
Azért lett így, mert könnyebb 1 byte-ban megadni a teljes kört, ne kelljen már word a 360 miatt. Belül úgy is, ha lehet byte-ban számolok. Nem CAD preciziós programhoz lesz és minden egyszerűbb. Szemre meg aztán pláne elég. Lebegőpontos dolgokat meg messzire kerülöm a sebesség miatt.
PSET: Szerintem nincs POINT utasítás (legalább is más, régebbi Basic-ekben így hívták azt, ami megadja az adott koordinátájú pont értékét). Már ha erre gondoltál.
Azért lett így, mert könnyebb 1 byte-ban megadni a teljes kört, ne kelljen már word a 360 miatt. Belül úgy is, ha lehet byte-ban számolok. Nem CAD preciziós programhoz lesz és minden egyszerűbb. Szemre meg aztán pláne elég. Lebegőpontos dolgokat meg messzire kerülöm a sebesség miatt.
PSET: Szerintem nincs POINT utasítás (legalább is más, régebbi Basic-ekben így hívták azt, ami megadja az adott koordinátájú pont értékét). Már ha erre gondoltál.
- solti_imre
- DrótVégénSzéndarab
- Hozzászólások: 22
- Csatlakozott: 2010. december 2. csütörtök, 7:00
Igen, erre gondoltam! Az esetleg megvalósítható, hogy az AVR RAM területén leképezem a kijelző memóriájának a tükörképét, ott végzem a vizsgálatokat, változtatásokat és valamilyen "LDIR"-szerű utasítással minden módosítás után átmásolom? Egyáltalán hozzá lehet férni a kijelző RAM-hoz? Mert ha igen, akkor gépi kóddal megoldható, nem? (Án sajnos csak a Z80 assemblert ismerem, az pedig már nem egy mai gyerek...winnerbt írta:....
PSET: Szerintem nincs POINT utasítás (legalább is más, régebbi Basic-ekben így hívták azt, ami megadja az adott koordinátájú pont értékét). Már ha erre gondoltál.