Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: TWI у ATMega8 Нужна помощь!
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
Metallist64
Добрый день уважаемые знатоки!
При программировании интерфейса 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;
}
mempfis_
Цитата
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.
Metallist64
Большое спасибо, кое-что стало понятно!
Так же решилась проблема с кодом 0х10 который шел после 0х18.
Оказалось, что в регистре TWCR требовалось записывать не только единички, но и нули.
После того, как стал записывать в регистр все биты, которые были указаны в DS проблема решилась.
Еще раз БОЛЬШОЕ СПАСИБО!!!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.