Страница 1 из 2
датчик DS1820 (в корпусе PR35)
Добавлено: Вт дек 29, 2009 09:14:26
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, что не так сделал? ПОМОГИТЕ!!!
Добавлено: Вт дек 29, 2009 10:41:25
Danko
Еще один секретный проект.
Что в себе содержит cifri_v_massiv(); ???
для чего нужна строка i=temp;
Где проверка на ноль ds1820_devices ???
Добавлено: Вт дек 29, 2009 11:26:08
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, 2009 11:30:03
sanic
Добавлено: Вт дек 29, 2009 11:34:44
sanic
Добавлено: Вт дек 29, 2009 11:36:34
sanic
Добавлено: Вт дек 29, 2009 14:41:21
Danko
исходник сильно смахивает на пример из КодеВижина.
первое:
зря Вы отказались от отрицательных температур.
второе:
проверку на кол-во найденных устройств нужно делать
последнее:
на время обращения по шине 1wire нужно запрещать прерывания. Почему рассказывать не буду. в ветке про DS18B20 наверняка ответ есть.
в идеале должно быть так:
Код: Выделить всё
#asm("cli")
temp=ds1820_temperature_10(&ds1820_rom_codes[0][0])/10; //измеряем
#asm("sei")
но при таком раскладе будут проблемы с динамической индикацией.
Выходом является запрет прерывания не на чтение температыры, а на обращение к шине, но для это нужно править библиотеку
DS1820.LIB
все строки содержащие
w1_write(...); нужно окружить своего рода скобками
Добавлено: Вт дек 29, 2009 20:04:48
ARV
смутил заголовок темы... вы уверены, что у вас DS1820 а не DS1821? последний выпускается в длинненьких корпусах, а первый - в обычном TO-92. Так вот - это несовместимые датчики!!!
Добавлено: Ср дек 30, 2009 07:28:10
sanic
Точно датчик DS1820 в длинненьком корпусе PR35 вот даташит
Добавлено: Ср дек 30, 2009 07:38:46
sanic
Я так понял что ds1820 и ds18s20 совместимые. В PROTEUS выше изложенный код с датчиком ds18s20 показывает температуру правильно,:(
Добавлено: Ср дек 30, 2009 07:49:09
sanic
Danko писал(а): нужно править библиотеку
DS1820.LIB
все строки содержащие
w1_write(...); нужно окружить своего рода скобками
Это в этой библиотеке нужно править?
/*
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();
}
Добавлено: Ср дек 30, 2009 08:25:13
ARV
sanic писал(а):Я так понял что ds1820 и ds18s20 совместимые. В PROTEUS выше изложенный код с датчиком ds18s20 показывает температуру правильно,:(
я с вас фигею! вы что, читать не умеете?
в длинненьком корпусе датчик DS1821 - это вам не DS1820!!! 21 и 20 различаете?!
Добавлено: Ср дек 30, 2009 08:32:40
sanic
В руках держу датчик DS1820 в длинненьком корпусе PR35. ARV смотри даташит
Добавлено: Ср дек 30, 2009 08:45:47
ARV
sanic писал(а):В руках держу датчик DS1820 в длинненьком корпусе PR35. ARV смотри даташит
даташитов я насмотрелся за несколько лет работы с датчиками - ваш какой-то левый, даже близко не похож на те, что я скачивал с официального сайта производителя.
я не стану вас переубеждать - трахайтесь с вашим датчиком дальше...
Добавлено: Ср дек 30, 2009 08:52:28
sanic
И нечего так возмущаться ARV, если такой умный, то посоветовал бы что то дельное. Я в этом деле начинающий. С НАСТУПАЮЩИМ НОВЫМ ГОДОМ!!!!!
Добавлено: Ср дек 30, 2009 09:32:45
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
Добавлено: Ср дек 30, 2009 09:51:20
ARV
sanic писал(а):И нечего так возмущаться ARV, если такой умный, то посоветовал бы что то дельное. Я в этом деле начинающий. С НАСТУПАЮЩИМ НОВЫМ ГОДОМ!!!!!
я посоветовал: работайте со своим датчиком, как с DS1821 - протокол отличается несильно, но кодвижные либы придется выбросить. если думаете, что я смогу посоветовать, как в круглое отверстие всунуть квадратную деталь - вы ошибаетесь: к каждому прибору свой подход.
а DS1820 и DS18S20 действительно 100% совместимы. но повторяю: у вас не 20, а 21!!!! если вы умудрились купить датчик в длинном корпусе на котором написано DS1820 - сразу выкиньте каку: даллас семикондактор не выпускает датчики DS18x20 в таких корпусах, а эта фирма - единственный официальный производитель 1-wire-девайсов, на сколько я в курсе, производство не лицензировано для других.
Добавлено: Ср дек 30, 2009 10:03:02
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;
}
и далее по тексту аналогично.
Добавлено: Ср дек 30, 2009 10:45:02
sanic
Danko писал(а):
sanic, выложите пожалуйста адрес с которого Вы брали даташники.
http://www.elin.ru/1-Wire/?topic=components2#DS1820
Добавлено: Ср дек 30, 2009 10:59:12
Danko
Недурно. Совсем недурно.
sanic, а Вас дата на страничке возле даташника
20.03.99 не смутила?
Даташнику 10 с гаком уже.
Вы когда DS-ку покупали ???