16f877a'da ccs ile birden fazla (24c512)eeprom kullanma.

Başlatan bnmdmbrk, 22 Şubat 2015, 15:01:43

bnmdmbrk

Merhaba arkadaşlar.
Forumda bu konuyla ilgili çok yazı okudum ama bir türlü anlayamadım nasıl eeprom seçimi yapıldığını. Kafam çok karıştı. Biri açıklarsa sevinirim.

tek eepromla yaptım ve yazdığım program:
#include <16f877.h>     // Kullanilacak denetleyicinin baslik dosyasi tanitiliyor.
#include <24512.c>

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES XT                       //Cristal osc
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection
#FUSES NOWRT
#FUSES NODEBUG                  //No Debug mode for ICD

#use delay(clock=4000000)
#use i2c(master, sda=EEPROM_SDA, scl=EEPROM_SCL)
#use fast_io(b)


long int address=0x00;
byte data=0;
byte okunan=0;

#include <lcd.h>   // lcd.c dosyasi tanitiliyor
#define use_portb_lcd TRUE   // LCD D portuna bagli


void main()
{
   set_tris_b(0x00);
   output_b(0x00);                  //B portu çıkışı sıfırlanıyor

   lcd_init( );                     // LCD hazirlama islemi
   lcd_send_byte(0, 0x0d);          // LCD Ekranda imlec yanip sonsun komutu.

   init_ext_eeprom();

   while(1)
   {
      for(address=0x00;address<0x30;address++)
      {
         write_ext_eeprom(address,data);
         delay_ms(150);
         data+=0x01;
      }
      
      for(address=0;address<0x50;address++)
      {
         okunan=read_ext_eeprom(address);
         delay_ms(150);
         printf(lcd_putc,"\f %x . satirda \n %d var.",address,okunan);
         delay_ms(1000);
      }
      
   }
}


Fakat birden çok olunca nasıl olduğunu bir türlü çözemedim.
4 eeprom kullandım ve eepromların A1,A2,A3 pinlerine sırası ile (000), (001), (010), (011) verdim.


Şimdi karıştırdığım veya anlamadığım yerleri sorayım.
     -Hangi eeproma yazılacağını bu bitler mi belirliyor?
     -Yoksa bu bitler sabitte biz programdan değer yollayıp mı eepromu aktif ediyoruz?
     -Yoksa 65535. adresten sonrasını 2.eeprom olarak algılıyorda ekstradan komuta ihtiyaç duymadan adres verisinden mi anlıyor 2.eeproma yazılacağını.
     -Eeprom(24c512) R/W hızı sanırım 1MHz
         
#use i2c(master,sda=pin_c4, scl=pin_c3, slow=100000)

        komutunu (slow=1000000) yapınca oluyor mu?
     -Bu komutu her eeprom için yazmak gerekiyor mu?
     -(master) kısmı hepsinde (master) olarak mı kalacak.

Gördüğünüz gibi çorba oldu kafam. Cevaplarla beraber gerekli komut ve komutun alacağı parametreleride yazarsınız. Komut veya örnek olmadan kolay kolay anlayamıyorum :) şimdiden teşekkürler...

Kabil ATICI

24C512 için sadece A0 ve A1 var görünüyor.

Burada chip id görünmüyor.
chip id olarak 0b10100(A1)(A0)(R/W) şeklinde tanımlanmış bir veridir.
(bazıları adres olarak belirtsede,) bundan sonraki gelen veri asıl adresi oluşturuyor. Yani verinin yazılacağı yeri.

muhtemeler bir chip id 24c512 kütüphanesinde, eğer uygun değişiklik yapılmazsa, diğer adreslerdeki ciplere erişemeyebilirsin.

Bu konuda basit bir şekilde, bu A1 sürekli lojik 0'da tutulup, A0, işlemcinin bir bacağına bağlanır. Ve sadece o eeprom'a yazılacağı zaman o çipin A0 bacağı lojik 0 çekilerek, sürekli olarak tüm eepromlar için 0xA0 chip id kullanılabilir. (  chip select gibi iş görmüş olur)
ambar7

bnmdmbrk

Teşekkür ederim Kabil ATICI. Dediğin gibi deneyeceğim.