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
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
ustam çok sağol deneyeceğim. peki çıkış olarak kullanmak istersem ne göndermem gerek
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
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.
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.
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;
}
(http://s18.postimg.cc/6e6qnqub9/Ekran_Al_nt_s.jpg) (http://postimg.cc/image/6e6qnqub9/)
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
}
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
}
}
@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);
arkadaşım sağol sayende mcp23017 ve mcp23s17 ikisinide input ve output olarak kullanabiliyor.
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.