View previous topic :: View next topic |
Author |
Message |
Colly McKenna Guest
|
PIC16F877 & DS1620 Temperature Sensor |
Posted: Wed Mar 01, 2006 8:03 am |
|
|
Hello everyone,
I am having difficultly in developing a fucntion to read the temperature from the DS1620 using the PIC16F877. At the minute my display will either be the 7-seg or LCD Display on the Bluebird PIC Millenium Board. If anyone can offer any assistance plaese reply or send to [email protected].
Cheers.
Colly. |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Wed Mar 01, 2006 6:01 pm |
|
|
Quote: | I am having difficultly in developing a fucntion to read the
temperature from the DS1620 using the PIC16F877 |
To find a CCS driver, use http://www.google.com
For the search string, put in the name of the chip and then put in
some keywords that are used only by CCS. Example:
(Make sure you use the quotes)
ds1620 "#use delay"
With that search string, the very first hit in Google shows a schematic
and source code in CCS. |
|
|
jds-pic
Joined: 17 Sep 2003 Posts: 205
|
Re: PIC16F877 & DS1620 Temperature Sensor |
Posted: Thu Mar 02, 2006 4:41 pm |
|
|
Colly McKenna wrote: | Hello everyone,
I am having difficultly in developing a fucntion to read the temperature from the DS1620 using the PIC16F877. |
colly,
post the code you are having difficulty with.
jds-pic (not holding breath)
ps:
http://www.ccsinfo.com/forum/viewtopic.php?t=19520 |
|
|
King Virus
Joined: 02 Mar 2006 Posts: 14 Location: Italy
|
Temp reading from DS1621 |
Posted: Fri Mar 03, 2006 12:08 pm |
|
|
Hi Colly McKenna !
Try to use the DS1621. For this component I�ve made a simple driver to use CCS !
If you are interested I could post it !? It works fine...it is to do some counting stuff on the PC side, but it should not be a problem to do it. _________________ *** A good forum is a forum where people respect eatch other ! *** |
|
|
Colly McKenna Guest
|
Millieuim Board |
Posted: Mon Mar 06, 2006 7:33 am |
|
|
HI Guys,
See below the code i have developed do far - i dont think the actual problem is with getting the DS1620 to read a temperature - the part i am havinf difficulty with is getting some code to display this data - at the moment i am using a simple PIC Bluebird Millieuim Development Board.
Many Thanks,
Colly
/**************************************************************************
* Project: Simple Test Program for Greenhouse Thermometer *
* File: test.c *
* Date: Feb 06 *
* Processor: PIC16F877 *
* Developed by: Colin McKenna (12077102) *
* *
* This project measures the temperature with a DS1620 type integrated *
* circuit (IC) sensor. The temperature is then displayed on a Millenium *
* Board every second in the format " nn C". *
* *
***************************************************************************/
#include <p16f877.h>
#include <displays.h>
#include <delays.h>
#include <datalib.h>
#include <strings.h>
#byte PORTD = 8
#fuses XT,NOWDT,NOPROTECT,PUT,NOLVP
/* Port Definitions */
#define RST PA..B0
#define CLK PA.B1
#define DQ PA.B2
#define DIG_H PA.B3
#define DIG_L PA.B4
/* DS1620 Functions */
char write_config = 0x0c;
char start_conv = 0xee;
char read_temp = 0xaa;
/* This function sends a data bit to the DS1620 Thermometer IC */
void write_ds1620_bit(char a)
{
DQ = a;
CLK =0;
CLK =1;
DQ =1;
}
/* This function reads a data bit from the DS1620 Thermometer IC */
char read_ds1620_bit()
{
char a;
CLK = 0;
a = DQ;
CLK=1;
return(a);
}
/* This function writes data/configuration to the DS1620 */
void write_to_ds1620(char ds1620_function, char ds1620_data, char bit_count)
{
char i, a_bit;
RST=1;
for (i=0; i<8; i++)
{
a_bit = ds1620_function >> i;
a_bit = a_bit & 0x01;
write_ds1620_bit(a_bit);
}
for (i=0; i<bit_count; i++)
{
a_bit = ds1620_data >> i;
a_bit = a_bit & 0x01;
write_ds1620_bit(a_bit);
}
RST=0;
}
/* This function reads data/configuration from the DS1620 */
int read_from_ds1620(char ds1620_function, char bit_count)
{
char i, a_bit;
int ds1620_data;
ds1620_data = 0;
RST=1;
for(i=0; i<8; i++)
{
a_bit = ds1620_function >>i;
a_bit = a_bit & 0x01;
write_ds1620_bit(a_bit);
}
for(i=0; i<bit_count; i++)
{
ds1620_data = ds1620_data | read_ds1620_bit() <<i;
}
RST=0;
return(ds1620_data);
}
/* Start of MAIN */
void main()
{
int left_digit, right_digit, temp=0;
TRISA = 0; /* Initialize Micro */
TRISD = 0;
/* Configure DS1620 for coninous operation */
write_to_ds1620(write_config,2,8);
/* Start conversion */
write_to_ds1620(start_conv,0,0);
while(1) /* DO FOREVER */
{
temp = read_from_ds1620(read_temp,9); |
|
|
rberek
Joined: 10 Jan 2005 Posts: 207 Location: Ottawa, Canada
|
|
Posted: Mon Mar 06, 2006 7:44 am |
|
|
A search of this board and the examples directory of the compiler will reveal many, many examples of LCD driver code. _________________ The difference between genius and stupidity is that genius has its limits... |
|
|
servera
Joined: 15 Dec 2010 Posts: 2
|
DS1620 working driver |
Posted: Sat Jan 01, 2011 11:50 am |
|
|
This is a DS1620 working and tested driver, use it as you like.
Code: |
#define DS1620_dq PIN_A0 // DS1620 DQ
#define DS1620_clk PIN_A1 // DS1620 CLK
#define DS1620_rst PIN_A2 // DS1620 RST
#define PortAConfig 0b00000000
#USE STANDARD_IO( All )
//
// DS1620 Commands
//
#define CONF_REG 0x0C // WRITE COMMAND
#define READ_TEMP 0xAA // READ COMMAND
#define START_CONVERT 0xEE
#define STOP_CONVERT 0x22
#define CONTINUOUS_CONV 0x00
//
// Function Declarations
//
void main( void );
void Setup( void );
void InitDS1620( void );
void write_commandDS1620( int Command );
unsigned int ReadDS1620( void );
//
//.............................................................................
//
void main( void )
{
int16 Temp;
int8 Centigrades;
Setup();
InitDS1620();
//
// Main loop
//
for( ; ; )
{
Temp = ReadDS1620();
Centigrades = (int8)Temp / 2;
delay_ms( 500 );
}
}
//
//..............................................................................
//
// Setup the hardware.
//
void Setup( void )
{
//
// Port configuration. 1 = Inputs, 0 = Outputs. MSB first
//
set_tris_a( PortAConfig );
//
// Set to iddle mode all the outputs
//
output_high( DS1620_clk );
output_low( DS1620_rst );
}
//
//.............................................................................
//
void InitDS1620( void )
{
output_low( DS1620_rst ); // idle
output_high( DS1620_clk );
output_high( DS1620_rst ); // DS1620_rst hight enable communication
write_commandDS1620( CONF_REG );
write_commandDS1620( CONTINUOUS_CONV );
output_low( DS1620_rst ); // DS1620_rst low disable communication
output_high( DS1620_rst ); // DS1620_rst hight enable communication
write_commandDS1620( START_CONVERT );
output_low( DS1620_rst ); // DS1620_rst low disable communication
}
//
//.............................................................................
//
// Sends 8 bit command on to DS1620, least significant bit first
//
void write_commandDS1620( int Command )
{
int8 n;
for( n = 0 ; n < 8 ; n++ )
{
//
// When writing to the DS1620, output the data before the clk pulse
// or at least before the rising edge of the clk pulse, see the datasheet
//
output_bit( DS1620_dq , shift_right( &Command , 1 , 0 ) );
output_low( DS1620_clk );
output_high( DS1620_clk );
}
}
//
//.............................................................................
//
unsigned int ReadDS1620( void )
{
int16 n, raw_data = 0;
short int _bit;
output_high( DS1620_rst ); // DS1620_rst hight enable communication
write_commandDS1620( READ_TEMP );
//
// Read 9 bits from the DS1620, least significant bit first
//
for( n = 0 ; n < 9 ; n++ )
{
output_low( DS1620_clk );
//
// When reading from the DS1620, this IC outputs the data at the falling
// edge of clk and remains valid until the rising edge of clk
//
_bit = input( DS1620_dq ); // CCS automatically makes DS1620_dq an input here
output_high( DS1620_clk );
raw_data = raw_data | ( _bit << n );
}
output_low( DS1620_rst ); // DS1620_rst low disable communication
//
// raw_data contains the temperature in 0.5ºC increments,
// per example raw_data = 30 equals to 15ºC
//
return raw_data;
}
|
|
|
|
atai21
Joined: 30 Dec 2010 Posts: 31
|
|
Posted: Fri Mar 04, 2011 3:58 am |
|
|
Good day,
I want to ask something about ds1621. Can I have two ds1621 connected to 1 PIC (18f4550) ? They share the same pin (pin 33 and 34). For the code I have plan to use delay so that the data did not crash.
TQ |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Fri Mar 04, 2011 1:25 pm |
|
|
Yes, the ds1621 chip has three address pins. You can use these to set
a different i2c address for the 2nd chip. Then you can have two ds1621
chips on the same i2c bus. The driver software must specify the correct
address for each chip, when it talks to each chip. |
|
|
|