mcp23017 calışması hakkında yardım

Başlatan korcenk, 15 Mayıs 2014, 11:58:08

korcenk

arkadaşlar mcp23017 entegresinden input okuya bilmek için entegrenin registırını nasıl ayarlama gerekiyor.datasheet te baktım ama anlayamadım.
yardımcı olursanız sevinirim.
iyi çalışmalar

CLR

sadece okuma yapacaksan register ayarlamana gerek yok çünkü default olarak portlar giriş , yani  A portunu okuyacaksan
0x41(read),GPIOA(0x09), ile okuyabilirsin, B portu için 0x19

Knowledge and Experience are Power

korcenk

ustam çok sağol deneyeceğim. peki çıkış olarak kullanmak istersem ne göndermem gerek

CLR

 A portunu çıkış yapmak için

0x40+0x00+0x00   //PORTA pinlerinin tümünü çıkış yapar
0x40+0x00+0xF0   //PORTA pinlerinin 0-3 çıkış/ 4-7 giriş yapar

Mesela PORTA'ya 0xFF yazmak için önce bir kereye mahsus
0x40+0x00(IODIRA)+0x00  // gönderilir yani portun tamamı çıkış yapılır
0x40+0x0A(OLATA)+0xFF   // artık pinlerde 0xFF görülecektir


Bu chip çok fonksiyonel, herderde deva, ben SPI olanını tercih ediyorum
Knowledge and Experience are Power

korcenk

#4
arkadaşım verdiğin bilgiler için sağol. input olarak okumayı başaramadım hep ff geliyor. output olarak yazma işleminde ise 0b00001111 yazarsam yazmıyor.0b10001111 yazarsam hepsini yazıyor yani lsb bitlerini yazmıyor ama msb bitlerinden 1 tanesi olursa lsb ve msb yi yazıyor.
yardımcı olabilirmisiniz.

CLR

yardımcı olamam çünkü ortada işlemci yok, kod yok, hardware I2C veya soft I2C hangisini kullandığın belli değil, şematik yok, ne yazarsam boşuna olur. Önce buraya devre şematiğini sonra yazdığın kodu yükle hata nerede o zaman bakabilirim.
Knowledge and Experience are Power

korcenk

arkadaşım kusura bakma şemayı ve kodu ekledim.

#include <xc.h>
#include "stdio.h"
#include "stdlib.h"
#include "plib/i2c.h"

char i=0;
void main(void) {
    TRISB=0x00;
    PORTB=0x00;
    OpenI2C(MASTER, SLEW_OFF);   // Initialize I2C module
   SSPADD = 9;

    StartI2C();
    IdleI2C();
    WriteI2C(0x40);
    IdleI2C();
    WriteI2C(0x00);
    IdleI2C();
    WriteI2C(0x00);
    StopI2C();

     while (1) {
    StartI2C();
    IdleI2C();
    WriteI2C(0x40);
    IdleI2C();
    WriteI2C(0x0a);
    IdleI2C();
    WriteI2C(0b00001111);
    IdleI2C();
    StopI2C();

    StartI2C();
    IdleI2C();
    WriteI2C(0x41);
    IdleI2C();
    WriteI2C(0x19);
    IdleI2C();
    i=ReadI2C();
    StopI2C();
    PORTB=i;
    }




CLR

Aşağıdaki kodu dene, çalışması lazım, ayrıca işlemci frekensını yazmamışsın, I2C clock frekansını düşürüp denersen daha emin olabilirsin. Ayrıca yazdığım yerlere en az 1ms delay ekle, çalıştırınca istersen silersin. 



char i=0;
void main(void) {
    TRISB=0x00;
    PORTB=0x00;
    OpenI2C(MASTER, SLEW_OFF);   // Initialize I2C module
   SSPADD = 9;

// bank değiştir
    StartI2C();
    IdleI2C();
    WriteI2C(0x40);
    IdleI2C();
    WriteI2C(0x0A);
    IdleI2C();
    WriteI2C(0x80);
    StopI2C();
//delay 1ms
// porta output
    StartI2C();
    IdleI2C();
    WriteI2C(0x40);
    IdleI2C();
    WriteI2C(0x00);
    IdleI2C();
    WriteI2C(0x00);
    StopI2C();
// delay  1ms
     while (1) {
    StartI2C();
    IdleI2C();
    WriteI2C(0x40);
    IdleI2C();
    WriteI2C(0x0a);
    IdleI2C();
    WriteI2C(0b00001111);
    IdleI2C();
    StopI2C();
// delay 1ms
    StartI2C();
    IdleI2C();
    WriteI2C(0x41);
    IdleI2C();
    WriteI2C(0x19);
    IdleI2C();
    i=ReadI2C();
    StopI2C();
    PORTB=i;
//delay ms
    }
Knowledge and Experience are Power

korcenk

kodu denedim ouput düzeldi.dediklerinide yaptım ama hala input okuyamıyorum .i2c frekansını 100khz ayarladım.
#define _XTAL_FREQ 4000000
#include <xc.h>
#include "stdio.h"
#include "stdlib.h"
#include "plib/i2c.h"

char i=0;
void main(void) {
    TRISB=0x00;
    PORTB=0x00;
    OpenI2C(MASTER, SLEW_OFF);   // Initialize I2C module
   SSPADD = 9;

   // bank değiştir
    StartI2C();
    IdleI2C();
    WriteI2C(0x40);
    IdleI2C();
    WriteI2C(0x0A);
    IdleI2C();
    WriteI2C(0x80);
    StopI2C();
    __delay_ms(1);
//delay 1ms
// porta output
    StartI2C();
    IdleI2C();
    WriteI2C(0x40);
    IdleI2C();
    WriteI2C(0x00);
    IdleI2C();
    WriteI2C(0x00);
    StopI2C();
    __delay_ms(1);
// delay  1ms


 while (1) {
    StartI2C();
    IdleI2C();
    WriteI2C(0x40);
    IdleI2C();
    WriteI2C(0x0a);
    IdleI2C();
    WriteI2C(0b00001111);
    IdleI2C();
    StopI2C();
    __delay_ms(1);
// delay 1ms
    StartI2C();
    IdleI2C();
    WriteI2C(0x41);
    IdleI2C();
    WriteI2C(0x19);
    IdleI2C();
    i=ReadI2C();
    StopI2C();
    PORTB=i;
    __delay_ms(1);
//delay ms
    }
}

CLR

@korcenk

datasheet okumayı öğrenmen lazım,

// okuma kısmı

StartI2C();
    IdleI2C();
    WriteI2C(0x40);
    IdleI2C();
    WriteI2C(0x19);
    IdleI2C();
    RestartI2C();
     IdleI2C();
    WriteI2C(0x41);
    IdleI2C();
    i=ReadI2C();
    IdleI2C();
    NotAckI2C();
    IdleI2C();
    StopI2C();
    PORTB=i;
    __delay_ms(1);
Knowledge and Experience are Power

korcenk

arkadaşım sağol sayende mcp23017 ve mcp23s17 ikisinide input ve output olarak kullanabiliyor.

CLR

rica ederim, o chip'in çok özeliiği var, şuan en basit özelliklerini kullanıyorsun, zamanla diğerlerinide geliştirirsin, spi kullanırsan daha problemsiz kullanabilirsin.
Knowledge and Experience are Power