Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: ATMega16+DS1621
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
DK10000
Уважаемые форумчане. Решил побаловаться с датчиком температуры. Написал программу, используя аппаратный 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
smalcom
Используйте реальную аппаратуру.
DK10000
Проверил на реальной аппаратуре. Увы, не работает.
ILYAUL
Цитата
Я настраиваю датчик на непрерывное преобразование...


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


Код
while(1)
{
delay_ms(1000);
НЕ имеет смысла. Попасть на окончание преобразования и запуск нового практически не возможно , проверяй DONE
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.