Resim Datalarını Eproma yükleme

Başlatan Mucit23, 12 Kasım 2011, 00:04:40

Pir-O


Mucit23

İlgilendiği için teşekkür ederim. Denemeye çalıştım fakat aklıma yatmaya bazı noktalar var yazdığınız programda.

    BStart 
    BusOut %10100000    'EPROM UN SLAVE ADRESİ YAZMA YAPILACAGINI BELIRTIYOR
    BusOut 0            'ADRESIN MSB BYTE I
    BusOut 4            'ADRESIN LSB BYTE I
    BusOut $AA
    DelayMS 10          '10 msn BEKLEME YAPMAK GEREKIYOR
    BStop Busuymuş
    DelayMS 10           'YAZMA İLE OKUMA ARASINDA 10 msn BEKLEME YAPMAK GEREKIYOR
    
    BStart 
    BusOut %10100000    'EPROM UN SLAVE ADRESİ YAZMA YAPILACAGINI BELIRTIYOR
    BusOut 0            'ADRESIN MSB BYTE I
    BusOut 4            'ADRESIN LSB BYTE I
    BREStart            'HAT YENIDEN BAŞLATILIYOR
    BusOut %10100001    'EPROM UN SLAVE ADRESI OKUMA YAPILACAĞI BELIRTILIYOR
    DEGER=BusIn
    BStop


Burada Adresleme nasıl oluyor anlayamadım. Diyelimki 10. adrese $FE yazmak istiyorsak ;
    BusOut 0            'ADRESIN MSB BYTE I
    BusOut 4            'ADRESIN LSB BYTE I
Buradaki kısımlar nasıl değişecek.

Bu yukarıda veri yazmak için yapılanların hepsini veri yazarken BusOut $A0,Adres,[Veri] komutu yapmıyormu öğrenmek isterim.

Ben yine Bazı denemeler yaptım. Anladığım üzere denemelerimde I2C hiç işlemiyor zaten. Bunu çözemiyorum.  PK2 ile farklı değerler yazıp okuyabiliyorum. Hiçbir sorun çıkmıyor.  Ama nedense Pic ile yazmada sorun yaşıyorum. Bilgisi olan arkadaşlardan yardım bekiyorum.

Birde şu gözüme çarptı.Proton, MSSP portu olmaya picler için PicBasicdeki gibi I2CiN ve I2COUT komutlarının kullanımına help dosyasında örnek vermiş. Ben bunu denemek istiyorum fakat I2COUT ve I2CiN komutlarını yazınca komutlar koyu hale gelmiyor. Yani Aktifleşmiyor. Ben bu komutları nasıl kullanabilirim.

Pir-O

Adresleme şöyle oluyor: epromun datasheetine göre 0 il3 8191 arasında adresleme var yani $0000 ile $1FFF arasında oluyor. Diyelim ki 800. adrese $FE değerini yazmak istiyoruz o zaman 800. adres 16'lık tabanda $0320 oluyor. Adres bilgisi 2 parçada gönderiliyor şu şekilde:

BusOut $03            'ADRESIN MSB BYTE I
BusOut $20            'ADRESIN LSB BYTE I


Yada diyelim 10. adrese veri yazmak istiyorsak o zaman 10. adres 16'lık tabanda $000A oluyor ve şu şekilde yazılıyor:

BusOut $00            'ADRESIN MSB BYTE I
BusOut $0A            'ADRESIN LSB BYTE I


Ben de ilk önce BusOut $A0,Adres,[Veri] komutunu denedim ama proteusta programı adım adım çalıştırınca eproma veri yazmadığını gördüm Help'i biraz karıştırınca size gönderdiğim kod şeklinde bir örnek yapmışlardı ve bu şekilde yazınca çalıştı.


Okan AKÇA

int i;
   
   for(i=0;i<(resim data uzunlugu);i++)  (write_eeprom(i,resim_data);

   

C yi seviyorum

Mucit23

Alıntı yapılan: Pir-O - 15 Kasım 2011, 08:51:19
Adresleme şöyle oluyor: epromun datasheetine göre 0 il3 8191 arasında adresleme var yani $0000 ile $1FFF arasında oluyor. Diyelim ki 800. adrese $FE değerini yazmak istiyoruz o zaman 800. adres 16'lık tabanda $0320 oluyor. Adres bilgisi 2 parçada gönderiliyor şu şekilde:

BusOut $03            'ADRESIN MSB BYTE I
BusOut $20            'ADRESIN LSB BYTE I


Yada diyelim 10. adrese veri yazmak istiyorsak o zaman 10. adres 16'lık tabanda $000A oluyor ve şu şekilde yazılıyor:

BusOut $00            'ADRESIN MSB BYTE I
BusOut $0A            'ADRESIN LSB BYTE I


Ben de ilk önce BusOut $A0,Adres,[Veri] komutunu denedim ama proteusta programı adım adım çalıştırınca eproma veri yazmadığını gördüm Help'i biraz karıştırınca size gönderdiğim kod şeklinde bir örnek yapmışlardı ve bu şekilde yazınca çalıştı.

Adresleme işini anladım. hafıza 512K bile olsa 256 256 bölünerek adresleniyor. Sanırım Busout kont,adres,[veri] komutu ise bu işi otomatik yapıyor. Birazdaha uğraşayım. Çözemem lazım bu işi

Mucit23

#35
Kafayı yemek üzereyim. Hiçbir uğraşım sonuç vermiyor. Eeproma ne veri yazabiliyorum nede okuyabiliyorum. Başka önerisi olan varmı. Denemediğim yol çare kalmadı desem yeridir..


---------------------------


Anlamadığım nokta hem Busout kont,adres,[veri] komutu hemde diğer Pir-O arkadaşımızın önerdiği yöntemin ikiside isiste çok iyi çalışıyor. Ama gerçek ortamda hiçbir hayat işareti yok. Sırasıyla yazıyor görünüyor ama iş okuma kısmına gelince koskoca bir sfır görüyorum . Yani hiçbirşey okunmuyor yada sıfır okunuyor...

Mucit23

Başka çözüm önerisi olan varmı?

Mucit23

Arkadaşlar sonunda başardım. İlk Başlarda Eepromla iletişimde biraz sıkıntı yaşadım ama sabırla hepsini çözdüm.
FxDev hocamızın dediği gibi yaptım. Resim datalarını pic ile eeproma yükleyip okudum. Sonra GLCD ye bastımdataları.  Fakat ufak bir problem var. I2C iletişimi biraz yavaş kalıyorki Ekrana datalar basılırken gözle görülür bir gecikme yaşanıyor. Daha doğrusu Resim birden ekranda belirmiyor. Yukarıdan aşağıya doğru basıldığı için göz dataların glcd ye basılma anını yukarıdan aşağıya doğru görüyor.

Datalar eeproma yüklü Sadece okuma yapıp GLCD ye basıyorum.
Deneme programı budur.
Device 18F452

Config_Start
   OSC = HS ; HS
   OSCS = OFF ; Disabled
   PWRT = On ; Enabled
   BOR = OFF ; Disabled
   WDT = OFF ; Disabled
   CCP2MUX = OFF ; Disable (RB3)
   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

Dim XPOS As Byte
Dim YPOS As Byte
Dim setclear As Byte
Dim addr As Word
Dim char As Byte
Dim X    As Byte
  Clear
    DelayMS 100
    Cls
    BASLA:
;           For addr=0 To 1023
;             chAR=CRead zmn+ADDR
;             BusOut $A0,ADDR,[CHAR]:DelayMS 10
;           Next
         For YPOS = 0 To 7
         For XPOS = X To 127
             addr = (Ypos*128)+XPOS
             char =BusIn $A1,addr
             LCDWrite YPOS,XPOS,[char]
         Next
     Next
Stop
Include "ZMN.inc"


Daha yüksek hızlara çıkabilirmiyim.

Murat Mert

mert07

Okan AKÇA

hocam bi yardım ediverin arkadaşlara

Mucit23

Hocam haberleşme hızı Max 400KHZ oluyor sanırım. Proton 8 MHz ve üzeri clock frekanslarında DECLARE SLOW_BUS ON  komutunu kullanın diyor. Clock Frekansım 20Mhz nin üzerine çıkartmak istemiyorum. Bunun dışında yapabileceğim bişey varmıdır.

Mucit23

40Mhz den zaten DECLARE SLOW_BUS ON  bu komutta yeterli gelmiyor. Gelen datalar bozuluyor.

Mucit23

   Hocam Dediğiniz gibi olabilir. Ancak farklı bir durum var. 4-5 Resimli Bir menümüz olsun. Butonlarla Bu menüler Arası Geçiş yapılıyor. Ramdan 1023 Byte Bu iş için ayıralım. Her bir geçişte dataları eepromdan oku Ram'e yerleştir, Sonra Ramdan okuyup hızlı bir şekilde ekrana bas. Mantıklı olabilir fakat Menüler arası geçiş butonlarına bastığımızda Datalar eepromdan okunup ram'e yerleştiriline kadar Dünyanın zamanı geçer. Gerçekten Sorun olabilir.

   Aslında şimdi Benim aklıma SD kart Geldi. Eğer SD kartı SD modunda kullanabilirsem Süper hızlı bir şekilde Dataları okuyup ekrana basabilirdim. Fakat SD kartı SD modunda nasıl eeprom gibi kullanacağımı bilmiyorum. Bu çözüm olabilirmiydi sizce..

Mucit23

Alıntı yapılan: FxDev - 17 Kasım 2011, 22:40:13
4MHz destekleniyor diye biliyordum I2C'de. Ben olsam şöyle yapardım, resmi önce EEPROM'dan PIC'e geçici depolardım, sonra PIC'den basardım. Direk EEPROM'dan alıp basmak yerine.
Biraz daha uğraşırsan dünyanın ilk 8 bit ekran kartını icat edersin böyle :)

Hocam 4Mhz Dediğiniz Pic OSC frekansımı Yoksa I2C clock frekansımı?

ErsinErce

EEPromlarda burst(sequential) read ve burst(page) write modları var, yeterli bir bufferı bu modlarla kullanarak hızlı geçiş sağlayabilirsin
eepromlar max 1mhz e çıkabiliyor