avatar_Mucit23

I2C Eeprom Veri yazma sorunu

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

Mucit23

Merhabalar Ete hocam

   Elimde 24C02, 24C32, 24C64 I2C eepromlardan var. Aslında asıl yapmak istediğim şey 128X64 GLCd ye  Resim basmak için resim datalarını Pic vasıtasıyla eeproma yazıp sonra bu dataları eepromdan okuyum GLCD ye basmak. GLCD ile uğraşırken Çok menülü uygulamalarda mecburen Menüler resimlerle yapmak zorunda kalıyorum. Böylesi göze daha güzel görünüyor. Fakat işin içine 16-17 Resim girince (Her resim 1024Byte) işlemcinin Program hafızasını çok dolduruyor. Microchipte çok şükür hafıza seçenekleri çok geniş fakat Yüksek hafızalı işlemciler (64Kb ve üzeri) çok pahalı. Bu yüzden dataları eeproma kaydetmek istiyorum.
 
   Sorun şudurki eepromla iletişimde çok sıkıntı yaşıyorum. Gerek proton olsun Gerekse PicBasicde Eepromun herhangi bir adresine veri yazıp sonra okumaya çalışıyorum. Fakat eeproma ne veri yazabiliyorum nede yazılan değerleri okuyabiliyorum.

   Sadece Pickit2 İle Pickit2 nin pc yazılımındaki penceredeki dataları değiştirip eeproma yazabiliyorum. Okurkende Aynı dataları sorunsuz bir şekilde okuyorum.  Hiçbir problem yok Pickit2 de.

   Gerçekte  Denemelerimi de Expkits'in Ex8B2 deney seti üzerinde gerçekleştiriyorum.

   Hem PicBasicde hemde protonda yazdığım deneme programları simülasyonda tam istediğim gibi çalışıyor fakat gerçekte hiçbir şekilde eeproma veri yazılmıyor. Okurken de hep $00 değerini okuyorum. (Veya hiç okuyamıyorum.) Açıkçası 2 Gündür bu işe uğraşıyorum Herhangi bir gelişme olmadı.
   Deneme amaçlı yazdığım program aşağıdaki gibi

DEFINE OSC 20
@ DEVICE pic16F876
@ DEVICE pic16F876, WDT_ON
@ DEVICE pic16F876, PWRT_ON
@ DEVICE pic16F876, PROTECT_OFF
@ DEVICE pic16F876, HS_OSC

TRISA=0:TRISB=0:TRISC=0
PORTA=0:PORTB=0:PORTC=0

DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 0
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 4
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 5
DEFINE LCD_BITS 4
DEFINE LCD_Lines 2
DEFINE LCD_COMMANDUS 2000
DEFINE LCD_DATAUS 50
DEFINE I2C_SLOW 1

ADCON1 = 7

SYMBOL SCL=PORTC.3
SYMBOL SDA=PORTC.4
SYMBOL BUZZER=PORTB.7

CHAR VAR BYTE
ADR  VAR BYTE
READING VAR BYTE
WRITING VAR BYTE

PAUSE 300
LCDOUT $FE,1
BASLA:

High PORTC.0
           For Char=0 To 10
              ADR=char+10
             I2CWRITE SDA,SCL,$A0,char,[adr]:pause 10
             WRITING=ADR
             GoSub EKRAN
             pause 700
           Next
HIGH PORTC.1
           For Char=0 To 10
             I2CREAD SDA,SCL,$A1,Char,[ADR]
             READING=ADR
             GoSub EKRAN
             PAUSE 1000
           Next
           LCDOUT $FE,1
           LCDOUT $FE,$80,"YAZMA VE OKUMA"
           LCDOUT $FE,$C0,"TAMAMLANDI.."
           High BUZZER:PAUSE 1000:Low BUZZER
Stop

EKRAN:
   LCDOUT $FE,$80,"YAZILAN $",DEC3 WRITING
   LCDOUT $FE,$C0,"OKUNAN  $",DEC3 READING
Return
END


   Sorun neden kaynaklandığını bilmiyorum. Eeproma veri yazarken kontrol bilgisinin $A0 okurkende $A1 olması gerektiğini söylemişlerdi. Bu şekilde denediğimde  simülasyonda istediğim şekilde çalışıyor fakat gerçekte çalışmıyor. Hem okurken Hemde yazarken kontrol kodunu $A0 olarak denediğimdede yine aynı sorunu yaşıyorum. Sonuç değişmiyor. 
   Eepromun SCL ve SDA hattını  Deney seti üzerindeki pull-up siwitchleri ile pull-up yapıyorum. Belki Deney setinde sorun vardır diye eeprom devresini board üzerinde kurup deney setine bağlantısını yaparak denediğimde de  yine aynı problemler ile karşılaşıyorum.
   Sorun sizce neden kaynaklanabilir. Yazılımsal olarak hatalarım varmı? Gerçkte çalışmamasına neler engel olabilir?


Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

est32

bir kaç eeprom datası incelemiştim bi ara,hiç uğraşmadım ama entegrelerde genelde bir bacak yazma koruması oluyor.O bacak ya gnd ya da vcc çekiliyor olsa gerek.Onlarla hiç oynadın mı,benzetimde çalışıp gerçekte çalışmaması bunu düşündürdü bana.

Ayrıca benim de bu bilgilere ihtiyacım var;
Örneğin büyük fontlar tanımladım ve bunları işlemci belleği almıyor,peki ben bunları nasıl ve ne şekilde harici eeproma yazarım?
Bu konu hakkında bi ara konu açmayı düşünüyordum ama henüz o işe girişmediğim için açmamıştım.

Mucit23

7 Numaralı Bacak WP Yani Write protec  Zaten GNDye Bağlı. Dediğiniz gibi konumunda olsaydı yazma korumalı olabilirdi. Fakat öyle değil. Ayrıca Adres Bacaklarıda A0,A1,A2 de GND konumunda. Sorun çıkmaması lazım.

Başka önerisi olan varmı?
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

menduh

Kodu 628 de denedim 24c08 ve 24c16 da hiç bir sorun yok ama 24c32 ... 24c256 da başlıyor sıkıntı çünkü aynı eprom değil bunlar.. bende pek anlamıyorum ama " http://antrak.org.tr/index.php?id=481&option=com_content&task=view " adresinden okuduğum kadarıyla birde 32...256 için ayrıca bi ayar gerekiyor. zaten isiste bile farklı tasarlanmış entegreler.

menduh

kardeş ben olayı anladım sanki  I2CWRITE SDA,SCL,$A0,g,char,[adr]:pause 10  24c32 ve üzeri epromlarda ayrıca adresleme gerekiyor "g" değişkeni word tipi değişken çünkü epromun datasında 2 bytelık adreslemeden bahsediyor $A0 bilgiside chip seçmek için kullanılıyor yani SCL,SDA iletim hattına 8 adet paralel bağlanabiliyor $A0 ın son üç bitide o iş için ayrılmış. az evvel senin kodu denedim oldu

G var WORD
C var WORD

BASLA:

; High PORTC.0
           g=0
           For Char=0 To 20
            g=g+1
             ADR=char+10
             I2CWRITE SDA,SCL,$A0,g,char,[adr]:pause 10
             WRITING=ADR
             GoSub EKRAN
             pause 200
           Next
           G=0
; HIGH PORTC.1     
           C=0
           For Char=0 To 20
         
             C=c+1
             I2CREAD SDA,SCL,$A0,C,Char,[ADR]   
             READING=ADR
             GoSub EKRAN
             PAUSE 200
           Next
           c=0
           LCDOUT $FE,1
           LCDOUT $FE,$80,"YAZMA VE OKUMA"
           LCDOUT $FE,$C0,"TAMAMLANDI.."
           High BUZZER:PAUSE 1000:Low BUZZER
Stop

Mucit23

Anladım Demek istediğinizi. Çipin Datasheedini inceledim. Dediklerinizle birebir uyuşuyor. Sorun bundan kaynaklansa gerek.Akşam biraz oturum üzerinde uğraşayım. İlgin için Teşekkür ederim.
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

ete

Gerek simulasyonlarda ve gerekse gerçek devrelerde hemen her çeşit epromu kullandım ve sorun yaşamadım.
Tabiiki bunda temel etken iyice data sheetlerini okuyup ona göre işlem yapmamdır.
Epromlar çok farklı yapılarda. Sizinde belirlediğiniz gibi farklı olan konu adreslenme şekilleridir.
Özellikle sorun yüksek kapasiteli epromlarda ortaya çıkmaktadır. Bunların bazısı tek entegre gibi 0-xxxx adresleri arasında adreslenip çalıştırılabiliyor kimisinde de sanki aynı kılıf içinde bir den fazla entegre varmış gibi "page" seçimi yapılıp adresleniyor. Özellikle page yani entegre seçilip adresleme yapılanlarda  genelde adresleme 0-255 arası yapılıyor ama siz 0-8 adet sayfadan (entegreden ) hangisini seçerseniz adresleme onun üzerinde çalışıyor. Bu nedenle bunlara dikkat etmek gerekiyor.

Burada ne kadar tartışırsak tartışalım bir temele oturtamayız. Bu nedenle hangi eeprom kullanılıyor ise onun üzerinden tartışmak gerekir. I2C epromların data ve CLK bacaklarının pullup yapılması ihtiyacınıda göz ardı etmeyin.

Ete

Mucit23

Hocam 24C32 için konuşalım. 24C32 Datasheedinde Sayfa 11 deki Figure 2 Ye bakarsak  eeproma veri yazmak için böyle bir tablo vermişler

image hosting gif

Adresleme kısmı iki  byte halinde yapılıyor. Burada FIRST WORD ADRESS 'in ilk 4 bitinden sonraki işaretli olan 4 bit'e herhangi bir dokunma yapılmıyor anlaşılan.

Adres değerini normal decimal olarak arttırmamız için Adres üzerinde başka bir işlem yapmamız geremiyor öyle değilmi.? Adres değeri word tipinde olduğu için 255 ten sonra MSB byte ına geçmesi lazım.

Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

Mucit23

Şimdiki denememde program çalıştı.

DEFINE OSC 20
@ DEVICE pic16F876
@ DEVICE pic16F876, WDT_ON
@ DEVICE pic16F876, PWRT_ON
@ DEVICE pic16F876, PROTECT_OFF
@ DEVICE pic16F876, HS_OSC

TRISA=0:TRISB=0:TRISC=0
PORTA=0:PORTB=0:PORTC=0

DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 0
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 4
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 5
DEFINE LCD_BITS 4
DEFINE LCD_Lines 2
DEFINE LCD_COMMANDUS 2000 'Command delay time in us
DEFINE LCD_DATAUS 50 'Data delay time in us
DEFINE I2C_SLOW 1

ADCON1 = 7

SYMBOL SCL=PORTC.3
SYMBOL SDA=PORTC.4
SYMBOL BUZZER=PORTB.7

CHAR VAR word
ADR  VAR BYTE
READING VAR BYTE
WRITING VAR BYTE

PAUSE 300
LCDOUT $FE,1
BASLA:

High PORTC.0
           For Char=0 To 10
              ADR=char+10
             I2CWRITE SDA,SCL,$A0,char,[adr]:pause 10
             WRITING=ADR
             GoSub EKRAN
             pause 700
           Next
HIGH PORTC.1
           For Char=0 To 10
             I2CREAD SDA,SCL,$A1,Char,[ADR]
             READING=ADR
             GoSub EKRAN
             PAUSE 1000
           Next
           LCDOUT $FE,1
           LCDOUT $FE,$80,"YAZMA VE OKUMA"
           LCDOUT $FE,$C0,"TAMAMLANDI.."
           High BUZZER:PAUSE 1000:Low BUZZER
Stop

EKRAN:
   LCDOUT $FE,$80,"YAZILAN $",DEC3 WRITING
   LCDOUT $FE,$C0,"OKUNAN  $",DEC3 READING
Return
END


Bu program çalışıyor. Fakat şu dikkatimi çekti. SCL ve SDA hattında ledler açık olunca İletişim bozuluyor.
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

ete

#9
24c32 4k X 8 Byte kapasitesine sahip bir eprom. Yani 4096 adet (sıfır dahil) byte hafızası var. Bu şu demektir. 0-4095 arasında hafıza adreslemesi yapılabilir demektir. En büyük adres 4095 in binary karşılığına bir bak istersen %111111111111 . Bu sayı tam tamına 12 bitlik bir sayıdır. Bu şu demektir High byte kısmında 4 bit kullanılmayacaktır (16bit-12bit=4 bit). İşte dokunulmayacak dediğin bitler sonda yer alan 4 adet bit dir. Ama ilk 4 bit kullanılacaktır.
Adres değişkenini sen de 16 bitlik word değişkeni şeklinde alırsan zaten iş kendiliğinden hallolmuş olacaktır.
O kullanılmayan bitlerin yerine daima sıfır yazılmalıdır. Ama sen zaten 4095 den büyük adres almayacağın için o bitler zaten sıfır olacaktır. Ama her ihtimale karşın programda tedbir almak istersen Adres.byte1=adres.byte1 & %00001111 şeklinde bir komut koyarsan adres değeri 4095 den büyük olamaz.

Toparlarsak, bu epromda 4K lık bir eprom. Adresleme direk 12 bitlik adres değeri verilerek yapılıyor.
Adres bilgisinden sonra yazılacak data değeri verilir (byte olarak). Şayet birden fazla byte verirseniz verilen adresten başlayarak sırası ile bytları adreslere yerleştirir. Bunada page yazma şekli deniliyor.

Burada dikkat edilmesi gereken bir diğer husus kontrol byte değeridir. Data sheet'e bakarsanız;
Yazma için : %10100000
Okuma için: %10100001  değerlerinin verilmesi gerekiyor.
Aynı devre üzerinde birden fazla 24C32 kullanabiliriniz. Bunun için kontrol byte değeri içinde size 3 adet bit verilmiş. Bu sayde aynı devrede 8 adet 24C32 kullanabilirsiniz. Bunları seçmek için devrede yer alan 24C32 lerin adres bacaklarına sırası ile,
%000
%001
%010
%011
%100
..
%111 şeklinde değer vermek ve hangi entegreyi kullanacaksanız onun kontrol byte'ı içindeki adres bitlerine aynı değeri vermeniz gerekir. Biraz karışık gibi gelirse örnekle açıklayalım.
Diyelimki devrenizde 2 adet 24C32 bağlı. Birincisinin  A0,A1 ve A2 bacaklarını GND ye bağlarsınız. Bu entegreye ulaşmak için Kontrol Byte'ı  %101000x şeklinde kullanılır.
İkinci entegrenin Adres bacakları ise A0=HIGH, ve A1 ile A2 GND ye bağlanır. Bu entegreye ulaşmak için Kontrol byte'ı olarak
%1010001x kullanılır. Her iki kontrol byte ında gördüğünüz x yerine yazmada  0 ve okumada 1 değeri kullanılacaktır.
Hepsi bu kadar.
Ete

Mucit23

Anladım. Birden fazla eeprom kullanılmak istenirse A0,A1 ve A2 bacaklarıyla adresleme yapılıyor. Bu şekilde Her eepromun farklı bir adresi oluyor.
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

Mucit23

#11
Hocam yapmak istediğimi başardım. Yani eeproma resim datalarını yükleyip sonra tekrar eepromdan okuyup GLCD ye bastım. İyi çalıştı fakat aynı intel gibi bende hız konusunda duvara tosladım. Görüntü GLCD ye geliyor fakat iletişim yavaş kaldığı için görüntünün tamamı ekrana yüklenmesini göz görebiliyor. Tahminimce 300-400ms sürüyor. Bu yüzden daha yüksek hızlı SPI eepromlarla deneme yapmayı düşünüyorum. Mesela 24A256 ve yukarısı bana uygun görünüyor. Hem SPI ile iletşimi kuruyor Hemde 20Mhz max. Clock Frekansında çalışabiliyor. Türkiyede bulamadım ama farnell de var.
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

toys-23

Merhaba mucit23

Konuyu bende merak ediyorum mümkünse son halini isisiyle eklermisin.Biraz bende üzerinde çalışayım.

Mucit23

İsis şeması malesef yok çizmedim. Gerçekte devreyi deniyorum. Yazılımıda protonla hazırladım. İstersen verebilirim.
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

toys-23

merhaba mucit 23

O zaman devren bitince videosunu paylaşırsan sevinirim en azından bir fikrimiz olur..

Powered by EzPortal