View previous topic :: View next topic |
Author |
Message |
micman Guest
|
<DS1820 work> but <DS18S20 not work>!! |
Posted: Sat Oct 25, 2008 4:36 am |
|
|
Hi all,
I have 4 sensor :
2- DS1820 (old sensor)
2- DS18S20 (new sensor)
The program work because i read 64 bit rom, code very well .
The difference is in read temperature :
DS1820 read real temperature.
DS18S20 read "SCRATCHPAD" Temperature LSB = 255 (0xFF) but when I friger the sensor I read the real temperature!!!! and when the sensor return to room temperature above 20°C the "SCRATCHPAD" Temperature LSB = 255!!!!
--
And two all kinds of sensor I write correctly in "SCRATCHPAD" .
post the code:
Code: |
#include "C:\Documents and Settings\Michele\Desktop\test_DS18S20\main.h"
#include "flex_lcd.c"
//#use fast_io (C)
#use fast_io (B)
//ds18b20 pin
#define DS18B20_IO PIN_E0
int1 ds18b20_initialization(void);
void ds18b20_write_bit(int8 b);
void ds18b20_write_byte(int8 B);
int1 ds18b20_read_bit(void);
int8 ds18b20_read_byte(void);
void ResetDS1820 ( void );
void main()
{
signed int8 i;
int8 scratchpad_data[9],busy;
char buffer[20];
signed int16 temp=0x0000;
float temperature,temperatura;
float average_temp[6],temp16_1,temp16_2,temp16_3,temp16_4,temp16_5,temp_avg;
int8 sample_count;
setup_adc_ports(NO_ANALOGS|VSS_VDD);
setup_adc(ADC_OFF|ADC_TAD_MUL_0);
setup_psp(PSP_DISABLED);
setup_spi(SPI_SS_DISABLED);
setup_wdt(WDT_OFF);
setup_timer_0(RTCC_INTERNAL);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
//Setup_Oscillator parameter not selected from Intr Oscillator Config tab
// TODO: USER CODE!!
output_float(DS18B20_IO);
lcd_init();
lcd_gotoxy(2,1);
lcd_putc("Temp: ");
delay_ms(1000);
//Leggi Temperatura
for(i=0; i<9; i++)
scratchpad_data[i]=0x00;
if(ds18b20_initialization()){
ds18b20_write_byte(0x33); //skip ROM command
for(i=0; i<8; i++){
scratchpad_data[i]=ds18b20_read_byte();
}
}
if(ds18b20_initialization()){
ds18b20_write_byte(0xCC); //skip ROM command
ds18b20_write_byte(0x4E);
ds18b20_write_byte(125);
ds18b20_write_byte(-55);
ds18b20_write_byte(127);
}
delay_ms(15);
if(ds18b20_initialization()){
ds18b20_write_byte(0xCC); //skip ROM command
ds18b20_write_byte(0x48);
}
#asm
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
#endasm
while(1){
//Leggi Temperatura
for(i=0; i<9; i++)
scratchpad_data[i]=0x00;
if(ds18b20_initialization()){
ds18b20_write_byte(0xCC); //skip ROM command
ds18b20_write_byte(0x44); //convert temperature command
delay_ms(850); //max conversion time for 12bit resolution=750ms
ds18b20_initialization();
ds18b20_write_byte(0xCC); //skip ROM command
ds18b20_write_byte(0xBE); //read scratch pad command
for(i=0; i<8; i++){
scratchpad_data[i]=ds18b20_read_byte();
}
//low precision
/*
temp=make16(scratchpad_data[1], scratchpad_data[0]);
i = scratchpad_data[0] >> 1;
temperature = i;
i = scratchpad_data[0] & 0x01;
temperature = (float) temperature + (i * 0.5);
i= scratchpad_data[1] & 0x01; //segno
if (i==1){
temperature = temperature * -1;
}
*/
//hight precisione temp
i = scratchpad_data[0];
temperature = (float)(scratchpad_data[7] - scratchpad_data[6]) / scratchpad_data[7];
if(i<0){
i = (signed)scratchpad_data[0]/2;
// i &= 0x7F;
// i = i* -1;
}
else{
i = scratchpad_data[0] >> 1;
i &= 0x7F;
}
temperatura = ((float)i - 0.25);
temperatura = temperatura + temperature;
temperature = temperatura;
//Media temperatura
average_temp[sample_count] = temperature;
//Calcola average
temp16_1 = average_temp[0];
temp16_2 = average_temp[1];
temp16_3 = average_temp[2];
temp16_4 = average_temp[3];
temp16_5 = average_temp[4];
temp16_1 = (temp16_1 + temp16_2 + temp16_3 + temp16_4 + temp16_5);
temp_avg = temp16_1/5; //Media della temperatura
sample_count++;
sample_count %= 5;
printf("%2.1f - %2.1f\n\r",temperature,temp_avg);
// lcd_putc("\f"); //Cancello display
lcd_gotoxy(7,1); //Mi posiziono alla spam 1,1
sprintf(buffer,"%2.1f°C ",temp_avg);//converto numero in stringa
lcd_puts(buffer); //invio stringa sul display
// delay_ms(250);
#asm
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
#endasm
}
else{
temperatura = -100;
// printf("DS18B20 failed to initialize\r\n");
}
#asm
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
#endasm
}
}
void ResetDS1820 ( void )
{
output_low ( DS18B20_IO );
delay_us ( 480 );
output_float ( DS18B20_IO );
delay_us ( 480 );
}
int1 ds18b20_initialization(void){
int1 ready;
output_low(DS18B20_IO);
delay_us(488); //min 480us
output_float(DS18B20_IO);
delay_us(72); //15 - 60us for device to respond
ready=!input(DS18B20_IO);
delay_us(424);
return ready;
}
void ds18b20_write_bit(int8 b){
output_low(DS18B20_IO);
if(b == 1){
delay_us(2); //min 1
output_float(DS18B20_IO);
}
delay_us(125);
output_float(DS18B20_IO);
}
void ds18b20_write_byte(int8 B){
int8 i, aux;
for(i=0; i<8; i++){
aux = B >> i; //aux equals B shifted i times to the right
aux &= 0x01; //least significant bit survives
ds18b20_write_bit(aux);
}
delay_us(120);
}
int1 ds18b20_read_bit(void){
output_low(DS18B20_IO);
delay_us(2); //min 1us
output_float(DS18B20_IO);
delay_us(8);
return(input(DS18B20_IO)); //next a delay of 60 to 120us must be done!
}
int8 ds18b20_read_byte(void){
int8 i, result=0x00;
for(i=0; i<8; i++){
if(ds18b20_read_bit())
result |= (0x01 << i);
delay_us(125);
}
return result;
}
|
Code: |
#include <18F4620.h>
#device ICD=TRUE
#device adc=8
#FUSES NOWDT //No Watch Dog Timer
#FUSES WDT128 //Watch Dog Timer uses 1:128 Postscale
#FUSES HS //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES NOPROTECT //Code not protected from reading
#FUSES IESO //Internal External Switch Over mode enabled
#FUSES NOBROWNOUT //No brownout reset
#FUSES BORV28 //Brownout reset at 2.8V
#FUSES PUT //Power Up Timer
#FUSES NOCPD //No EE protection
#FUSES STVREN //Stack full/underflow will cause reset
#FUSES DEBUG //Debug mode for use with ICD
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOWRT //Program memory not write protected
#FUSES NOWRTD //Data EEPROM not write protected
#FUSES NOEBTR //Memory not protected from table reads
#FUSES NOCPB //No Boot Block code protection
#FUSES NOEBTRB //Boot block not protected from table reads
#FUSES NOWRTC //configuration not registers write protected
#FUSES NOWRTB //Boot block not write protected
#FUSES FCMEN //Fail-safe clock monitor enabled
#FUSES NOXINST //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
#FUSES NOPBADEN //PORTB pins are configured as digital I/O on RESET
#FUSES LPT1OSC //Timer1 configured for low-power operation
#FUSES MCLR //Master Clear pin enabled
#use delay(clock=10000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
|
|
|
|
micman2
Joined: 12 Mar 2007 Posts: 5
|
|
Posted: Sat Oct 25, 2008 6:29 am |
|
|
Debug sensor DS1820
Read 64bit ROM ......... OK!
-------------------------------------------------------------------
Debug sensor DS1820
Read Temp and SCRATCHPAD memory .........Ok
Last edited by micman2 on Sat Oct 25, 2008 6:34 am; edited 2 times in total |
|
|
micman2
Joined: 12 Mar 2007 Posts: 5
|
|
Posted: Sat Oct 25, 2008 6:32 am |
|
|
Debug sensor DS18S20
Read 64bit ROM .............OK!
-------------------------------------------------------------------
Debug sensor DS1820
Read Temp and SCRATCHPAD memory..... Error temp LSB = 255 !!!!!
[/u] |
|
|
ckielstra
Joined: 18 Mar 2004 Posts: 3680 Location: The Netherlands
|
|
Posted: Sat Oct 25, 2008 8:29 am |
|
|
Do I understand it correctly you have an DS1820 and a DS18S20 but your code is using the functions named for the DS18B20? This implies you copied the code from somewhere else.... not giving credits to the original author and you don't know what the limitations of the code are.
Code: | #use fast_io (B)
//ds18b20 pin
#define DS18B20_IO PIN_E0 | You set fast_io for PortB but this port is never used in your code. Setting it for portE would have made sense but then you have to set the TRIS register on every I/O operation. Not recommended.
Code: | ds18b20_write_byte(0x33); //skip ROM command | 0x33 is the command for reading the ROM code, not skipping. Try to write 'self documenting code', this will make your code easier to read and causes less of these copy/paste errors. For example you could have written this as: Code: | #define CMD_READ_ROM 0x33
#define CMD_SKIP_ROM 0xCC
ds18b20_write_byte(CMD_READ_ROM); |
Code: | ds18b20_write_byte(0x4E);
ds18b20_write_byte(125);
ds18b20_write_byte(-55);
ds18b20_write_byte(127); | This is code for the DS18B20 where you have to write 3 bytes. In your DS18S20 you should only write two bytes.
I haven't checked the rest of your code but as you copied the code from a 12-bit DS18B20 I suggest you check all commands to be valid for your 9-bit DS18S20.
Is your DS18S20 powered directly from 5V or is it powered using the 'parasitic' feature on the data line?
Also mention your compiler version number. |
|
|
micman2
Joined: 12 Mar 2007 Posts: 5
|
|
Posted: Sat Oct 25, 2008 12:34 pm |
|
|
Hi,
The sensor is power with 5V No in parasite mode but standard mode.
I find this note in maxim-ic : difference on DS1820 and 18s20
there is no difference. but I doubt, if I send below 0 ° C sensor 18s20 this work.
May be faulty? I take in sample |
|
|
ckielstra
Joined: 18 Mar 2004 Posts: 3680 Location: The Netherlands
|
|
Posted: Sat Oct 25, 2008 1:07 pm |
|
|
micman2 wrote: | I find this note in maxim-ic : difference on DS1820 and 18s20
<picture>
there is no difference. | The DS1820 and DS18S20 are equal, but my point is that (part) of your code is written for the DS18B20 which _is_ different.
Again, post your compiler version number. |
|
|
micman2
Joined: 12 Mar 2007 Posts: 5
|
|
Posted: Sun Oct 26, 2008 2:31 am |
|
|
compiler ver is 4.074 |
|
|
|