1-wire ds18b20

Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Закрыто
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 31
Зарегистрирован: Чт май 05, 2011 22:37:15

Сообщение wir_wolf »

Доброго времени суток уважаемые. Пытаюсь сделать термометре на основе статьи http://kibermaster.net/rabota-s-shinoy- ... b20-k-avr/ и с WINSTAR WH1202A.

После того как убираю USART и printf по каким то не известным причинам перестает работать сканер устройств на шине.

Вот собственно код

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

#include "main.h"
#include <avr/io.h>
#include <avr/interrupt.h>  
#include <avr/wdt.h>
#include <stdio.h>
#include <util/delay.h>
#include "delay.h"
#include "onewire.h"
#include "ds18x20.h"




unsigned char	nDevices;	// количество сенсоров
unsigned char	owDevicesIDs[MAXDEVICES][8];	// Их ID


unsigned char search_ow_devices(void) // поиск всех устройств на шине
{ 
	unsigned char	i;
   	unsigned char	id[OW_ROMCODE_SIZE];
   	unsigned char	diff, sensors_count;
	
	sensors_count = 0;

	for( diff = OW_SEARCH_FIRST; diff != OW_LAST_DEVICE && sensors_count < MAXDEVICES ; )
    { 
		OW_FindROM( &diff, &id[0] );

      	if( diff == OW_PRESENCE_ERR ){break};

      	if( diff == OW_DATA_ERR ){break;}

      	for (i=0;i<OW_ROMCODE_SIZE;i++)
		{
			owDevicesIDs[sensors_count][i] = id[i];
		}			  
		sensors_count++;
    }
	return sensors_count;

}

int main_dalas_termo(void)
{

	DDRB = 0b00000010; PORTB = 0b00000010;

	nDevices = search_ow_devices(); // ищем все устройства

	if (nDevices == 0)
	{
		LCD_print("No_Devise",2,5);
	}
	for (unsigned char i=0; i<nDevices; i++) // теперь сотируем устройства и запрашиваем данные
	{
		DS18x20_StartMeasureAddressed(owDevicesIDs[i]); // запускаем измерение
		_delay_ms(800); // ждем минимум 750 мс, пока конвентируется температура
		unsigned char	data[2]; // переменная для хранения старшего и младшего байта данных
		DS18x20_ReadData(owDevicesIDs[i], data); // считываем данные
		unsigned char	themperature[3]; // в этот массив будет записана температура
		DS18x20_ConvertToThemperature(data, themperature); // преобразовываем температуру в человекопонятный вид
		char buff[10];
		
		itoa(themperature[1], buff, 10);
		LCD_print(buff,i,3);
		
		LCD_print(".",i,5);
		
		itoa(themperature[2], buff, 10);
		LCD_print(buff,i,6);

	}
		

}
ЗЫ. Порты заданы правильно.
AvR_Termometer.rar
Сорцы
(158.21 КБ) 304 скачивания
Контактная информация:
Реклама
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

Реклама
Закрыто

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