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 »

Szia!
A CE-t felcserélni nem egyszerűbb?
Akár madzagot akár a config lcd-nél?
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 »

kapu48 írta:Létezik annak „glcdKS108.lib” változata is!
Azt tudod szerkeszteni.
Csak 4 Chip Ce utasítást kellene megcserélni!
:idea:
Köszönöm, tökéletesen működik!!
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

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

winnerbt!

Milyen Igazad van! :lol:

Én mostanában imádok Grafikus lib-eket fabrikálni! :D
A hozzászólást 1 alkalommal szerkesztették, utoljára kapu48 2012. július 26. csütörtök, 16:53-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 »

winnerbt írta:Szia!
A CE-t felcserélni nem egyszerűbb?
Akár madzagot akár a config lcd-nél?
JAni
Köszönöm Neked is - most már a bőség zavarával küzdök a megoldások terén! :-)
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 »

"É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
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

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

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
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 »

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
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

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

Ez nem jó neked?

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]
+/- Vizsgálat:

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
 
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 »

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. :

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
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

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

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.
:wink:
A hozzászólást 1 alkalommal szerkesztették, utoljára kapu48 2012. július 26. csütörtök, 20:26-kor.
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 »

É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
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 egészen értem!
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
:? :?:
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 »

Még egy kérdésem lenne: a PSET-nek van valamilyen inverze? (amivel le lehetne kérdezni, hogy egy adott pont beállított, avagy nem, tehát mint az inp/out páros a memóriacímek esetében)
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, 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.
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:....

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.
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...:-)
Válasz küldése