1-Wire для DS18b20(Atmel Studio 6.2)

Обсуждаем контроллеры компании Atmel.
Ответить
Neptyn
Родился
Сообщения: 15
Зарегистрирован: Чт июл 21, 2011 09:58:24

1-Wire для DS18b20(Atmel Studio 6.2)

Сообщение Neptyn »

Делаю метеостанцию на Atmega8.
Не могу подключить датчик DS18b20 с помощью библиотеки отсюда: http://chipenable.ru/index.php/programm ... tvami.html.
Контроллер не видит датчик.
Код(Пожалуйста не обращайте внимания на большое количество прерываний :)) ):

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

#define F_CPU										8000000
#define ADC_Stop									(1)
#define MPX_messure									(2)
#define LM_messure									(3)
#define UART_data_ok								(4)
#define UART_reception_ended						(5)
#define UART_transfer_completed						(6)
#define VS											5000
#define amount_of_messung							12
#define amount_of_sensors							3

#define BUS											OWI_PIN_0
#define DS18B20_FAMILY_ID							0x28
#define DS18B20_CONVERT_T							0x44
#define DS18B20_READ_SCRATCHPAD						0xbe
#define DS18B20_WRITE_SCRATCHPAD					0x4e
#define DS18B20_COPY_SCRATCHPAD						0x48
#define DS18B20_RECALL_E							0xb8
#define DS18B20_READ_POWER_SUPPLY					0xb4
#define MAX_DEVICES									4
#define READ_SUCCESSFUL								0x00
#define READ_CRC_ERROR								0x01
#define SEARCH_SENSORS								0x00
#define SENSORS_FOUND								0xff

#include <avr/io.h>
#include <math.h>
#include <util/delay.h>
#include <avr/pgmspace.h>
#include <avr/interrupt.h>

#include "UART_macros.h"
#include "lcd_lib.c"
#include "Bits_macros.h"
#include "1Wire\OWIPolled.h"
#include "1Wire\OWIHighLevelFunctions.h"
#include "1Wire\OWIBitFunctions.h"
#include "1Wire\common_files\OWIcrc.h"

volatile register uint8_t a asm("r8");
volatile register uint8_t n asm("r9");
volatile register uint8_t n_of_sensor asm("r10");
volatile register uint8_t i asm("r11");
volatile uint8_t Status, lng,
UART_received_Data[UART_Size_of_buf]={0x41, 0x74, 0x6d, 0x65, 0x67, 0x61, 0x33, 0x32, 0x20, 0x55, 0x41, 0x52, 0x54, 0x20, 0x69, 0x73, 0x20, 0x72, 0x65, 0x61, 0x64, 0x79, 0x21},//"Atmega32 UART is ready!";
UART_reception_Data[UART_Size_of_buf], rezultH, rezultL;
int A_D_C = 0;
OWI_device allDevices[MAX_DEVICES];
unsigned char rom[8];
unsigned int temperature = 0;
unsigned char num = 0;

ISR (USART_RXC_vect)	
{
	if (a >= UART_Size_of_buf)	
	{
		UART_interrupt_completion_reception_wildcat;
		UART_reception_wildcat;
		SetBit(Status, UART_reception_ended);
		a = 0;
	}
	else
	{
		UART_received_Data[a] = UDR;
		a++;
	}
	sei();
	//LCDsendChar(rc);
}

ISR (USART_TXC_vect)	
{
	SetBit(Status, UART_transfer_completed);
	//a=0;
	sei();
}

ISR (USART_UDRE_vect)	
{
	a++;
	if(a == lng)
	{
		UART_interrupt_on_clean_UDR_wildcat;	
		UART_transfer_wildcat;	
		a=0;
		UART_reception_allow;	
		UART_interrupt_completion_reception_allow;	
	}
	else
	{
		UDR = UART_reception_Data[a];	//починаєм передачу чергового байта
	}
	sei();
}

ISR(TIMER0_OVF_vect)
{
	//ADCSR = (1<<ADSC);
	if (i >= 2)
	{
		i = 0;
		ADMUX |= (1<<REFS0);
		switch (n_of_sensor)
		{
			case 0:
			ADMUX |= (0<<MUX0) | (0<<MUX1) | (0<<MUX2) | (0<<MUX3);
			break;
			case 1:
			ADMUX |= (1<<MUX0) | (0<<MUX1) | (0<<MUX2) | (0<<MUX3);
			break;
			case 2:
			ADMUX |= (0<<MUX0) | (1<<MUX1) | (0<<MUX2) | (0<<MUX3);
			break;
		}
		ADCSRA |= (1<<ADEN) | (1<<ADSC) | (1<<ADIE) | (1<<ADPS1) | (1<<ADPS0);
		n ++;	
	} 
	else
	{
		i ++;
	}
	sei();
}

ISR(ADC_vect)
{
	/*rezultL=ADCL;
	rezultH=ADCH;*/
	A_D_C = ADC;
	if (i == 0)
	{
		SetBit(Status, ADC_Stop);
	}
	sei();
}

unsigned char DS18B20_ReadTemperature(unsigned char bus, unsigned char * id, unsigned int* temperature)
{
    unsigned char scratchpad[9];
    unsigned char i;
	
    OWI_DetectPresence(bus);
    OWI_MatchRom(id, bus);
    OWI_SendByte(DS18B20_CONVERT_T ,bus);
	
    while (!OWI_ReadBit(bus));
    OWI_DetectPresence(bus);
    OWI_MatchRom(id, bus);
    OWI_SendByte(DS18B20_READ_SCRATCHPAD, bus);
    for (i = 0; i<=8; i++){
      scratchpad[i] = OWI_ReceiveByte(bus);
    }
    
    if(OWI_CheckScratchPadCRC(scratchpad) != OWI_CRC_OK){
      return READ_CRC_ERROR;
    }
    
    *temperature = (unsigned int)scratchpad[0];
    *temperature |= ((unsigned int)scratchpad[1] << 8);
    
    return READ_SUCCESSFUL;
}

int main(void)
{
	//*******UART
	DDRB |= 1<<0;
	UBRRH = 0x00;
	UBRRL = 51;
	lng = strlen(UART_reception_Data);
	UART_transfer_allow;
	UDR = UART_received_Data[0];
	UART_interrupt_on_clean_UDR_allow;
	a = 0;
	//******АЦП
	ADMUX |= (1<<REFS0);
	ADCSRA |= (1<<ADEN) | (0<<ADSC) | (1<<ADIE) | (1<<ADPS1) | (1<<ADPS0);
	n = 0;
	n_of_sensor = 0;
	float messure_sum[amount_of_messung];
	/*for (uint8_t j = 0; j < amount_of_messung; j ++)
	{
		messure_sum[j] = 0
	}*/
	//******PORTS
	DDRD = 0b00000010;
	//*******LCDmonitor
	//*
	LCDinit();
	LCDclr();
	LCDhome();
	//LCDstring("WER", 3);
	//*/
	//*****Timer0
	TCCR0 = (1 << CS12) | (0 << CS11) | ( 1 << CS10);
	TIMSK = (1 << TOIE0);
	TCNT0 = 0;
	i = 0;
	//*****DS18B20
	OWI_Init(BUS);
	OWI_SearchDevices(allDevices, MAX_DEVICES, BUS, &num);
	unsigned int temperature = 0;
	unsigned char searchFlag = SEARCH_SENSORS;
	unsigned char crcFlag = 0;
	unsigned char num = 0;
	//*****		
	sei(); 
    while(1)
    {
		char myStg[10];
		/*unsigned int temperature = 0;
		DS18B20_ReadTemperature(BUS, allDevices[0].id, &temperature);
		sprintf(myStg, "t=%i", temperature);
		LCDGotoXY(0, 0);
		LCDstring(myStg, 3);*/
		/*-флаг сброшен - выполнить поиск 1Wire устройств
    -если количество заданных устройсв совпадает с
    колличеством найденных - устанавливаем флаг, 
    чтобы функция поиска больше не запускалась
    -отобразить количество найденных устройств*/
    if (searchFlag == SEARCH_SENSORS){
      num = 0;
      crcFlag = OWI_SearchDevices(allDevices, MAX_DEVICES, BUS, &num);
      //LCDGotoXY(14,1);
	  if (crcFlag = SEARCH_CRC_ERROR)
	  {
		  LCDstring("JOPE", 4);
	  }
		//BCD_1Lcd(num);
      if ((num == MAX_DEVICES)&&(crcFlag != SEARCH_CRC_ERROR)){
         searchFlag = SENSORS_FOUND;  
      }
    }
    
    /*считать температуру первого найденного датчика
    если возвращена ошибка CRC, вывести строку "not"
    и сбросить флаг, чтобы функция поиска снова произвела
    опрос шины*/
    LCDGotoXY(0,1);
    crcFlag = DS18B20_ReadTemperature(BUS, allDevices[0].id, &temperature);
    if (crcFlag != READ_CRC_ERROR){ 
      //DS18B20_PrintTemperature(temperature);
	  DS18B20_ReadTemperature(BUS, allDevices[0].id, &temperature);
	  sprintf(myStg, "t=%i", temperature);
	  LCDGotoXY(0, 0);
	  LCDstring(myStg, 3);
    }
    else{
      LCDstring("  fot  ", 3);
      searchFlag = SEARCH_SENSORS;
    }
    
    /*считать температуру второго найденного датчика
    если возвращена ошибка CRC, вывести строку "not"
    и сбросить флаг, чтобы функция поиска снова произвела
    опрос шины*/
    LCDGotoXY(7,1);     
    crcFlag = DS18B20_ReadTemperature(BUS, allDevices[1].id, &temperature);
    if (crcFlag != READ_CRC_ERROR){ 
      //DS18B20_PrintTemperature(temperature);
	  sprintf(myStg, "t=%i", temperature);
	  LCDGotoXY(0, 1);
	  LCDstring(myStg, 3);
    }
    else{
      LCDstring("  not  ", 3);
      searchFlag = SEARCH_SENSORS;
    }
		asm("NOP");
		DDRC = 0xFF;
		if (BitIsSet(Status, ADC_Stop))
		{
			cli();
			messure_sum[n] = (A_D_C * VS) / 1024;
			//char myStg[10];	
			sprintf(myStg, "n=%i", n);
			//LCDGotoXY(0, 3);
			//LCDstring(myStg, 4);
			sprintf(myStg, "n=%i", n_of_sensor);
			//LCDGotoXY(6, 3);
			//LCDstring(myStg, 3);
			if(n >= amount_of_messung)
			{
				n = 0;
				float val;
				for (uint8_t j = 0; j < amount_of_messung; j ++)
				{
					val += messure_sum[j] / amount_of_messung;
				}
				switch (n_of_sensor)
				{
				case 0:
					sprintf(myStg, "P=%i", (val / 5 + 95) / 900000 * 750064);
					//LCDGotoXY(0, 0);
					//UART_received_Data += (uint8_t)messure_sum;
					//LCDstring(myStg, 5); 
					n_of_sensor ++;
					break;
				case 1:
					sprintf(myStg, "T=%i", val / 10);
					//LCDGotoXY(0, 1);
					//UART_received_Data += messure_sum;
					//LCDstring(myStg, 5);
					n_of_sensor ++;
					break;
				case 2:
					sprintf(myStg, "V=%i", val);
					//LCDGotoXY(0, 2);
					//UART_received_Data += messure_sum;
					//LCDstring(myStg, 5);
					n_of_sensor ++;
					break;
				}
				if (n_of_sensor >= amount_of_sensors)
				{
					SetBit(Status, UART_data_ok);
					TCCR0 = (0 << CS12) | (0 << CS11) | ( 0 << CS10);
					TCNT0 = 0;
					n_of_sensor = 0;
				}
			}
			sei();
			ClearBit(Status, ADC_Stop);
		}
		asm("NOP");
		if (BitIsSet(Status, UART_data_ok))
		{
			ClearBit(Status, UART_reception_ended);
			ClearBit(Status, UART_data_ok);
			a = 0;
			UART_transfer_allow;	//дозвіл на передачу
			UDR = UART_received_Data[0];
			UART_interrupt_on_clean_UDR_allow;
		}
		if (BitIsSet(Status, UART_reception_ended))
		{
			TCCR0 = (1 << CS12) | (0 << CS11) | ( 1 << CS10);
		}
    }
}
Проект в Atmel Studio 6.2:[attachment=0]Meteo3.rar[/attachment]
В чем может быть проблема?
Заранее очень благодарю :)) 
Вложения
Meteo3.rar
(124.66 КБ) 203 скачивания
Реклама
Neptyn
Родился
Сообщения: 15
Зарегистрирован: Чт июл 21, 2011 09:58:24

Re: 1-Wire для DS18b20(Atmel Studio 6.2)

Сообщение Neptyn »

Уменьшил код, перешел на один датчик, но все равно не работает

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

#define F_CPU 8000000
#define BUS   OWI_PIN_7
#define DS18B20_CONVERT_T                0x44
#define DS18B20_READ_SCRATCHPAD          0xbe

#include <avr/io.h>
#include "lcd_lib.h"
#include "OWIPolled.h"
#include "OWIHighLevelFunctions.h"
#include "OWIBitFunctions.h"
#include "common_files\OWIcrc.h"

unsigned char scratchpad[9];

int main(void)
{
	unsigned int tmp = 0;
	unsigned char temperature;
	OWI_Init(BUS);
	LCDinit();
	LCDhome();
	LCDclr();
	LCDstring("  0%", 4);
    while(1)
    {
		OWI_DetectPresence(BUS);
		OWI_SkipRom(BUS);
		OWI_SendByte(DS18B20_CONVERT_T ,BUS);

		while (!OWI_ReadBit(BUS));
		
		OWI_DetectPresence(BUS);
		OWI_SkipRom(BUS);
		OWI_SendByte(DS18B20_READ_SCRATCHPAD, BUS);
		scratchpad[0] = OWI_ReceiveByte(BUS);
		scratchpad[1] = OWI_ReceiveByte(BUS);
		char myStg[16];
		LCDGotoXY(5,0);
		if ((scratchpad[1]&128) == 0){
			LCDsendChar('+');
		}
		else{
			LCDsendChar('-');
			tmp = ((unsigned int)scratchpad[1]<<8)|scratchpad[0];
			tmp = ~tmp + 1;
			scratchpad[0] = tmp;
			scratchpad[1] = tmp>>8;
		}
		
		temperature = (scratchpad[0]>>4)|((scratchpad[1]&7)<<4);
		sprintf(myStg, "%d", temperature);
		LCDstring(myStg, 16);
		
		temperature = (scratchpad[0]&15);
		temperature = (temperature<<1) + (temperature<<3);
		temperature = (temperature>>4);
		LCDsendChar('.');
		sprintf(myStg, "%d", temperature);
		LCDstring(myStg, 16);
		_delay_ms(10);
		
        //TODO:: Please write your application code 
    }
}
Изображение
Реклама
Аватара пользователя
BigallS
Опытный кот
Сообщения: 752
Зарегистрирован: Пт апр 15, 2011 21:11:22
Откуда: Россия

Re: 1-Wire для DS18b20(Atmel Studio 6.2)

Сообщение BigallS »

Вот здесь код точно рабочий, сам проверял с 1 датчиком http://forum.sources.ru/index.php?showtopic=381077
Rtmip
Держит паяльник хвостом
Сообщения: 963
Зарегистрирован: Чт апр 03, 2014 23:16:55
Откуда: Россия

Re: 1-Wire для DS18b20(Atmel Studio 6.2)

Сообщение Rtmip »

Neptyn писал(а):Уменьшил код, перешел на один датчик, но все равно не работает
Судя по картинке из протеуса датчик отвечает.
Как вариант проблема может быть в том как вы читаете ответ или выводите данные на дисплей.
Реклама
Эиком - электронные компоненты и радиодетали
Neptyn
Родился
Сообщения: 15
Зарегистрирован: Чт июл 21, 2011 09:58:24

Re: 1-Wire для DS18b20(Atmel Studio 6.2)

Сообщение Neptyn »

BigallS писал(а):Вот здесь код точно рабочий, сам проверял с 1 датчиком http://forum.sources.ru/index.php?showtopic=381077
Не могли бы Вы подсказать как переделать этот код на два датчика и более?
Rtmip писал(а):
Neptyn писал(а):Уменьшил код, перешел на один датчик, но все равно не работает
Судя по картинке из протеуса датчик отвечает.
Как вариант проблема может быть в том как вы читаете ответ или выводите данные на дисплей.
Если менять температуру на датчике на дисплее ничего не меняется.
Реклама
Аватара пользователя
BigallS
Опытный кот
Сообщения: 752
Зарегистрирован: Пт апр 15, 2011 21:11:22
Откуда: Россия

Re: 1-Wire для DS18b20(Atmel Studio 6.2)

Сообщение BigallS »

Neptyn писал(а):
BigallS писал(а):Вот здесь код точно рабочий, сам проверял с 1 датчиком http://forum.sources.ru/index.php?showtopic=381077
Не могли бы Вы подсказать как переделать этот код на два датчика и более?
На два датчика не делал, здесь есть описание и пример http://mega-avr.ucoz.ru/publ/ds18b20_co ... 5/1-1-0-15
Реклама
Аватара пользователя
НАПАЛМ
Это не хвост, это антенна
Сообщения: 1314
Зарегистрирован: Пт ноя 27, 2009 19:47:13
Откуда: Казань

Re: 1-Wire для DS18b20(Atmel Studio 6.2)

Сообщение НАПАЛМ »

Neptyn писал(а):на два датчика и более?
Есть asm'овский вариант, нннада?
Neptyn
Родился
Сообщения: 15
Зарегистрирован: Чт июл 21, 2011 09:58:24

Re: 1-Wire для DS18b20(Atmel Studio 6.2)

Сообщение Neptyn »

НАПАЛМ писал(а):
Neptyn писал(а):на два датчика и более?
Есть asm'овский вариант, нннада?
Давай :))
Neptyn
Родился
Сообщения: 15
Зарегистрирован: Чт июл 21, 2011 09:58:24

Re: 1-Wire для DS18b20(Atmel Studio 6.2)

Сообщение Neptyn »

BigallS писал(а):
На два датчика не делал, здесь есть описание и пример http://mega-avr.ucoz.ru/publ/ds18b20_co ... 5/1-1-0-15
Здесь для CVAvr...
Аватара пользователя
НАПАЛМ
Это не хвост, это антенна
Сообщения: 1314
Зарегистрирован: Пт ноя 27, 2009 19:47:13
Откуда: Казань

Re: 1-Wire для DS18b20(Atmel Studio 6.2)

Сообщение НАПАЛМ »

Neptyn писал(а):
НАПАЛМ писал(а): Есть asm'овский вариант, нннада?
Давай :))
DS1820.asm
(6.84 КБ) 389 скачиваний
- библиотека

Пример использования (подпрограммы Survey_of_DS18B20_ROM_1 и Survey_of_DS18B20_ROM_2):
Спойлер

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

;--------Подпрограмма опроса датчиков DS18B20--------------------------*

;+---------------------------------------+
;| Последовательность работы с датчиком: |
;| 1) Инициализация                      |
;| 2) ROM                                |
;| 3) Функциональная команда             |
;+---------------------------------------+
DS18B20_ROM_1:
    LDI	Temp1,$28		
	MOV		R0, Temp1
	rcall	Send_1W
	LDI	Temp1,$A0		
	MOV		R0, Temp1
	rcall	Send_1W
	LDI	Temp1,$AD		
	MOV		R0, Temp1
	rcall	Send_1W
	LDI	Temp1,$B7		
	MOV		R0, Temp1
	rcall	Send_1W
	LDI	Temp1,$04		
	MOV		R0, Temp1
	rcall	Send_1W
	LDI	Temp1,$00		
	MOV		R0, Temp1
	rcall	Send_1W
	LDI	Temp1,$00		
	MOV		R0, Temp1
	rcall	Send_1W
	LDI	Temp1,$14		
	MOV		R0, Temp1
	rcall	Send_1W
	ret
DS18B20_ROM_2:
    LDI	Temp1,$28		
	MOV		R0, Temp1
	rcall	Send_1W
	LDI	Temp1,$58		
	MOV		R0, Temp1
	rcall	Send_1W
	LDI	Temp1,$C4		
	MOV		R0, Temp1
	rcall	Send_1W
	LDI	Temp1,$87		
	MOV		R0, Temp1
	rcall	Send_1W
	LDI	Temp1,$03		
	MOV		R0, Temp1
	rcall	Send_1W
	LDI	Temp1,$00		
	MOV		R0, Temp1
	rcall	Send_1W
	LDI	Temp1,$00		
	MOV		R0, Temp1
	rcall	Send_1W
	LDI	Temp1,$17		
	MOV		R0, Temp1
	rcall	Send_1W
	ret

Survey_of_DS18B20_ROM_1:
    cli

	rcall	Init_1W	;Инициализация			
	
	LDI		Temp1,CMD_MATCH_ROM		
	MOV		R0, Temp1
	rcall	Send_1W	;Команда обращения к датчику по ROM коду	
	
	rcall DS18B20_ROM_1 ;Выдача 64 бит кода датчика

	LDI		Temp1,CMD_CONVERT_T	
	MOV		R0, Temp1
	rcall	Send_1W	;Начать преобразование температуры	
	
	rcall	Init_1W	;Инициализация			
	
	LDI		Temp1,CMD_MATCH_ROM		
	MOV		R0, Temp1
	rcall	Send_1W	;Команда обращения к датчику по ROM коду	
	
	rcall DS18B20_ROM_1 ;Выдача 64 бит кода датчика	
     	
    LDI		Temp1,CMD_R_SCRATCHPAD	
	MOV		R0, Temp1
	rcall	Send_1W	;Команда на чтение ОЗУ датчика

	rcall	ReadBytes_1w ;Чтение
	rjmp Survey_of_DS18B20_Exit
;   =====
	

Survey_of_DS18B20_ROM_2:
    cli

	rcall	Init_1W	;Инициализация			
	
	LDI		Temp1,CMD_MATCH_ROM		
	MOV		R0, Temp1
	rcall	Send_1W	;Команда обращения к датчику по ROM коду	
	
	rcall DS18B20_ROM_2 ;Выдача 64 бит кода датчика

	LDI		Temp1,CMD_CONVERT_T	
	MOV		R0, Temp1
	rcall	Send_1W	;Начать преобразование температуры	
	
	rcall	Init_1W	;Инициализация			
	
	LDI		Temp1,CMD_MATCH_ROM		
	MOV		R0, Temp1
	rcall	Send_1W	;Команда обращения к датчику по ROM коду	
	
	rcall DS18B20_ROM_2 ;Выдача 64 бит кода датчика	
     	
    LDI		Temp1,CMD_R_SCRATCHPAD	
	MOV		R0, Temp1
	rcall	Send_1W	;Команда на чтение ОЗУ датчика

	rcall	ReadBytes_1w ;Чтение

Survey_of_DS18B20_Exit:
	LDI R16, 0b00000001
    STS DS18B20_state, R16 
    sei
	ret
;-----------------Конец подпрограммы-----------------------------------
Предварительно надо написать небольшую програмку, которая узнает номера датчиков, затем датчики стоит промаркировать, чтобы не спутать, затем забить во флеш память номера и пользоваться.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18546
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: 1-Wire для DS18b20(Atmel Studio 6.2)

Сообщение ARV »

НАПАЛМ писал(а):Пример использования (подпрограммы Survey_of_DS18B20_ROM_1 и Survey_of_DS18B20_ROM_2):
что ж у вас так убого-то реализована выдача ROM-кода?! а если 10 девайсов будет? :o это ведь просто выдача 8 байтов из флеша в цикле!
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
НАПАЛМ
Это не хвост, это антенна
Сообщения: 1314
Зарегистрирован: Пт ноя 27, 2009 19:47:13
Откуда: Казань

Re: 1-Wire для DS18b20(Atmel Studio 6.2)

Сообщение НАПАЛМ »

Знаю, просто когда я это писал, я даже не подозревал как из флеша по-нормальному инфу доставать :))) ...и о многих других полезных вещах
Аватара пользователя
BigallS
Опытный кот
Сообщения: 752
Зарегистрирован: Пт апр 15, 2011 21:11:22
Откуда: Россия

Re: 1-Wire для DS18b20(Atmel Studio 6.2)

Сообщение BigallS »

Neptyn писал(а):
BigallS писал(а):
На два датчика не делал, здесь есть описание и пример http://mega-avr.ucoz.ru/publ/ds18b20_co ... 5/1-1-0-15
Здесь для CVAvr...
А что это меняет? Или надо на тарелочке с каемочкой?
Neptyn
Родился
Сообщения: 15
Зарегистрирован: Чт июл 21, 2011 09:58:24

Re: 1-Wire для DS18b20(Atmel Studio 6.2)

Сообщение Neptyn »

BigallS писал(а):
А что это меняет? Или надо на тарелочке с каемочкой?
Где мне взять ds18b20.lib? Там вся статья на этой библиотеке построена.
Rtmip
Держит паяльник хвостом
Сообщения: 963
Зарегистрирован: Чт апр 03, 2014 23:16:55
Откуда: Россия

Re: 1-Wire для DS18b20(Atmel Studio 6.2)

Сообщение Rtmip »

Neptyn, покрутил библиотеку из вашего первого поста.
В принципе там все универсально и почти все рабочее.
Проблема только во "времянках".
В протеусе датчик исправно выдает температуру если эти "времянки" для DS18b20 задать "жестко", например так:
Спойлерв файле OWIPolled.h изменения
/*****************************************************************************
Timing parameters
*****************************************************************************/
Вместо:
#define OWI_DELAY_OFFSET_CYCLES 12 //!< Timing delay when pulling bus low and releasing bus.

// Bit timing delays in clock cycles (= us*clock freq in MHz).
#define OWI_DELAY_A_STD_MODE ((6 * CPU_FREQUENCY) - OWI_DELAY_OFFSET_CYCLES)
#define OWI_DELAY_B_STD_MODE ((64 * CPU_FREQUENCY) - OWI_DELAY_OFFSET_CYCLES)
#define OWI_DELAY_C_STD_MODE ((60 * CPU_FREQUENCY) - OWI_DELAY_OFFSET_CYCLES)
#define OWI_DELAY_D_STD_MODE ((10 * CPU_FREQUENCY) - OWI_DELAY_OFFSET_CYCLES)
#define OWI_DELAY_E_STD_MODE ((9 * CPU_FREQUENCY) - OWI_DELAY_OFFSET_CYCLES)
#define OWI_DELAY_F_STD_MODE ((55 * CPU_FREQUENCY) - OWI_DELAY_OFFSET_CYCLES)
//#define OWI_DELAY_G_STD_MODE ((0 * CPU_FREQUENCY) - OWI_DELAY_OFFSET_CYCLES)
#define OWI_DELAY_H_STD_MODE ((480 * CPU_FREQUENCY) - OWI_DELAY_OFFSET_CYCLES)
#define OWI_DELAY_I_STD_MODE ((70 * CPU_FREQUENCY) - OWI_DELAY_OFFSET_CYCLES)
#define OWI_DELAY_J_STD_MODE ((410 * CPU_FREQUENCY) - OWI_DELAY_OFFSET_CYCLES)
Пишем:
#define OWI_DELAY_H_STD_MODE 4800
#define OWI_DELAY_A_STD_MODE 120
#define OWI_DELAY_B_STD_MODE 400
#define OWI_DELAY_C_STD_MODE 480
#define OWI_DELAY_D_STD_MODE 80
#define OWI_DELAY_E_STD_MODE 96
#define OWI_DELAY_F_STD_MODE 540
#define OWI_DELAY_I_STD_MODE 560
#define OWI_DELAY_J_STD_MODE 3200
#define OWI_DELAY_A1_STD_MODE 24
Эти циферки для 8 МГц, для проверки работоспособности библиотеки :)
Если нужна будет другая частота, то вы теперь знаете где и как поменять...
Если будет нужна "универсальность", то берите даташит, считайте, правьте "define-ы" и "OWI_DELAY_OFFSET_CYCLES"
В файле OWISWBitFunctions.c строку

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

__delay_cycles(OWI_DELAY_A_STD_MODE);
меняем на

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

__delay_cycles(OWI_DELAY_A1_STD_MODE);
Кроме этого, WinAVR ругается на вашу lcd_lib.c, вернее на то как вы ее используете и на дисплее, соответственно, лишние символы у вас.
Ну это уж вы сами разберитесь на месте, что там хотели отображать и как :roll:
Но, хотя бы градусы с датчика на дисплее отображаются верно и это уже хорошо :idea:
Аватара пользователя
BigallS
Опытный кот
Сообщения: 752
Зарегистрирован: Пт апр 15, 2011 21:11:22
Откуда: Россия

Re: 1-Wire для DS18b20(Atmel Studio 6.2)

Сообщение BigallS »

Neptyn писал(а):
BigallS писал(а):
А что это меняет? Или надо на тарелочке с каемочкой?
Где мне взять ds18b20.lib? Там вся статья на этой библиотеке построена.
Ну не в библиотеке дело, а что надо сделать чтобы работало 2 и более датчиков, а вам дал ссылку как пример.
Посмотрите на команды, надо послать команду поиска - ловить ответ и выводить температуру(каждый датчик температуры имеет уникальный 64-битный адрес устройства, по которому у нас есть возможность опросить определенный датчик и взять с него значения температуры.)
Поищите в интернете вот ещё ссылка http://arduino-project.net/podklyucheni ... 0-arduino/
Ответить

Вернуться в «AVR»