Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: P4 в AT89C5131
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
spashok2
Помогите с вопросом: пытаюсь вывести 1 на линии порта P4 ( 2 линии двунаправленный) просто выводя значение в порт. Но ничего на линии не выводится. Может где-то программируется его направление. Как правильно выводить данные в этот порт? Я не нашел ничего по этому поводу в описании к мксх. Буду длагодарен за любую информацию.
ANT
Мне кажется, что Вам надо просто подтянуть эту линию к питанию каким-нибудь резистором, и тогда сможете писать и 0 и 1.
spashok2
Спасибо за совет, я обязательно попробую. Но дело в том, что в описании на мксх про эти выводы ничего не сказано, а например про P0 (кстати тоже помог Ваш совет) отмечено, что это линии с открытым стоком. А так никаких особенностей вывода быть не должно?
ANT
Это обычные линии 51-го, вот кусок рабочего кода с ними(программная реализация I2C):

sbit MCU_SCL_OUT= P4^0; // TWI clock
sbit MCU_SDA= P4^1; // TWI data

#define scl_out MCU_SCL_OUT
#define sda_io MCU_SDA

//--------------------------------------------------
void i2c_start(void)
{
scl_out = 1;
delay(1);
sda_io = 1;
delay(1);
sda_io = 0; // Start condition
delay(1);
}
//--------------------------------------------------
void i2c_stop(void)
{
scl_out = 1;
delay(1);
sda_io = 0;
delay(1);
sda_io = 1; // Stop condition
delay(1);
}
//--------------------------------------------------
void i2c_send_byte(byte cool.gif
{byte i;
for( i=0x80; i; i >>= 1 ) {
scl_out = 0;
delay(1);
sda_io = (i & cool.gif ? 1 : 0;
delay(1);
scl_out = 1;
delay(1);
}
scl_out = 0;
delay(1);
sda_io = 0;
delay(1);
}
//--------------------------------------------------
bit i2c_get_ack(void)
{bit b;
sda_io = 1;
delay(1);
scl_out = 1;
delay(1);
b = !sda_io; // Acknoledge bit
delay(1);
scl_out = 0;
delay(1);
sda_io = 0;
delay(1);
return b;
}
//--------------------------------------------------
void i2c_wr_byte(word addr, byte dat)
{
i2c_start(); // Start
i2c_send_byte(I2C_WRITE); // Control byte WRITE
i2c_get_ack();
i2c_send_byte((byte)(addr & 0xff)); // Word address
i2c_get_ack();
i2c_send_byte(dat); // Data
i2c_get_ack();
i2c_stop(); // Stop initiates write cycle
delay_ms(21);
}
//--------------------------------------------------
byte i2c_receive_byte(void)
{byte b, i;
b = 0;
scl_out = 0;
delay(1);
for( i=0x80; i; i >>= 1 ) {
scl_out = 1;
delay(1);
b |= sda_io ? i : 0;
delay(1);
scl_out = 0;
delay(1);
}
scl_out = 1;
delay(1);
scl_out = 0;
delay(1);
return b;
}
//--------------------------------------------------
byte i2c_rd_byte(word addr)
{byte b;
i2c_start(); // Start
i2c_send_byte(I2C_WRITE); // Control byte READ
i2c_get_ack();
i2c_send_byte(addr); // Word address
i2c_get_ack();
i2c_start();
i2c_send_byte(I2C_READ); // Control byte READ
i2c_get_ack();
sda_io = 1;
delay(1);
b = i2c_receive_byte();
i2c_stop(); // Stop
return b;
}
ANT
Извиняюсь, был какой-то глюк при отправке ответа :-(.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.