i2cread ve i2cwrite sorunu

Başlatan mavi, 05 Şubat 2007, 23:06:26

mavi

24c64  adres word data byte tipi değişken  ve
adres word data word değişken ikiside denendi.
24c32 de adres byte data byte denendi.
24lc16 de adres byte data byte denendi.
24c adres pinleri 0000 ayarlandı wp ucu sıfıra bağlandı.

komutlarımız

i2cread datapini,clockpini,$A0,adresdeğiskeni, [degisken],hatarutini

i2cwrite  datapini,clockpini,$A0,adresdeğiskeni, [degisken],hatarutini



kullanımı:
clk var porta.0
cdta var porta.1

a var byte
b var word
c var word

for a=0 to 55
b=a
i2cwrite cdta,clk,$A0,b, [c],hatarutini
next a



for a=0 to 55
i2cread  cdta,clk,$A0,a, [c],hatarutini
lcd ye yaz komutları
next a

0D adresine kadar registere normal bir şekilde yazma yapılıyor sonrasında sistem sapıtıyor.bazen rastgele adreslere yazma yapıyor.okuduğunda zaten yanlış okuyor.yazılan bilgiyide okumuyor.
4 mhz ve 20 mhzlerde denendi.İnternetten çalıştığı söylenen hazır kodları kullandım onlarda aynı hatayı verdi.

i2cwrite ve i2cread komutunun bir püf noktası var mı?

picin normal iç epromuna uklaşıyorum ama o bana yetmiyor.


derleyici 2.46
Telecommander Monster Of Network

teknikelektronikci

hocam hic bu zamana kadar kullanmadim bu komutu ama elimdeki kitaba baktim söle bir sey yazior belki isinize yarar

Alıntı Yaptek bir i2cwrite komutuyla birden fazla datayi yazmak cogu seri eeprom da mümkün değildirnbu durumda her bir data yazimi arasinda 10 ms kadar gecikme yapilmalidir
Ey Türk istikbalinin evlâdı! İşte, bu ahval ve şerâit içinde dahi, vazifen; Türk İstiklâl ve Cumhuriyetini kurtarmaktır! Muhtaç olduğun kudret, damarlarındaki asil kanda mevcuttur!

armys2000

hocam i2cwirte komutun da bir sonraki yazmayı yapabilmen için 10 ms  beklemen gerek orda döngü de  bu bekleme süresini koy hata burdan

for a=0 to 55
    b=a
    i2cwrite cdta,clk,$A0,b, [c],hatarutini
    pause 10
next a

mavi

10ms beklemem var

0D adresine kadar yazıyor sonrasında 100 adet veri yazacaksa 5 tanesini doğru adrese yazıyor kalan veriler yok
okumayıda yanlış yapıyor.bir zamanlama hatası gibi görünüyor ama
20  ve 4 mhz lerde denedim olmadı.işlem yanlış olsa hiç yazma yapmaz.
Telecommander Monster Of Network

armys2000

Hocam adres byte cinsinden siz byte adrese word değişkeni yazmaya çalışıyorsunuz adresi word yapabilirmisiniz birde böyle deneyin burdan da  kaynakalanabilir.

zeren51

Arkadaşın dedigi bigi bende hazır devre üzerinde denedim ve verimli sonuc alamadım birsürü hazır kod üzerince calıştım pullup direcleri ile oynama yaptım ama verim yok ....

DEFINE LCD_DREG PORTB 'LCD data port
DEFINE LCD_DBIT 0 'LCD data starting bit 0 or 4
DEFINE LCD_RSREG PORTB 'LCD register select port
DEFINE LCD_RSBIT 4 'LCD register select bit
DEFINE LCD_EREG PORTA 'LCD enable port
DEFINE LCD_EBIT 4 'LCD enable bit
'DEFINE LCD_RWREG PORTE 'LCD read/write port
'DEFINE LCD_RWBIT 2 'LCD read/write bit
DEFINE LCD_BITS 4 'LCD bus size 4 or 8
DEFINE LCD_LINES 2 'Number lines on LCD
DEFINE LCD_COMMANDUS 2000 'Command delay time in us
DEFINE LCD_DATAUS 50 'Data delay time in us
DEFINE OSC 4
DEFINE I2C_HOLD 1 'Pause I2C transmission while clock held low
DEFINE I2C_SCLOUT 1 'Set serial clock to bipolar instead of open-collector
trisa=%11111
trisb=%00000000
B0 var byte
B1 var byte
B2 var byte
B3 var byte
B4 var byte
B5 var byte
e2prom var byte
z var byte

INCLUDE "modedefs.bas"
LCDOUT $FE,$84,"-EEPROM-"
main:
for z= 0 to 10
I2CREAD PORTB.5,PORTB.6,%10100001,Z,[E2PROM]
LCDOUT $FE,$C0+Z,E2PROM
pause 200
next
goto main
End

zeren51

Kodlar belki yardımcı olur isterseniz bakın bende cok calışma yapmıştım ı2c üzerine....

PORTA=0
TRISB=%00000000   'PortB.0 giriş diğerleri çıkış yapıldı.
TRISA=%00000000   'A portu tamamı çıkış yapıldı.
'-----------------------------------------------------------------
@ DEVICE pic16F628                      'işlemci 16F628                                
@ DEVICE pic16F628, WDT_on              'Watch Dog timer açık
@ DEVICE pic16F628, PWRT_ON             'Power on timer açık
@ DEVICE pic16F628, PROTECT_OFF         'Kod Protek kapalı
@ DEVICE pic16F628, MCLR_OFF             'MCLR pini kullanılıyor.
@ DEVICE pic16F628, INTRC_OSC_NOCLKOUT  'Dahili osilatör kullanılacak
'---------------------------------------------------------------------
SYMBOL CPIN=PortB.1       ' Clock pini
SYMBOL DPIN=PortB.2       ' Data pini

SIFRE_A   VAR  BYTE
SIFRE_B   VAR  BYTE
ADRS      VAR  byte
E_GIRIS     Var  Byte      ' Eeproma Bilgi Yaz
E_CIKIS     Var  Byte      ' Eepromdan Bilgi oku

KONT   Con   %10100000      ' Cihaz kodu

SIFRE_A=1234
SIFRE_B=5678

BASLA:
'-----------------önce ilk sekiz adrese bilgi yazalım-----------------
ADRS=0
E_CIKIS=SIFRE_A DIG 0
GOSUB  E_YAZ
ADRS=1
E_CIKIS=SIFRE_A DIG 1
GOSUB E_YAZ
ADRS=2
E_CIKIS=SIFRE_A DIG 2
GOSUB  E_YAZ
ADRS=3
E_CIKIS=SIFRE_A DIG 3
GOSUB E_YAZ
'şifre 2. kısım yazılıyor
ADRS=4
E_CIKIS=SIFRE_B DIG 0
GOSUB  E_YAZ
ADRS=5
E_CIKIS=SIFRE_B DIG 1
GOSUB E_YAZ
ADRS=6
E_CIKIS=SIFRE_B DIG 2
GOSUB  E_YAZ
ADRS=7
E_CIKIS=SIFRE_B DIG 3
GOSUB E_YAZ

'----------Şimdide ilk 8 adresteki bilgileri okuyalım--------------------
ADRS=0
GOSUB E_OKU
SIFRE_A=E_GIRIS
ADRS=1
GOSUB E_OKU
SIFRE_A=SIFRE_A+E_GIRIS*10
ADRS=2
GOSUB E_OKU
SIFRE_A=SIFRE_A+E_GIRIS*100
ADRS=3
GOSUB E_OKU
SIFRE_A=SIFRE_A+E_GIRIS*1000
'-----------Sifre 2. kısım okunacak--------------------
ADRS=4
GOSUB E_OKU
SIFRE_B=E_GIRIS
ADRS=5
GOSUB E_OKU
SIFRE_B=SIFRE_B+E_GIRIS*10
ADRS=6
GOSUB E_OKU
SIFRE_B=SIFRE_B+E_GIRIS*100
ADRS=7
GOSUB E_OKU
SIFRE_B=SIFRE_B+E_GIRIS*1000

'buraya kadar olan satırlarda Sifre_A=1234 , Sifre?B=5678 olarak okundu
END

E_YAZ:
      I2CWRITE DPIN,CPIN,KONT,ADRS,[E_CIKIS]
      Pause 10                      
      Return
     
E_OKU:    
       I2CREAD DPIN, CPIN, KONT, ADRS, [E_GIRIS]
       RETURN
   
END

armys2000

Sayın arkadaşlar 16F628 kullanıyorsunuz PBP 245  te I2C deerleyici tarafında sorun var diye biliyorum bi arkadaşım bu nu düzeltip bana göndermişti ama  ordaki sorununun internal epromda mı yoksa I2C de mi
olduğunu hatırlamıyorum  hatta bu düzeltmesini de ilgili yerlere göndermişti . Eğer o sorun sonraki sürümlerde de devam ediyorsa bilemem. Sanırım devam ediyor gibi. bunu en güzel 16f84 le deneyerek bulabilir. Bende Çok merak ettim açıkçası . Deneme imkanı olan bir arkadaş denyip sonucu buraya bildirebilir mi ? Umarım öyle bir sorun yoktur .

drmp

arkadaş ben bu i2cread and i2cwrite komutu ile 24lc64 içine 2048 byte üst üste yazmıştım sorun çıkadı  ama arkadaşın dediği gibi adres word data byte olmalı aksi taktirde beklenen 3 gelen 2 olur sapıtır  öyle hatırlıyorum

teknikelektronikci

merhaba arkadaslar üstadlar bende bu harici eerpmlarla calismaya basladim fakat b türü calistiramadim daha önce dahili kullaniordum problem yoktu simdi ise haricide problem cikti problem ise isisde bir sürü hata verior hatta hata aynen söyle:








ayrica programin en üstünede
kontrol con %10100000
yazdim  ba bu konuda yardimci olabilirseniz cok sevinirim simdiden tesekürler


edit: üstadlar simdide bir hata dah eklendi hata: internal write buffer overflowed:buffer size is 32 words but 78 words received  

sanirim buffer ile ilgili problem ,sizce problem nedir
Ey Türk istikbalinin evlâdı! İşte, bu ahval ve şerâit içinde dahi, vazifen; Türk İstiklâl ve Cumhuriyetini kurtarmaktır! Muhtaç olduğun kudret, damarlarındaki asil kanda mevcuttur!

oooben

selam herkeze iyi çalışmalar ben bir kart hazırladım öyleki bu kart 2 adet 24 lc 64 ü kontrol etmek için
şöyle yaptım 5.bacak olan sda yı bc546 dan geçirdim d0.1.eepromd.1=2.eeprom oldu
yani d.0=1 deyip arkasından yazıyorum ve sonra okuyorum.
aynısını diğer bağlantı için yaptım
isis tesorun yok ( bu arada bc546 dan sonra 10k ile pull up çektim +5v)
buraya kadar herşey yolunda çalışmadı gerçek devrede denedim yani
bende 1 adet bağldım o da çalışmadı hiç bişey anlamadım
ne yaptıysam olmadı şema veremiyorum  yardım ederseniz sevinirim

 

teknikelektronikci

niye böyle bir sey yaptinizki ? i2c haberlesmede sda scl pinlerini paralel baglayip ikisini ayri ayri kontrol edebilirsiniz en kötü ihtimal wp pinini kontrol edersiniz
Ey Türk istikbalinin evlâdı! İşte, bu ahval ve şerâit içinde dahi, vazifen; Türk İstiklâl ve Cumhuriyetini kurtarmaktır! Muhtaç olduğun kudret, damarlarındaki asil kanda mevcuttur!

oooben

selam herkeze ben 24lc 64 kullanmaya çalışıyorum "zeren 51" sen denedinmi bu kodu arkadaşım
ben denedim bu kod ete hocanın ders 9 undan birebir kopya dır ve bu da çalışmamaktadır kopyala pbp yapıştır isiste devresini kur
sonuç pull-up v.s. ne istersen yap ben lcd bile kullandım
olmuyor
bana kalırsada 16f877a da sorun var(pbp kompile edemiyor aynı pwm komutu gibi sıkıntılı ) ve 18f452 denicem birazdan
yanlış anlamayın sözüm kimseye değil ama bi deneyin ya oluyosa da nasıl oluyo püf noktası verin sıkıntı var bi yerlerde
mesela kitap okuyorum piclerle ,konularla ilgili
adam kitap yazmış :) malesef
örneğin  max485 i anlatmış ama preambl ne olduğunu bile anlatmamış ete hoca sağ olsun nerdeyse proje yatıyodu
lütfen adım adım nasıl yazılır ve okunur diye yazarmısınız
hepinize teşekkürler
saygılar .....
bülent

equ

Arkadaşlar aynı sorunu bende yaşıyorum. Isiste çalıştıramadım, devreyi kurdum olmadı, ne yaptıysam çalışmadı. Kodlar ve şema aşağıda. Nerde yanlış yapıyorum >:(

:[IMG]http://imageupload.org/thumb/thumb_152350.jpg[/img]


@ DEVICE pic16F873a                     
@ DEVICE pic16F873a, WDT_OFF             
@ DEVICE pic16F873a, PWRT_ON             
@ DEVICE pic16F873a, PROTECT_OFF         
@ DEVICE PIC16F873a, XT_OSC
@ DEVICE PIC16F873a, DEBUG_OFF
@ DEVICE PIC16F873a, CPD_OFF

DEFINE OSC 4
include "modedefs.bas"

DEFINE LCD_DREG      PORTB   
DEFINE LCD_DBIT      4      
DEFINE LCD_EREG      PORTB   
DEFINE LCD_EBIT      3      
DEFINE LCD RWREG                PORTB   
DEFINE LCD_RWBIT                2       
DEFINE LCD_RSREG                 PORTB   
DEFINE LCD_RSBIT                  1      
DEFINE LCD_BITS      4      
DEFINE LCD_LINES                     2      

LCDOUT $FE,1

a var byte
b var byte
a=44

i2cwrite PORTC.4,PORTC.3,$A0,1,[a]
LCDOUT $FE,1,#a
pause 500
                 
i2cREAD PORTC.4,PORTC.3,$A0,1,
LCDOUT $FE,1,#b

end

ento

@ DEVICE pic16F873a                     
@ DEVICE pic16F873a, WDT_OFF             
@ DEVICE pic16F873a, PWRT_ON             
@ DEVICE pic16F873a, PROTECT_OFF         
@ DEVICE PIC16F873a, XT_OSC
@ DEVICE PIC16F873a, DEBUG_OFF
@ DEVICE PIC16F873a, CPD_OFF

DEFINE OSC 4
include "modedefs.bas"

DEFINE LCD_DREG      PORTB   
DEFINE LCD_DBIT      4      
DEFINE LCD_EREG      PORTB   
DEFINE LCD_EBIT      3      
DEFINE LCD RWREG                PORTB   
DEFINE LCD_RWBIT                2       
DEFINE LCD_RSREG                 PORTB   
DEFINE LCD_RSBIT                  1      
DEFINE LCD_BITS      4      
DEFINE LCD_LINES                     2      

a var byte
c var byte
a=44

program:
LCDOUT $FE,1

i2cwrite PORTC.4,PORTC.3,$A0,1,[a]
LCDOUT $FE,1,#a
pause 500
                 
i2cREAD PORTC.4,PORTC.3,$A0,1,[c]
LCDOUT $FE,1,#c
goto program
end