Grafikus LCD

Hogyha sikeresen O/PLED illetve hagyományos alfanumerikus - esetleg tán grafikus kijelzővel gyűlik meg a baja valakinek:)
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:Rejtélyes hiba!
Remélem a sok Push - Pop stimel?
:idea:
Köszönöm, így már működik! (Beírtam - még az előző megoldásnál - egy ilyen "agyonbonyolított" részt is a lib-be:

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

[IMIKE]
_imike:
nop
ret
[END]
és azt meghívva is hibát jelzett, tehát valamiért az RCALL-t, !CALL-t nem hajtotta végre, maga az asm program jó volt.)

Viszont van egy érdekes jelenség:

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

Pset 5 , 5 , 1
Px = 5
Py = 5
Call Spixelread()
Lcdat 7 , 1 , Pixelread
Px = 88
Py = 55
Call Spixelread()
Lcdat 8 , 1 , Pixelread
Az elsőnél - tehát az egyezésnél- fix 0-ával tér vissza, de a másodiknál random módon bármilyen értékkel. Végülis ez nekem így tökéletesen megfelel (ha nulla, akkor ütközött, egyébként nem), csak nem értem. miért random?

Még egyszer nagyon köszönöm értékes segítséged!!
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 »

solti_imre írta:
Viszont van egy érdekes jelenség:

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

Pset 5 , 5 , 1
Px = 5
Py = 5
Call Spixelread()
Lcdat 7 , 1 , Pixelread
Px = 88
Py = 55
Call Spixelread()
Lcdat 8 , 1 , Pixelread
Az elsőnél - tehát az egyezésnél- fix 0-ával tér vissza, de a másodiknál random módon bármilyen értékkel. Végülis ez nekem így tökéletesen megfelel (ha nulla, akkor ütközött, egyébként nem), csak nem értem. miért random?
A hiba sajnos komolyabb, mint gondoltam. Beleraktam egy ciklusba

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

Ciklus = 1
 Do
 Cls
 Pset 5 , 5 , 1
 Px = 5
 Py = 5
 Call Spixelread()
 Lcdat 7 , 1 , Pixelread
 Px = 88
 Py = 55
 Call Spixelread()
 Lcdat 8 , 1 , Pixelread
 Lcdat 5 , 1 , Ciklus
 Waitms 500
 Incr Ciklus
 Loop
és a második ciklustól kezdődően mindkét beolvasás értéke 0 lesz... :(
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

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

Na És igy?:

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

Pset 5 , 5 , 1 
 Px = 5 
 Py = 5 
 Call Spixelread() 
 Lcdat 7 , 1 , Pixelread 

Pset 5 , 5 , 0 

 Call Spixelread() 
 Lcdat 8 , 1 , Pixelread
:?:

A Verem műveletek lehetnek Páratlanul!
Mivel Nem Ismerjük az eredeti Bascomos rutinokat, ezért benne hagytam a sok regisztermentést és visszatöltést! Meg kell próbálni egyszerűsíteni.
A hozzászólást 1 alkalommal szerkesztették, utoljára kapu48 2012. július 27. péntek, 13:14-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:Na És igy?:

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

Pset 5 , 5 , 1 
 Px = 5 
 Py = 5 
 Call Spixelread() 
 Lcdat 7 , 1 , Pixelread 

Pset 5 , 5 , 0 

 Call Spixelread() 
 Lcdat 8 , 1 , Pixelread
:?:
Így már az első ciklusban is mindkét érték 0....
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

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

Tegyél közé várakozást, hogy lássad a Pont rajzolás megtörténik?

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

Pset 5 , 5 , 1 
  Px = 5 
  Py = 5 
  Call Spixelread() 
  Lcdat 7 , 1 , Pixelread 
Waitms 2000

 Pset 5 , 5 , 0 

  Call Spixelread() 
  Lcdat 8 , 1 , Pixelread
A cimzés X/Y biztos jó?
Én már szívtam. hogy hol 0-val kezdődik, hól 1-el!
A Bascom nem egységes ezen a téren.
:?
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:Tegyél közé várakozást, hogy lássad a Pont rajzolás megtörténik?

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

Pset 5 , 5 , 1 
  Px = 5 
  Py = 5 
  Call Spixelread() 
  Lcdat 7 , 1 , Pixelread 
Waitms 2000

 Pset 5 , 5 , 0 

  Call Spixelread() 
  Lcdat 8 , 1 , Pixelread
A cimzés X/Y biztos jó?
Én már szívtam. hogy hol 0-val kezdődik, hól 1-el!
A Bascom nem egységes ezen a téren.
:?
Beleraktam (igaz, csak 500ms -osat), de ezzel is látszik, hogy gyönyörűen villog a pont.

A címzés 1,1 -nél kezdődik és 8,16-nál végződik, ezt már tegnap leteszteltem.
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

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

A Help másként irja:
PSET X , Y, value


Remarks

X
The X location of the pixel. In range from 0-239.

Y
The Y location of the pixel. In range from 0-63.

value
The value for the pixel. 0 will clear the pixel. 1 Will set the pixel.
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:A Help másként irja:
PSET X , Y, value


Remarks

X
The X location of the pixel. In range from 0-239.

Y
The Y location of the pixel. In range from 0-63.

value
The value for the pixel. 0 will clear the pixel. 1 Will set the pixel.
Bocsi, azt hittem, a karakteres kiiratást kérdezed! A pset az valóban 0-127 és 0-63!
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

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

Akor a 6*6 Pont villog?
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:Akor a 6*6 Pont villog?
Igen. De gondolom ha a psetnél 5,5 -öt adok meg és a kiolvasásnál is u.azt, akkor ugyanarra a pontra kell vonatkozzon.
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 Sajnos nem úsztuk meg az LCD adatlapp tanulmányozását!
Jobban járunk, ha meg írjuk magunk, mert most nem tudjuk mit is olvas ez a rutin!
(Lehet, hogy csak a hibajelzést olvassuk vissza?)

Tudsz Adatlap címeket adni?
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 »

Persze! Pl.:http://www.datasheet4u.net/download.php?id=676733

Az előző inkább az elektromos felépítésével foglalkozott, ez viszont szerintem hasznosabb a programozás szempontjából

http://www.datasheetcatalog.org/datashe ... yzytqy.pdf (Főleg a 18-20. oldal)

De hogy hogyan lesz ebből működő program...? :D
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

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

Az első hibánk, hogy 2* kel olvasni a regisztert és az elsőt eldobni!
Adatlap Gyors fordítás:
OUTPUT REGISTER
Kimeneti regiszter tárolja az adatokat ideiglenesen a kijelző, ha az adatok RAM CS1B, CS2B CS3 és az aktív
mód és R / W és RS = H, tárolt adatok megjelenítési adatok RAM van rögzítve a kimeneti regiszter. Amikor CS1B a CS3
Az aktív mód és R / W = H, L = RS, státusz adatok (foglalt csekk) is felolvasott. Olvasni a kijelző tartalmát adatok
RAM, kétszer hozzáférés olvasási utasítás szükséges. Az első hozzáférés, az adatok megjelenítési adatok RAM van rögzítve a kimeneti regiszter.
A második hozzáférés, MPU tudja olvasni, amely becsukva. Ez azt jelenti, hogy olvasni az adatokat a RAM-kijelzőn adatokat, akkor dummy kell olvasni. De a status read nincs szükség dummy olvasható.

A második, hogy 1 Bytet olvas ki és nem 1 Pixelt!

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

' 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
  !call _gread_data                ; return data in r1  DO NOT REMOVE !!!
* 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
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 »

Na, megírtam a tesztelő programot, tökéletes! Így nézett ki a végére:

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
  Cls

 Setfont Font8x8

 Declare Sub Spixelread()
 Dim Ciklus As Byte , Hiba As Byte

 Cls

 Pset 5 , 5 , 1
 Hiba = 0

 For Px = 0 To 127
   For Py = 8 To 63

      Call Spixelread()
      If Pixelread > 0 Then
         Incr Hiba
      End If
   Next Py
 Next Px

 If Hiba = 0 Then
   Lcdat 8 , 1 , "Rendben!"
   Else
   Lcdat 8 , 1 , "HIBA!!!!"
 End If

 Pset 5 , 5 , 0
 Pset 5 , 5 , 1

 For Px = 0 To 7
   For Py = 0 To 7
      Call Spixelread()
      If Pixelread > 0 Then
         Lcdat 1 , 9 , "             "
         Lcdat 1 , 9 , Pixelread
         Lcdat 1 , 49 , Px
         Lcdat 1 , 89 , Py
         Wait 5
      End If
   Next Py
 Next Px
 End                                                        ' IDE KELL EZ! Mert ráfut a program a Subra

 Sub Spixelread()
 $asm
  Push r20
  Push r21
  lds r20,{Px}                                              ' Bascom változó átadá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
  rcall _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   Távoli Rutin hívás

  rcall _gread_data           ; return data in r1
  rcall _gread_data           ; return data in r1  DO NOT REMOVE !!!
  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"
Amint azt gondoltam, valóban byte-ot ad vissza - 5,0 -tól az 5,7 -ig a visszaadott érték 32 volt (ha pl. 4,4 -et PSET-eltem volna, akkor 16 lett volna, 0,0-nál 1, stb.), minden másra 0 volt a Pixelread értéke! :-) Most már csak a maszkolás van hátra - kiszámolom, a kígyófej az adott byte melyik bitjét találná el és ha az a bit 1, akkor jöhetnek a további vizsgálatok! :-)

Nagyon köszönöm még egyszer a segítséged és a rám áldozott időd!!!!
A hozzászólást 1 alkalommal szerkesztették, utoljára solti_imre 2012. július 27. péntek, 17:00-kor.
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

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

Valószínű az 5 bite-nek változnia kellene?
Ha ez már jó!? Majd haladunk tovább.
:wink:

Egyébként benne van a lib-ben.

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

[_GPIXEL]
$external _div8 , _glocate , _adjust_pin
; set or reset a single pixel
; X=R20 , Y=R21 , R25 is on/off
_gpixel:
  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

  rcall _gread_data                ; return data in r1  DO NOT REMOVE !!!

;' Itt kezdi ki maszkolni az aktuális Pixelt


  mov r20,r2
  mov r21,r3
  rcall _setcol                    ; use the code from locate

  Mov r24,r0                       ; remainder
  call _Adjust_pin                 ;
  Pop r16  ;param r25
  tst r16
  breq _gpixel_clear
  or r1,r24
  rjmp _gpixel_set
_gpixel_clear:
  and r1,r25
_gpixel_set:
  mov r24,r1

;' Aztán a változtatást vissza irja
  rcall _GWrite_data               ; write data
  Pop r16
  Pop r3
  Pop r2
  Pop r1
  Pop r0
ret
[END
8)

És felesleges idézgetni az előző hsz-emt! Mert csak széthúzod az oldalt!
Válasz küldése