17.03.2014, 19:45
|
|
Вид на жительство
Регистрация: 09.10.2012
Сообщений: 312
Сказал спасибо: 119
Сказали Спасибо 69 раз(а) в 36 сообщении(ях)
|
Заставить работать библиотеку ds18b20.c
Пару лет назад повторил конструкцию пятиканального измерителя температуры на PIC16F84A и DS1820.
Были какие-то заморочки, но я их быстро поправил. В общем, с одним датчиком DS18b20 он работал до сих пор, пока не упала на схему железка, повредившая МК. К сожалению, свою версию я не сохранил. Есть только авторская. Но сколько не пытаюсь добиться работы хотя бы с одним датчиком DS18b20 ничего не получается. Все выходные промучился. Можно было бы конечно другой проект повторить, но под этот есть печатная плата с RS485. Может кто поправит DS18b20.c, что бы работали 5 каналов.
Как я понял проблема проявляется здесь:
while (read_ds1820_one_byte(sensor)==0xff);//зацикливается
Исходник под компилятора CCS-PIC C Compiler!!!!! На другом не компилируется!
Здесь я привел исходный текст, который не может быть откомпилирован. Поэтому прикрепляю весь проект.
Это главный модуль:
Код:
|
#include ‹16F84A.h›
//#include "P16F84A.INC"
#use delay(clock=4000000)
#fuses NOWDT,XT, NOPUT, NOPROTECT
#use rs232(baud=9600, xmit=PIN_B2, rcv=PIN_B3)
#include "ds18b20.c"
//#include "ds1307.c"
void main(void)
{
int8 i;//,sec,min,hour;
int16 tpx,all_tp;
int8 tp,tpd;
delay_ms(50);
// init_ds1307(); // initial DS1307
// set second to 00 and enable clock(bit7=0)
//write_ds1307(0,0x00);
while(true) {
printf("========================\r\n"); //while(true) - бесконечный цикл
//sec=read_ds1307(0); // read second
//min=read_ds1307(1); // read minute
//hour=read_ds1307(2); // read houre
//printf("%02X:%02X:%02X\r\n",hour,min,sec);
for (i =0;i‹5;i++) {
all_tp=read_sensor(i); // read temperature
tpx=all_tp;
tp=make8(tpx,1);
tpx=all_tp;
tpd=make8(tpx,0);
printf("Ch:%u = %03u.%u\r\n",i+1,tp,tpd);
delay_ms(500);
}
}
} |
//****************************а это DS18b20.C***********************************
Код:
|
#BYTE TRISA=0x85//регистр управления порта А
#BYTE PORTA=0x5
#BYTE STATUS=0x3
#define RP0 5
#define C 0
void make_ds1820_high_pin(int sensor)
{
TRISA = 0xff;//на вых порта А все 1
}
void make_ds1820_low_pin(int sensor)
{
PORTA = 0x00; //
TRISA = 0xff & (~(0x01 ‹‹ sensor));//определяем активный разряд порта А
}
// delay routines для кварца 4МГц
void delay_10us(int t)
{
#asm
BCF STATUS, RP0
DELAY_10US_X:
CLRWDT
NOP
NOP
NOP
NOP
NOP
NOP
DECFSZ t, F
GOTO DELAY_10US_X
#endasm
}
void delay_ms(long t) // delays t millisecs
{
do
{
delay_10us(100);
} while(--t);
}
void init_ds1820(int sensor)
{
make_ds1820_high_pin(sensor);
make_ds1820_low_pin(sensor);
delay_10us(500);
make_ds1820_high_pin(sensor);
delay_10us(500);//что бы было что опускать 18ь20
}
int read_ds1820_one_byte(int sensor)//байт считывается побитно
{
int bitN, i_byte, temper, bitRA;//номер бита, номер байта, температура, разряд порта А
bitRA = 0xff & (~(0x01‹‹sensor));//определили каким выв будем читать датчик
for (bitN=0; bitN‹8; bitN++)
{
PORTA=0x00;
TRISA=bitRA;//pin=0. FE-RA0,FD-RA1,FB-RA2,F7-RA3,EF-RA5
TRISA=0xff;//перевод в режим входов. pin=1.
#asm
CLRWDT//нафиг сбрасывать сторожевой таймер если он не вкл?
NOP
NOP
#endasm
temper=PORTA;//считываем бит?
if (temper & ~bitRA)
{
i_byte=(i_byte››1) | 0x80; // least sig bit first
}
else
{
i_byte=i_byte ›› 1;
}
delay_10us(6);
}
return(i_byte);//считанный из датчика байт
}
void write_ds1820_one_byte(int byteCommand, int sensor)//
{
int bitN, bitRA;
//байт состоит из 8бит. Вот их и надо передать через вывод
bitRA = 0xff & (~(0x01‹‹sensor));//
for(bitN=0; bitN‹8; bitN++)
{
if (byteCommand&0x01)//если текущий бит для передачи= 1
{
PORTA=0;
TRISA=bitRA; //pin=0 FE-RA0,FD-RA1,FB-RA2,F7-RA3,EF-RA5 // momentary low
TRISA=0xff;//перевод в режим входов. pin="1"
delay_10us(6);
}
else//передаем 0
{
PORTA=0;
TRISA=bitRA;//pin="0"
delay_10us(6);
TRISA=0xff;//перевод в режим входов. pin="1".
}
byteCommand=byteCommand››1;//переход к след биту (0xcc - 11001100 команда "Пропуск ROM")
}
}
int16 read_sensor(byte sensor)//эта функция вызывается из главного модуля
{
signed int16 t1;
int buff[9], n;
// int temp,temp_dec;
// int1 flag_s;
int16 flag_s;
/*1) Инициализация
2)команда ROM, например, Пропуск ROM
3)функциональная команда, например Запуск температурного преобразования
Вернуться к п.1 */
init_ds1820(sensor);//1) Инициализация
write_ds1820_one_byte(0xcc, sensor);// 2)команда ROM 0xcc - команда "Пропуск ROM"
write_ds1820_one_byte(0x44, sensor);// 3)ф. 0x44 - команда "Запуск температурного преобразования"
//Если на шине 0- преобразование данных не закончено
while (read_ds1820_one_byte(sensor)==0xff); //Цикл. пока на шине 1 *******Здесь проявляется проблема
//read_ds1820_one_byte(sensor);
init_ds1820(sensor);//1) Инициализация
write_ds1820_one_byte(0xcc, sensor);// 2)команда ROM 0xcc - команда "Пропуск ROM"
write_ds1820_one_byte(0x44, sensor);//преобразование
write_ds1820_one_byte(0xbe, sensor);//0xbe - команда "чтение памяти"
//for (n=0; n‹9; n++) //чтение ОЗУ датчика (9 байт!) в 0 и 1 температура.
//Внимание 18B20 передает данные начиная с нулевого байта
{
buff[n]=read_ds1820_one_byte(sensor); // read DS1820
}
//******Эта часть даже если считает неправильно сейчас меня мало волнует******
// Запихиваем первые 2 байта в переменную. Для этого переменная должна быть определена как знаковая двухбайтовая
t1= buff[1]; //запихнули в переменную старший байт температуры (MSB), который занял младшие 8 бит переменной.
//Получим: 00000000sssssxxx
//Для того, что бы подготовить в переменной место для младшего байта температуры (LSB) надо
//подвинуть MSB-биты на 8 разрядов влево.Получим: sssssxxx00000000. Только после этого можем добавить в переменную младший байт температуры (LSB). Получим: sssssxxxхххххххх
t1=(t1‹‹8)+buff[0];
//printf("MSB:%4X LSB:%4X t_:%4X \r\n",buff[1],buff[0], t1); // %4X 0хХХХХ (Hex)
flag_s=0b0000000000000000;// подготовили старший бит , показывающий , что температура положительная
if (t1‹0) //если температура отрицательная, т.е. старший бит переменной равен 1,
{
t1=-t1+1;flag_s=0b1000000000000000;// преобразуем из добавочного кода в прямой, т.е. получаем модуль температуры, т.е. sssss=00000
//Внимание! Это условие верно только если мы не понижали разрядность.Иначе надо сначала избавиться от незначащих битов, что бы прибавить 1
}
t1 = t1 ›› 4; //выбросим дробную часть кода (формат: sssss0000000.0000) Получим: 000000000xxxхххх
t1=t1 | flag_s; // «склеиваем» нулевой байт и флаг температуры Получим: 000000000xxxхххх или 111100000xxxхххх
return(t1);
} |
Последний раз редактировалось 123ksn; 17.03.2014 в 20:34.
|
|
|
|
17.03.2014, 20:08
|
|
Гуру портала
Регистрация: 20.11.2004
Сообщений: 10,018
Сказал спасибо: 936
Сказали Спасибо 2,270 раз(а) в 1,565 сообщении(ях)
|
Re: Заставить работать библиотеку ds18b20.c
123ksn, Код оформи как положено - тэг code ...
__________________
Осторожно , злой кот
|
|
|
|
18.03.2014, 13:14
|
|
Прописка
Регистрация: 29.10.2008
Сообщений: 272
Сказал спасибо: 0
Сказали Спасибо 102 раз(а) в 95 сообщении(ях)
|
Re: Заставить работать библиотеку ds18b20.c
Сообщение от 123ksn
|
while (read_ds1820_one_byte(sensor)==0xff);//зацикливается
|
Не удачное решение... Эту строчку можно совсем убрать, не нужно ждать окончания конвертации (у тебя в программе есть пауза между опросами), следующее чтение прочтет верное значение. Для начала исправь в Протеусе - подвигай датчики и увидишь, что они не подключены... Поэтому и звисает.
|
|
|
|
18.03.2014, 13:27
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 918
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: Заставить работать библиотеку ds18b20.c
Чтобы запустить 1-wire, нужно всего все вещи - библиотека ногодрыга и точные паузы. Если за два года эта элементарщина вами так и не освоена, думаю, стоит купить что-то готовое.
|
|
|
|
18.03.2014, 20:15
|
|
Вид на жительство
Регистрация: 09.10.2012
Сообщений: 312
Сказал спасибо: 119
Сказали Спасибо 69 раз(а) в 36 сообщении(ях)
|
Re: Заставить работать библиотеку ds18b20.c
Сообщение от mimuh64
|
Не удачное решение... Эту строчку можно совсем убрать, не нужно ждать окончания конвертации (у тебя в программе есть пауза между опросами), следующее чтение прочтет верное значение. Для начала исправь в Протеусе - подвигай датчики и увидишь, что они не подключены... Поэтому и звисает.
|
Спасибо за совет. Но если Вы смотрели исходник, то я пробовал функцию чтения убирать из цикла - не взлетело. Не понял фразу "подвигай датчики и увидишь, что они не подключены". Вообще-то я и все подключал, и один, и в разных комбинациях и разные типы (b,s) -не работает. К сожалению, автор не указал, должны ли быть подключены все датчики или возможна любая комбинация. Кроме того, авторская версия имела какой-то глюк и тоже не работала, но в первый раз я как-то быстро справился.
Уважаемый Easyrider83, Си - это не мой хлеб. Просто привычка доводить решение задач до конца. "элементарщина вами так и не освоена". Я и не осваивал. Возник вопрос - попытался решить. Вы думаете лучше, как большинство, даже и не пробовать? Не помогут люди - решу сам, но позже. Сейчас развожу плату под 6-ти канальный термометр с RS232 отсюда https://kazus.ru/forums/attachment.p...2&d=1379960214 уважаемого sasha_1973.
Спасибо всем за отклик на мою проблему.
|
|
|
|
18.03.2014, 20:47
|
|
Прописка
Регистрация: 29.10.2008
Сообщений: 272
Сказал спасибо: 0
Сказали Спасибо 102 раз(а) в 95 сообщении(ях)
|
Re: Заставить работать библиотеку ds18b20.c
Сообщение от 123ksn
|
Не понял фразу "подвигай датчики и увидишь, что они не подключены"
|
Да так и понимай, они у тебя не подключены - висят в воздухе. Делай что говорю. Я же написал - там и зацикливается. Подключишь датчики, и старая версия заработает... А там и свою запустишь. Я переложил первичный исходник в свою среду, кое что подправил, ... смотри Си файл (правь имена регистров), ставь свои библиотеки на rs232 и I2C и будет счастье...
|
|
|
Сказали "Спасибо" mimuh64
|
|
|
18.03.2014, 20:56
|
|
Вид на жительство
Регистрация: 09.10.2012
Сообщений: 312
Сказал спасибо: 119
Сказали Спасибо 69 раз(а) в 36 сообщении(ях)
|
Re: Заставить работать библиотеку ds18b20.c
Сообщение от mimuh64
|
Да так и понимай, они у тебя не подключены - висят в воздухе. Делай что говорю. Я же написал - там и зацикливается. Подключишь датчики, и старая версия заработает... А там и свою запустишь. Я переложил первичный исходник в свою среду, кое что подправил, ... смотри Си файл (правь имена регистров), ставь свои библиотеки на rs232 и I2C и будет счастье...
|
Большое спасибо за помощь! Сегодня ночью попробую.
|
|
|
|
19.03.2014, 00:19
|
|
Вид на жительство
Регистрация: 09.10.2012
Сообщений: 312
Сказал спасибо: 119
Сказали Спасибо 69 раз(а) в 36 сообщении(ях)
|
Re: Заставить работать библиотеку ds18b20.c
Сообщение от mimuh64
|
ставь свои библиотеки на rs232 и I2C и будет счастье...
|
Залил Вашу прошивку в МК - не работает(не заводится МК), хотя в протеусе всё отлично. Изменил код конфигурации. У Вас был 3FFB, а я поставил 3FF9. Все заработало. Правда есть одно "НО". Врет на о,2 градуса. Если датчик отключить, то показывает -0,2. Для меня это несущественно. Пока заниматься "своей" библиотекой не буду. Ваш код работает и хорошо. Увеличу только период передачи показаний, так как мне надо раз в 5 мин.
Еще раз большое спасибо за помощь!
|
|
|
|
19.03.2014, 10:49
|
|
Прописка
Регистрация: 29.10.2008
Сообщений: 272
Сказал спасибо: 0
Сказали Спасибо 102 раз(а) в 95 сообщении(ях)
|
Re: Заставить работать библиотеку ds18b20.c
Сообщение от 123ksn
|
У Вас был 3FFB...
|
Все правильно, так и было - RC... - подправил для тебя - XТ.
Сообщение от 123ksn
|
Если датчик отключить, то показывает -0,2.......надо раз в 5 мин
|
Попробуй вот эту прошивку, 5 минут - тупо пауза 300 сек, но можно попробывать что бы сравнивало время часов, места еще немного осталось... Но не думаю что в этом есть смысл...
|
|
|
|
19.03.2014, 13:13
|
|
Вид на жительство
Регистрация: 09.10.2012
Сообщений: 312
Сказал спасибо: 119
Сказали Спасибо 69 раз(а) в 36 сообщении(ях)
|
Re: Заставить работать библиотеку ds18b20.c
"Попробуй вот эту прошивку, 5 минут - тупо пауза 300 сек, но можно попробывать что бы сравнивало время часов"
Попробовал. Время отображается вопросами. Прикрепил две картинки. Как было и как стало.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 18:23.
|
|