Elektronik / Mikrodenetleyici Projeleri/

I2C Eeprom kullanarak 128X64 GLCD’ye Resim Basma

Merhaba Arkadaşlar.

Bu aralar Uğraştığım I2C eepromlarlar Resim Basma uygulamamı toparlayıp sizlere sunmak istiyorum.

Aslında I2C eepromlar (24C16, 24C32, 24C64, 24C128) bu işte biraz yavaş kalıyorlar. Gerçekte görüntünün tamamının ekrana basılması tahminimce 300-400 ms Sürüyor. Resim Basılmasını göz görebiliyor. (Yani Birden Ekranda Belirmiyor).

Kullandığım İşlemci PIC18F452, 20Mhz de çalıştırıyorum. İşlemci Frekansını Yükseltmem bi sonuç Vermedi. 32 Ve 40 Mhz de denedim böyle olunca eepromdan okunan Resim Dataları bozulmaya başlıyor. Kısacası Sapıtıyor :D

Eğer PC yazılım dillerinden birini bilseydim Resimleri Bin dosyası olarak kaydedip Direk Pickit2 İle eeproma yükleyebilirdim. Fakat Böyle bir imkanım olmadığı İçin FxDev ‘in de Tavsiyesi ile Bu işi De Pice yaptırdım. :D

Toplamda 28 Tane Resim gösterdim GLCD de Resimleri 3 adet 24C64 ve 1 adette 24C32 ye yazdım. Eeprom Sayısı arttırılarak veya Daha yüksek Hafızalı eepromlar kullanılarak Dahada Fazla resim gösterilebilir. Fakat Eepromları Resim datalarıyla doldurmak için Resimleri 18F452 nin program hafızasına yüklemek gerekiyor. 18F452 ‘nin içine 28 Tane Resim sığdırabildim. Zaten işlemcinin Hafızasının doluluk oranı %99,16 :D Ağzına kadar dolu..

Daha çok Resim istiyorsanız İlk Önce Eepromları programlamak için Daha yüksek Hafızalı Bir pic seçilebilir. Okumak için ise 16F877 bile yeter.

Ben ilk Başta 18F452 ye Eeproma yükleme yazılımını yükleyip, eepromları programlıyordum. Yükleme işlemi bitince 18452 ye okuma yazılımını yükleyip, eepromdan dataları okuyup GLCD ye postalıyordum :D

Yükleme işlemi epeyce sürüyor. Kronometreyle ölçtüğümde yaklaşık 10dk da tüm resimleri yazmış oldu.

Devre şeması aşağıdaki gibidir

pic18f452-glcd-bitmap-128x64

Resime bakarsanız 3 adet 24C64 ve 1 adette 24C32 kullanmışım. Eepromaların A0, A1, A2 Bacaklarını kullanarak Farklı farklı adresledim. Bu sayede tekbir Hattan tüm eepromalara veri yükleyip okuyabildim. Yine Resimlere Bakarsanız Eepromlara ait Yazma ve okuma adreslerini görebilirsiniz.

Yazma işlemi bu şekilde

glcd-data-adres-00-ic2

Buda yazma işleminin bitmiş hali

fastlcd-yazma-islemi-bitti-pic18f452-eeprom

Bunları Gerçekte çekmek isterdim ama fotoğraf makinamın makro özelliği berbat. Yazılar iç içe giriyor.

Resimleri Düzenlemek İçin FastLCD Programını kullandım. Bu program ile resimleri düzenleyip Bitmap olarak kaydediyorum. Sonra Pixelv1.2 programı ile Bu resim dosyalarını .inc dosyası haline getiriyorum. Yazılımda ise bu .inc dosyalarını programa dahil edip yazma sırsı geldiğinde sırasıyla dataları okuyup eeproma yazıyorum.

Eepromları programlamak için hazırladığım yazılım;


Device 18F452

Config_Start
   OSC = HS ; HS osc
   OSCS = OFF ; Disabled
   PWRT = On ; Enabled
   BOR = OFF ; Disabled
   WDT = OFF ; Disabled
   STVR = OFF ; Disabled
   LVP = OFF ; Disabled
   Debug = OFF ; Disabled
Config_End

Xtal 20

TRISA=%00000000
TRISB=%00000000
TRISC=%00000000
TRISD=%00000000
TRISE=%00000000

PORTA=0:PORTB=0
PORTC=0:PORTD=0
    PORTE=0

PORTB.5=1                          'GLCD RESET=1
All_Digital= TRUE                  'ADC PORTLARININ TAMAMI DİJİTAL GİRİŞ VEYA ÇIKIŞ
LCD_DTPort = PORTD                 'GLCD DATA PORTLARI PORTD'YE BAĞLI
LCD_RSPin = PORTB.0                'GLCD RS PİNİ PORTB.0 BAĞLI
LCD_ENPin = PORTB.2                'GLCD ENABLE PİNİ PORTB.2 BAĞLI
LCD_RWPin = PORTB.1                'GLCD RW PİNİ PORTB.1 BAĞLI
LCD_CS1Pin = PORTB.4               'GLCD CS1 PİNİ PORTB.4 BAĞLI
LCD_CS2Pin = PORTB.3               'GLCD CS2 PİNİ PORTB.3 BAĞLI
LCD_Type =  Samsung                'GLCD TİPİ GRAFİK KS0108 128*64B WİNSTAR
Declare Internal_Font = On
Declare Font_Addr = 0
Declare GLCD_STROBE_DELAY = 5
Declare Optimiser_Level 3
;GLCD_EXTERNAL_PRINT = PPRINT

    Declare SCL_Pin	= PORTC.3
    Declare SDA_Pin	= PORTC.4
    Declare Slow_Bus On 
    
    Symbol WRITE_LED=PORTB.7

Dim ADDR     As Word
Dim ADRS     As Word
Dim YPOS     As Byte
Dim XPOS     As Byte
Dim CHAR     As Byte
Dim KONT     As Byte
Dim RESIM      As Byte
Cls
Print At 1,1,"LUTFEN BEKLEYiNiZ"
Print At 2,1,"KAYDEDiliYOR..." 
DelayMS 100
BASLA:WRITE_LED=1
KONT=$A0:RESIM=1
For ADDR = 0 To 1023
  CHAR = CRead RESIM1+ADDR
  ADRS=ADDR:GoSub I2C_YAZ
Next
RESIM=2
For ADDR=0 To 1023
  CHAR = CRead RESIM2+ADDR
  ADRS=1024+ADDR:GoSub I2C_YAZ
Next
RESIM=3
For ADDR = 0 To 1023
  CHAR = CRead RESIM3+ADDR
  ADRS=2048+ADDR:GoSub I2C_YAZ
Next
RESIM=4
For ADDR = 0 To 1023
  CHAR = CRead RESIM4+ADDR
  ADRS=3072+ADDR:GoSub I2C_YAZ
Next
RESIM=5
For ADDR = 0 To 1023
  CHAR = CRead RESIM5+ADDR
  ADRS=4096+ADDR:GoSub I2C_YAZ
Next
RESIM=6
For ADDR = 0 To 1023
  CHAR = CRead RESIM6+ADDR
  ADRS=5120+ADDR:GoSub I2C_YAZ
Next
RESIM=7
For ADDR = 0 To 1023
  CHAR = CRead RESIM7+ADDR
  ADRS=6144+ADDR:GoSub I2C_YAZ
Next
RESIM=8
For ADDR = 0 To 1023
  CHAR = CRead RESIM8+ADDR
  ADRS=7168+ADDR:GoSub I2C_YAZ
Next
KONT=$A2:RESIM=9
For ADDR = 0 To 1023
  CHAR = CRead RESIM9+ADDR
  ADRS=0+ADDR:GoSub I2C_YAZ
Next
RESIM=10
For ADDR = 0 To 1023
  CHAR = CRead RESIM10+ADDR
  ADRS=1024+ADDR:GoSub I2C_YAZ
Next
RESIM=11
For ADDR = 0 To 1023
  CHAR = CRead RESIM11+ADDR
  ADRS=2048+ADDR:GoSub I2C_YAZ
Next
RESIM=12
For ADDR = 0 To 1023
  CHAR = CRead RESIM12+ADDR
  ADRS=3072+ADDR:GoSub I2C_YAZ
Next
RESIM=13
For ADDR = 0 To 1023
  CHAR = CRead RESIM13+ADDR
  ADRS=4096+ADDR:GoSub I2C_YAZ
Next
RESIM=14
For ADDR = 0 To 1023
  CHAR = CRead RESIM14+ADDR
  ADRS=5120+ADDR:GoSub I2C_YAZ
Next
RESIM=15
For ADDR = 0 To 1023
  CHAR = CRead RESIM15+ADDR
  ADRS=6144+ADDR:GoSub I2C_YAZ
Next
RESIM=16
For ADDR = 0 To 1023
  CHAR = CRead RESIM16+ADDR
  ADRS=7168+ADDR:GoSub I2C_YAZ
Next
KONT=$A4:RESIM=17
For ADDR = 0 To 1023
  CHAR = CRead RESIM17+ADDR
  ADRS=0+ADDR:GoSub I2C_YAZ
Next
RESIM=18
For ADDR = 0 To 1023
  CHAR = CRead RESIM18+ADDR
  ADRS=1024+ADDR:GoSub I2C_YAZ
Next
RESIM=19
For ADDR = 0 To 1023
  CHAR = CRead RESIM19+ADDR
  ADRS=2048+ADDR:GoSub I2C_YAZ
Next
RESIM=20
For ADDR = 0 To 1023
  CHAR = CRead RESIM20+ADDR
  ADRS=3072+ADDR:GoSub I2C_YAZ
Next
RESIM=21
For ADDR = 0 To 1023
  CHAR = CRead RESIM21+ADDR
  ADRS=4096+ADDR:GoSub I2C_YAZ
Next
RESIM=22
For ADDR = 0 To 1023
  CHAR = CRead RESIM22+ADDR
  ADRS=5120+ADDR:GoSub I2C_YAZ
Next
RESIM=23
For ADDR = 0 To 1023
  CHAR = CRead RESIM23+ADDR
  ADRS=6144+ADDR:GoSub I2C_YAZ
Next
RESIM=24
For ADDR = 0 To 1023
  CHAR = CRead RESIM24+ADDR
  ADRS=7168+ADDR:GoSub I2C_YAZ
Next
KONT=$A6:RESIM=25
For ADDR = 0 To 1023
  CHAR = CRead RESIM25+ADDR
  ADRS=0+ADDR:GoSub I2C_YAZ
Next
RESIM=26
For ADDR = 0 To 1023
  CHAR = CRead RESIM26+ADDR
  ADRS=1024+ADDR:GoSub I2C_YAZ
Next
RESIM=27
For ADDR = 0 To 1023
  CHAR = CRead RESIM27+ADDR
  ADRS=2048+ADDR:GoSub I2C_YAZ
Next
RESIM=28
For ADDR = 0 To 1023
  CHAR = CRead RESIM28+ADDR
  ADRS=3072+ADDR:GoSub I2C_YAZ
Next
Cls
Print At 3,4,"YAZMA iSLEMi"
Print At 4,3,"TAMAMLANMISTIR.."
WRITE_LED=0
Stop

I2C_YAZ:
Print At 3,1,"DATA $",Hex2 CHAR
Print At 4,1,"ADRES = ",Dec4 ADRS
Print At 5,1,Dec RESIM,". RESIM YAZILIYOR"
Print At 6,1,"DEVICE ADRES = $",Hex2 KONT
BusOut KONT,ADRS,[CHAR]:DelayMS 10
Return

Include "RESIM1.inc"
Include "RESIM2.inc"
Include "RESIM3.inc"
Include "RESIM4.inc"
Include "RESIM5.inc"
Include "RESIM6.inc"
Include "RESIM7.inc"
Include "RESIM8.inc"
Include "RESIM9.inc"
Include "RESIM10.inc"
Include "RESIM11.inc"
Include "RESIM12.inc"
Include "RESIM13.inc"
Include "RESIM14.inc"
Include "RESIM15.inc"
Include "RESIM16.inc"
Include "RESIM17.inc"
Include "RESIM18.inc"
Include "RESIM19.inc"
Include "RESIM20.inc"
Include "RESIM21.inc"
Include "RESIM22.inc"
Include "RESIM23.inc"
Include "RESIM24.inc"
Include "RESIM25.inc"
Include "RESIM26.inc"
Include "RESIM27.inc"
Include "RESIM28.inc"
Include "FONT.inc"
End

Eepromaları okuma işlemi ise benzer bir şekilde oluyor. Her bir eeprom için her bir resmin bir başlangıç adresi vardır. Bir resim 1023 byten tan oluştuğu için okumalar Başlangıc adresi + resim data adresi şeklinde oluyor.

Eeprom okuma programı ise budur.


'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : FERHAT YOL                                        *
'*  Notice  : Copyright (c) 2011 KULUÇKA KONTROL CİHAZI         *
'*          : All Rights Reserved                               *
'*  Date    : 20.11.2011                                        *
'*  Version : 1.0                                               *
'*  Notes   : 4 adet eeprom kullanılmıştır.(3x26C64,1x24C32)    *
'*          : Toplamda 28adet resim ekranda gösteriliyor. Eeprom* 
'           : Sayısı arttırılarak Resim sayısı arttırılabilir.  *
'           : Resimler 4 farklı efektle ekranda gösterilir      *
'****************************************************************
Device 18F452

Config_Start
   OSC = HS ; HS osc
   OSCS = OFF ; Disabled
   PWRT = On ; Enabled
   BOR = OFF ; Disabled
   WDT = OFF ; Disabled
   STVR = OFF ; Disabled
   LVP = OFF ; Disabled
   Debug = OFF ; Disabled
Config_End

Xtal 20

TRISA=%00000000
TRISB=%00000000
TRISC=%00000000
TRISD=%00000000
TRISE=%00000000

PORTA=0:PORTB=0
PORTC=0:PORTD=0
    PORTE=0

PORTB.5=1                          'GLCD RESET=1
All_Digital= TRUE                  'ADC PORTLARININ TAMAMI DİJİTAL GİRİŞ VEYA ÇIKIŞ
LCD_DTPort = PORTD                 'GLCD DATA PORTLARI PORTD'YE BAĞLI
LCD_RSPin = PORTB.0                'GLCD RS PİNİ PORTB.0 BAĞLI
LCD_ENPin = PORTB.2                'GLCD ENABLE PİNİ PORTB.2 BAĞLI
LCD_RWPin = PORTB.1                'GLCD RW PİNİ PORTB.1 BAĞLI
LCD_CS1Pin = PORTB.4               'GLCD CS1 PİNİ PORTB.4 BAĞLI
LCD_CS2Pin = PORTB.3               'GLCD CS2 PİNİ PORTB.3 BAĞLI
LCD_Type =  Samsung                'GLCD TİPİ GRAFİK KS0108 128*64B WİNSTAR
Declare Internal_Font = On
Declare Font_Addr = 0
Declare GLCD_STROBE_DELAY = 5                                                                     
;GLCD_EXTERNAL_PRINT = PPRINT

    Declare SCL_Pin	= PORTC.3
    Declare SDA_Pin	= PORTC.4
    Declare Slow_Bus On 
    Declare Optimiser_Level 2  
    Symbol READ_LED=PORTB.6

Dim ADDR     As Word
Dim ADRS     As Word
Dim YPOS     As Byte
Dim XPOS     As Byte
Dim CHAR     As Byte
Dim KONT     As Byte
Dim X        As Byte

DelayMS 200
Cls
READ_LED=1   ;Okuma yapılıyor.
BASLA:

KONT=$A1     ;1. Eeprom seçildi(24C64)
  For X=0 To 7
    Select Case X
       Case 0
         ADRS=0:GoSub YATAY_D       ;1.Resmin Başlangıc adresi $0000h
       Case 1
         ADRS=1024:GoSub YATAY_T    ;2.Resmin Başlangıc adresi $0400h
       Case 2
         ADRS=2048:GoSub DIKEY_T    ;3.Resmin Başlangıc adresi $0800h
       Case 3
         ADRS=3072:GoSub DIKEY_D    ;4.Resmin Başlangıc adresi $0C00h
       Case 4
         ADRS=4096:GoSub YATAY_T    ;5.Resmin Başlangıc adresi $1000h
       Case 5
         ADRS=5120:GoSub YATAY_D    ;6.Resmin Başlangıc adresi $1400h
       Case 6
         ADRS=6144:GoSub DIKEY_D    ;7.Resmin Başlangıc adresi $1800h
       Case 7
         ADRS=7168:GoSub DIKEY_T    ;8.Resmin Başlangıc adresi $1C00h
    EndSelect
  DelayMS 1800    ;Resım arası bekleme süresi 
  Next
KONT=$A3          ;ikinci eprom seçildi(24C64)
  For X=0 To 7
    Select Case X
       Case 0
         ADRS=0:GoSub DIKEY_D        ;1.Resmin Başlangıc adresi $0000h
       Case 1
         ADRS=1024:GoSub YATAY_T     ;2.Resmin Başlangıc adresi $0400h
       Case 2
         ADRS=2048:GoSub DIKEY_T     ;3.Resmin Başlangıc adresi $0800h
       Case 3
         ADRS=3072:GoSub YATAY_D     ;4.Resmin Başlangıc adresi $0C00h
       Case 4
         ADRS=4096:GoSub YATAY_T     ;5.Resmin Başlangıc adresi $1000h
       Case 5
         ADRS=5120:GoSub DIKEY_D     ;6.Resmin Başlangıc adresi $1400h
       Case 6
         ADRS=6144:GoSub YATAY_D     ;7.Resmin Başlangıc adresi $1800h
       Case 7
         ADRS=7168:GoSub DIKEY_T     ;8.Resmin Başlangıc adresi $1C00h
    EndSelect
  DelayMS 1800    ;Resım arası bekleme süresi
  Next
KONT=$A5          ;3. Eeprom seçildi(24C64)
  For X=0 To 7
    Select Case X
       Case 0
         ADRS=0:GoSub DIKEY_D        ;1.Resmin Başlangıc adresi $0000h
       Case 1
         ADRS=1024:GoSub YATAY_D     ;2.Resmin Başlangıc adresi $0400h
       Case 2
         ADRS=2048:GoSub DIKEY_D     ;3.Resmin Başlangıc adresi $0800h
       Case 3
         ADRS=3072:GoSub YATAY_T     ;4.Resmin Başlangıc adresi $0C00h
       Case 4
         ADRS=4096:GoSub DIKEY_D     ;5.Resmin Başlangıc adresi $1000h
       Case 5
         ADRS=5120:GoSub DIKEY_T     ;6.Resmin Başlangıc adresi $1400h
       Case 6
         ADRS=6144:GoSub YATAY_D     ;7.Resmin Başlangıc adresi $1800h 
       Case 7
         ADRS=7168:GoSub DIKEY_T     ;8.Resmin Başlangıc adresi $1C00h
    EndSelect
  DelayMS 1800    ;Resım arası bekleme süresi
  Next
KONT=$A7          ;4.Eeprom seçildi(24C32)
  For X=0 To 3
    Select Case X
       Case 0
         ADRS=0:GoSub YATAY_T        ;1.Resmin Başlangıc adresi $0000h
       Case 1
         ADRS=1024:GoSub YATAY_D     ;2.Resmin Başlangıc adresi $0400h
       Case 2
         ADRS=2048:GoSub DIKEY_T     ;3.Resmin Başlangıc adresi $0800h
       Case 3
         ADRS=3072:GoSub YATAY_T     ;4.Resmin Başlangıc adresi $0C00h
    EndSelect
  DelayMS 1800    ;Resım arası bekleme süresi
  Next

GoTo BASLA

YATAY_D: ; Yukarıdan aşağıya doğru döşe
       For YPOS = 0 To 7
         For XPOS = 0 To 127
             ADDR = (Ypos*128)+XPOS
             ADDR = ADRS + ADDR
             GoSub I2C_OKU
             LCDWrite YPOS,XPOS,[CHAR]
         Next
       Next
Return

YATAY_T: ; Aşağıdan yukarıya doğru döşe
       For YPOS = 7 To 0 Step - 1
         For XPOS = 0 To 127
             ADDR = (Ypos*128)+XPOS
             ADDR = ADRS + ADDR
             GoSub I2C_OKU
             LCDWrite YPOS,XPOS,[CHAR]
         Next
       Next
Return

DIKEY_D:  ; Soldan Sağa doğru döşe
       For XPOS = 0 To 127
         For YPOS = 0 To 7
           ADDR = (Ypos*128)+XPOS
           ADDR = ADRS + ADDR
           GoSub I2C_OKU
           LCDWrite YPOS,XPOS,[CHAR]
         Next
       Next 
Return

DIKEY_T: ;Sağdan sola doğru Döşe
       For XPOS = 127 To 0 Step - 1 
         For YPOS = 0 To 7
           ADDR = (Ypos*128)+XPOS
           ADDR = ADRS + ADDR
           GoSub I2C_OKU
           LCDWrite YPOS,XPOS,[CHAR]
         Next
       Next 
Return

I2C_OKU:
   CHAR = BusIn KONT,ADDR  ;Eeprom oku
Return

End

Aslında menü uygulamaları için eeprom un yavaş çalışması sorun olabilir ama ben burada bu sorundan faydalandım biraz. Resimleri birkaç efektlerle basıyorum. (Sağdan sola, Soldan sağa, Yukarıdan aşağı gibi). Resim geçişleri bu şekilde oluyor.

Uygulamaya ait test videosu;

Video pekde iyi değil malesef. Artık idare edin :D

Devreyi denediği kit ise Expkits in EX8B2 (http://www.expkits.com/?s=ex8b2.htm) Deney setidir. Bu deney seti üzerinde deniyorum.

Seri birkaç tane eeprom olduğu için eeprom devresini board üzerine kurup deney seti ile header kablosu üzerinden bağlantıyı yaptım.

Artık Bu tip eepromlarla işim bitti Daha yüksek hızlı eepromlar alıp birkaç deneme daha yapacağım :)

I2C Eeprom kullanarak 128X64 GLCD’ye Resim Basma

Dosya indirme LINK listesi (TXT formatında) link-17993.zip şifre-pass: 320volt.com

  1. Fatih 2011/11/22
  2. Ferhat YOL 2011/11/23
  3. Fatih 2011/11/23
  4. Ferhat YOL 2011/11/23
  5. Ferhat YOL 2011/11/23
  6. Fatih 2011/11/24
  7. Fatih 2011/11/24
  8. Ferhat YOL 2011/11/25
  9. Fatih 2011/11/26
  10. Ferhat YOL 2011/11/26
  11. gokhan 2011/12/27
  12. Ferhat YOL 2011/12/27
  13. KAYA 2012/01/24
  14. Ferhat YOL 2012/01/24
  15. Emre Koşar 2013/02/18
  16. Pascal 2014/02/13

Yorum

Soru: