Страница 1 из 1

AtMega32 TWI + LM75A

Добавлено: Вс май 19, 2013 07:53:33
x8973
Проблема, товарищи. Второй день бьюсь пальцами об клавиатуру, а хочется головой об стену.
Не могу заставить правильно работать связку AtMega32A и LM75A. Написал код для получения байта данных из датчика, все проверки сделал, а оно не работает... Точнее, прорабатывает до конца функции, но байт так и не возвращает. Да еще и виснет потом, если повторно запрос температуры сделать.
Вот код инициализации TWI:

Код: Выделить всё

void funcTWIInit(void) //Инициализация шины i2c
{
	PORTC |= (1<<PC0)|(1<<PC1);	//Внутренние подтягивающие резисторы
	DDRC &= ~((1<<PC0)|(1<<PC1));
	TWBR = 10; //Настройка скорости работы
	TWSR = 0x00;
}
Вот код самого запроса температуры:

Код: Выделить всё

char funcGetTemperature()
{
	//USART_Transmit('0');
	uint8_t temp = 0x00;
	//Формируем START
	TWCR = (1<<TWEN) | (1<<TWINT) | (1<<TWSTA);
	//Ждем ответа датчика
	while (!(TWCR & (1<<TWINT)));
	//Если START принят, то
	if ((TWSR & 0xF8) == 0x08)
	{
		//USART_Transmit('1');
		//Загружаем адрес для чтения
		TWDR = 0x9F; //Адрес датчика 1001111 (0x4F) плюс бит чтения - 10011111 (0x9F)
		//Отправляем пакет с адресом
		TWCR=(1<<TWEN)|(1<<TWINT);
		//Ждем ответа датчика
		while (!(TWCR & (1<<TWINT)));
		//Если адрес принят, то
		if ((TWSR & 0xF8) == 0x40)
		{
			//USART_Transmit('2');
			//Запрашиваем байт данных
			TWCR=(1<<TWEN)|(1<<TWINT);
			//Ждем ответа датчика
			while (!(TWCR & (1<<TWINT)));
			//Если данные получены, то
			if ((TWSR & 0xF8) == 0x58)
			{
				//USART_Transmit('3');
				//Читаем байт данных
				temp = TWDR;
				//Формируем STOP
				TWCR = (1<<TWEN)|(1<<TWINT)|(1<<TWSTO);
			}
		}
	}
	return temp;
}
Может мне кто помочь? На самом датчике линии SDA и SCL подтянуты резисторами к Vcc, по питанию установлен конденсатор.

Re: AtMega32 TWI + LM75A

Добавлено: Вс май 19, 2013 08:08:06
Vov123
Конечно надо брать даташит и отрабатывать функции для начала в протеусе.
Но если религия позволяет,можно воспользоваться CVAVR,во встроенной библиотеке используется,по-моему,одна функция - чтение температуры.

Re: AtMega32 TWI + LM75A

Добавлено: Вс май 19, 2013 08:50:17
x8973
Мда. Поторопился я с открытием темы) Сделал все на прерываниях - и вот оно, все работает и ничего не виснет)