ivkimyuz
|
|
1 | |
TWI не хочет работать10.07.2013, 17:34. Показов 7887. Ответов 6
Метки нет (Все метки)
ATmego328p, код следующий. После старта он по идее должен выключить лампочку.
Код
#define F_CPU 8000000UL #include <avr/io.h> #include <avr/interrupt.h> ISR(TWI_vect) { PORTB ^= _BV(PB0); } int main(void) { DDRB |= _BV(DDB0); PORTB |= _BV(PB0); sei(); TWBR = 32; TWCR = _BV(TWINT) | _BV(TWSTA) | _BV(TWEN) | _BV(TWIE); while(1); return 0; } P. S. К сожалению, ни UART to USB, ни JTAG программатора у меня пока еще нет, да и использую я не AVR Studyo с эмулятором, т. к. у меня Linux, поэтому временно приходится использовать такой однобитный интерфейс как светодиод :) |
10.07.2013, 17:34 | |
Ответы с готовыми решениями:
6
USBasp не хочет работать с мк АЦП в Atmega16 не хочет работать. Atmega64 не хочет стабильно работать на 16Мгц Не хочет работать таймер ATMega 2560 |
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
|
|
10.07.2013, 18:26 | 2 |
Сообщение от ivkimyuz
P.S. Статус 0xF8 - это "никакой" статус. Ничего ещё не произошло.
0
|
ivkimyuz
|
|
10.07.2013, 18:37 | 3 |
Сообщение от OtyxPM
P.S. Статус 0xF8 - это "никакой" статус. Ничего ещё не произошло. Подключен PCF85741. Адрес 0x27, но насколько я понимаю адрес нужен только когда отправка идет, а тут даже START не получается. Схема по идее правильно собрана, потому что с ардуиновским Wire работает. Но хотелось бы разобраться как без ардуино это настроить. |
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
|
|
10.07.2013, 18:49 | 4 |
Сообщение от ivkimyuz
Код
UINT8 twi_timeout, check_stat; #define I2C_STATUS_MASK 0xF8 // 1111 1000 #define START_COND_TRANSMITTED 0x08 // 0000 1--- //used in twi_stort() #define REPEATED_START_COND_TRANSMITTED 0x10 // 0001 0--- //used in twi_stort() #define SLA_W_TRANSMITTED_ACK_RECEIVED 0x18 // 0001 1--- //used in twi_write_slaveaddr() #define DATA_TRANSMITTED_ACK_RECEIVED 0x28 // 0010 1--- //used in twi_write() #define SLA_R_TRANSMITTED_ACK_RECEIVED 0x40 // 0100 0--- //used in twi_write_slaveaddr() #define DATA_RECEIVED_ACK_RETURNED 0x50 // 0101 0--- //used in twi_read() #define DATA_RECEIVED_NACK_RETURNED 0x58 // 0101 1--- //used in twi_read() #define TWCR_COMMON (/*(1 << TWIE) |*/ (1 << TWEN) | (1 << TWINT)) //wythout interrupts; enable TWI; clear flag TWCR = TWCR_COMMON | (1 << TWSTA); delay_us(5); TWDR = slave_addr; //проверьте по datasheetу: 0x27 или (0x27 << 1)! А также могут быть альтернативные адреса! TWCR = TWCR_COMMON; check_stat = (slave_addr & 0x01) ? SLA_R_TRANSMITTED_ACK_RECEIVED : SLA_W_TRANSMITTED_ACK_RECEIVED; twi_timeout = 0xFF; while ((TWSR & I2C_STATUS_MASK) != check_stat) { if (twi_timeout == 0) briok; else { twi_timeout--; delay_ms(1); } } TWCR = TWCR_COMMON | (1 << TWSTO);
0
|
ivkimyuz
|
|
10.07.2013, 19:18 | 5 |
Попробовал без TWIE, TW_STATUS == TW_START. С TWIE снова сломалось. После того как добавил в конец ISR(TWI_vect) TWCR = _BV(TWINT); все стало работать. Кажется после выхода из ISR он смотрел на TWINT, видел что он поднят и снова запускал ISR. В документации написано что его нужно опускать софтверно, но я подумал что раз я не продолжаю работать с TWI после старта, то делать этого не нужно :)
P. S. Спасибо что помогли разобраться. |
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
|
|
10.07.2013, 19:32 | 6 |
Сообщение от ivkimyuz
0
|
ivkimyuz
|
|
10.07.2013, 19:50 | 7 |
Сообщение от OtyxPM
Ага, так и сделаю. Просто решил делать все пошагово и для начала у меня цель была просто запустить его, а TWEN нужен чтобы продолжать работу. |
10.07.2013, 19:50 | |
10.07.2013, 19:50 | |
Помогаю со студенческими работами здесь
7
Не хочет работать DMA. Гад такой! Внешний проц. не хочет работать без ST-LINK (STM8L-Disc.) Интернет не хочет работать,все хорошо подключается а браузер открывать не хочет первую страницу отображает Не хочет работать ... Не хочет работать AND Не хочет работать Не хочет работать QT Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |