Grafikus LCD - Fontszerkesztő

Hogyan programozzak AVR chipet? Programozók beállításai...
Bascom nyelvű programok...
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

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

Sziasztok!
Mivel lehet grafikus fontokat szerkeszteni?

Kelenének a 16*16 ékezetes betűk!

Esetleg már készen is jó lenne!
8)
Avatar
Franz
DrótVégénSzéndarab
Hozzászólások: 43
Csatlakozott: 2009. május 29. péntek, 6:00

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

Bascom beépített: MCS Font Editor, Bascom->Tools->Plugins->Font Editor
(Lehet, hogy a Plugin managerbe ki kel pipálni meg egy ujraindités is kell, persze a Plugin könyvtárban ott kell lennie a fonteditor.bpl-nek)
Aztán font16x16.font fájlból lehet csinálni ékezeteset. Nem túl szép meló :-(
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

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

Köszönöm!
:D
A pipa hiányzott. Azért nem találtam. :oops:
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

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

Ha már át lettem ide pakolva!
Előzmények itt : T6963C kijelző és a CGRAM?
Akkor hozom ide a téma előzményét is.

Erről a kijelzőről van szó:
http://www.acdcshop.gr/content/rg240128b-biw-v.pdf
Amin újabb típusú meghajtó IC van RA6963 és nehezen sikerült működésre bírni.
RA6963 - Dot Matrix LCD Controller:
http://www.alldatasheet.com/datasheet-p ... A6963.html?

Bascomos oldalakon fellelhető a „glcdRA6963.LIB” de valami hiba van, mert semmit nem tudok ki írni vele az LCD-re!

A hiba oka nagyvonalakban, a glcdRA6963. lib-ben nem a fenti adatlap 40. oldalán szereplő ábra szerinti sorrendben kezelték az LCD vezérlő pinjeit!
8-2 MPU Interface Timing ábra.
És be kellett illeszteni a lib-be még a: 18-as MD2 pin vezérlését is.
Ezek után már elég szépen dolgozik a kijelző!

Amit szeretnék megvalósítani:
Óra: számok 32*32font „óó:pp” 16*16font „:mm”
Dátum: 12*16font „éééé,hh,nn Hónap,hnapja”
Még ébresztés stb…
Persze ahol kell ékezetes betűkkel, most épen ezen dolgozok!
8)
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!
Nem biztos, hogy mindenki bele tud nyúlni a LIB-be, érdemes lenne közkincsé tenni az általad módosított LIB-et vagy a sorokat.
Különben ilyenkor mindig az jut eszembe, hogy aki ezt megírta,
befésülték a Bascom-ba, terjesztették stb.... szóval kis sem próbálták? Ez olyan, mint a Tiny13-85 Start Timer hiba. nem igaz, hogy akár 1db programot is írtak rá... Kezd már olyan lenni az egész, mint a WIN. Pár napja belefutottam olyanba, hogy EEPROMba Single változó-tól lehalt minden. Amint szétkaptam byte-okra, jó lett. Szóval ott is van valami bibi, de nem sikerült rövid tesztprogrammal előhozni. Más panaszkodik, hogy M8-ban ha a program 60%-nál nagyobb (akár pár NOP-pal vagy Data sorral), az egész lehal.

Még jó, hogy van aki bele tud mókolni a cucc lelkébe!
Előre is köszönöm mások okulására is. No, meg ha én is beleakadok ilyen kijelzőbe, talán nem megy rá 300 hajszálam.

JAni
19:31
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

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

OK!
Ide teszem nektek, azt a részletet, amit javítgattam!
De ez nem hivatalos, csak benne hagyom a Copyright-ot, hogy tudjátok, miről van szó.
Nem tudom, lehet e így? (Majd Róbert helyre teszi!)
Ez így hiba nélkül megy 16MHz AVR-el. (De még lehetne lefaragni a NOP-okból.)

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

copyright = MCS Electronics
www       = http://www.mcselec.com
email     = avr@mcselec.com
comment   = RA6963 graphic display library
libversion   = 2.0.4.1
date         = 5 apr 2012
statement    = No SOURCE code from the library may be distributed in any form
statement    = Of course this does not apply for the COMPILED code when you have a BASCOM-AVR license
history      = No known bugs.
history      = LINE added
history      = RLE decoding added
history      = rcall changed into call
history      = a RET was left in the lib causing the status check not to work
history      = box statement did not filled complete box
history      = R23 is replaced by r11 because r23 might be used in case you use an extended port for control
history      = changed for RA6963 single scan , 32KB model , MD2 Pin setup = _Glcd_md2
history      = AVR 16MHz

[_GLCD]
;init display uses r24,r25

_set_display:
* Sbi _glcd_portm,_GLCD_CD         ; command high
*  nop
*  nop
*  nop

* Sbi _glcd_portm,_GLCD_Ce         ; ChipEnable high
*  nop
*  nop
*  nop

* Sbi _glcd_portm,_glcd_wr         ; write high
*  nop
*  nop
*  nop

* sbi _glcd_portm,_glcd_rd         ; read high
*  nop
*  nop
*  nop

* #IF _GLCD_MODE=8
* cbi _glcd_portM,_glcd_fs         ; font select  0 for 8*8
*  nop
*  nop
*  nop

* sbi _glcd_portM,_Glcd_md2         ; 32 Colums H
* #ELSE
* sbi _glcd_portM,_glcd_fs         ; font select  1 for 6*8
*  nop
*  nop
*  nop

* cbi _glcd_portM,_Glcd_md2         ; 40 Colums L
* #ENDIF
*  nop
*  nop
*  nop

* cbi _glcd_portm,_glcd_reset      ; reset low
  Ldi r24,100                       ; reset 100 mS
  Clr R25
* Call _Waitms
* sbi _glcd_portm,_glcd_reset      ; reset high
  Ldi r24,100                       ; Wait 100 mS
  Clr R25
* Call _Waitms

  rcall _gstatus_check

  Clr r24
  rcall _GWrite_Data
  rcall _GWrite_Data
  ldi r24,&H40                     ; home adres text ram.upperleft corner 0000
  rcall _GWrite_Cmd

  rcall _GWrite_Data
  rcall _GWrite_Data
  ldi r24,&H22                     ; offset register 00 00
  rcall _GWrite_Cmd

* ldi r24,_GLCD_COLS
  rcall _GWrite_Data
  Clr r24
  rcall _GWrite_Data
  ldi r24,&H41                     ; linewidth graphic (characters per line)
  rcall _GWrite_Cmd

  Clr r24
  rcall _GWrite_Data
  ldi r24,&H08                     ; 0800
  rcall _GWrite_Data
  ldi r24,&H42                     ; home adress graphical ram.upperleft corner 0800
  rcall _GWrite_Cmd

* ldi r24, _GLCD_COLS              ; columns depends on mode for 240 with mode 6 it is 40
  rcall _GWrite_Data
  Clr r24
  rcall _GWrite_Data
  ldi r24,&H43                     ;  linewidth graphics (bytes per line)
  rcall _GWrite_Cmd

  ldi r24,&H80                                                ' OR mode
  rcall _GWrite_Cmd
  ldi r24,&H9F                     ; text, graph, cursor , blink all on
  rjmp _GWrite_Cmd


;Status check
;The Status of T6963C can be read from the data lines.
;  RD L
;  WR H
;  CE L
;  C/D H
;  Do to D7 H
;  The T6963C status word format is as follows:

_gstatus_check:
; Adat Port bemenet
  clr r25                          ; r25 = 0
* out _glcd_port_ddr,r25           ; make port an input
  ser r25                          ; r25 = HFF
* out _glcd_port,r25               ; Adat Port Felhuzo R
*  nop
*  nop
*  nop
*  nop
*  nop
*  nop
* Sbi _glcd_portm,_GLCD_CD         ; H command
*  nop
*  nop
*  nop
*  nop
*  nop
*  nop
*  nop
* Cbi _glcd_portm,_glcd_ce         ; L Enable Chip
*  nop
*  nop
*  nop

* sbi _glcd_portm,_glcd_wr         ; H write high

_gstatus_check1:
*  nop
*  nop
*  nop
*  nop

* cbi _glcd_portm,_glcd_rd         ; L RD low
*  nop
*  nop
*  nop
*  nop
*  nop
*  nop
*  nop

* in r25, _glcd_port_in            ; get status
*  nop
*  nop
*  nop

* sbi _glcd_portm,_glcd_rd         ; H end RD
*  nop
*  nop
*  nop
*  nop
*  nop
  Andi R25 , 3                     ; Mask Bits
  ;cpi r25,3
* #IF _SIM=0
  breq _Gstatus_check1             ; not ready
* #ENDIF

; Adat Port kimenet
_gstatus_check2:
* sbi _glcd_portm,_GLCD_CE        ; disable chip not needed at this stage
*  nop
*  nop
*  nop
*  nop
  ser r25                          ; 255
* out  _glcd_port_ddr,r25          ; AVR make output port
*  nop
*  nop

Ret        ; _gstatus_check END


_wr_check:
  clr r25
; AVR Adat Port bemenet
* out _glcd_port_ddr,r25           ; make port an input
  ser r25
* out _glcd_port,r25
*  nop
*  nop
*  nop
*  nop
*  nop
* Sbi _glcd_portm,_GLCD_CD         ; command H
*  nop
*  nop
*  nop
*  nop
*  nop
*  nop
*  nop

* Cbi _glcd_portm,_glcd_ce         ; Enable Chip  L
*  nop
*  nop
*  nop

* sbi _glcd_portm,_glcd_wr         ; write high  H

_wr_check1:
*  nop
*  nop
*  nop
*  nop
*  nop
*  nop

* cbi _glcd_portm,_glcd_rd         ; RD low
*  nop
*  nop
*  nop
*  nop
*  nop
*  nop
*  nop

* in r25, _glcd_port_in            ; get status
*  nop
*  nop

* sbi _glcd_portm,_glcd_rd         ; H end RD
*  nop
*  nop
*  nop
*  nop
*  nop
*  nop

  Andi R25 , 8                     ; Mask Bits
* #IF _SIM=0
  breq _wr_check1                  ; not ready
* #ENDIF
  rjmp _gstatus_check2             ; set to output


_Gwrite_Data:
  rcall _GStatus_check             ; check status

_Gwrite_Data_NS:
* cbi _glcd_portm,_GLCD_CD         ; L data
_gwrite_datamisc:
*  nop
*  nop
*  nop
*  nop
*  nop
*  nop
*  nop

* cbi _glcd_portm,_GLCD_CE         ; enable chip is done in status checl
*  nop
*  nop
*  nop
*  nop
*  nop
*  nop
*  nop

* out _GLCD_PORT,r24               ; write
*  nop
*  nop
*  nop
*  nop
*  nop
*  nop

* cbi _glcd_portm,_glcd_wr         ; write low
*  nop
*  nop
*  nop
*  nop
*  nop
*  nop
*  nop


* sbi _glcd_portm,_glcd_wr         ; write high
*  nop
*  nop
*  nop
*  nop
*  nop

* Sbi _glcd_portm,_GLCD_CE         ; disable chip
*  nop
*  nop
*  nop
*  nop
*  nop
Ret     ; _Gwrite_Data END

_Gwrite_Cmd:
....
....

A Hátralévő részt nem bántottam!

Már elég sokat teszteltem, demég azért csiszólgatom!
Nem kinevetni ez az első GLCD-s munkám!
8)

Meghívni pedig igy kel:

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

'__________________________    LCD RG240128B-BIW-V CONFIG    ___________________
'Bascom által nem vezérelt MD2 Port Output
Config Portc.3 = Output
Lcd_md2 Alias Portc.3

' (LCD PIN 18  MD2 =  H: 32 columns ; L: 40 columns)  > Controlport._glcd_md2
Const _glcd_md2 = 3                                         'MD2 = Controlport.3

' LCD-RA6963 and  AVR $crystal = 16000000 used crystal frequency Optimized glcdRA6963_2.Lib
$lib "glcdRA6963.LIB"

Config Graphlcd = 240 * 128 , Dataport = Porta , Controlport = Portc , Ce = 0 , Cd = 2 , Wr = 7 , Rd = 6 , Reset = 1 , Fs = 4 , Mode = 8
Cursor Off
Cls
Jó rajzólgatást!
:)
Ui.:
Tanács: A Control port ne legyen a programozóval egyűt, mert nagyon bezavarja az LCDt! :wink:
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

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

Mivel minden kezdet nehéz!
Kerestem mintákat, hogyan csinálják ezt mások?
Amikkel játszadoztam:
Graphic fonts:
http://evertdekker.com/Joomla/index.php ... &Itemid=85
Ebből kiszedtem a forgatást, mert az nem kel. Maradt csak a „Case 0” ág.
Nagyon sokat tudó rutin. De mivel pontonként rajzolja a betűket, elégé lassú!

A másik minta progi kevesebbet tud és vannak kötöttségek benne.
Pl. a karakter szélességnek 8-al oszthatónak kel lennie és az oszlop csak Byte határra kerülhet.
Itt Byteokat küldünk ki 1*re ezért gyorsabb. És könnyebb gépi kódba rakni.
Showing custom fonts on the T6963C:
http://www.mcselec.com/index.php?option ... &Itemid=57
Ezt kell tovább mókolnni, hogy tudjon nagyobb méretű és ékezetes betűket is kipakolni!

Még van a másik lehetőség bgf eket kipakolászni pl:
http://evertdekker.com/Joomla/index.php ... &Itemid=95
Ez gyorsabb, és talán még könyebb is megrajzolni, a fontoknál.


Esetleg további ötletek, tanácsok jöhetnek!

8)
A hozzászólást 1 alkalommal szerkesztették, utoljára kapu48 2012. április 9. hétfő, 18:09-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 »

Igen, sajnos az 1-pixel/bit-nél kicsi lesz a kép, de nagyon sok bitoperációt kíván, ha tetszőleges helyre akarod kiatenni. Ezért van a 8-al osztható X vagy Y hely kötöttség. Viszont tapasztaltaim szerint, ha akár külső PLOT meghívásával teszel ki szöveget, nem lesz sokkal lassabb. Sőt én tettem bele overlay funkciót is, tehát amikor kiteszi a szöveget XY-ra (ami bitmap XY, tehát bármi), akkor a 0-kat átlátszóként kezelje, akkor is gyors. Persze emiatt 2db rutin kell, mert 80%-ban nem jó az overlay-es kiírás, viszont amikor kell, akkor nincs mese.

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

'1 sor kirakása X-Y-ra
'X,Y
'
Sorxy:                                            'SX() sor tömb kirakása x-y ponttól SXHOSSZ-ig
X = Sorxy_x
Y = Sorxy_y
For Ctx = 1 To Sxhossz                            '1-től a hosszig
Pixelbyte = Sx(ctx)
Gosub Wpixel
X = X + 1
Y = Y - 8
Next Ctx
Return
Wpixel:                                           '1 függőleges byte kirakása x-y-ponttól lefelé
   Bitct = 255
   While Bitct <> 7
    Incr Bitct
    'Decr Bitct  'Ha fejjel lefelé kell kiírni...minek?
      If Pixelbyte.bitct <> 0 Then
        Ink = 1
         Gosub Plot_v
      Else
         If Ov = 0 Then                           'OV=1 overlaynél a 0-s pixel nem rakódik ki
         Ink = 0
         Gosub Plot_v
         End If
      End If
        Incr Y
         If Y > 63 Then Exit While
  Wend
Return
(itt egy tömb, ami tartalmazza az egy karaktersort, kipakolása
megy, de bárhova. a hossz nem nagyon fontos, de jól jön.
Hogy ez hogyan néz ki?
http://data.hu/get/4941079/oledmenu.m2v
(10mega kb)
Ha kikockázod, látszik, hogy ráír a felmenő sor a többire, de nem hagy fekete kockát. Teljes sorok kiírásánál vizuálisan nagyon mocsok volt, amikor a karakter sor törölte maga alatt a többit.
A PLOT-V az az INK színnel (0=törlés, 1= set, 2=exor) kitesz egy pontot. Így, hogy minden pixel, ilyen gyors.
(ez 128x64-es kijelzőn megy, a határok azért vannak benne)
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 »

A kis bemutató videón látható sebesség nagyon meggyőző!
Köszí, az ötletet!
:o :o
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!
Ha: Config Graphlcd = … Mode = 6
Ilyenkor a Grafikus területen is csak 6 Bite jelenik meg Byte-onként?
:?
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. Logikai karakterhossz, vagy normálisan egymás mellett lesznek a karaktereid és tökölhetsz a 6-bites byte-okkal vagy távolabb lesznek (szerintem ocsmány), de akkor mind a 8 bit látszik.
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 »

Fenébe!

Akkor TEXT + GRAPHIC hardveresen Gyors és ocsmány!
Szoftveresen pedig írnom kel rá rutint, szép lesz és lassú!?
:?: :cry:

Igaz az ékezetes betűk miatt már úgy is írnom kel Font rajzoló rutint!
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 »

végül is nem 8-al hanem 6-al kell osztanod, ami nem lenne gond,
ha hardveresen menne, de hát szorzó van, osztó nincs :(
(haj, de kényelmes volt anno 8051-nél, nem is tudom, miért hagyták ki)
Talán még lehet próbálkozni 7x8-as karakterekkel, bár kicsit tömzsinek tűnnek. Vagy választhatod azt a megoldást, hogy maradsz a 8-bitnél és mindent grafikusan kezelsz, nem foglalkozol a text layer-el. Van is olyan LCD, ami vagy-vagy, egyszerre nincs text-grafikus layer (LC79xx vagy mi a vezérlő).
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 jó ötletnek tűnik!
A „Font8x8.font” készletet átrajzolom 1 pixelel szélesebbre.
Így kisebb lesz a betűk között a tér, és jobban látható lesz.

Az angolos karakterek ASCII 127 után hozzácsapom az ékezetes betűimet + pár grafikus karaktert. Az egészet feltöltöm a CGRAM területre és mehet gyorsan Mode=8 Text HW a ki írás.
Alá pedig rajzolgathatok kedvemre.
:)
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 »

És mivel a CGRAM helyét akár változtatni is tudod, így váltogathatsz a fontok között egy regiszterírással. Nekem elég sok karakter kimaradt, oda a grafikához szükséges alapdolgokat tettem be és ugyebár egy karakterkódot gyorsabban beviszel, mint mondjuk egy grafikus ásító macskát, tehát gyors is lesz.
Válasz küldése