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

 
 
 
Reply to this topicStart new topic
> ATMega16+DS1621, ATMega16+DS1621
DK10000
сообщение Feb 21 2014, 06:38
Сообщение #1





Группа: Новичок
Сообщений: 2
Регистрация: 21-02-14
Пользователь №: 80 626



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

Вот код

CODE
/*****************************************************
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();



}

}



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

Код
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();




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

Сообщение отредактировал IgorKossak - Feb 21 2014, 08:22
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!

Прикрепленные файлы
Прикрепленный файл  DS1621___ATMega_16.rar ( 51.3 килобайт ) Кол-во скачиваний: 14
 
Go to the top of the page
 
+Quote Post
smalcom
сообщение Feb 21 2014, 07:11
Сообщение #2


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

Группа: Свой
Сообщений: 1 292
Регистрация: 26-06-07
Пользователь №: 28 718



Используйте реальную аппаратуру.
Go to the top of the page
 
+Quote Post
DK10000
сообщение Feb 21 2014, 18:00
Сообщение #3





Группа: Новичок
Сообщений: 2
Регистрация: 21-02-14
Пользователь №: 80 626



Проверил на реальной аппаратуре. Увы, не работает.
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Feb 22 2014, 16:34
Сообщение #4


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

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Цитата
Я настраиваю датчик на непрерывное преобразование...


Код
start_twi();
write_twi(0xEE);


Код
while(1)
{
delay_ms(1000);
НЕ имеет смысла. Попасть на окончание преобразования и запуск нового практически не возможно , проверяй DONE


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post

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

 


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


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