реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> TWI у ATMega8 Нужна помощь!
Metallist64
сообщение Oct 8 2009, 10:06
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 103
Регистрация: 29-01-08
Пользователь №: 34 558



Добрый день уважаемые знатоки!
При программировании интерфейса twi у ATMega8 столкнулся с проблемой.
Пытаюсь подключить датчик температуры LM75 по указанному интерфейсу.
Делаю вроде правильно:
1. Формирую стартовые условия.
2. После возникновения прерывания проверяю статусный регистр. Если битики TWS7...TWS3 дают чисто 0x08 то, посылаю байт адреса микросхемы (0х90)
3. После возникновения прерывания проверяю статусный регистр. Если битики TWS7...TWS3 дают чисто 0x18, посылаю байт указателя(0х00).
4. После возникновения прерывания проверяю статусный регистр. Если битики TWS7...TWS3 дают чисто 0x28... А они его не дают!!!
Уже замучился, никак не могу получить код 0х28 в статусном регистре.
Методом перебора нашел код, который тама получается: 0х10 - повстарт ??? причем он тут непонятно...
Кстати тоже самое было и с 1307, часы не ACKали байт указателя.
Обе линии подтянуты к питанию через 4.7 кОм.
Напряжение питания - 5В.
Если кто сталкивался с подобным, помогите плиз!

Вот код прерывания:

CODE
#pragma vector = TWI_vect
__interrupt void twi_interrupt(void)
{

if((0xf8&TWSR)==0x08)
{

buffer_1[0] = 0x9F;
TWDR = 0x90;
TWCR |= 0x84;
return;
}

if((0xf8&TWSR)==0x18)
{

buffer_1[1] = 0x25;
TWDR = 0x00;
TWCR |= 0x84;
return;
}

if((0xf8&TWSR)==0x28)
{

buffer_1[2] = 0x0D;
TWDR = 0x00;
TWCR |= 0x84;
return;
}
TWCR |= 0x94;
}
Go to the top of the page
 
+Quote Post
mempfis_
сообщение Oct 8 2009, 14:04
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409



Цитата
4. После возникновения прерывания проверяю статусный регистр. Если битики TWS7...TWS3 дают чисто 0x28... А они его не дают!!!
Уже замучился, никак не могу получить код 0х28 в статусном регистре.

А почему вы ожидаетет только 0х28?
Там возможны и другие варианты которые также являются правильными:
Код
case 0x18:            // SLA+W transmitted and ack received
case 0x28:            // data transmitted and ack received
case 0x40:            // SLA+R transmitted and ack received


После подачи start/repeat_start ожидаете 0x08 /0x10 (start прошёл).
Далее шлёте SLAW/SLAR (slave addr write/read) ожидайте статус 0x18/0x40.
Ну а дальше шлёте данные с ожиданием статуса 0x28.

А сам модуль TWI инициализировали правильно?

По поводу самого прерывания - у вас в каждом if стоит 0xf8&TWSR.
Вы смотрели как компилятор выполняет обработку считывания регистра TWSR?
Он не пытается для каждого if заново считать этот регистр?
Попробуйте сначала считвать регистр статуса в отделную переменную а потом использовать его во всех if.

Сообщение отредактировал mempfis_ - Oct 8 2009, 14:16
Причина редактирования: Нарушение п.3.4 Правил форума.
Go to the top of the page
 
+Quote Post
Metallist64
сообщение Oct 11 2009, 09:08
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 103
Регистрация: 29-01-08
Пользователь №: 34 558



Большое спасибо, кое-что стало понятно!
Так же решилась проблема с кодом 0х10 который шел после 0х18.
Оказалось, что в регистре TWCR требовалось записывать не только единички, но и нули.
После того, как стал записывать в регистр все биты, которые были указаны в DS проблема решилась.
Еще раз БОЛЬШОЕ СПАСИБО!!!
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 08:38
Рейтинг@Mail.ru


Страница сгенерированна за 0.01375 секунд с 7
ELECTRONIX ©2004-2016