Перейти к содержанию
    

P4 в AT89C5131

Помогите с вопросом: пытаюсь вывести 1 на линии порта P4 ( 2 линии двунаправленный) просто выводя значение в порт. Но ничего на линии не выводится. Может где-то программируется его направление. Как правильно выводить данные в этот порт? Я не нашел ничего по этому поводу в описании к мксх. Буду длагодарен за любую информацию.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Мне кажется, что Вам надо просто подтянуть эту линию к питанию каким-нибудь резистором, и тогда сможете писать и 0 и 1.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо за совет, я обязательно попробую. Но дело в том, что в описании на мксх про эти выводы ничего не сказано, а например про P0 (кстати тоже помог Ваш совет) отмечено, что это линии с открытым стоком. А так никаких особенностей вывода быть не должно?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это обычные линии 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 B)

{byte i;

for( i=0x80; i; i >>= 1 ) {

scl_out = 0;

delay(1);

sda_io = (i & B) ? 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;

}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...