Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ATmega AVR
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.58/43: Рейтинг темы: голосов - 43, средняя оценка - 4.58
ivkimyuz
1

TWI не хочет работать

10.07.2013, 17:34. Показов 7825. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
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;
}
Но не работает. После изменения TWCR бит TWINT = 0, TWSR = 0xF8. В чем может быть дело? Заранее спасибо.

P. S. К сожалению, ни UART to USB, ни JTAG программатора у меня пока еще нет, да и использую я не AVR Studyo с эмулятором, т. к. у меня Linux, поэтому временно приходится использовать такой однобитный интерфейс как светодиод :)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.07.2013, 17:34
Ответы с готовыми решениями:

USBasp не хочет работать с мк
Доброго времени суток.Подключил программатор к мк (мега32) и в AVRDUDE при попытке проверки МК...

АЦП в Atmega16 не хочет работать.
Здравствуйте. Вчера вот попытался заюзать встроенный АЦП у Atmega16, раскурил Даташит, настроил...

Atmega64 не хочет стабильно работать на 16Мгц
Доброго времени суток, и с Наступающим Новым годом, форумчане. Сложилась проблема у меня, и не...

Не хочет работать таймер ATMega 2560
Здравствуйте! Занимаюсь разработкой девайса обменивающегося с периферией по RS485. Работает в...

6
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
10.07.2013, 18:26 2
Цитата Сообщение от ivkimyuz
ATmego328p, код следующий. После старта он по идее должен выключить лампочку.
... ...
Но не работает. После изменения TWCR бит TWINT = 0, TWSR = 0xF8. В чем может быть дело?
А что, у Вас какая-то I2C-периферия подключена к МК? Почему Вы ожидаете, что прерывание сработает?

P.S. Статус 0xF8 - это "никакой" статус. Ничего ещё не произошло.
0
ivkimyuz
10.07.2013, 18:37 3
Цитата Сообщение от OtyxPM
Цитата Сообщение от ivkimyuz
ATmego328p, код следующий. После старта он по идее должен выключить лампочку.
... ...
Но не работает. После изменения TWCR бит TWINT = 0, TWSR = 0xF8. В чем может быть дело?
А что, у Вас какая-то I2C-периферия подключена к МК? Почему Вы ожидаете, что прерывание сработает?

P.S. Статус 0xF8 - это "никакой" статус. Ничего ещё не произошло.
Подключен PCF85741. Адрес 0x27, но насколько я понимаю адрес нужен только когда отправка идет, а тут даже START не получается. Схема по идее правильно собрана, потому что с ардуиновским Wire работает. Но хотелось бы разобраться как без ардуино это настроить.
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
10.07.2013, 18:49 4
Цитата Сообщение от ivkimyuz
Подключен PCF85741. Адрес 0x27, но насколько я понимаю адрес нужен только когда отправка идет, а тут даже START не получается. Схема по идее правильно собрана, потому что с ардуиновским Wire работает. Но хотелось бы разобраться как без ардуино это настроить.
Попробуйте для проверки так (пока без прерывания, поллингом):
Код
    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
добавил в конец ISR(TWI_vect) TWCR = _BV(TWINT)
А разве бит TWEN не нужен? Я бы так сделал: TWCR = TWCR_COMMON; (то есть биты TWEN и TVINT).
0
ivkimyuz
10.07.2013, 19:50 7
Цитата Сообщение от OtyxPM
Цитата Сообщение от ivkimyuz
добавил в конец ISR(TWI_vect) TWCR = _BV(TWINT)
А разве бит TWEN не нужен? Я бы так сделал: TWCR = TWCR_COMMON; (то есть биты TWEN и TVINT).
Ага, так и сделаю. Просто решил делать все пошагово и для начала у меня цель была просто запустить его, а TWEN нужен чтобы продолжать работу.
10.07.2013, 19:50
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.07.2013, 19:50
Помогаю со студенческими работами здесь

Не хочет работать DMA. Гад такой!
Решил поковырять ЦАП из STM32F100RB что на Дискавери стоит, причём в связке с DMA. Но вот не хочет...

Внешний проц. не хочет работать без ST-LINK (STM8L-Disc.)
1. Собрал схему на основе STM8L-Dyscovery, программировал и отлаживал в IAR Embeddid Workbench 6.0...

Интернет не хочет работать,все хорошо подключается а браузер открывать не хочет первую страницу отображает
ребят такой вопрос,установил винду 8,все норм только интернет не хочет работать,все хорошо...

Не хочет работать ...
1. Установил ПХП. 2. Проверяю домен ruseller.loc Выскакивает При открытии файла выдает сам код...

Не хочет работать AND
Приветствую) Есть код: $query_last5 = &quot;SELECT * FROM mail WHERE (to_id = 1 AND read = 0) ORDER BY...

Не хочет работать
#include&lt;time.h&gt; #include&lt;stdlib.h&gt; using namespace std; int main() { setlocale(0, &quot;&quot;); int...

Не хочет работать QT
Недавно начал изучать С++ и поставил QT creator 4.3.1(Community). Сначало было все норм, писал...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru