roboforum.ru

Технический форум по робототехнике.
Текущее время: 02 дек 2024, 08:31

Часовой пояс: UTC + 4 часа




Начать новую тему Ответить на тему  [ Сообщений: 6 ] 
Автор Сообщение
 Заголовок сообщения: ATMega16+DS1621
СообщениеДобавлено: 20 фев 2014, 23:55 
Не в сети
Аватара пользователя

Зарегистрирован: 25 ноя 2008, 16:46
Сообщения: 33
Откуда: Томск
Уважаемые форумчане. Решил побаловаться с датчиком температуры. Написал программу, используя аппаратный TWI. Но возникла проблема. Я настраиваю датчик на непрерывное преобразование, но при опросе температуры он ведет себя как будто настроен на единичное преобразование. То есть замеряет первое значение температуры и оно больше не меняется в цикле, хотя в протеусе я меняю показания датчика. Как будто не записывается в его регистр управления число 0x00. Однако другие команды, например, "начать преобразование" прекрасно доходят и работают. В чем может быть проблема?

Вот код

Код:
/*****************************************************
Chip type               : ATmega16
Program type            : Application
AVR Core Clock frequency: 16,000000 MHz
Memory model            : Small
External RAM size       : 0
Data Stack size         : 256
*****************************************************/

#include <mega16.h>
#include <delay.h>
#define ACK                    0xD0
#define NACK                   0xD1



//Функции аппаратного I2C

void start_twi(void)                                                                 
{
   TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
   while (!(TWCR & (1<<TWINT))); 
}

void stop_twi(void)   
{
   TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO);
}
       
void write_twi(unsigned char data_byte)
{
   TWDR = data_byte;                             
   TWCR = (1<<TWINT) | (1<<TWEN); 
  while(!(TWCR & (1<<TWINT)));     
}


unsigned char i2read (unsigned ACK_Status)
{
   if(ACK_Status == ACK)                             
     TWCR = (1<<TWINT)| (1<<TWEA) | (1<<TWEN);     
      else                                         
        TWCR = (1<<TWINT)  | (1<<TWEN);             
                                                   
  while(!(TWCR & (1<<TWINT)));
  return TWDR;
}








void main(void)
{
DDRD=0xFF;
TWBR=0xC;


start_twi();
write_twi(0x90);
write_twi(0xAC);
write_twi(0x00);
stop_twi();


start_twi();
write_twi(0x90);
write_twi(0xEE);
stop_twi();


while(1)
{
delay_ms(1000);
start_twi();
write_twi(0x90);
write_twi(0xAA);   
start_twi();
write_twi(0x91);
i2read (ACK);
i2read (NACK);
stop_twi();



}

}


Вложения:
DS1621 + ATMega 16.rar [51.3 КиБ]
Скачиваний: 0
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ATMega16+DS1621
СообщениеДобавлено: 21 фев 2014, 10:18 
Не в сети
Аватара пользователя

Зарегистрирован: 25 ноя 2008, 16:46
Сообщения: 33
Откуда: Томск
То есть команды

Код:
start_twi();
write_twi(0x90);
write_twi(0xAC);
write_twi(0x00);
stop_twi();


Не доходят, хотя в Протеусе, в терминале I2C написано что дошло и сигнал A есть.

А вот такая конструкция работает и включает преобразование

Код:
start_twi();
write_twi(0x90);
write_twi(0xEE);
stop_twi();


Изображение

Одно и то же вроде. А такие странности... Хэлп!!! :cry:


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ATMega16+DS1621
СообщениеДобавлено: 21 фев 2014, 22:08 
Не в сети
Аватара пользователя

Зарегистрирован: 25 ноя 2008, 16:46
Сообщения: 33
Откуда: Томск
Ради интереса собрал на данных функция измеритель температуры с LCD экраном. Прошил реальный контроллер, увы на экране ЛСД пустота. Решил реализовать то же самое через встроенные в CODEVISION функции. В протеусе все работало. В жизни опять нет. Что делать...

Прилагаю два файла проекта.


Вложения:
DS1621+ATMega16+portA_LCD.rar [82.82 КиБ]
Скачиваний: 0
ATMEGA16+DS1621+codevision biliotter+LCD.rar [105.07 КиБ]
Скачиваний: 0
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ATMega16+DS1621
СообщениеДобавлено: 22 фев 2014, 00:22 
Не в сети

Зарегистрирован: 07 авг 2010, 21:29
Сообщения: 1725
Откуда: КМВ
прог. языки: C
ФИО: Андрей
Для отладки в подобных случаях пользуюсь светодиодом. Цепляю на ногу - зажигаю в нужных местах программы.
Вообще - я б проверил первым делом - действительно поставил ноги МК выходами?

_________________
Дым, идущий из всех устройств в помещении предвещает появление электрика.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ATMega16+DS1621
СообщениеДобавлено: 22 фев 2014, 01:49 
Не в сети
Аватара пользователя

Зарегистрирован: 25 ноя 2008, 16:46
Сообщения: 33
Откуда: Томск
В общем, чуть поигрался с Протеусом и непрерывное преобразование в нем заработало (так и не понял почему). Однако в жизни датчик не работает. Я решил проверить как вообще отзывается датчик. Он при адресе 0b10010000 выдает NACK то бишь не отзывается. Хотя я его выводы 5 6 7 посадил на землю. Подтяжку по 4.7 тоже поставил.

То есть этот код

Код:
start_twi();
write_twi(0b10010000);


Дает в регистре статуса TWSR код 0x20 что значит "Адресный пакет отправил, а подтверждение не было принято"

что забавно, второй датчик (у меня их два) вообще не приводит к выводу кода на экран. Может они какие-то сломанные? Вроде покупал в магазине, не выпаивал.

Прилагаю рабочий код, где подается адресный пакет и диагностическое сообщение выводится на жк экран в десятичной системе (24 (18 hex) - значит все в порядке, 32 (20 hex) - значит не отозвался на свой адрес).

Не знаю что и делать....

А разве порт С нужно делать выходом? Вроде если аппаратный TWI работает то это не требуется. Но все равно проверил, результат тот же. Датчик не отзывается. :cry:


Вложения:
DS1621+ATMega16+portA_LCD (Vorkin version).rar [82.27 КиБ]
Скачиваний: 0
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ATMega16+DS1621
СообщениеДобавлено: 22 фев 2014, 18:28 
Не в сети
Аватара пользователя

Зарегистрирован: 25 ноя 2008, 16:46
Сообщения: 33
Откуда: Томск
Хех, видимо, я так и останусь со свое проблемой... :cry:

Добавлено спустя 2 часа 19 минут 48 секунд:
В общем взял чужой рабочий проект на 8 меге, собрал все. Проверил на 10 раз. И увы. Не работают оба датчика. Вот и дела. В магазине продали две штуки и обе нерабочие. Тьфу...


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 6 ] 

Часовой пояс: UTC + 4 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 9


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
phpBB SEO