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

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

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

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

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

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


 
Опции темы
Непрочитано 17.03.2014, 19:45  
123ksn
Вид на жительство
 
Аватар для 123ksn
 
Регистрация: 09.10.2012
Сообщений: 312
Сказал спасибо: 119
Сказали Спасибо 69 раз(а) в 36 сообщении(ях)
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
Сообщений: 10,018
Сказал спасибо: 936
Сказали Спасибо 2,270 раз(а) в 1,565 сообщении(ях)
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,835
Сказал спасибо: 918
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
Easyrider83 на пути к лучшему
По умолчанию Re: Заставить работать библиотеку ds18b20.c

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

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

Уважаемый Easyrider83, Си - это не мой хлеб. Просто привычка доводить решение задач до конца. "элементарщина вами так и не освоена". Я и не осваивал. Возник вопрос - попытался решить. Вы думаете лучше, как большинство, даже и не пробовать? Не помогут люди - решу сам, но позже. Сейчас развожу плату под 6-ти канальный термометр с RS232 отсюда https://kazus.ru/forums/attachment.p...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
Сообщений: 312
Сказал спасибо: 119
Сказали Спасибо 69 раз(а) в 36 сообщении(ях)
123ksn на пути к лучшему
По умолчанию Re: Заставить работать библиотеку ds18b20.c

Сообщение от mimuh64 Посмотреть сообщение
Да так и понимай, они у тебя не подключены - висят в воздухе. Делай что говорю. Я же написал - там и зацикливается. Подключишь датчики, и старая версия заработает... А там и свою запустишь. Я переложил первичный исходник в свою среду, кое что подправил, ... смотри Си файл (правь имена регистров), ставь свои библиотеки на rs232 и I2C и будет счастье...
Большое спасибо за помощь! Сегодня ночью попробую.
123ksn вне форума  
Непрочитано 19.03.2014, 00:19  
123ksn
Вид на жительство
 
Аватар для 123ksn
 
Регистрация: 09.10.2012
Сообщений: 312
Сказал спасибо: 119
Сказали Спасибо 69 раз(а) в 36 сообщении(ях)
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
Сообщений: 312
Сказал спасибо: 119
Сказали Спасибо 69 раз(а) в 36 сообщении(ях)
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 22:44


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


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot