BGF kép letöltése

Avatar
norbi
Chipgyilok
Hozzászólások: 308
Csatlakozott: 2006. augusztus 3. csütörtök, 6:00

BGF kép letöltése

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

Most, hogy az I2C bootloaderen túlvagyok, találtam még egy olyan dolgot, amivel nem foglalkozott itt más...netről szeretnék letölteni BGF-képet.

Nem feltétlenül arra gondolok, hogy megadok egy webcímet, s letöltöm, sajnos kicsi a kijelző egy saját böngészőhöz... :P hanem egy gépről szeretném feltölteni.

Addig már nincs baj, hogy eltároljam eepromban a netről érkező csomago(ka)t (bár kicsit más, mint egy hex file, de ez belefér egy TCP csomagba, nem kell illesztgetni).

De innen, hogyan tovább? Ismeri valaki a BGF felépítését?
Érdeklődtem már Mark Alberts-nél, de még nem reagált...

Néztem az eepromos képtárolást Bascomban (showpice), de az ha jól emlékszem csak megadott kijelzővel megy... és abban nem segít, hogy a byte-okból, hogy lesz újra kép így.

Köszönöm!
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

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

Azt hiszem tömörített bitmap kép. Te is létre tudod hozni a Bascom beépített kezelőjével.
"The BGF files are RLE encoded to save space."

A súgóból:
"
The BGF format is made up as following:

· first byte is the height of the picture
· second byte is the width of the picture
· for each row, all pixels are scanned from left to right in steps of 6 or 8 depending on the font size. The resulting byte in stored with RLE compression

The RLE method used is : byte value, AA(hex), repeats.
So a sequence of 5, AA, 10 means that a byte with the value of 5 must be repeated 16 times (hex notation used)"
Avatar
norbi
Chipgyilok
Hozzászólások: 308
Csatlakozott: 2006. augusztus 3. csütörtök, 6:00

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

Köszi a segítséget, de ebből még nem tudom, hogy az eltárolt byte-okból miként tudom megjeleníteni a Bascomban a képet (természetesen akármilyen LCD-n).
Mert ha a Showpic(e)-t használom, ott van egy cimke, amire mutat, ezt kellene valahogy megoldani, hogy az én byte-tömbömre mutasson.

Vagy ez nem lenne elég?

A beépített BMP-BGF konvertert használtam eddig, de kellene egy küldő kis progi is, amivel lehet konvertálni, majd az igy átkonvertált képet tölteném a szerverre s erről akarom letölteni neten.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

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

X, Y koordianata az első 2 byte
Utána 6 vagy 8as csoportban az adatok amik a képernyőre Íródnak, egymás után...

Azaz a feléptés
XYDDDDDDDDDDDDDDDDDDDDDDD...

A képernyő X*Y méretű, és a DDDDD a simam memóriafeltöltési blokkot jelenti...

A ShowPic függvény:

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

[_ShowPicture]
$EXTERNAL _DIV8, _MUL8 , _GetByteFromROM_EPROM
; RLE encoded. When the data after the byte is AA, it means it is a repeating
; sequence and the byte after it hold the number of repeats
; AB, AC , AF,AA, EE means show AB,AC and AF EE times
; needs more code but needs less picture data!
; show a picture with ShowPic x,y , label
; y+2 holds X, y+1 holds Y , y+0 holds EPROM/ROM flag, Z points to picture data
; The calling code uses for example
; clr r20
; clr r21
; st -y,r20      this way it will be referred to with  y+4
; st -y,r21                   and                      y+3

; ldi zl,low(plaatje * 2)        to point to picture data
; ldi zh,high(plaatje * 2)
_ShowPicture:
 CLR R1 ; repeats
 CLR R2 ; char to repeat
 clr r3 ; temp register
 ld r23,y+                        ; 255 means get from EEPROM, 0 means get from flash
 call _GetByteFromROM             ; get height of picture in pixels
 St -y,r0                         ; y+2
 call _GetByteFromROM             ; get width of picture in pixels
 mov r16,r0
* ldi r20,_GLCD_MODE               ; 8 bits in byte
 call _Div8
 st -y,r16                        ; number of cols into  y+1
 st -y,r16                        ; number of cols into  y+0

 ldd r16,y+4                       ; get X pos
* ldi r20,_GLCD_MODE
 call _Div8                       ; correct
 std y+4,r16                       ; save column
_ShowPicture1:
 ldd r16,y+3                       ; get Y
* ldi r20,_GLCD_COLS               ; 30 cols
 call _Mul8                       ; b MSb  a LSB
 ldd r24,y+4
 Add r20,r24                      ; add X
 Clr r24
 Adc R21,r24
 subi r20,-0                      ; add graph base address
 sbci r21,-3
 Rcall _set_address               ; Point To Right Position
_ShowPicture2:
;  Clr r24
;  rcall _Gwrite_data
; *** New RLE encoding routine ***
  cp r1,r3                        ; is repeats 0 ?
  brne _ShowPicture8              ; no
  call _GetByteFromROM            ; get next char
  mov r2,r0                       ; save char
  mov r24,r0
  cpi r24,&HAA                    ; test for repeat char must always be shown
  breq _ShowPicture9              ; we need to show AA
  call _GetByteFromROM            ; is it RLE?
  mov r24,r0
  cpi r24,&HAA                    ; is it a RLE encoded char?
  breq _ShowPicture10             ; yes
  sbiw R30,1                      ; no readjust pointer to graphic data

#IF _ROMSIZE>65536
  brcc _ShowPicture2c   ; when not skipping the boundery
*  In r24, RAMPZ
  Dec R24
*  Out RAMPZ, R24
_ShowPicture2c:
#ENDIF
  rjmp _ShowPicture11             ; show it

_ShowPicture9:
  adiw r30,1
#IF _ROMSIZE>65536
  brcc _ShowPicture9c   ; when not skipping the boundery
*  In r24, RAMPZ
  Inc R24
*  Out RAMPZ, R24
_ShowPicture9c:
 #ENDIF

  rjmp _ShowPicture11
_ShowPicture8:
  ;we are repeating
  dec r1                          ; adjust repeat counter
  breq _showpicture2
  rjmp _ShowPicture11             ; show it
_ShowPicture10:
  call _GetByteFromROM            ; get number of repeats

  Mov r24,r0                      ;
  Tst r24                         ; is it zero
  Brne _showpicture15             ; no it isa RLE sequence
  Sbiw r30,2                      ; it is char AA we needto show
#IF _ROMSIZE>65536
  brcc _ShowPicture10c   ; when not skipping the boundery
*  In r24, RAMPZ
  Dec R24
*  Out RAMPZ, R24
_ShowPicture10c:
#ENDIF

  Rjmp _showpicture11             ; skip some code
_showpicture15:
  mov r1,r0                       ; save number of repeats
_ShowPicture11:
  Clr r24
  rcall _Gwrite_data

  mov r24,r2
; *** end of RLE code ***
  rcall _Gwrite_Data
  ldi r24,&HC0
  rcall _Gwrite_Cmd               ; advance pointer
  ldd r24,y+1                      ; get column counter
  dec r24
  std y+1,r24                      ; save col counter
  brne _ShowPicture2              ; for all columns

  ldd r24,y+0                      ; get num of cols
  std y+1,r24                      ; save for the new row
  ldd r24,y+2                      ; get row counter
  dec r24
  std y+2,r24
  brne _ShowPicture3              ; for all rows
  adiw r28,5                      ; adjust soft stack
  Ret
_ShowPicture3:
  ldd r24,y+3                      ; get row counter
  inc r24                         ; advance
  std y+3,r24
  rjmp _ShowPicture1
[END]
3 külső függvényed van: getbyteEPROM, DIV8 és MUL8
Avatar
norbi
Chipgyilok
Hozzászólások: 308
Csatlakozott: 2006. augusztus 3. csütörtök, 6:00

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

Szóval akkor ha megkapom az adatokat, akkor az x-y adatoknak megfelően kiküldöm az LCD-nek?

Vagyis, ha 128x64-es LCD-m van, akkor a koordináták után az első 128byte az első sor, a 2. 128byte a 2.sor,s így tovább?

De akkor vajon az is megoldható a Bascomban, hogy a Showpic(e) cimke arra a cimre mutasson, ahol kezdődnek az adatok? S akkor nem kell foglalkozni semmivel...holnap még megnézem azt a függvényt, ha hazérek!
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

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

Igen. Valahogy így... A RLE kódolás is kihagyható - elvileg.
Amúgy valahol összefutottam olyan megoldással, hogy nem a drága Flash helyet hazsnálod, hanem a külső I2C eeprom-ot!
Itt ugye a kezdőcím állítható. és ha azt mondod, hogy neszen cseéljük ki a képet, így sokkal egyszerűbb....
24LC1025-s chip esetén 128kByte van a külső memóriában. Ha egy kép csak 2K akkor is 64 darabod van! :)

Ha meg van SD kártya, akkor gyorsan kezelhető, és lehet mozizni is vele :)
Avatar
norbi
Chipgyilok
Hozzászólások: 308
Csatlakozott: 2006. augusztus 3. csütörtök, 6:00

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

Hogy érted, hogy elhagyható az RLE kódolás?

Ha BGF-et kezelek, akkor alapból kódolja a BMP-BGF konverter, nem?

24LC1025- van a hw-en, de abbol 124K már foglalt a szoftvernek (a 4k bootloader miatt csak 124), 128byte konfig beállításoknak van fenttarva, így marad több, mint 3K képnek, így azért már csak 3-4kép fér el, de nekem ennyi elég is lenne, nem akarokvieót, azt majd szines LCD-n s valami AVR32-n... :P
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

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

2 db 24LC1025?
8 db címezhető. ha mást nem emeletesíted őket:). Csak az A vonalat kell átkötni másképp (1 szál plusz drót....)
Avatar
norbi
Chipgyilok
Hozzászólások: 308
Csatlakozott: 2006. augusztus 3. csütörtök, 6:00

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

Régebb csináltam ilyet valami TTL IC-vel is.... :P

Már tervben van dataflash alkalmazása, csak a mostani panelokon már ez van, ezt kell használni.

Így azért egy chippel kitolódna több megára... :wink:

De, hogy is értetted, hogy elhagyható a kódolás?
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

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

Ha az adat nincs RLE kódolva, azt hiszem az is működik. Azaz a natív bíthalmot kell sorba behányni... :)
Avatar
norbi
Chipgyilok
Hozzászólások: 308
Csatlakozott: 2006. augusztus 3. csütörtök, 6:00

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

Megnéztem az RLE kódolást, nagyon egyszerű tényleg, de biztosan kell ezzel foglalkozni?

Vagyis adott a Showpic függvény, ami egy cimkéről olvassa be a képet (ami ugyebár a RLE kódolt BGF), tehát nekem csak ahhoz a cimkéhez kellene tenni a ketöltött byte-oket.
Valahogy így:

Showpic 0,0,bgf_teszt

bgf_teszt: 'Itt lenne eredetileg a $bgf "bgf_teszt.bgf"
'adatok
return 'eredetileg nincs itt a return, de teszik a Bascomnak így is

A fordító nem dob ki rá hibát, működhet ez így?

Mert ha a másik verziót választam (ami szebb lenne), akkor e letöltött adatokat kikódolnám, és az X és Y koordinátáknak megfelelően csak kiküldeném, de a kérdés, hogy hogyan oldjam meg a kiküldést?
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

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

A Showpic ASM részeit felhasználhatod Te is nyugodtan...
Nálam a karakteres LCD I2Cre volt így megoldva....
Avatar
norbi
Chipgyilok
Hozzászólások: 308
Csatlakozott: 2006. augusztus 3. csütörtök, 6:00

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

nem igazán értem, hogy az általad beillesztett kódban mire szolgál a sokféle
_ShowPicture cimke? Mért van abbol több?

Már látom, ugrál ide-oda a program...

Kipróbáltam úgy, ahogy az előbb írtam a példában, és valami memória szemétből lett kép, vagyis működhet így, hogy a cimke az adatokra mutat és nem is kell piszkálni a függvényt.

De, hogy mutasson a cimke aza adatokra? :lol:
Válasz küldése