ATMega16+DS1621

Программирование микроконтроллеров AVR, PIC, ARM.
Разработка и изготовление печатных плат для модулей.

ATMega16+DS1621

Сообщение DK10000 » 20 фев 2014, 23:55

Уважаемые форумчане. Решил побаловаться с датчиком температуры. Написал программу, используя аппаратный 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
Аватара пользователя
DK10000
 
Сообщения: 33
Зарегистрирован: 25 ноя 2008, 16:46
Откуда: Томск

Re: ATMega16+DS1621

Сообщение DK10000 » 21 фев 2014, 10:18

То есть команды

Код: Выделить всё
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:
Аватара пользователя
DK10000
 
Сообщения: 33
Зарегистрирован: 25 ноя 2008, 16:46
Откуда: Томск

Re: ATMega16+DS1621

Сообщение DK10000 » 21 фев 2014, 22:08

Ради интереса собрал на данных функция измеритель температуры с LCD экраном. Прошил реальный контроллер, увы на экране ЛСД пустота. Решил реализовать то же самое через встроенные в CODEVISION функции. В протеусе все работало. В жизни опять нет. Что делать...

Прилагаю два файла проекта.
Вложения
DS1621+ATMega16+portA_LCD.rar
(82.82 КиБ) Скачиваний: 0
ATMEGA16+DS1621+codevision biliotter+LCD.rar
(105.07 КиБ) Скачиваний: 0
Аватара пользователя
DK10000
 
Сообщения: 33
Зарегистрирован: 25 ноя 2008, 16:46
Откуда: Томск

Re: ATMega16+DS1621

Сообщение RootAdmin » 22 фев 2014, 00:22

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

Re: ATMega16+DS1621

Сообщение DK10000 » 22 фев 2014, 01:49

В общем, чуть поигрался с Протеусом и непрерывное преобразование в нем заработало (так и не понял почему). Однако в жизни датчик не работает. Я решил проверить как вообще отзывается датчик. Он при адресе 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
Аватара пользователя
DK10000
 
Сообщения: 33
Зарегистрирован: 25 ноя 2008, 16:46
Откуда: Томск

Re: ATMega16+DS1621

Сообщение DK10000 » 22 фев 2014, 18:28

Хех, видимо, я так и останусь со свое проблемой... :cry:

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


Вернуться в Микроконтроллеры

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

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

cron