View previous topic :: View next topic |
Author |
Message |
zio_pecos
Joined: 24 Oct 2004 Posts: 21 Location: italy
|
ds1923 |
Posted: Fri Nov 19, 2004 2:56 am |
|
|
hi,
i wrote this code to obtain an humidity measurement with ds1923
Code: |
if(touch_present()){
//starting up RTC
touch_write_byte(0xcc);//skip rom command
touch_write_byte(0x0f);
touch_write_byte(0x00);//low TA1, beginning offset
touch_write_byte(0x02);//high TA2
touch_write_byte(0x00);
touch_write_byte(0x00);//hour
touch_write_byte(0x0a);
touch_write_byte(0x1b);
touch_write_byte(0x0a);//day
touch_write_byte(0x04);
touch_write_byte(0x0a);//sample rate
touch_write_byte(0x00);
touch_write_byte(0x00);
touch_write_byte(0x00);
touch_write_byte(0x00);//humdity and temperature alarm (off)
touch_write_byte(0x00);
touch_write_byte(0xff);
touch_write_byte(0xff);//indirizzi 020ch 020dh 020eh 020fh
touch_write_byte(0xff);
touch_write_byte(0xff);
touch_write_byte(0x00);//temp alarm off
touch_write_byte(0xfc);//hum alarm off
touch_write_byte(0x01);//low sample rate
touch_write_byte(0xc8);//general control mission register
touch_write_byte(0xff);//alarm status
touch_write_byte(0xff);//general status (questi registri nn sono accessibili in scrittura!!ecco xk� scrivo cos�)
touch_write_byte(0x00);
touch_write_byte(0x00);//mission start delay
touch_write_byte(0x00);
touch_write_byte(0xff);touch_write_byte(0xff);touch_write_byte(0xff);touch_write_byte(0xff);touch_write_byte(0xff);
touch_write_byte(0xff);touch_write_byte(0xff);
if(touch_present()){
touch_write_byte(0xcc);//skip rom
touch_write_byte(0xaa);//verify scracthpad
c=touch_read_byte();//receiving ta1 00h
d=touch_read_byte();//receiving ta2 02h
e=touch_read_byte();//receiving E/S 1fh
//f=touch_read_byte();//receiving data byte
for(m=0;m<32;m++)
{
m1[m]=touch_read_byte();//leggo i 32byte che ho scritto nello scratchpad
}
if(touch_present()){
touch_write_byte(0xcc);//skip rom
touch_write_byte(0x99);//copy scratchpad command
touch_write_byte(0x00);//transmitting ta1
touch_write_byte(0x02);//transmitting ta2
touch_write_byte(0x1f);//transmitting e/s
touch_write_byte(0xff);//
touch_write_byte(0xff);//
touch_write_byte(0xff);//
touch_write_byte(0xff);//
touch_write_byte(0xff);// 64 bit dummy password
touch_write_byte(0xff);//
touch_write_byte(0xff);//
touch_write_byte(0xff);//
if(touch_present()){
touch_write_byte(0xcc);//skip rom
touch_write_byte(0x55);//forced conversion
//After the command code the master has to send one FFh byte to get the conversion started
touch_write_byte(0xff);//dummy byte
output_high(touch_pin);
delay_ms(1000);//the conversion needs 666ms
if(touch_present()){
touch_write_byte(0xcc);//skip rom command
touch_write_byte(0x69);
touch_write_byte(0x0e);//low
touch_write_byte(0x02);//high
touch_write_byte(0xff);//
touch_write_byte(0xff);//
touch_write_byte(0xff);//
touch_write_byte(0xff);//
touch_write_byte(0xff);// 64 bit dummy password
touch_write_byte(0xff);//
touch_write_byte(0xff);//
touch_write_byte(0xff);//
hrl=touch_read_byte();
hrh=touch_read_byte();
|
someone of you can tell me if this code is correct
i ask you this because i've just burnt 2 ds1923...
moreover someone has tested code for this sensor???
thank you very much |
|
|
zio_pecos
Joined: 24 Oct 2004 Posts: 21 Location: italy
|
|
Posted: Tue Nov 23, 2004 12:55 am |
|
|
noone can help me? |
|
|
Haplo
Joined: 06 Sep 2003 Posts: 659 Location: Sydney, Australia
|
Re: ds1923 |
Posted: Tue Nov 23, 2004 5:45 am |
|
|
zio_pecos wrote: |
i ask you this because i've just burnt 2 ds1923...
|
This sounds mor like a wiring problem than code problem...describe your circuit. |
|
|
zio_pecos
Joined: 24 Oct 2004 Posts: 21 Location: italy
|
|
Posted: Tue Nov 23, 2004 9:44 am |
|
|
A temperature or humidity
conversion must not be attempted while the RTC oscillator is
stopped. This causes the device to enter into an unrecoverable state.
i programmed my devices and while the RTC oscillator was
stopped!!
so i've burnt them... |
|
|
ckielstra
Joined: 18 Mar 2004 Posts: 3680 Location: The Netherlands
|
|
Posted: Tue Nov 23, 2004 11:56 am |
|
|
1) Your code is hard to read because of irregular indenting.
2) Your code is incomplete:
- No function headers
- Several times a '{' , but never a '}' character.
- Missing functions.
A '1 wire' protocol is error prone, that's why they implemented several security checks. You are doing the required read commands, but you never check the results. So how can you be sure the RTC is enabled?
After the Copy Scratchpad command you should add a test for the AA (Authorization Accepted) flag being set. Without this flag being set by the DS1923 you know the Copy command failed.
You discovered the 'forced conversion' command can bring the device in an infinite undefined state. So why aren't you checking the RTC is running before executing this oommand? This is another murder waiting to happen. |
|
|
zio_pecos
Joined: 24 Oct 2004 Posts: 21 Location: italy
|
|
Posted: Tue Nov 23, 2004 4:49 pm |
|
|
this is the whole code...
Code: |
#include "C:\USB\generale\sensori.h"
//Tells the CCS PIC USB firmware to include HID handling code.
#DEFINE USB_HID_DEVICE TRUE
//Set this to FALSE if you only want to test enumeration. Some USB test programs,
//such as USBCHECK, crash if you are trying to test enumeration and the device
//starts sending data once configured.
#DEFINE USB_RUN_WHEN_CONFIGURED TRUE
//the following defines needed for the CCS USB PIC driver to enable the TX endpoint 1
#define USB_EP1_TX_ENABLE 1 //turn on EP1 for IN bulk/interrupt transfers
#define USB_EP1_TX_SIZE 8 //if you change this, be sure to change the hid descriptor
//the following defines needed for the CCS USB PIC driver to enable the RX endpoint 1
#define USB_EP1_RX_ENABLE 1 //turn on EP1 for OUT bulk/interrupt transfers
#define USB_EP1_RX_SIZE 8 //if you change this, be sure to change the hid descriptor
#include "C:\USB\usb_desc_bruno.h"
#include <pic_usb.h>
#include <usb.c>
#include <TOUCH.C>
void main() {
int8 c,d,e,m,m1[32];
int8 hrl,hrh;
int8 out_data[USB_EP1_TX_SIZE];//array outgoing data
usb_init();
usb_wait_for_enumeration();
if(usb_enumerated())
while(1){
if(touch_present())//inizializzazione
{
if(touch_present()){
//starting up RTC
touch_write_byte(0xcc);//skip rom command
touch_write_byte(0x0f);//Write Scratchpad command,
touch_write_byte(0x00);//low TA1, beginning offset
touch_write_byte(0x02);//high TA2
touch_write_byte(0x00);
touch_write_byte(0x00);//hour
touch_write_byte(0x0a);
touch_write_byte(0x1b);
touch_write_byte(0x0a);//day
touch_write_byte(0x04);
touch_write_byte(0x0a);//sample rate
touch_write_byte(0x00);
touch_write_byte(0x00);
touch_write_byte(0x00);
touch_write_byte(0x00);//humdity and temperature alarm (off)
touch_write_byte(0x00);
touch_write_byte(0xff);
touch_write_byte(0xff);
touch_write_byte(0xff);
touch_write_byte(0xff);
touch_write_byte(0x00);//temp alarm off
touch_write_byte(0xfc);//hum alarm off
touch_write_byte(0x01);//low sample rate
touch_write_byte(0xc8);//general control mission register
touch_write_byte(0xff);//alarm status
touch_write_byte(0xff);//general status
touch_write_byte(0x00);
touch_write_byte(0x00);//mission start delay
touch_write_byte(0x00);
//these 25 bytes set the rtc
touch_write_byte(0xff);touch_write_byte(0xff);touch_write_byte(0xff);touch_write_byte(0xff);touch_write_byte(0xff);
touch_write_byte(0xff);touch_write_byte(0xff);
//these 7 byte complete the scratchpad writing
if(touch_present()){
touch_write_byte(0xcc);//skip rom
touch_write_byte(0xaa);
c=touch_read_byte();//receiving ta1 00h
d=touch_read_byte();//receiving ta2 02h
e=touch_read_byte();//receiving E/S 1fh
for(m=0;m<32;m++)
{
m1[m]=touch_read_byte();
}
if(touch_present()){
touch_write_byte(0xcc);//skip rom
touch_write_byte(0x99);//copy scratchpad command
touch_write_byte(0x00);//transmitting ta1
touch_write_byte(0x02);//transmitting ta2
touch_write_byte(0x1f);//transmitting e/s
touch_write_byte(0xff);//
touch_write_byte(0xff);//
touch_write_byte(0xff);//
touch_write_byte(0xff);//
touch_write_byte(0xff);// 64 bit dummy password
touch_write_byte(0xff);//
touch_write_byte(0xff);//
touch_write_byte(0xff);//
if(touch_present()){
touch_write_byte(0xcc);//skip rom
touch_write_byte(0x55);//The Forced Conversion
touch_write_byte(0xff);//dummy byte
output_high(touch_pin);
delay_ms(1000);//the conversion needs 666ms
if(usb_enumerated()){
if(touch_present()){//device reset as is written in the datasheet on page 32
touch_write_byte(0xcc);//skip rom command
touch_write_byte(0x69);
touch_write_byte(0x0e);//low
touch_write_byte(0x02);//high
touch_write_byte(0xff);//
touch_write_byte(0xff);//
touch_write_byte(0xff);//
touch_write_byte(0xff);//
touch_write_byte(0xff);// 64 bit dummy password
touch_write_byte(0xff);//
touch_write_byte(0xff);//
touch_write_byte(0xff);//
hrl=touch_read_byte();
hrh=touch_read_byte();
if(touch_present()){//device reset as is written in the datasheet on page 31
out_data[0]=hrl;
out_data[1]=hrh;
out_data[2]=0;
out_data[3]=0;
out_data[4]=0;
out_data[5]=0;
out_data[6]=0;
out_data[7]=0;
usb_put_packet(1, out_data, USB_EP1_TX_SIZE, TOGGLE);
delay_ms(500);
}}}}}}}}}}
|
it's the same of the previous!!
i don't understand why i must check if the rtc starts as you are telling me...
the datasheet don't tells about this...
i wrote a code following the datasheet instructions
noone use pcw to communicate with the ds1923
noone used this sensor all over the world ??
i only need to know if using this code i'll receive the bytes that contain the humidity measurement.
thank you very much! |
|
|
ckielstra
Joined: 18 Mar 2004 Posts: 3680 Location: The Netherlands
|
|
Posted: Tue Nov 23, 2004 5:53 pm |
|
|
Quote: | this is the whole code... | No it isn't. For example the #fuse line is missing.
Quote: | it's the same of the previous!! | Not! This one is more complete.
Quote: | i don't understand why i must check if the rtc starts as you are telling me...
the datasheet don't tells about this... | You are the one quoting from the manual that the RTC must be running before issuing a 'read sensor 'command. You murdered two devices, very likely because of this situation occurring. Don't you think it starts making sense then to incorporate a test?....
Quote: | i wrote a code following the datasheet instructions | 95% of your code looks correct to me, but at page 47 (and other places) it says "Read scratchpad data and verify". You do the read, but you don't check the values. So if you had some kind of communication error, the device will not be configured correctly and strange things might happen....
Quote: | i only need to know if using this code i'll receive the bytes that contain the humidity measurement. | I only need to know the winning lottery numbers to become a milionair....
Apart from the missing verify it looks alright. You'll have to test to know for sure. You didn't give all your code. If you have an interrupt routine in the other files, this might destroy the timings. |
|
|
zio_pecos
Joined: 24 Oct 2004 Posts: 21 Location: italy
|
|
|
ckielstra
Joined: 18 Mar 2004 Posts: 3680 Location: The Netherlands
|
|
Posted: Wed Nov 24, 2004 5:30 am |
|
|
In the link you refer to several options are discussed. We recommended you to use the solution without interrupts as it is easier and more accurate. You didn't say which option you choose, but it seems like you have a preference for the interrupt driven solution. Interrupts will influence your timing to the DS1923, whether this will result in errors I can not say.
Quote: | so i must use a pic to read from ds1923
and other pics to make someelse?? | No, you can do it all with one processor, but it requires a good design.
From the other posts it looks like you are new to the embedded software programming. Maybe you should start with an easier project first. |
|
|
zio_pecos
Joined: 24 Oct 2004 Posts: 21 Location: italy
|
|
Posted: Wed Nov 24, 2004 9:36 am |
|
|
ckielstra wrote: |
[...]
Interrupts will influence your timing to the DS1923, whether this will result in errors I can not say.
Quote: | so i must use a pic to read from ds1923
and other pics to make someelse?? | No, you can do it all with one processor, but it requires a good design.
From the other posts it looks like you are new to the embedded software programming. Maybe you should start with an easier project first. |
yes i am a beginner but i cannot choose a easier project... in my university there is no one that could help me you are the only ones that, in my opinion, can help me in solving my troubles...
when you say : "you can do it all with one processor, but it requires a good design" what did you mean??
this is my design...
Code: |
#include "D:\Bruno\appunti\__Tirocinio\_C\PIC16C745---porta usb\Finale\12312412.h"
//Tells the CCS PIC USB firmware to include HID handling code.
#DEFINE USB_HID_DEVICE TRUE
//Set this to FALSE if you only want to test enumeration. Some USB test programs,
//such as USBCHECK, crash if you are trying to test enumeration and the device
//starts sending data once configured.
#DEFINE USB_RUN_WHEN_CONFIGURED TRUE
//the following defines needed for the CCS USB PIC driver to enable the TX endpoint 1
#define USB_EP1_TX_ENABLE 1 //turn on EP1 for IN bulk/interrupt transfers
#define USB_EP1_TX_SIZE 8 //if you change this, be sure to change the hid descriptor
//the following defines needed for the CCS USB PIC driver to enable the RX endpoint 1
#define USB_EP1_RX_ENABLE 1 //turn on EP1 for OUT bulk/interrupt transfers
#define USB_EP1_RX_SIZE 8 //if you change this, be sure to change the hid descriptor
#include "D:\Bruno\appunti\__Tirocinio\_C\PIC16C745---porta usb\usb_desc_bruno.h"
#include <pic_usb.h>
#include <usb.c>
#include <TOUCH.C>
//--------------------------------------------------------------------------
// CCP1 Data
//
int16 CCP1Value;
int16 CCP1OldValue;
BOOLEAN CCP1Captured;
//--------------------------------------------------------------------------
//--------------------------------------------------------------------------
// CCP2 Data
//
int16 CCP2Value;
int16 CCP2OldValue;
BOOLEAN CCP2Captured;
//--------------------------------------------------------------------------
#int_CCP1
CCP1_isr()
{
CCP1Value = CCP_1 - CCP1OldValue;
CCP1OldValue = CCP_1;
CCP1Captured = TRUE;
}
//--------------------------------------------------------------------------
#int_CCP2
CCP2_isr()
{
CCP2Value = CCP_2 - CCP2OldValue;
CCP2OldValue = CCP_2;
CCP2Captured = TRUE;
}
//--------------------------------------------------------------------------
void main() {
int8 c,d,e,m,m1[32];
int16 periodo,per;
int16 periodo1,per1;
int h1,h2,h3,h4;
int8 hrl,hrh;
int8 out_data[USB_EP1_TX_SIZE];//array outgoing data
int8 value,te;
setup_counters(RTCC_INTERNAL,RTCC_DIV_256);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
setup_ccp1(CCP_CAPTURE_RE|CCP_CAPTURE_DIV_16);
setup_ccp2(CCP_CAPTURE_RE|CCP_CAPTURE_DIV_16);
enable_interrupts(INT_CCP1);
enable_interrupts(INT_CCP2);
enable_interrupts(global);
CCP1Value = 0;
CCP1OldValue = 0;
CCP1Captured = TRUE;
CCP2Value = 0;
CCP2OldValue = 0;
CCP2Captured = TRUE;
usb_init();//inizializza la trasmissione tramite porta usb
usb_wait_for_enumeration();
if(usb_enumerated())
while(1){
if (CCP1Captured) {
//---
// F = 1/T
// Timer1 prescaler DIV_BY_1
// Pic16C745 at 24Mz -> 4/24M= 1.66666e-7;ans*(timeprescaler/ccpprescaler)
//
periodo=((float)CCP1Value*4/(24e6)/16)*100000000;
per=periodo;
CCP1Captured = FALSE;
}
h2= make8(per, 1);
h1= make8(per, 0);
if (CCP2Captured) {
periodo1=((float)CCP2Value*4/(24e6)/16)*100000000;
per1=periodo1;
CCP2Captured = FALSE;
}
h4= make8(per1, 1);
h3= make8(per1, 0);
usb_enumerated();
if(touch_present())//inizializzazione
{
if(touch_present()){
//starting up RTC
touch_write_byte(0xcc);//skip rom command
touch_write_byte(0x0f);//Write Scratchpad command,
touch_write_byte(0x00);//low TA1, beginning offset
touch_write_byte(0x02);//high TA2
touch_write_byte(0x00);
touch_write_byte(0x00);//ora
touch_write_byte(0x0a);
touch_write_byte(0x1b);
touch_write_byte(0x0a);//giorno
touch_write_byte(0x04);
touch_write_byte(0x0a);//sample rate
touch_write_byte(0x00);
touch_write_byte(0x00);
touch_write_byte(0x00);
touch_write_byte(0x00);//humdity and temperature alarm (off)
touch_write_byte(0x00);
touch_write_byte(0xff);
touch_write_byte(0xff);
touch_write_byte(0xff);
touch_write_byte(0xff);
touch_write_byte(0x00);//temp alarm off
touch_write_byte(0xfc);//hum alarm off
touch_write_byte(0x01);//low sample rate
touch_write_byte(0xc8);//general control mission register
touch_write_byte(0xff);//alarm status
touch_write_byte(0xff);//general status
touch_write_byte(0x00);
touch_write_byte(0x00);//mission start delay
touch_write_byte(0x00);
touch_write_byte(0xff);touch_write_byte(0xff);touch_write_byte(0xff);touch_write_byte(0xff);touch_write_byte(0xff);
touch_write_byte(0xff);touch_write_byte(0xff);
if(touch_present()){
touch_write_byte(0xcc);//skip rom
touch_write_byte(0xaa);
c=touch_read_byte();//receiving ta1 00h
d=touch_read_byte();//receiving ta2 02h
e=touch_read_byte();//receiving E/S 1fh
for(m=0;m<32;m++)
{
m1[m]=touch_read_byte();
}
if(touch_present()){
touch_write_byte(0xcc);//skip rom
touch_write_byte(0x99);//copy scratchpad command
touch_write_byte(0x00);//transmitting ta1
touch_write_byte(0x02);//transmitting ta2
touch_write_byte(0x1f);//transmitting e/s
touch_write_byte(0xff);//
touch_write_byte(0xff);//
touch_write_byte(0xff);//
touch_write_byte(0xff);//
touch_write_byte(0xff);// 64 bit dummy password
touch_write_byte(0xff);//
touch_write_byte(0xff);//
touch_write_byte(0xff);//
if(touch_present()){
touch_write_byte(0xcc);//skip rom
touch_write_byte(0x55);//Forced Conversion command
touch_write_byte(0xff);//dummy byte
output_high(touch_pin);
delay_ms(1000);//the conversion needs 666ms
if(usb_enumerated()){
if(touch_present()){//device reset as is written in the datasheet on page 32
touch_write_byte(0xcc);//skip rom command
touch_write_byte(0x69);
touch_write_byte(0x0e);//low
touch_write_byte(0x02);//high
touch_write_byte(0xff);//
touch_write_byte(0xff);//
touch_write_byte(0xff);//
touch_write_byte(0xff);//
touch_write_byte(0xff);// 64 bit dummy password
touch_write_byte(0xff);//
touch_write_byte(0xff);//
touch_write_byte(0xff);//
hrl=touch_read_byte();
hrh=touch_read_byte();
if(touch_present()){//device reset as is written in the datasheet on page 31
out_data[0]=hrl;
out_data[1]=hrh;
out_data[2]=0;
out_data[3]=h1;
out_data[4]=h2;
out_data[5]=h3;
out_data[6]=h4;
out_data[7]=0;
usb_put_packet(1, out_data, USB_EP1_TX_SIZE, TOGGLE);
delay_ms(500);
}}}}}}}}}}
|
the following is the include file
Code: | #include <16C745.h>
#device *=16
#device adc=8
#use delay(clock=24000000)
#fuses H4,NOWDT
|
is this a good design?
thank you |
|
|
Guest
|
|
Posted: Thu Nov 25, 2004 12:07 pm |
|
|
up |
|
|
Sanjuro Guest
|
|
Posted: Fri Nov 26, 2004 4:23 am |
|
|
RTC control register is 0212h. 0200h is only setings of time register. |
|
|
zio_pecos
Joined: 24 Oct 2004 Posts: 21 Location: italy
|
|
Posted: Fri Nov 26, 2004 4:43 am |
|
|
which part to my code are you referring to ? |
|
|
|