датчик DS1820 (в корпусе PR35)

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Первый раз сказал Мяу!
Сообщения: 29
Зарегистрирован: Чт ноя 12, 2009 15:03:49

Сообщение sanic »

Не могу вывести температуру на 7-сегментник,в CodeVision.
Сделал так:
.......
#asm("cli");
ds1820_devices=w1_search(0xf0,ds1820_rom_codes);

// Global enable interrupts
#asm("sei")

while (1)
{
// Place your code here
temp=ds1820_temperature_10(&ds1820_rom_codes[0][0])/10; //измеряем

i=temp;
if(temp!=-9999)
{cifri_v_massiv();}
delay_ms(500);
};
}
выводится на индикатор 125, что не так сделал? ПОМОГИТЕ!!!
Реклама
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1287
Зарегистрирован: Пн окт 13, 2008 11:45:54
Откуда: РФ, Крым, г.Бахчисарай

Сообщение Danko »

Еще один секретный проект.

Что в себе содержит cifri_v_massiv(); ???

для чего нужна строка i=temp;

Где проверка на ноль ds1820_devices ???
Первое, что привлекает в программировании, объяснить просто: ты говоришь компьютеру что то сделать, и он это делает. Безошибочно. Всегда. Без возражений.
---------------------
Линус Торвальдс. "Just for fun. Рассказ нечаянного революционера"
Контактная информация:
Реклама
Первый раз сказал Мяу!
Сообщения: 29
Зарегистрирован: Чт ноя 12, 2009 15:03:49

Сообщение sanic »

Ничего секретного нет. Просто, что есть из деталей +интерес. Я в этом деле новичок. Хочу собрать себе термометр.
С датчиком DS18B20(соответственно в программе DS18B20) в Proteus все работает, но у меня есть DS1820. Собрал навесным монтажом схему, на индикаторе 125 не пойму почему. Вот весь код:

#include <mega8515>
#include <delay>
#asm
.equ __w1_port=0x1B ;PORTA
.equ __w1_bit=0
#endasm
#include <1wire>
#include <ds1820>
#define MAX_DS1820 8
unsigned char ds1820_devices;
unsigned char ds1820_rom_codes[MAX_DS1820][9];

char digit_out[2], cur_dig=0; //переменные для работы с LED
signed long int i;
int temp; //переменные для вывода

flash char digits [] = { // массив для отображения на индикаторе
0b10000001, // 0
0b11110011, // 1
0b01001001, // 2
0b01100001, // 3
0b00110011, // 4
0b00100101, // 5
0b00000101, // 6
0b11110001, // 7
0b00000001, // 8
0b00100001, // 9
0b01111111 //-
};

// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{ TCNT0=0x00;
// Place your code here
PORTC=0x00;
PORTD=0xFF;
switch (cur_dig)
{
case 0:{PORTC.1=0;PORTC.3=1;break;};
case 1:{PORTC.3=0;PORTC.2=1;break;};
case 2:{PORTC.2=0;PORTC.1=1;break;};
}
PORTD=digits[digit_out[cur_dig]];
cur_dig++;
if (cur_dig==3) cur_dig=0;
}
void cifri_v_massiv (void)
{digit_out[0]=i%10;
i=i/10;
digit_out[1]=i%10;
i=i/10; };
}

void main(void)
{
PORTA=0x00;
DDRA=0x01;

PORTC=0x00;
DDRC=0xFF;

PORTD=0x00;
DDRD=0xFF;

TCCR0=0x03;
TCNT0=0x00;
OCR0=0x00;


// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x02;

w1_init();
#asm("sli")
ds1820_devices=w1_search(0xf0,ds1820_rom_codes);
#asm("sei")

while (1)
{
temp=ds1820_temperature_10(&ds1820_rom_codes[0][0])/10; //измеряем

i=temp;
if(temp!=-9999)
{cifri_v_massiv();}
delay_ms(500);
};
}
Первый раз сказал Мяу!
Сообщения: 29
Зарегистрирован: Чт ноя 12, 2009 15:03:49

Сообщение sanic »

:))
Последний раз редактировалось sanic Вт дек 29, 2009 11:40:28, всего редактировалось 2 раза.
Реклама
Эиком - электронные компоненты и радиодетали
Первый раз сказал Мяу!
Сообщения: 29
Зарегистрирован: Чт ноя 12, 2009 15:03:49

Сообщение sanic »

:)))
Последний раз редактировалось sanic Вт дек 29, 2009 11:42:26, всего редактировалось 1 раз.
Реклама
Первый раз сказал Мяу!
Сообщения: 29
Зарегистрирован: Чт ноя 12, 2009 15:03:49

Сообщение sanic »

:shock:
Реклама
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1287
Зарегистрирован: Пн окт 13, 2008 11:45:54
Откуда: РФ, Крым, г.Бахчисарай

Сообщение Danko »

исходник сильно смахивает на пример из КодеВижина.

первое:
зря Вы отказались от отрицательных температур.

второе:
проверку на кол-во найденных устройств нужно делать

последнее:
на время обращения по шине 1wire нужно запрещать прерывания. Почему рассказывать не буду. в ветке про DS18B20 наверняка ответ есть.

в идеале должно быть так:

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

#asm("cli")
temp=ds1820_temperature_10(&ds1820_rom_codes[0][0])/10; //измеряем
#asm("sei")
но при таком раскладе будут проблемы с динамической индикацией.
Выходом является запрет прерывания не на чтение температыры, а на обращение к шине, но для это нужно править библиотеку DS1820.LIB

все строки содержащие w1_write(...); нужно окружить своего рода скобками

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

   #asm("cli")
   w1_write(...);
   #asm("sei")
Первое, что привлекает в программировании, объяснить просто: ты говоришь компьютеру что то сделать, и он это делает. Безошибочно. Всегда. Без возражений.
---------------------
Линус Торвальдс. "Just for fun. Рассказ нечаянного революционера"
Контактная информация:
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18785
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

смутил заголовок темы... вы уверены, что у вас DS1820 а не DS1821? последний выпускается в длинненьких корпусах, а первый - в обычном TO-92. Так вот - это несовместимые датчики!!!
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Первый раз сказал Мяу!
Сообщения: 29
Зарегистрирован: Чт ноя 12, 2009 15:03:49

Сообщение sanic »

Точно датчик DS1820 в длинненьком корпусе PR35 вот даташит
Вложения
1820.pdf
даташит DS1820
(151.87 КБ) 432 скачивания
Первый раз сказал Мяу!
Сообщения: 29
Зарегистрирован: Чт ноя 12, 2009 15:03:49

Сообщение sanic »

Я так понял что ds1820 и ds18s20 совместимые. В PROTEUS выше изложенный код с датчиком ds18s20 показывает температуру правильно,:(
Первый раз сказал Мяу!
Сообщения: 29
Зарегистрирован: Чт ноя 12, 2009 15:03:49

Сообщение sanic »

Danko писал(а): нужно править библиотеку DS1820.LIB

все строки содержащие w1_write(...); нужно окружить своего рода скобками

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

   #asm("cli")
   w1_write(...);
   #asm("sei")
Это в этой библиотеке нужно править?

/*
CodeVisionAVR C Compiler
(C) 1998-2005 Pavel Haiduc, HP InfoTech S.R.L.

Dallas Semiconductor DS1820 1 Wire bus temperature sensor functions
*/

#include <delay>
#include <ds1820>

struct __ds1820_scratch_pad_struct __ds1820_scratch_pad;

unsigned char ds1820_select(unsigned char *addr)
{
unsigned char i;
if (w1_init()==0) return 0;
if (addr)
{
w1_write(0x55);
i=0;
do
w1_write(*(addr++));
while (++i<8);
}
else w1_write(0xcc);
return 1;
}

unsigned char ds1820_read_spd(unsigned char *addr)
{
unsigned char i;
unsigned char *p;
if (ds1820_select(addr)==0) return 0;
w1_write(0xbe);
i=0;
p=(char *) &__ds1820_scratch_pad;
do
*(p++)=w1_read();
while (++i<9);
return !w1_dow_crc8(&__ds1820_scratch_pad,9);
}

int ds1820_temperature_10(unsigned char *addr)
{
if (ds1820_select(addr)==0) return -9999;
w1_write(0x44);
delay_ms(550);
if (ds1820_read_spd(addr)==0) return -9999;
w1_init();
return (((int)__ds1820_scratch_pad.temp_msb<<8)|
__ds1820_scratch_pad.temp_lsb)*5;
}

unsigned char ds1820_set_alarm(unsigned char *addr,signed char temp_low,signed char temp_high)
{
if (ds1820_select(addr)==0) return 0;
w1_write(0x4e);
w1_write(temp_high);
w1_write(temp_low);
if (ds1820_read_spd(addr)==0) return 0;
if ((__ds1820_scratch_pad.temp_low!=temp_low) ||
(__ds1820_scratch_pad.temp_high!=temp_high)) return 0;
if (ds1820_select(addr)==0) return 0;
w1_write(0x48);
delay_ms(15);
return w1_init();
}
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18785
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

sanic писал(а):Я так понял что ds1820 и ds18s20 совместимые. В PROTEUS выше изложенный код с датчиком ds18s20 показывает температуру правильно,:(
я с вас фигею! вы что, читать не умеете?
в длинненьком корпусе датчик DS1821 - это вам не DS1820!!! 21 и 20 различаете?!
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Первый раз сказал Мяу!
Сообщения: 29
Зарегистрирован: Чт ноя 12, 2009 15:03:49

Сообщение sanic »

В руках держу датчик DS1820 в длинненьком корпусе PR35. ARV смотри даташит
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18785
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

sanic писал(а):В руках держу датчик DS1820 в длинненьком корпусе PR35. ARV смотри даташит
даташитов я насмотрелся за несколько лет работы с датчиками - ваш какой-то левый, даже близко не похож на те, что я скачивал с официального сайта производителя.

я не стану вас переубеждать - трахайтесь с вашим датчиком дальше...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Первый раз сказал Мяу!
Сообщения: 29
Зарегистрирован: Чт ноя 12, 2009 15:03:49

Сообщение sanic »

И нечего так возмущаться ARV, если такой умный, то посоветовал бы что то дельное. Я в этом деле начинающий. С НАСТУПАЮЩИМ НОВЫМ ГОДОМ!!!!!
Первый раз сказал Мяу!
Сообщения: 29
Зарегистрирован: Чт ноя 12, 2009 15:03:49

Сообщение sanic »

ARV Это ваш ответ на сайте http://arv.radioliga.com/component/opti ... /catid,18/ ? """В ответ на: Термодатчики DS18B20 / DS18S20 в чем разница? 17.09.2009 19:12 Репутация: 151
DS1820 - это полный аналог DS18S20, а DS18B20 - уже другое дело.
Кстати, последнее время я делаю свои приборчики универсальными - они работают действительно с любым из этих датчиков, да еще и DS1822 поддерживают впридачу."""


Из этого ответа я сделал вывод что DS1820 - это полный аналог DS18S20
Жаль нет фотоаппарата с собой, а в руках у меня DS1820 в корпусе PR35
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18785
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

sanic писал(а):И нечего так возмущаться ARV, если такой умный, то посоветовал бы что то дельное. Я в этом деле начинающий. С НАСТУПАЮЩИМ НОВЫМ ГОДОМ!!!!!
я посоветовал: работайте со своим датчиком, как с DS1821 - протокол отличается несильно, но кодвижные либы придется выбросить. если думаете, что я смогу посоветовать, как в круглое отверстие всунуть квадратную деталь - вы ошибаетесь: к каждому прибору свой подход.

а DS1820 и DS18S20 действительно 100% совместимы. но повторяю: у вас не 20, а 21!!!! если вы умудрились купить датчик в длинном корпусе на котором написано DS1820 - сразу выкиньте каку: даллас семикондактор не выпускает датчики DS18x20 в таких корпусах, а эта фирма - единственный официальный производитель 1-wire-девайсов, на сколько я в курсе, производство не лицензировано для других.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1287
Зарегистрирован: Пн окт 13, 2008 11:45:54
Откуда: РФ, Крым, г.Бахчисарай

Сообщение Danko »

sanic писал(а):В руках держу датчик DS1820 в длинненьком корпусе PR35. ARV смотри даташит
Сам лично вытянул даташники на 1820 и 1821.
По ним 1820 в корпусе TO-92, а 1821 в корпусе PR35.

С виду корпуса одинаковые, только длиной отличаются.

sanic, выложите пожалуйста адрес с которого Вы брали даташники.

Я отсюда:
http://datasheets.maxim-ic.com/en/ds/DS18S20.pdf
http://datasheets.maxim-ic.com/en/ds/DS1821.pdf

В библиотеке должно быть примерно так:

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

struct __ds18s20_scratch_pad_struct __ds18s20_scratch_pad;
       
unsigned char ds18s20_select(unsigned char *addr)
{
	unsigned char i;
	if (w1_init()==0) return 0;
	if (addr) {
		#asm("cli")
		w1_write(0x55);
		#asm("sei")
		i=0;
		do {
			#asm("cli")
			w1_write(*(addr++));
			#asm("sei")
		} while (++i<8);
	}
	else {
		#asm("cli")
		w1_write(0xcc);
		#asm("sei")
	}
	return 1;
}
и далее по тексту аналогично.
Вложения
1820.jpg
(13.77 КБ) 664 скачивания
1821.jpg
(12.35 КБ) 752 скачивания
Первое, что привлекает в программировании, объяснить просто: ты говоришь компьютеру что то сделать, и он это делает. Безошибочно. Всегда. Без возражений.
---------------------
Линус Торвальдс. "Just for fun. Рассказ нечаянного революционера"
Контактная информация:
Первый раз сказал Мяу!
Сообщения: 29
Зарегистрирован: Чт ноя 12, 2009 15:03:49

Сообщение sanic »

Danko писал(а): sanic, выложите пожалуйста адрес с которого Вы брали даташники.
http://www.elin.ru/1-Wire/?topic=components2#DS1820
Вложения
ds.doc
сохраненная страница
(189 КБ) 447 скачиваний
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1287
Зарегистрирован: Пн окт 13, 2008 11:45:54
Откуда: РФ, Крым, г.Бахчисарай

Сообщение Danko »

Недурно. Совсем недурно.

sanic, а Вас дата на страничке возле даташника 20.03.99 не смутила?

Даташнику 10 с гаком уже. :))

Вы когда DS-ку покупали ???
Первое, что привлекает в программировании, объяснить просто: ты говоришь компьютеру что то сделать, и он это делает. Безошибочно. Всегда. Без возражений.
---------------------
Линус Торвальдс. "Just for fun. Рассказ нечаянного революционера"
Контактная информация:
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»