Свежие обсуждения
Микроконтроллеры

I2C + PIC + CСS + Prоteus= Проблема?

1 5

Сергей К: Залил на наш обменник
Супергут!

 

доброго времени суток, я не силен в контроллерах, но по пробую изложить суть вопроса. Есть PIC к нему подсоединена память и часы. причем если прописать
#use i2c(MASTER, SLOW, FORCE_HW, sda=PIN_A2, scl=PIN_A1)
то работают часы, но из памяти ничего не считывается, а если
#use i2c(MASTER, SLOW, FORCE_HW, sda=PIN_B5, scl=PIN_B3)
то наоборот, не работают часы, но читает из памяти...
подскажите как решить данную проблему
возможно как то менять настройку ПИНов?
спасибо!

 

Подключите и часы и память к одним и тем-же ножкам МК.
Интерфейс I2C подразумевамет подключение в паралель нескольких устройств.

 

а не перепаивая сделать невозможно?

 

Точно не помню. Для UARTа можно сделать несколько разных, а вот для I2C точно не помню, посмотрите в документации по СCS в разделе про I2C, там тищите параметр на подобие STREAM="i2c_1" и подобное.
Возможно есть еще функция для настройки I2C прямо в процессе работы.

 

спасибо) надеюсь найду)

 

придумал еще способ, не сильно оригинальный, т. к. не нашел как менять порты в процессе, я решил рядом с встроенным i2c интерфейсом вставить еще один, который будет работать с другими портами. Нашел в инете множество примеров, но компилятор ругается.
#define SCL TRISA1 // шина I2C
#define SDA TRISA2 //
#define SCL_IN RA1 //
#define SDA_IN RA2 //

void i2c2_dly(void)
{
}

void i2c2_start(void)
{
SDA = 1; // последовательность стартовых битов i2c
i2c2_dly();
SCL = 1;
i2c2_dly();
SDA = 0;
i2c2_dly();
SCL = 0;
i2c2_dly();
}
//---------------------------------------------------------------------------------------
void i2c2_stop(void)
{
SDA = 0; // последовательность завершающих битов i2c
i2c2_dly();
SCL = 1;
i2c2_dly();
SDA = 1;
i2c2_dly();
}
unsigned char i2c2_read(char ack)
{
char x, d=0;
SDA = 1;
for(x=0; x8; x++) {
d = 1;
do {
SCL = 1;
}
while(SCL_IN==0); // ждем любые длинные синхроимпульсы SCL
i2c2_dly();
if(SDA_IN) d |= 1;
SCL = 0;
}
if(ack) SDA = 0;
else SDA = 1;
SCL = 1;
i2c2_dly(); // отсылаем (N)ACK бит
SCL = 0;
SDA = 1;
return d;
}

bit i2c2_write(unsigned char d)
{
char x;
static bit b;
for(x=8; x; x--) {
if(d&0x80) SDA = 1;
else SDA = 0;
SCL = 1;
d = 1;
SCL = 0;
}
SDA = 1;
SCL = 1;
i2c2_dly();
b = SDA_IN; // возможный ACK бит
SCL = 0;
return b;
}

пишет
Undefined identifier TRISA2
Undefined identifier RA2
ну и еще много чего помимо, может подскажете как корректно заменить, чтобы работало, заранее спасибо

 

искал как разными путями добиться работоспособности, но решил скинуть оригинальный пример

 

Kirst0n: Undefined identifier TRISA2
это ссылка на регистр
#byte TRISA = getenv("SFR:TRISA")

Kirst0n: Undefined identifier RA2
это ссылка на ножку порта (бит)
#bit RA2 = PORTA.2

 

все, разобрался, действительно просто реализуется
#use i2c(MASTER, SLOW, FORCE_HW, sda=Device_SDA, scl=Device_SLC, STREAM=A)
#use i2c(MASTER, SLOW, FORCE_HW, sda=PIN_A2 , scl=PIN_A1 , STREAM=B)

 
1 5