Hello Everyone,

I'm trying to swap Radiator_temp and Block_temp into a temp variable before reading the temperature of two DS1820 in the code below and can't seem to get it right. I've only included 2 subroutines below that are part of a bigger program to make it easier to read and I compiled the code below as it is and I get the same results.

I have 2 DS1820's and am reading one at a time in each pass through the mainloop to speed up using my push buttons. I try and use: Sensor_Select = Radiator_Sensor : Radiator_temp = temp : GOSUB Check_Temperature

Then on the next pass through the mainloop I use: Sensor_Select = Block_Sensor : Block_temp = temp : GOSUB Check_Temperature

With that code then I warm up the Block_Sensor it shows the temperature rise to the Radiator_Sensor on my Lcd but if I mix it up a bit and write the code like this: Sensor_Select = Block_Sensor : Radiator_temp = temp : GOSUB Check_Temperature and the same with the Radiator_Sensor then it displays properly?

Anyone have any idea of what's going on here, it's working ok but the logic is very confusing to say the least. Any help with this would be very much appreciated.

Thanks In Advance
jessey




Code:
'*******************************************************************************
'* Name     : Two Ds1820 18F452.bas                                            *
'* Author   : Jessey Montgomery                                                *
'* Includes : STRINGS.PBP By Darrel Taylor                                     *
'* Notice   : Copyright (c) 2004                                               *
'*          : All Rights Reserved                                              *
'* Date     : 22/10/2005                                                       *
'* Version  : Using PicBasic Pro Ver 2.50, MPASM Ver 5.20, Using MicroCode     *
'*          : Studio 3.0.0.5, PICkit 2 programmer - Application Version        *
'*          : 2.50.02 - Device File Version 1.5100 - OS Firmware Version       *
'*          : 2.30.01. Using a PIC18f452-20/P                                  *
'*******************************************************************************

'                                --------------
'                                |   18F452   |
'               MCLR/Vpp ------> |1         40| <-----> RB7/PGD 
'                RA0/AN0 <-----> |2         39| <-----> RB6/PGC 
'                RA1/AN1 <-----> |3         38| <-----> RB5/PGM 
'          RA2/AN2/Vref- <-----> |4         37| <-----> RB4 
'          RA3/AN3/Vref+ <-----> |5         36| <-----> RB3/CCP2* 
'              RA4/TOCK1 <-----> |6         35| <-----> RB2/INT2 
'       RA5/AN5/SS/LVDIN <-----> |7         34| <-----> RB1/INT1 
'             RE0/RD/AN5 <-----> |8         33| <-----> RB0/INT0
'             RE1/WR/AN6 <-----> |9         32| <-----  Vdd 
'             RE2/CS/AN7 <-----> |10        31| <-----  Vss 
'                    Vdd  -----> |11        30| <-----> RD7/PSP7 
'                    VSS  -----> |12        29| <-----> RD6/PSP6 
'              OSC1/CLK1  -----> |13        28| <-----> RD5/PSP5 
'          OSC2/CLKO/RA6 <------ |14        27| <-----> RD4/PSP4 
'        RC0/T1OSO/TICK1 <-----> |15        26| <-----> RC7/RX/DT 
'        RC1/T1OSI/CCP2* <-----> |16        25| <-----> RC6/TX/CK 
'               RC2/CPP1 <-----> |17        24| <-----> RC5/SDO 
'            RC3/SCK/SCL <-----> |18        23| <-----> RC4/SD1/SDA 
'               RD0/PSP0 <-----> |19        22| <-----> RD3/PSP3  
'               RD1/PSP1 <-----> |20        21| <-----> RD2/PSP2       
'                                --------------


'------------------------------------------------------------------------------'
'-- Clear All The Variables And Each Port Before Setting The TRIS Registers ---'
'------------------------------------------------------------------------------'
 
Clear    'Set all ram registers to zero
PORTA = 0
PORTB = 0                           
PORTC = 0   
PORTD = 0
PORTE = 0
 
'--------------------------- VSS VDD MCLR Ect. Pins ---------------------------'
 
'MCLR        (Pin 1)
'VDD         (Pin 11)
'VSS         (Pin 12)
'OSC/CLKIN   (Pin 13)
'OSC2/CLKOUT (Pin 14)
'VSS         (Pin 31)
'Vdd         (Pin 32)
 
'((OPTION_REG=127 ' ENABLE WEAK PULL UP RESISTORS ON PORTB))
 
'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
'XXXXXXXXXXXXXXXXXXXXXXXXXX Set The TRIS In/Out Pins XXXXXXXXXXXXXXXXXXXXXXXXXX'
'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX BELOW XXX'    

'-------------------- PORTA PINS --------------------'
TRISA.0 = 1  '(pin 2) ........................Adj_Dn_Button VAR PORTA.0  ' pin 2  
TRISA.1 = 1  '(pin 3) ........................Adj_Up_Button VAR PORTA.1  ' pin 3  
TRISA.2 = 1  '(pin 4) .......................Adj_Dn_Button2 VAR PORTA.2  ' pin 4  
TRISA.3 = 1  '(pin 5) .......................Adj_Up_Button2 VAR PORTA.3  ' pin 5   
TRISA.4 = 1  '(pin 6) NOT USED  
TRISA.5 = 1  '(pin 7) NOT USED 
  
'-------------------- PORTB PINS --------------------'
TRISB.0 = 1  '(pin 33) ........................................DS1820 Rad_Sensor  
TRISB.1 = 1  '(pin 34) NOT USED VAR PORTB.1 'pin 34 
TRISB.2 = 1  '(pin 35) NOT USED VAR PORTB.2 'pin 35    
TRISB.3 = 0  '(pin 36) ..............................The_Led VAR PORTB.3 'pin 36  
TRISB.4 = 1  '(pin 37) NOT USED VAR PORTB.4 'pin 37 
TRISB.5 = 1  '(pin 38) NOT USED VAR PORTB.5 'pin 38 
TRISB.6 = 1  '(pin 39) NOT USED VAR PORTB.6 'pin 39 
TRISB.7 = 1  '(pin 40) NOT USED VAR PORTB.7 'pin 40 
 
'-------------------- PORTC PINS --------------------'
TRISC.0 = 1  '(pin 15) ......................................DS1820 Block_Sensor   
TRISC.1 = 1  '(pin 16) ...................Change_Mode_Button VAR PORTC.1 'pin 16
TRISC.2 = 1  '(pin 17) ....................Block_Code_Button VAR PORTC.2 'pin 17  
TRISC.3 = 1  '(pin 18) NOT USED VAR PORTC.3 'pin 18 
TRISC.4 = 1  '(pin 23) NOT USED VAR PORTC.4 'pin 23  
TRISC.5 = 1  '(pin 24) NOT USED VAR PORTC.5 'pin 24 
TRISC.6 = 1  '(pin 25) NOT USED VAR PORTC.6 'pin 25 
TRISC.7 = 1  '(pin 26) NOT USED VAR PORTC.7 'pin 26 
 
'-------------------- PORTD PINS --------------------'
TRISD.0 = 1 '(pin 19) NOT USED VAR PORTD.0 'pin 19 
TRISD.1 = 0 '(pin 20) ................................Buzzer VAR PORTD.1 'pin 15  
TRISD.2 = 0 '(pin 21) ...............................The_Fan VAR PORTD.2 'pin 21 
TRISD.3 = 1 '(pin 22) NOT USED VAR PORTD.3 'pin 22  
TRISD.4 = 0 '(pin 27) ...........................Lcd out for Data bit 4                                  
TRISD.5 = 0 '(pin 28) ...........................Lcd out for Data bit 5                                     
TRISD.6 = 0 '(pin 29) ...........................Lcd out for Data bit 6                                     
TRISD.7 = 0 '(pin 30) ...........................Lcd out for Data bit 7 

'-------------------- PORTE PINS --------------------'
TRISE.0 = 0 '(pin 8)  ...........................LCD Register/Select                                     
TRISE.1 = 0 '(pin 9)  ...........................LCD Enable
TRISE.2 = 1 '(pin 10) NOT USED PORTE.2 


;==========================================================================
;@ __CONFIG _CONFIG1H, _OSCS_ON_1H & _XT_OSC_1H ' use this one for 4 mhz and 
                                                ' also declare the osc as 4mhz
@ __CONFIG _CONFIG1H, _OSCS_OFF_1H & _HSPLL_OSC_1H ; use this one for 16 mhz
@ __CONFIG _CONFIG2L, _BOR_OFF_2L & _BORV_20_2L & _PWRT_ON_2L
@ __CONFIG _CONFIG2H, _WDT_ON_2H & _WDTPS_128_2H
@ __CONFIG _CONFIG3H, _CCP2MX_OFF_3H
@ __CONFIG _CONFIG4L, _STVR_OFF_4L & _LVP_OFF_4L & _DEBUG_OFF_4L
@ __CONFIG _CONFIG5L, _CP0_OFF_5L & _CP1_OFF_5L & _CP2_OFF_5L & _CP3_OFF_5L
@ __CONFIG _CONFIG5H, _CPB_OFF_5H & _CPD_OFF_5H
@ __CONFIG _CONFIG6L, _WRT0_OFF_6L & _WRT1_OFF_6L & _WRT2_OFF_6L & _WRT3_OFF_6L
@ __CONFIG _CONFIG6H, _WRTC_OFF_6H & _WRTB_OFF_6H & _WRTD_OFF_6H
@ __CONFIG _CONFIG7L, _EBTR0_OFF_7L & _EBTR1_OFF_7L & _EBTR2_OFF_7L & _EBTR3_OFF_7L
@ __CONFIG _CONFIG7H, _EBTRB_OFF_7H 


 DEFINE OSC 16     ' using HSPLL X 4 gives us OSC 16
@ errorlevel -306 ; turn off the Crossing page boundary warnings 

 Define LCD_DREG   PORTD
 Define LCD_DBIT   4
 Define LCD_RSREG  PORTE
 Define LCD_RSBIT  0
 Define LCD_EREG   PORTE
 Define LCD_EBIT   1

 ADCON1 = 7  ' Set to Digital


 'used for temperature'
 '--------------------'
 count_remain VAR BYTE  ' Count remaining
 count_per_c VAR	BYTE  ' Count per degree C
 Sensor_Select VAR Byte ' this var allows 2 sensors to be read    
 Radiator_Sensor con 8  ' Sensor on PortC.0 One-wire data pin (pin 15)
 Block_Sensor con 0     ' Sensor on PortB.0 One-wire data pin (pin 33)
 temp Var Word          ' temporary storage for Block_temp & Radiator_temp  
 Block_temp Var Word    ' Temperature storage  
 Radiator_temp Var Word ' Temperature storage 

 
 INCLUDE "EE_Vars.PBP"     
     
 'Declare The EE Variable' 'Load A Default Setting For The EE Variable'
 '=======================' '=========================================='
      Temp_Mode VAR  BYTE : @  EE_var  _Temp_Mode, BYTE,1 


 ' Allocate variables '
 ' ================== '
 a var byte             ' Enables if..then statements to execute without
 a = 0                  ' using GOTO's, a always equals 0
 b Var Word             ' counter to detect a sensor malfunction 
 I Var Byte             ' This variable speeds up button presses by only  
 I = 0                  ' reading one sensor at a time then displaying.

'Pushbuttons Variables '  
'===================== ' 
 Block_Code_Button VAR PORTC.2 ' pin 17 

'Port pins Variables '
'=================== ' 
 Buzzer VAR PORTD.1     ' pin 20 
 The_Fan VAR PORTD.2    ' pin 21

 Fahrenheit con 1
 Celsius CON 0
 Is_On CON 1
 Is_Off CON 0
 Is_Pressed CON 0  
 Is_Not_Pressed CON 1

 LCDOUT  254,64,28,20,28,0,0,0,0,0        ' Cust Char #0, Temp degree sign  

 Pause 1000' wait for Lcd to initialize

    LCDOut $fe, 1, "Taurus Controler"
  LCDOut $fe, $c0, "Jessy Montgomery" 

  PAUSE 2000 

  If a = 0 Then mainloop' Skip subroutines


Check_Temperature: 

  OWOut Sensor_Select, 1, [$CC, $44] ' Start the Temp conversion
 waitloop:
   If count_remain = 0 Then b = b + 1''''''''
   If b >= 20000 then                       '
  Loop_5:                                   '                      
     If Sensor_Select = Block_Sensor then   '   
        LCDOut $fe, 1, "Block Sensor Has"   '
     Else  ' If it's Radiator_Sensor        ' This detects a sensor malfunction
        LCDOut $fe, 1, " Rad Sensor Has "   ' in 2.5 seconds.
     Endif                                  '
      LCDOut $fe, $c0, "!Malfunctioned! "   ' Rad sensor will sound the alarm if 
      PWM  Buzzer,255,100                   ' the positive or the 4.7K resistor 
      The_Fan = Is_On                       ' is dissconnected from the DS1820
      Pause 100                             '
      IF Block_Code_Button = Is_Pressed THEN' Block sensor will only sound the 
        While Block_Code_Button = Is_Pressed' alarm if the 4.7K resistor is 
        Wend                                ' dissconnected?
        Pause 150                           '
        If a = 0 then Return                '
      Endif                                 '
  If a = 0 then Loop_5                      '
   Endif''''''''''''''''''''''''''''''''''''' 
     OWIn Sensor_Select, 4, [count_remain]'  Check for still busy converting 
	 IF count_remain = 0 THEN waitloop
     OWOut Sensor_Select, 1, [$CC, $BE]	  '  Read the Temp 
     OWIn Sensor_Select, 0, [temp.LOWBYTE, temp.HIGHBYTE, _
                        Skip 4, count_remain, count_per_c]
    ' Calculate temp in degrees Celsius to 2 decimal places 
     temp = ((ABS(temp) >> 1) * 100)
     temp = temp - 25 + (((count_per_c - count_remain) * 100) / count_per_c)
     IF Temp_Mode = Celsius then RETURN' If Mode is Fahrenheit then continue 
    ' Convert Celsius to Fahrenheit before returning   
     temp = (ABS(temp) */ 461)
     temp = temp + 3200
 RETURN


Select_A_Sensor_To_Read: 

   If I = 0 then'' This code here speeds up button presses
      I = 1      ' by only reading one sensor then displaying
   else          ' the results instead of reading two sensors
      I = 0      ' before displaying the results. 
   Endif'''''''''' 

   If I = 0 Then''''''''''''''''''''                 
    Sensor_Select = Radiator_Sensor' This is a little convoluted to say the 
   'SWAP temp, Radiator_temp       ' least but it works, how and why I have no  
   'Radiator_temp = temp           ' idea. If I uncomment the commented out code 
    Block_temp = temp              ' lines and use them the way you would think    
    GOSUB Check_Temperature        ' it should work then the program switches  
   Endif                           ' sensors around i.e. instead of reading the    
                                   ' Radiator_Sensor on pin 15 it then reads  
   If I = 1 Then                   ' the sensor on 33 even though it's declared  
    Sensor_Select = Block_Sensor   ' on pin 15 and vice versa for the  
   'SWAP temp, Block_temp          ' DS1820 Block_Sensor. So it switches the       
   'Block_temp = temp              ' two sensors, very confusing! It must be in  
    Radiator_temp = temp           ' way I'm swaping Rad & Block_temp into the       
    GOSUB Check_Temperature        ' temp variable but I also tried SWAP with 
   Endif                           ' the same results.
Return''''''''''''''''''''''''''''''

mainloop:

  Gosub Select_A_Sensor_To_Read
  b = 0

  If Temp_Mode = Fahrenheit Then
     LCDOut $FE, 1, "Radiator = ", DEC Radiator_temp / 100,0,"F"
     LCDOut $fe, $c0, " Block   = ", DEC Block_temp / 100,0,"F"
  Else ' If Temp_Mode = Celsius 
     LCDOut $FE, 1, "Rad Temp = ", DEC Radiator_temp / 100,0,"C"
     LCDOut $fe, $c0, " Block   = ", DEC Block_temp / 100,0,"C"
  Endif

  Pause 100

If a = 0 then mainloop

End