Отговори на тема  [ 47 мнения ]  Отиди на страница Предишна  1, 2, 3, 4  Следваща
ds18b20 
Автор Съобщение
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пет Фев 04, 2005 9:59 pm
Мнения: 6019
Местоположение: София
Мнение Re: ds18b20
Цитат:
y=i%100;
purva=(i-y)/100;
treta=i%10;
vtora=(y-treta)/10;
i = (float)i * 6.25 ;

Нямаш си на идея микроконтролерите, колко обичат такив сметки, но както и да е.
Какво ще стане ако към purva се прибави 0х30?

Изображение

_________________
Warriors of the Night, ASSEMBLER!!!


Сря Яну 23, 2013 9:49 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Сря Яну 23, 2013 12:27 am
Мнения: 9
Мнение Re: ds18b20
Aко към purva прибавя aски кода на 0, ще получа аски кода на числото, и съответно за да ги подредя трите, трябва едно след друго да им изкарам аски кода.


Сря Яну 23, 2013 10:11 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Сря Яну 23, 2013 12:27 am
Мнения: 9
Мнение Re: ds18b20
Код:
#include <htc.h>
#include <stdlib.h>
#ifndef _XTAL_FREQ
   #define _XTAL_FREQ 8000000
#endif
#include "lcd.h"      


#define Skip_ROM       0xCC
#define Convert_T       0x44
#define Read_scratchpad 0xBE

#define Port_18B20    RA0
#define Tx_18B20    TRISA0 = 0
#define Rx_18B20    TRISA0 = 1
unsigned char reset();
void write(char WRT);
unsigned char read();
char masiv[30];
//signed int ciala_chast;

int main(void)
{   
      
   unsigned temp;
   unsigned short tempL, tempH, fraction;
   unsigned int i = 0 ;   
   unsigned char buffer [20];
   //   buffer[0]=i/100;
   //   buffer[1]=(i%100)/10;
   //  buffer[2]=i %10;
   //   buffer[3]=0;
   lcd_init();
   lcd_goto(0);
   lcd_puts("DS18B20");  //LCD display for the starting part
   lcd_goto(0x40);
   itoa(buffer,i,20);
   lcd_puts(buffer);
   __delay_ms(5000);


   while(1)    // create an infinite loop
   {      
         if(!reset())
         {
         write(Skip_ROM);      
         write(Convert_T);      
         __delay_ms(1000);
         
         reset();
         write(Skip_ROM);      
         write(Read_scratchpad);   
         tempL = read();         //read low temp value
         tempH = read();         //read high temp value
         i=((unsigned int)tempH << 8 ) | (unsigned int)tempL;      //put both value in one variable
         // i = (float)i * 6.25 ;      //calcuation from the table provided
         lcd_goto(0x40);   
                  
         }
   }   
   while(1) continue;
}


unsigned char reset()
{
   Tx_18B20; // Tris = 0 (output)
   Port_18B20 = 0; // set pin# to low (0)
   __delay_us(550); // 1 wire require time delay
   Rx_18B20; // Tris = 1 (input)
   __delay_us(60); // 1 wire require time delay
   
      if (Port_18B20 == 0) // if there is a presence pluse
      {
      __delay_us(550);
      return 0; // return 0 ( 1-wire is presence)
      }
      else
      {
      __delay_us(550);
      return 1; // return 1 ( 1-wire is NOT presence)
      }
}

void write(char WRT)
{
   char i,Cmd;
   Cmd=WRT;
   Rx_18B20; // set pin# to input (1)
   
      for(i = 0; i < 8; i++)
      {
         if((Cmd & (1<<i))!= 0)
         {
         // write 1
         Tx_18B20; // set pin# to output (0)
         Port_18B20 = 0; // set pin# to low (0)
         __delay_us(10); // 1 wire require time delay
         Rx_18B20; // set pin# to input (release the bus)
         __delay_us(80); // 1 wire require time delay
         }
         else
         {
         //write 0
         Tx_18B20; // set pin# to output (0)
         Port_18B20 = 0; // set pin# to low (0)
         __delay_us(80); // 1 wire require time delay
         Rx_18B20; // set pin# to input (release the bus)
         }
      }
}

unsigned char read()
{
   char i,result = 0;
   Rx_18B20; // TRIS is input(1)
      for(i = 0; i < 8; i++)
      {
      Tx_18B20; // TRIS is output(0)
      Port_18B20 = 0; // genarate low pluse for 2us
      __delay_us(10);
      Rx_18B20; // TRIS is input(1) release the bus
      if(Port_18B20 != 0)
      result |= 1<<i;
      __delay_us(80); // wait for recovery time
      }
   return result;
}

Някой може ли да ми помогне, че в момента LCD показва само 0, като стойност за температурата и не знам къде е проблема.


Пет Яну 25, 2013 2:55 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Окт 11, 2011 11:53 pm
Мнения: 4582
Местоположение: Brussels / Пловдив
Мнение Re: ds18b20
Може, може ... като гледам все още не ти е ясно за какво иде реч .... един безплатен съвет - или си сядай на задника и се опитай да проумееш за какво иде реч, или си намери нещо друго да правиш, иначе само ще си загубиш времето и ще се разочароваш.
Сори, ама да ти напише някой програмата, си е мечешка услуга ... ако все пак искаш съвет - трябва да показваш измерената температура след измерването, не извън цикъла още преди да е измерено каквото и да е.

_________________
Мразя да мразя ...


Съб Яну 26, 2013 12:02 am
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Чет Яну 03, 2013 11:53 am
Мнения: 17
Мнение Re: ds18b20
Код:
#include <htc.h>
#include <stdlib.h>
#ifndef _XTAL_FREQ
   #define _XTAL_FREQ 8000000
#endif
#include "lcd.h"      


#define Skip_ROM       0xCC
#define Convert_T       0x44
#define Read_scratchpad 0xBE

#define Port_18B20    RA0
#define Tx_18B20    TRISA0 = 0
#define Rx_18B20    TRISA0 = 1
unsigned char reset();
void write(char WRT);
unsigned char read();

int main(void)
{   
      
   unsigned temp;
   unsigned short tempL, tempH, fraction;
    int i=0  ;   
   unsigned char buffer [20];
   lcd_init();
   lcd_goto(0);
   lcd_puts("DS18B20");  //LCD display for the starting part
   while(1)    // create an infinite loop
   {      
         if(!reset())
         {
         write(Skip_ROM);      
         write(Convert_T);      
         __delay_ms(500);
         write(Skip_ROM);      
         write(Read_scratchpad);   
         tempL = read();         //read low temp value
         tempH = read();         //read high temp value
         i=((unsigned int)tempH << 8 ) | (unsigned int)tempL;      //put both value in one variable
         i = (float)i * 0.5;
         lcd_goto(0x40);   
         itoa(buffer,i,10);
         lcd_puts(buffer);
         __delay_ms(5000);
         }   

   }   
while(1) continue;
}


unsigned char reset()
{
   Tx_18B20; // Tris = 0 (output)
   Port_18B20 = 0; // set pin# to low (0)
   __delay_us(480); // 1 wire require time delay
   Rx_18B20; // Tris = 1 (input)
   __delay_us(60); // 1 wire require time delay
   
      if (Port_18B20 == 0) // if there is a presence pluse
      {
      __delay_us(240);
      return 0; // return 0 ( 1-wire is presence)
      }
      else
      {
      __delay_us(240);
      return 1; // return 1 ( 1-wire is NOT presence)
      }
}

void write(char WRT)
{
   char i,Cmd;
   Cmd=WRT;
   Rx_18B20; // set pin# to input (1)
   
      for(i = 0; i < 8; i++)
      {
         if((Cmd & (1<<i))!= 0)
         {
         // write 1
         Tx_18B20; // set pin# to output (0)
         Port_18B20 = 0; // set pin# to low (0)
         __delay_us(15); // 1 wire require time delay
         Rx_18B20; // set pin# to input (release the bus)
         __delay_us(60); // 1 wire require time delay
         }
         else
         {
         //write 0
         Tx_18B20; // set pin# to output (0)
         Port_18B20 = 0; // set pin# to low (0)
         __delay_us(60); // 1 wire require time delay
         Rx_18B20; // set pin# to input (release the bus)
         }
      }
}

unsigned char read()
{
   char i,result = 0;
   Rx_18B20; // TRIS is input(1)
      for(i = 0; i < 8; i++)
      {
      Tx_18B20; // TRIS is output(0)
      Port_18B20 = 0; // genarate low pluse for 2us
      __delay_us(2);
      Rx_18B20; // TRIS is input(1) release the bus
      if(Port_18B20 != 0)
      result |= 1<<i;
      __delay_us(60); // wait for recovery time
      }
   return result;

}

Oправих извеждането на температурата, да е след измерването, но все още ми показва 0


Съб Яну 26, 2013 2:48 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Окт 11, 2011 11:53 pm
Мнения: 4582
Местоположение: Brussels / Пловдив
Мнение Re: ds18b20
Трябва да пуснеш 5 волта по one wire, иначе сензора минава във паразитен режим на мерене и не е ясно какво ще измери - най вероятно 85 градуса.
Тъй като не е ясно с каква прецизност работи сензора трябва да изчакаш 750mS а не 500 след стартиране на измерването преди да прочетеш резултата.
Хубаво е да ползваш логически анализатор който разбира onewire протокол, или осцилоскоп (но ще се поизмъчиш с него) да видиш какво върви по линиите - иначе си сляп, пишеш нещо и се надяваш да тръгне, такива комуникации не се оживяват на късмет - мериш, проверяваш за да си сигурен. Оправи изчакването при мерене на температурата, иначе сензора ще ти отговаря с 0 за да покаже, че все още измерва. Ако и след това продължиш да четеш 0 значи нещо не е наред с кабелите (или както там си го направил) за връзка от PIC-а до DS18C20 - няма да се учудя ако данните са ти вързани към маса (и от там четеш само 0).

_________________
Мразя да мразя ...


Съб Яну 26, 2013 3:32 am
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Чет Яну 03, 2013 11:53 am
Мнения: 17
Мнение Re: ds18b20
Имам pull-resistor 4,7к към 5V. Промених времето и сега ми показва А.


Съб Яну 26, 2013 4:09 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Ное 27, 2012 9:27 pm
Мнения: 2011
Мнение Re: ds18b20
Boris666 написа:
Имам pull-resistor 4,7к към 5V. Промених времето и сега ми показва А.

Пич, ползвай друг форум тука са боговете и ще те объркат само и пак няма да ти помогнат!
Чети датшета и го направи и никакви 750мс. Целият ми апартамент работи с тези датчици и вилата също и се държи много добре. Само мога да те насоча към нещо, купи си нов датчик понеже този може да ти изкарва грешно TL i TH ако времето не е наред ще ти показва 0.1
За боговете :butthead: :finga:
:D


Нед Яну 27, 2013 2:26 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Окт 11, 2011 11:53 pm
Мнения: 4582
Местоположение: Brussels / Пловдив
Мнение Re: ds18b20
Boris666 написа:
Имам pull-resistor 4,7к към 5V. Промених времето и сега ми показва А.

'A' или 'а' ?
Като хванеш сензора с ръка за да го загрееш малко пак ли показва същото?

_________________
Мразя да мразя ...


Нед Яну 27, 2013 5:13 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Окт 11, 2011 11:53 pm
Мнения: 4582
Местоположение: Brussels / Пловдив
Мнение Re: ds18b20
Boris666 написа:
Имам pull-resistor 4,7к към 5V. Промених времето и сега ми показва А.

Предполагам, че този пулуп е на линията за данни - пробвай с допълнително захранване за да не се пъне да мери температурата само със захранването през данните - това да не ти е iButton :)

_________________
Мразя да мразя ...


Нед Яну 27, 2013 5:19 am
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Чет Яну 03, 2013 11:53 am
Мнения: 17
Мнение Re: ds18b20
Цитат:
'A' или 'а' ?
Като хванеш сензора с ръка за да го загрееш малко пак ли показва същото?


Показва 'А'. Когато го хвана с ръка не се променя по никакъв начин. Захранването е през USB 5V, така че би трябвало да му е достатъчно.


Нед Яну 27, 2013 11:01 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Окт 11, 2011 11:53 pm
Мнения: 4582
Местоположение: Brussels / Пловдив
Мнение Re: ds18b20
Мдааа ... Както се казва "гледам и не вярвам на ушите си" ... Вземи и сложи опция на компилатора да прави всички warnings на errors!
Как можа да объркаш параметрите на itoa?!

_________________
Мразя да мразя ...


Пон Яну 28, 2013 1:14 am
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Чет Яну 03, 2013 11:53 am
Мнения: 17
Мнение Re: ds18b20
Мисля че имам проблем със самата комуникация, защото пуснах да чете директно данните, които получавам в бинарен вид, като МSB го сложих да е твърда 10-ка, и LCD прочете 000 0000 0101 0000.


Пон Яну 28, 2013 9:40 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Окт 11, 2011 11:53 pm
Мнения: 4582
Местоположение: Brussels / Пловдив
Мнение Re: ds18b20
Boris666 написа:
Мисля че имам проблем със самата комуникация, защото пуснах да чете директно данните, които получавам в бинарен вид, като МSB го сложих да е твърда 10-ка, и LCD прочете 000 0000 0101 0000.

Ами по принцип за да си сигурен в стойноста измерена от термометъра трябва да прочетеше целия scratchpad и да провериш CRC-то. Пробвай и постни всички байтове от скратчпада тук да ги погледна - и аз доста се борих с тоя сензор, но накрая всичко заработи перфектно - даже за тест бях закачил 20-30 сензора и ги пусках едновременно да мерят, после им четях резултатите един по един. Щом не четеш само 0 или само 1 значи почти си го подкарал - още малко и ще заработи.

_________________
Мразя да мразя ...


Пон Яну 28, 2013 12:33 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Чет Яну 03, 2013 11:53 am
Мнения: 17
Мнение Re: ds18b20
Toва е програмата в момента, чета само байтовете от сензора, които показват само 0.


Прикачени файлове:
main.c [3.72 KiB]
196 пъти
Пон Яну 28, 2013 12:58 pm
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 47 мнения ]  Отиди на страница Предишна  1, 2, 3, 4  Следваща

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 4 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни