Форум Микро-Чип
Поиск и заказ электронных компонентов
 

Вернуться   Форум Микро-Чип > Своими руками

Своими руками Завершенные и текущие проекты, хард & софт

Ответ
 
Опции темы Опции просмотра
Старый 17.03.2014, 22:04   #1
123ksn
Member
 
Регистрация: 20.01.2012
Сообщений: 34
Вес репутации: 88/0
123ksn will become famous soon enough
По умолчанию Заставить работать библиотеку 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 Кб, 10 просмотров)
123ksn вне форума   Ответить с цитированием
Ответ

Метки
ds18b20, pic16f84, многоточечный термометр


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы
Опции просмотра

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

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

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

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
PIC16F874A подскажите как заставить PORTC работать на ввод / вывод цифровой информации / baavu3 Вопросы начинающих 61 02.08.2013 01:41
как заставить 4550 работать на 24мгц ? b-612 Продукция MICROCHIP 2 30.07.2013 14:56
Pic 18 На Максимальной Частоте или как заставить 4550 работать на 48МГц Pasipaka Продукция MICROCHIP 7 19.03.2011 22:40
Помогите мне не могу никак заставить порт А работать на вход p630304 Вопросы начинающих 11 10.02.2011 23:31
Не заставить работать АЦП (dsPIC33F...) в режиме «несколько измерений в БУФЕР» Юрий440 Продукция MICROCHIP 9 11.08.2007 14:50


Часовой пояс GMT +3, время: 12:38.


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