AtMega32 TWI + LM75A

Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Ответить
Встал на лапы
Сообщения: 99
Зарегистрирован: Чт мар 08, 2012 18:05:49
Откуда: Пермь

Сообщение 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, по питанию установлен конденсатор.
Реклама
Опытный кот
Сообщения: 804
Зарегистрирован: Чт мар 12, 2009 16:31:05

Сообщение Vov123 »

Конечно надо брать даташит и отрабатывать функции для начала в протеусе.
Но если религия позволяет,можно воспользоваться CVAVR,во встроенной библиотеке используется,по-моему,одна функция - чтение температуры.
Реклама
Встал на лапы
Сообщения: 99
Зарегистрирован: Чт мар 08, 2012 18:05:49
Откуда: Пермь

Сообщение x8973 »

Мда. Поторопился я с открытием темы) Сделал все на прерываниях - и вот оно, все работает и ничего не виснет)
Ответить

Вернуться в «Периферия»