Реклама на сайте DatasheetsDatasheets

KAZUS.RUN - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Книги и журналы
FAQ по электронике

  Datasheets
Поиск SMD
Онлайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Схемы и проекты
Принципиальные схемы
  Программы
Каталог сайтов
Калькуляторы
  Форумы по электронике
Помощь проекту


 
Опции темы

Заставить работать библиотеку ds18b20.c

Непрочитано 17.03.2014, 19:45  
123ksn
Вид на жительство
 
Аватар для 123ksn
 
Регистрация: 09.10.2012
Сообщений: 333
Сказал спасибо: 124
Сказали Спасибо 71 раз(а) в 38 сообщении(ях)
123ksn на пути к лучшему
По умолчанию Заставить работать библиотеку 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);
}
Вложения:
Тип файла: rar 5_therm_16f84.rar (355.1 Кб, 61 просмотров)
Реклама:

Последний раз редактировалось 123ksn; 17.03.2014 в 20:34.
123ksn вне форума  
Непрочитано 17.03.2014, 20:08  
dosikus
Гуру портала
 
Аватар для dosikus
 
Регистрация: 20.11.2004
Сообщений: 9,979
Сказал спасибо: 928
Сказали Спасибо 2,261 раз(а) в 1,557 сообщении(ях)
dosikus на пути к лучшему
По умолчанию Re: Заставить работать библиотеку ds18b20.c

123ksn, Код оформи как положено - тэг code ...
__________________
Осторожно , злой кот
dosikus вне форума  
Непрочитано 18.03.2014, 13:14  
mimuh64
Прописка
 
Регистрация: 29.10.2008
Сообщений: 272
Сказал спасибо: 0
Сказали Спасибо 102 раз(а) в 95 сообщении(ях)
mimuh64 на пути к лучшему
По умолчанию Re: Заставить работать библиотеку ds18b20.c

Сообщение от 123ksn Посмотреть сообщение
while (read_ds1820_one_byte(sensor)==0xff);//зацикливается
Не удачное решение... Эту строчку можно совсем убрать, не нужно ждать окончания конвертации (у тебя в программе есть пауза между опросами), следующее чтение прочтет верное значение. Для начала исправь в Протеусе - подвигай датчики и увидишь, что они не подключены... Поэтому и звисает.
mimuh64 вне форума  
Непрочитано 18.03.2014, 13:27  
Easyrider83
Гуру портала
 
Аватар для Easyrider83
 
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,821
Сказал спасибо: 919
Сказали Спасибо 4,289 раз(а) в 2,570 сообщении(ях)
Easyrider83 на пути к лучшему
По умолчанию Re: Заставить работать библиотеку ds18b20.c

Чтобы запустить 1-wire, нужно всего все вещи - библиотека ногодрыга и точные паузы. Если за два года эта элементарщина вами так и не освоена, думаю, стоит купить что-то готовое.
Easyrider83 вне форума  
Непрочитано 18.03.2014, 20:15  
123ksn
Вид на жительство
 
Аватар для 123ksn
 
Регистрация: 09.10.2012
Сообщений: 333
Сказал спасибо: 124
Сказали Спасибо 71 раз(а) в 38 сообщении(ях)
123ksn на пути к лучшему
По умолчанию Re: Заставить работать библиотеку ds18b20.c

Сообщение от mimuh64 Посмотреть сообщение
Не удачное решение... Эту строчку можно совсем убрать, не нужно ждать окончания конвертации (у тебя в программе есть пауза между опросами), следующее чтение прочтет верное значение. Для начала исправь в Протеусе - подвигай датчики и увидишь, что они не подключены... Поэтому и звисает.
Спасибо за совет. Но если Вы смотрели исходник, то я пробовал функцию чтения убирать из цикла - не взлетело. Не понял фразу "подвигай датчики и увидишь, что они не подключены". Вообще-то я и все подключал, и один, и в разных комбинациях и разные типы (b,s) -не работает. К сожалению, автор не указал, должны ли быть подключены все датчики или возможна любая комбинация. Кроме того, авторская версия имела какой-то глюк и тоже не работала, но в первый раз я как-то быстро справился.

Уважаемый Easyrider83, Си - это не мой хлеб. Просто привычка доводить решение задач до конца. "элементарщина вами так и не освоена". Я и не осваивал. Возник вопрос - попытался решить. Вы думаете лучше, как большинство, даже и не пробовать? Не помогут люди - решу сам, но позже. Сейчас развожу плату под 6-ти канальный термометр с RS232 отсюда https://kazus.run/forums/attachment....2&d=1379960214 уважаемого sasha_1973.

Спасибо всем за отклик на мою проблему.
123ksn вне форума  
Непрочитано 18.03.2014, 20:47  
mimuh64
Прописка
 
Регистрация: 29.10.2008
Сообщений: 272
Сказал спасибо: 0
Сказали Спасибо 102 раз(а) в 95 сообщении(ях)
mimuh64 на пути к лучшему
По умолчанию Re: Заставить работать библиотеку ds18b20.c

Сообщение от 123ksn Посмотреть сообщение
Не понял фразу "подвигай датчики и увидишь, что они не подключены"
Да так и понимай, они у тебя не подключены - висят в воздухе. Делай что говорю. Я же написал - там и зацикливается. Подключишь датчики, и старая версия заработает... А там и свою запустишь. Я переложил первичный исходник в свою среду, кое что подправил, ... смотри Си файл (правь имена регистров), ставь свои библиотеки на rs232 и I2C и будет счастье...
Вложения:
Тип файла: rar 5_18b20.rar (73.5 Кб, 107 просмотров)
mimuh64 вне форума  
Сказали "Спасибо" mimuh64
123ksn (18.03.2014)
Непрочитано 18.03.2014, 20:56  
123ksn
Вид на жительство
 
Аватар для 123ksn
 
Регистрация: 09.10.2012
Сообщений: 333
Сказал спасибо: 124
Сказали Спасибо 71 раз(а) в 38 сообщении(ях)
123ksn на пути к лучшему
По умолчанию Re: Заставить работать библиотеку ds18b20.c

Сообщение от mimuh64 Посмотреть сообщение
Да так и понимай, они у тебя не подключены - висят в воздухе. Делай что говорю. Я же написал - там и зацикливается. Подключишь датчики, и старая версия заработает... А там и свою запустишь. Я переложил первичный исходник в свою среду, кое что подправил, ... смотри Си файл (правь имена регистров), ставь свои библиотеки на rs232 и I2C и будет счастье...
Большое спасибо за помощь! Сегодня ночью попробую.
123ksn вне форума  
Непрочитано 19.03.2014, 00:19  
123ksn
Вид на жительство
 
Аватар для 123ksn
 
Регистрация: 09.10.2012
Сообщений: 333
Сказал спасибо: 124
Сказали Спасибо 71 раз(а) в 38 сообщении(ях)
123ksn на пути к лучшему
По умолчанию Re: Заставить работать библиотеку ds18b20.c

Сообщение от mimuh64 Посмотреть сообщение
ставь свои библиотеки на rs232 и I2C и будет счастье...
Залил Вашу прошивку в МК - не работает(не заводится МК), хотя в протеусе всё отлично. Изменил код конфигурации. У Вас был 3FFB, а я поставил 3FF9. Все заработало. Правда есть одно "НО". Врет на о,2 градуса. Если датчик отключить, то показывает -0,2. Для меня это несущественно. Пока заниматься "своей" библиотекой не буду. Ваш код работает и хорошо. Увеличу только период передачи показаний, так как мне надо раз в 5 мин.
Еще раз большое спасибо за помощь!
123ksn вне форума  
Непрочитано 19.03.2014, 10:49  
mimuh64
Прописка
 
Регистрация: 29.10.2008
Сообщений: 272
Сказал спасибо: 0
Сказали Спасибо 102 раз(а) в 95 сообщении(ях)
mimuh64 на пути к лучшему
По умолчанию Re: Заставить работать библиотеку ds18b20.c

Сообщение от 123ksn Посмотреть сообщение
У Вас был 3FFB...
Все правильно, так и было - RC... - подправил для тебя - XТ.
Сообщение от 123ksn Посмотреть сообщение
Если датчик отключить, то показывает -0,2.......надо раз в 5 мин
Попробуй вот эту прошивку, 5 минут - тупо пауза 300 сек, но можно попробывать что бы сравнивало время часов, места еще немного осталось... Но не думаю что в этом есть смысл...
Вложения:
Тип файла: rar 5_18b20_232_hex.rar (2.0 Кб, 40 просмотров)
mimuh64 вне форума  
Непрочитано 19.03.2014, 13:13  
123ksn
Вид на жительство
 
Аватар для 123ksn
 
Регистрация: 09.10.2012
Сообщений: 333
Сказал спасибо: 124
Сказали Спасибо 71 раз(а) в 38 сообщении(ях)
123ksn на пути к лучшему
По умолчанию Re: Заставить работать библиотеку ds18b20.c

"Попробуй вот эту прошивку, 5 минут - тупо пауза 300 сек, но можно попробывать что бы сравнивало время часов"

Попробовал. Время отображается вопросами. Прикрепил две картинки. Как было Нажмите на изображение для увеличения
Название: 5 channel 1sec.jpg
Просмотров: 67
Размер:	62.8 Кб
ID:	61001 и как стало.Нажмите на изображение для увеличения
Название: 5 channel 5minut.jpg
Просмотров: 60
Размер:	58.0 Кб
ID:	61002
123ksn вне форума  
 

Метки
ds18b20, pic16f84, proteus, многоканальный термометр
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как заставить себя работать?! Sukhanov Отвлекитесь, эмбеддеры! 152 09.04.2009 08:08
Как заставить работать "Страж-SMS 4x4" в Беларуси milt Делимся опытом 2 05.11.2008 11:27
Как заставить COM-порт работать со своим устройством? LazarenkoAS2 Коллекция глюков 0 20.09.2008 20:25
[Решено] В какой обстановке Вам наиболее комфортно работать? Don_Ambrosio Отвлекитесь, эмбеддеры! 66 27.05.2008 14:02
Как заставить работать индикатор по I2C zevs Микроконтроллеры, АЦП, память и т.д 1 11.01.2005 21:44


Часовой пояс GMT +4, время: 02:28.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.