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

 
 
> 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



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

 


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


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