MCP23S17 için örnek program

Başlatan Salih, 19 Ocak 2010, 11:17:19

Salih

MCP23S17 elemanı için örnek bir program forumumuzda yok. İhtiyacı olan olabilir diye kendimin oluşturup denediği kodları yayınlıyorum.
CCS versiyon : 4.084

//Bu program MCP23S17 elemanını kullanmak amacıyla hazırlanmıştır
//MCP23S17 elemanı port çoğullama için kullanılır. 8 bitlik iki porta sahiptir
//SPI veya I2C haberleşmelerinden birini kullanabilir.
//Bu programda SPI haberleşme kullanılmıştır.
//Okuma ve yazma işlemleri için iki fonksiyon tanımlanmıştır.
//Örnek olsun diye A portu giriş B portu çıkış olarak ayarlanmıştır.
//Program gerçek devre üzerinde denenmiştir.
//ISIS programında çalışmıyor. Nedenini şimdilik bulamadım.
//       PIC                   MCP23S17 
//    ------------            -----------
//      RC3    ->              CLK
//      RC4    ->              SO
//      RC5    ->              SI
//      RA2    ->              CS
//      RA3    ->              RESET     
#include <16F887.h>
#device *=16
#device adc=10

#FUSES NOWDT         //No Watch Dog Timer
#FUSES HS            //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES PUT           //Power Up Timer
#FUSES NOMCLR        //Master Clear pin used for I/O
#FUSES PROTECT       //Code protected from reads
#FUSES NOCPD         //No EE protection
#FUSES NOBROWNOUT    //No brownout reset
#FUSES IESO          //Internal External Switch Over mode enabled
#FUSES FCMEN         //Fail-safe clock monitor enabled
#FUSES NOLVP         //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NODEBUG       //No Debug mode for ICD
#FUSES NOWRT         //Program memory not write protected
#FUSES BORV40        //Brownout reset at 4.0V

#use delay(clock=8000000)
#define yaz    0b01000000 //MCP23S17 yazmak için en önce bu gönderilecek
#define oku    0b01000001 //MCP23S17 Okuma için en önce bu gönderilecek   

#define spi_clk   Pin_C3   
#define ETrisA    0x00 // İlave TrisA adresi (MCP23S17 için) 
#define ETrisB    0x01 // İlave TrisB adresi (MCP23S17 için)
#define EPortA    0x12 // İlave PortA adresi (MCP23S17 için)
#define EPortB    0x13 // İlave PortB adresi (MCP23S17 için)
#define IOCON     0x0A // Ayar registeri
#define GPPUA     0x0C // EPortA PullUp ayar registerı 0xFF bütün bitler pull-up

#Define Cs_on     output_high(Pin_A2)// Chip seçme biti
#Define Cs_off    output_low(Pin_A2)
#Define Rst_on    output_high(Pin_A3)// Chip reset biti
#Define Rst_off   output_low(Pin_A3)

void port_yaz(int8 adres,gir){
cs_off;
spi_write(yaz);
spi_write(adres);
spi_write(gir);
cs_on;
delay_us(10);
}

void Eport_setup(){
      // MCP23S17 Başlangıç reset işlemi.
      cs_on;
      setup_spi(SPI_MASTER|SPI_H_TO_L|SPI_CLK_DIV_16|SPI_XMIT_L_TO_H);
           
      output_low(Spi_clk);      
      delay_ms(6);
      rst_on;
      delay_ms(6);   

port_yaz(IOCON,0x10);
port_yaz(ETrisA,0xFF);
port_yaz(ETrisB,0x00);
port_yaz(GPPUA,0xFF);//A Portu girişleri tüm Pull-Up
}

int8 port_oku(int8 adres){
int8 y=0;
cs_off;
spi_write(oku);
spi_write(adres);
Y=spi_read(0);
cs_on;
Delay_us(10);
return(y);
}
int8 x=0;
void main()
{
   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);

   Set_Tris_C(0X10);   
   output_B(0);   
   Eport_setup();//İlave port kurma işlemleri 
   
   while(true){
   output_toggle(Pin_A5);//Devrenin kilitlenmediğini görmek için
   Port_yaz(EPortB,x); 
   output_B(Port_oku(EPortA));//İlave port girişleri B portunda gözleniyor  
   x++;
   delay_ms(500);
   }
}

mcan

Entegreye baktım fiyatı biraz pahalı gibi 1 dolar civarı bir fiyatı var, o civarda mikrokonrolör bulmak mümkün,PIC16F57-I/P gibilerinin fiyatı aşşağı yukarı bu seviyede hatta daha ucuzu da var.Fakat bu entegrenin ne gibi avantajları vardır bilemiyorum mesela giriş çkışları emc'e daha mı dayanıklı? Yoksa mikrokontrolörlere ekstra program atmak maliyetli diye mi bunlar tercih ediliyor? Renesas,atmel vs vs birsürü ucuz mikrolar varken bunun tercih edilmesinin sebebi nedir?

Salih

Ben ticari olarak kullanmadım. İnternetten anladığım kadarıyla genellikle, normal lcd veya grafik lcdleri seri haberleşmeli hale çevirmek için kullanılmış. Bir portuyla lcd sürülmüş diğer port giriş için kullanılmış gibi.

edurdag

elinize sağlık fakat kodu daha anlaşılır yapmak için satır yanlarına açıklama yazmanız mümkünmü...şimdiden elinize sağlık

Salih

Gerekli yerlerde açıklama var. Ama siz özellikle açıklanmasını
istediğiniz satır varsa, yardımcı olabilirim.