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

 
 
> 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
 
Start new topic
Ответов
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



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

 


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


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