EEPROM Kopyalamada zaman sıkıntısı

Başlatan gogoce, 06 Şubat 2014, 19:11:39

gogoce

Merhaba sayın ustatlar arkadaşlar,

işyerinde kullanacak olduğum bir eeprom kopyalayıcı yaptım .  Fakat kopyalama konusunda zaman sıkıntım var . Orjinal cihazda 2 adet 25c256 bulunmakta . Pcb üzerinde bu eepromlar adreslenmiş . Benim cihazımda da aynı şekilde eepromlar a0 a1 a2 uçlarında adreslendi .
Zaten toplam 2 eeprom var .


programın eepromu kopyalama kısmı şu



A=0
For A=0 To 32767
GoSub HESAPLA
Print $FE,$80,"LCD DEN OKU   ",# VOLT,",",# Mvolt,"V"
Print $FE,$C0,"DATA 1 E KAYIT...   "
I2CIN SDA_ORJINAL,SCL_ORJINAL,%10100001,A,[TEMP] ;1. eeprom ;CONTROL BYTE %.....AAX X=1 READ X=0 WRITE   AA=00 1.EEPROM AA=01 2. EEPROM
DelayMS 6
I2COUT SDA1,SCL1,%10100000,A,[TEMP] ;1. eeprom
Print $FE,$D4,# SAYAC,"/65534              "
SAYAC=SAYAC+1
Next
A=0
For A=0 To 32767
I2CIN SDA_ORJINAL,SCL_ORJINAL,%10100010,A,[TEMP] ;2. eeprom
DelayUS 6
I2COUT  SDA1,SCL1,%10100011,A,[TEMP] ;2. eeprom
Print $FE,$D4,# SAYAC,"/65534              "
SAYAC=SAYAC+1
Next


bu şekilde yaptığım zaman yaklaşık 5-6 dakikada eeprom kopyalanıyor . Pic olarak 16f877 kullanıyorum . 4MHZ de çalıştırıyorum . Programı proton ile yazdım .

Atmel in PDF inde 24c256 için eğer yanlış anlamadıysam 1Mhz de çalıştırabiliyiyoruz



Yanlış mı anladım uygulamada mı bir hatam var yoksa ben mi tezcanlıyım . Bu işin süresi hakikatten bukadar mı yoksa hızlandırabilir miyim?
Ne ukalayı affederim nede yapılan haksızlığı ...
Ya sus adam sansınlar , yada adam gibi kouş ilham alsınlar

ete

Ya 25C256 diye yazdığın eprom ismi yanlış yada sen yanlış okudun. Zira programda I2C komutlarını kullanmışsın ama data sheet onunbir SPI eprom olduğunu söylüyor.

Epromu tekrar kontrol edip isimlerinin doğruluğunu onaylarmısın.

Ete


gogoce

Hocam kopyalamak istediğim cihazda 24c256 lar smd . benim devremde 24c256 lar dip kilifta . Cok datasjeet kurcaladim belki yanlis datasheet atmış olabilirim hata yaptıysam özür dilerim hocam
Ne ukalayı affederim nede yapılan haksızlığı ...
Ya sus adam sansınlar , yada adam gibi kouş ilham alsınlar

gogoce

Ilk mesajimda 25c256 yazmisim hocam pardon dogrusu 24c256 olacak
Ne ukalayı affederim nede yapılan haksızlığı ...
Ya sus adam sansınlar , yada adam gibi kouş ilham alsınlar

ete

Eproma yazdığın her byte değerini ekrana da yazıp görmek istersen uzun sürmesi kaçınılmaz.
HIzlı kopyalama yapmanın yolu "page write " özelliğini kullanmaktan geçer. I2C işleminde yazılan her byte dan sonra işlemci stop işlemi uygular.  Bu byte yazma da uygulanan sistemdir. Ama yazılan her byte dan sonra tekrar bir byte yazılırsa işlemci stop işlemi uygulamaz Bu 64 byte kadar sürer ve 64 byte sonunda stop işlemi uygulanır. Buna Sayfa yazma deniliyor.
Bu şekilde yazma yapılırsa işlem çok hızlı yürür.
Mümkün olduğu kadar ekrana yazdırma işleminden de kaçınman gerekiyor. Zaten o kadarlık kısa zamanda ne göreceksin ki?
Madem göremeyeceksin o halde hiç bir şey görem bırak hepsini yazıp bitirsin.
32768 byte lık boyutu 64 lük parçalara (sayfalara) bölersek 512 sayfa eder.
O halde yapılacak işlem şudur;

OKUNAN VAR BYTE[64]
FOR I=0 to 511 step 64
  I2CIN SDA_ORJINAL,SCL_ORJINAL,%10100001,I.byte1,I.byte0,[OKUNAN[0],OKUNAN[1],......OKUNAN[63]]
  I2COUT SDA1,SCL1,%10100000,I.Byte1,I.Byte1,[OKUNAN[0],OKUNAN[1]...........,OKUNAN[63]]
  PAUSE 10
next

BU şekilde epromu hızlı bir şekilde kopyalayacağını düşünüyorum.
Bu sistemi daha önce denemedim. yalnızca Data sheet den okuyarak ve mantığımı kullanarak öneride bulunuyorum.
Aksaklık varsa yeniden değerlendirip düşünmek gerekebilir.

Ete




gogoce

Tamam hocam en kısa zamanda deneyip haber vereceğim teşekkür ederim
Ne ukalayı affederim nede yapılan haksızlığı ...
Ya sus adam sansınlar , yada adam gibi kouş ilham alsınlar

gogoce

Hocam sanırım komutlar üzerinde çalışmamız gerekecek . Sürekli hata alıyorum compile yapamıyorum
Ne ukalayı affederim nede yapılan haksızlığı ...
Ya sus adam sansınlar , yada adam gibi kouş ilham alsınlar

gogoce

trisa=0
trisb=255
adcon1=7
OKUNAN VAR BYTE[64]
I VAR WORD
I=0
FOR I=0 to 511 step 64
  I2CIN PORTA.0,PORTA.1,%10100001,I,[OKUNAN[0],OKUNAN[1],OKUNAN[2]]
  I2COUT PORTA.2,PORTA.3,%10100000,I,[OKUNAN[0],OKUNAN[1],OKUNAN[2]
  PAUSE 10
next
END


en basitinden böyle bişey yaptım hocam ama ne yaptıysam olmadı


hata i2cin ve i2cout komut satırlarında

syntax error hata bu :(
Ne ukalayı affederim nede yapılan haksızlığı ...
Ya sus adam sansınlar , yada adam gibi kouş ilham alsınlar

ete

I2COUT satırında en sonda köşeli parantez eksik. Bu kadarını görebilmen gerekir.
İLk komut o adresten 64 adet okuma yaması gerekir. Deneme için bile olsa 3 adet byte okuması yaptırmaman gerekir.
Yazarkende 64 byte yazacak şekildekomut yerleştirmen daha doğru olurdu.

Ete

gogoce

trisa=0
trisb=255
adcon1=7
OKUNAN VAR BYTE[64]
I VAR WORD
I=0
FOR I=0 to 511 step 64
  I2CIN PORTA.0,PORTA.1,%10100001,I,[OKUNAN[0],OKUNAN[1],OKUNAN[2],OKUNAN[3],OKUNAN[4],OKUNAN[5],OKUNAN[6],OKUNAN[7],OKUNAN[8],OKUNAN[9],OKUNAN[10],OKUNAN[11],OKUNAN[12],OKUNAN[13],OKUNAN[14],OKUNAN[15],OKUNAN[16],OKUNAN[17],OKUNAN[18],OKUNAN[19],OKUNAN[20],OKUNAN[21],OKUNAN[22],OKUNAN[23],OKUNAN[24],OKUNAN[25],OKUNAN[26],OKUNAN[27],OKUNAN[28],OKUNAN[29],OKUNAN[30],OKUNAN[31],OKUNAN[32],OKUNAN[33],OKUNAN[34],OKUNAN[35],OKUNAN[36],OKUNAN[37],OKUNAN[38],OKUNAN[39],OKUNAN[40],OKUNAN[41],OKUNAN[42],OKUNAN[43],OKUNAN[44],OKUNAN[45],OKUNAN[46],OKUNAN[47],OKUNAN[48],OKUNAN[49],OKUNAN[50],OKUNAN[51],OKUNAN[52],OKUNAN[53],OKUNAN[54],OKUNAN[55],OKUNAN[56],OKUNAN[57],OKUNAN[58],OKUNAN[59],OKUNAN[60],OKUNAN[61],OKUNAN[62],OKUNAN[63]]
  I2COUT PORTA.2,PORTA.3,%10100000,I,[OKUNAN[0],OKUNAN[1],OKUNAN[2],OKUNAN[3],OKUNAN[4],OKUNAN[5],OKUNAN[6],OKUNAN[7],OKUNAN[8],OKUNAN[9],OKUNAN[10],OKUNAN[11],OKUNAN[12],OKUNAN[13],OKUNAN[14],OKUNAN[15],OKUNAN[16],OKUNAN[17],OKUNAN[18],OKUNAN[19],OKUNAN[20],OKUNAN[21],OKUNAN[22],OKUNAN[23],OKUNAN[24],OKUNAN[25],OKUNAN[26],OKUNAN[27],OKUNAN[28],OKUNAN[29],OKUNAN[30],OKUNAN[31],OKUNAN[32],OKUNAN[33],OKUNAN[34],OKUNAN[35],OKUNAN[36],OKUNAN[37],OKUNAN[38],OKUNAN[39],OKUNAN[40],OKUNAN[41],OKUNAN[42],OKUNAN[43],OKUNAN[44],OKUNAN[45],OKUNAN[46],OKUNAN[47],OKUNAN[48],OKUNAN[49],OKUNAN[50],OKUNAN[51],OKUNAN[52],OKUNAN[53],OKUNAN[54],OKUNAN[55],OKUNAN[56],OKUNAN[57],OKUNAN[58],OKUNAN[59],OKUNAN[60],OKUNAN[61],OKUNAN[62],OKUNAN[63]]
  PAUSE 10
next
END



haklısınız hocam ama sonuç değişmedi :(
Ne ukalayı affederim nede yapılan haksızlığı ...
Ya sus adam sansınlar , yada adam gibi kouş ilham alsınlar

gogoce

scl  VAR PORTD.7        
sda  VAR PORTD.6
SCL2 VAR PORTB.2
SDA2 VAR PORTB.3       
addr VAR WORD           
i    VAR BYTE
TRISC=0         

data_array VAR BYTE[64]

   ADCON1 = 7           
PORTC=255       
   For i = 0 to 63     
   data_array[i] = i
   Next i

   For addr = 0 To 32767 Step 64   
      I2CREAD sda,scl,%10100001,addr,[STR data_array\64] 
      I2CWRITE sda2,scl2,%10100001,addr,[STR data_array\64]
      Pause 10                   
   Next addr
For i = 0 to 63     
   data_array[i] = i
   Next i

   For addr = 0 To 32767 Step 64   
      I2CREAD sda,scl,%10100010,addr,[STR data_array\64] 
      I2CWRITE sda2,scl2,%10100011,addr,[STR data_array\64]
      Pause 10                   
   Next addr                           
PORTC=0
   End     


Hocam yabancı forumların birinde böyle bişey buldum derlemede hata vermedi proteus ta çalıştı ama str komutu hakkında bilgim yok burda nasıl bir işlem yapılmış açıklayabilirmisiniz ?
Ne ukalayı affederim nede yapılan haksızlığı ...
Ya sus adam sansınlar , yada adam gibi kouş ilham alsınlar

ete

Bak bu aklıma gelmemişti. Doğru komut bu "STR"
Bu komut Data_Array dizi değişkeninin 64 adet üyesini sırayla almak ve yazmak için kullanılır.
Bir sürü komut yazmak yerine bununla yapabilirsin. Gerçi diğer yaptığınla aynı şey ama bu yinede daha hızlıdır.
Ete

Powered by EzPortal