avatar_Mucit23

I2C Eeprom Veri yazma sorunu

Başlatan Mucit23, 15 Kasım 2011, 21:38:28

ete

#45
Data sheet'i dikkatlice okudum. Bir yerde hata yapıyoruz diye.
Sonunda buldum sorunu. Önemli bir konu var oda şu;
Adamlar Yazma kısmında bunu belirtmişler şöyle;
Herhangi bir yazma işleminden önce write enable latch , WREN instruction kullanılarak set edilmelidir.
Üstelik bu set edilme işi CS pini HIGH a çekilerek sonlandırılmalı. Aksi halde WREN işlemi tam oalrak yapılmamış olacaktır deniliyor.

Bu durumda yazma kısmı aşağıdaki şekilde yapılmalı;

EPROM_YAZ:
CS=0
  SHIFTOUT SI,SCK,1,[WREN]
CS=1
cs=0 
  SHIFTOUT SI,SCK,1,[EEWRT,YERI\16,YAZILAN]
CS=1
Return
Bu değişikliği yap yazma işleminin doğru olacağını göreceksin.

Okuma işlemini "MSBPOST"  ile değil  "MSBPRE"  ile yapman gerekiyor bunuda uygulamayı unutma.
(SHIFTIN  SO,SCK,0,[OKUNAN])

Ete

Mucit23

Hocam siz çalıştırabildinizmi? Ben denedim. Yine 00 okuyorum. Yani atladığımız bişeyler daha olmalı.

Yeni yazılım bu şekilde oldu.
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=%01000000
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 Shift_DelayUs 50
;GLCD_EXTERNAL_PRINT = PPRINT

    Symbol CS =PORTC.0
    Symbol SCK=PORTC.2
    Symbol DO =PORTC.4
    Symbol DI =PORTC.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 RESIM    As Byte
Dim X        As Byte
Dim WREN     As %00000110
Dim EEWRT    As Byte
Dim EERAD    As Byte
EEWRT=%00000010
EERAD=%00000011
;GoSub EE_INIT
Cls
Print At 1,1,"LUTFEN BEKLEYiNiZ"
Print At 2,1,"KAYDEDiliYOR..."
DelayMS 100
ADRS=15:ADDR=$A0
BASLA:
GoSub E_WRITE:GoSub E_READ
Print At 3,1,"YAZILAN=$",Hex2 ADDR
Print At 4,1,"OKUNAN=$",Hex2 CHAR
Stop

E_WRITE:
CS=0
  SHOut DO,SCK,1,[WREN]
CS=1
CS=0
  SHOut DO,SCK,1,[EEWRT,ADRS\16,ADDR]
CS=1
Return

E_READ:
CS=0
  SHOut DO,SCK,1,[EERAD,ADRS\16]
  SHIn  DI,SCK,0,[CHAR]
CS=1
Return

EE_INIT:
CS=0:DO=1:SCK=1
CS=1:SCK=0
Return

Include "FONT.inc"
End


Belki hızdan dolayı bu sorun oluşuyordur diye Declare Shift_DelayUs 50 komutu ile clock frekansını yavaşlattım.  Başka daha ne problem olabilir bilmiyorum. Belkide İlk başta dediğim gibi daha iyi takip olması açısından Seri iletişim programını biz yazmalıyız. Ondanda işte şu bit seçip alma işini yapamadım. Clock frekansı düzgün çıkmıyordu. Bir sürü sorun...
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

ete

#47
Ben çalıştırdım. Üstelik hız faktörünüde denedim. Çünki önce hız etkilemesin diye 4 Mhz de çalıştırmıştım programı ama sonra 20 Mhz de de çalıştırdım.

Yalnız bir şey daha eksik sende sanırım. Oda portların analog yapılması meselesi.
ADCON0=0
ADCON1=7  'tamamı digital
komutlarınıda programına ilave etmen gerek. Gerçi  All_Digital= TRUE  diye komut koymuşsun ama protona fazla güvenemiyorum ben işin doğrusu.

Bende her şey çalışıyor. 
Bu arada bir başka şey daha var. Senin verdiğin simulasyonda devreye bir skop bağladım ama baktımki hiç bir hareket yok. Entegreden ne clk nede data sinyali çıkmıyor. Bir terslik var senin programda ama nerede bilemem.

Benim program aşağıdadır. BU arada eprom pinlerini sıralı kullandım şaşırmayasın. SO ve SI pinleri Epromun pinlerine göre isimlendirildi şaırma olmasın diye.
Ete

asm
    __CONFIG _CONFIG1H, _OSCS_OFF_1H & _HS_OSC_1H  ;  _HSPLL_OSC_1H       
    __CONFIG _CONFIG2L, _BOR_ON_2L  & _BORV_20_2L & _PWRT_OFF_2L
   __CONFIG _CONFIG2H, _WDT_ON_2H & _WDTPS_128_2H
    __CONFIG _CONFIG3H, _CCP2MX_ON_3H
    __CONFIG _CONFIG4L, _STVR_ON_4L & _LVP_OFF_4L & _DEBUG_OFF_4L
;    __CONFIG _CONFIG5L, _CP0_OFF_5L & _CP1_OFF_5L & _CP2_OFF_5L & _CP3_OFF_5L
    __CONFIG _CONFIG5L, _CP0_ON_5L & _CP1_ON_5L & _CP2_ON_5L & _CP3_ON_5L
;    __CONFIG _CONFIG5H, _CPB_OFF_5H & _CPD_OFF_5H
    __CONFIG _CONFIG5H, _CPB_ON_5H & _CPD_ON_5H   
    __CONFIG _CONFIG6L, _WRT0_OFF_6L & _WRT1_OFF_6L & _WRT2_OFF_6L & _WRT3_OFF_6L
    __CONFIG _CONFIG6H, _WRTC_OFF_6H & _WRTB_OFF_6H & _WRTD_OFF_6H
    __CONFIG _CONFIG7L, _EBTR0_OFF_7L & _EBTR1_OFF_7L & _EBTR2_OFF_7L & _EBTR3_OFF_7L
    __CONFIG _CONFIG7H, _EBTRB_OFF_7H
endasm
define OSC 20

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

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

ADCON0=0
ADCON1=7  'tamamı digital

DEFINE LCD_DREG     PORTD       
DEFINE LCD_DBIT     4           
DEFINE LCD_RSREG    PORTD       
DEFINE LCD_RSBIT    2           
DEFINE LCD_EREG     PORTD       
DEFINE LCD_EBIT     3           
DEFINE LCD_BITS     4           
DEFINE LCD_LINES    4           
DEFINE LCD_COMMANDUS 4000 'Command delay time in us
DEFINE LCD_DATAUS 50 'Data delay time in us

Symbol SCK=PORTC.0
Symbol SI =PORTC.1
Symbol SO =PORTC.2
Symbol CS =PORTC.3

YAZILAN  VAR Word
OKUNAN   VAR WORD
YERI     VAR Word
'YPOS     Var Byte
'XPOS     Var Byte
'CHAR     Var Byte
'KONT     Var Byte
'RESIM    Var Byte
X        Var Byte

EEWRT CON %00000010
EERAD CON %00000011
WREN  CON %00000110
WRDI  CON %00000100

pause 200
LCDOUT $fe,1
pause 200
LCDOUT $fe,$80,"LUTFEN BEKLEYiNiZ"
lcdout $fe,$c0,"KAYDEDiliYOR..."
Pause 100
GOSUB EE_INIT
YERI=15:YAZILAN=$A0

BASLA:
GoSub EPROM_YAZ
pause 100
GoSub EPROM_OKU
LCDOUT $FE,$94,"YAZILAN=$",Hex2 YAZILAN
LCDOUT $fe,$d4,"OKUNAN=$",Hex2 OKUNAN
pause 500

CS=0
SHIFTOUT SI,SCK,1,[%00000101]
SHIFTIN SO,SCK,0,[OKUNAN\8]
LCDOUT $fe,$d4,"STATUS=$",Hex2 OKUNAN
CS=1
pause 500

goto basla





EPROM_YAZ:
CS=0                       'bu satırlar önemli , önce CS low yaplıyor
  SHIFTOUT SI,SCK,1,[WREN] 'write enable set ediliyor
CS=1                       'cs=1 yapılıyor ki WREN işlemi tamamlansın Aksi halde sistem çalışmıyor
cs=0 
  SHIFTOUT SI,SCK,1,[EEWRT,YERI\16,YAZILAN]
CS=1
Return

EPROM_OKU:
CS=0:okunan=0
  SHIFTOUT SI,SCK,1,[EERAD,YERI\16]
  SHIFTIN  SO,SCK,0,[OKUNAN]
CS=1
Return

EE_INIT:
CS=0:SO=1:SCK=1
CS=1:SCK=0
pause 100
Return

End

ete

Her ihtimale karşı göresin diye programlarıda aşağıya ekledim.

Ete

Mucit23

Evet hocam sizin yaptıınızı bende dendim. Verdiğiniz kodu derleyerek simülasyonda denedim çalışıyor. Şimdi Sizin yazdığınız yazılımla Protonda yazılan yazılım arasındaki farkları bulmaya çalışayım.
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

ete

Do. İsmini pin adı olarak kullanmamalısın. Bu kelime reserved isimlerden birisidir. Do-loop komutunu hatırla. Muhtemelen sorun burada.
Ete

Mucit23

Çalıştı :) :) :)

Hocam sizin yazdığınız programdaki herşeyi uyguladım yazılımda. Şimdi çalıştı. Sorunun asıl sebebi. yazma işleminden sonra hemen okuma işlemine geçilmesiymiş. Ben min. nekadar beklemek gerektiğine baktım. Anladığım kadarıyla 5ms den 1 ms dahi az beklense yazma işlemi olumsuz olarak sonuçlanıyor. Deneye deneyebu sonucu buldum. Ama sınır bir değer. Bana kalırsa sağlam olsun diye 7-8 ms beklemek gerekiyor.
Şimdi ufak bir problemim daha kaldı. Onuda halledersem hemen resim basma çalışmalarım devam edeceğim
Ben yaptığım ufak deney kartında eepromun çıkışını 1 transistörle 5 volta yükselttiğimi belirtmiştim. Fakat bu seferde gelen veri terslenmiş olarak geliyordu. Yani E1 yazdıysam okurken 1E okuyorum.

Yani okuduğum veriyi değil işlemine tutarak yazdığım veriye çevirebilirim.
Bunu PBP nin mantık operatörleriyle nasıl yapabilirim.
PBP de Not komutu var Bu komutu bu iş için  nasıl kullanmam gerekiyor.
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

ete

#52
Her epromun belirli bir yazma süresi vardır. Hiç bir zaman yazdıktan sonra hemen okuma yapılmamalıdır yada ikinci bir yazma emri verilmemelidir. Bu süre genelde 10 ms dir ancak yeni nesil epromlarda bu süre 5 ms ye ye düşmüş gözüküyor. Zira bu programda da 5 ms ile sistem çalışıyor ancak 4 ms verirsem çalışamıyor.

Değilleme değişken başına not koyarak yapılır. Basicde bunun işareti ~ veya ! işaretidir. Daha ziyade ikincisi kullanılır sanırım.
Ama şaşırırsanız basit bir yoluda Byte değişkenleri için Veri =255-Veri  formülü, Word değişkenleri için Veri=65535-Veri şeklindeki formülde işinizi görür.

Ete

Mucit23

Anladım hocam. Onu hallederimde şu anda eeprommdan gelen data sinyallerini 5 volta yükseltmede sorun yaşıyorum. 2N2221 verimli çalışmayacak gibi. Devrenin orjinlinde BSS138 kullanılmıştı. Sipariş ettim onlardan. Yarın gelsin olmazsa Level shifter kartını yeniden yapıcam.
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

ete

Gelen sinyalleri 5V ta yükseltmek  dünyanın en kolay işi. Bütün yapman gereken gelen data hattına4K7  ile Pullup direnci bağlaman. Bu sayede gelen data HIGH konumunda 3V ile geliyorsa Pullup onu 5V ta çıkartacaktır.

Ete

Mucit23

Hocam ben şöyle bir bağlantı kullandım

image hosting jpeg
Aslında güzel çalışıyorda eeprom cevap vermiyor. Onuda çözeceğim gibi aklıma bi sebeb var. Sadece bu şekilde gelen veri değillenmiş oluyordu onuda sayenizde çözdüm.
Birde Şu LM317 kararlı çalışmıyor. Ben besleme için düşündüm ama anladığım kadarıyla 5 v giriş voltajı yetersiz geliyor. Tam 3 V a çıkartamıyorum. 2.7 de felan kalıyor. Gerçi eeprom için problem yok 1,5 voltta bile çalışıyor. Daha düzgün çalışan bir regülatör bildiğiniz varmı. En fazla 3V verecek. 3.6 V çok sınır oluyor.
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

Mucit23

Yok hocam Gerçekte hiç bir şekilde eeprom cevap vermiyor. Ben WP pinini Normalde GND ye çekmiştim. Belki ondandır diye umutlandım. Wp pinin pull-up yaptım. Tekrar denediğimde yine sonuç alamadım. Daha atladığım ne var bilmiyorum. Simülasyonda çalışıyor. Simülasyonda WP pinin konumu farketmiyor. Hıgh dada veri yazılıyor Low dada. Gerçekte ise Hiçbirşekilde Veri okuyamıyorum. Hep FF geliyor Normalde eğer eeprom cevap verse farlı bir veri gelmesi lazım.
Ne yapacağımı hiç bilmiyorum açıkçası...
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

ete

Bütün sistemi 3V da çalıştırabilirsin. 3V ile çalışan bir işlemci kullan. Gerçi 18F452 3 V ta inemiyor ama bulabilirsen 18LF452 si varki 2V da bile çalışıyor.
Sorunun ne olduğunu gerçekten bende anlamıyorum. İsis de çalışan şeyin mutlaka çalışması gerekir. Yine devreni araştır bence.

Ete

Mucit23

Hocam Expkitste deney setinde deniyorum. orada öyle bir imkanım yok. Tüm devreyide yeniden board üzerine kurmak gerçekten hiç işime gelmiyor.
Eepromun max çalışma voltajı düşük 3V  O yüzden LF serisi olmayan piclerde sorun çıkartabilir.
Sorunun neden kaynaklandığını hiç bir şekilde bilmiyorum. Osiloskobum olsa bakıcam ne var ne yok belli olur. Ancak okulda gidip yapayım.
Daha önce Bu eepromla uğraşan kimse yok. Uğraşan olsa mutlaka olası sorunları bilir. Bu akşam birazdaha uğraşacam olmadı birde picproje sakinlerine danışmak istiyorum.
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

zeus48

Mrb arkadaşlar . 18F452 eepromuna kaç değişik bilgi kaydedebilirim. Açıkcası kaç adres var

Powered by EzPortal