spashok2 0 29 сентября, 2005 Опубликовано 29 сентября, 2005 · Жалоба Помогите с вопросом: пытаюсь вывести 1 на линии порта P4 ( 2 линии двунаправленный) просто выводя значение в порт. Но ничего на линии не выводится. Может где-то программируется его направление. Как правильно выводить данные в этот порт? Я не нашел ничего по этому поводу в описании к мксх. Буду длагодарен за любую информацию. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ANT 0 29 сентября, 2005 Опубликовано 29 сентября, 2005 · Жалоба Мне кажется, что Вам надо просто подтянуть эту линию к питанию каким-нибудь резистором, и тогда сможете писать и 0 и 1. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
spashok2 0 29 сентября, 2005 Опубликовано 29 сентября, 2005 · Жалоба Спасибо за совет, я обязательно попробую. Но дело в том, что в описании на мксх про эти выводы ничего не сказано, а например про P0 (кстати тоже помог Ваш совет) отмечено, что это линии с открытым стоком. А так никаких особенностей вывода быть не должно? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ANT 0 30 сентября, 2005 Опубликовано 30 сентября, 2005 · Жалоба Это обычные линии 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; } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ANT 0 30 сентября, 2005 Опубликовано 30 сентября, 2005 · Жалоба Извиняюсь, был какой-то глюк при отправке ответа :-(. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться