I'm stuck ...at red lines bellow ...
Code:
; Termo 7 seg
'======================================================================================
@ DEVICE pic16F628A, intOSC_osc_noclkout, WDT_OFF, PWRT_ON, MCLR_OFF, LVP_OFF, CPD_OFF
DEFINE OSC 4
CMCON = 7
VRCON = 0
INTCON = 0
Common_4 VAR PORTA.0
Common_3 VAR PORTA.1
Common_2 VAR PORTA.2
Common_1 VAR PORTA.3
DP VAR PORTB.7
Temp Var byte
Temperature Var Word
TempC Var Word
I Var Byte
Sign Var Word
Float Var Word
V Var Word
Dummy Var Byte
Busy Var Bit
DIGIT_0 VAR BYTE
DIGIT_1 VAR BYTE
DIGIT_2 VAR BYTE
DIGIT_3 VAR BYTE
digit Var BYTE
DQ VAR PORTA.4
DQ_DIR var TRISA.4
command var byte
pis var byte
TrisB=0 ' Make PortB outputs
TrisA.0=0:TrisA.1=0:TrisA.2=0 ' Make only the specific bits of PortA outputs
TrisA.3=0:TrisA.4=1
PortA=0:PortB=0 ' Clear PortB and PortA
INTCON = %00100000
OPTION_REG = %10000000
ON INTERRUPT GOTO ISR
INTCON = %10100000
'======================================================================================
Gosub init1820 ' Init the DS1820
command = $cc ' Issue Skip ROM command
Gosub write1820
command = $44 ' Start temperature conversion
Gosub write1820
Pause 2000 ' Wait 2 seconds for conversion to complete
Gosub init1820 ' Do another init
command = $cc ' Issue Skip ROM command
Gosub write1820
MAIN :
command = $be ' Read the temperature
Gosub write1820
Gosub read1820
temperature = ??????
sign = ????
Gosub Selectie
Goto Main
'======================================================================================
Selectie :
IF sign ="-" then
DIGIT_3="-"
else
DIGIT_3=" "
ENDIF
IF TEMPERATURE DIG 2 = 0 THEN
DIGIT_2 = " "
ELSE
DIGIT_2 = TEMPERATURE dig 2
ENDIF
DIGIT_1 = TEMPERATURE dig 1
DIGIT_0 = TEMPERATURE dig 0
RETURN
'======================================================================================
DISABLE
ISR:
for i=0 to 4
TEMP = DIGIT_3 : gosub segments
COMMON_1 = 1 : PAUSE 1 : COMMON_1 = 0
TEMP = DIGIT_2 : GOSUB segments
COMMON_2 = 1 : PAUSE 1 : COMMON_2 = 0
TEMP = DIGIT_1 : GOSUB segments
COMMON_3 = 1 : DP = 0 : PAUSE 1 : COMMON_3 = 0 : DP = 1
TEMP = DIGIT_0 : GOSUB segments
COMMON_4 = 1 : PAUSE 1 : COMMON_4 = 0
next i
segments: ; CONVERTS DATES TO 7 SEGMENT CODE for Common ANOD
SELECT CASE TEMP
CASE 0 : PortB=%11000000 ; 0=ON ; 1=OFF
CASE 1 : PortB=%11111001
CASE 2 : PortB=%10100100
CASE 3 : PortB=%10110000
CASE 4 : PortB=%10011001
CASE 5 : PortB=%10010010
CASE 6 : PortB=%10000010
CASE 7 : PortB=%11111000
CASE 8 : PortB=%10000000
CASE 9 : PortB=%10010000
CASE "-" : PortB=%10111111
CASE " " : PortB=%11111111
END SELECT
return
INTCON.2=0
RESUME
ENABLE
'======================================================================================
' Initialize DS1820 and check for presence
init1820:
Low DQ ' Set the data pin low to init
Pauseus 500 ' Wait > 480us
DQ_DIR = 1 ' Release data pin (set to input for high)
Pauseus 100 ' Wait > 60us
If DQ = 1 Then
Pause 500
Goto main ' Try again
Endif
Pauseus 400 ' Wait for end of presence pulse
Return
' Write "command" byte to the DS1820
write1820:
For pis = 1 To 8 ' 8 bits to a byte
If command.0 = 0 Then
Gosub write0 ' Write a 0 bit
Else
Gosub write1 ' Write a 1 bit
Endif
command = command >> 1 ' Shift to next bit
Next pis
Return
' Write a 0 bit to the DS1820
write0:
Low DQ
Pauseus 60 ' Low for > 60us for 0
DQ_DIR = 1 ' Release data pin (set to input for high)
Return
' Write a 1 bit to the DS1820
write1:
Low DQ ' Low for < 15us for 1
@ nop ' Delay 1us at 4MHz
DQ_DIR = 1 ' Release data pin (set to input for high)
Pauseus 60 ' Use up rest of time slot
Return
' Read temperature from the DS1820
read1820:
For pis = 1 To 16 ' 16 bits to a word
temperature = temperature >> 1 ' Shift down bits
Gosub readbit ' Get the bit to the top of temp
Next pis
Return
' Read a bit from the DS1820
readbit:
temperature.15 = 1 ' Preset read bit to 1
Low DQ ' Start the time slot
@ nop ' Delay 1us at 4MHz
DQ_DIR = 1 ' Release data pin (set to input for high)
If DQ = 0 Then
temperature.15 = 0 ' Set bit to 0
Endif
Pauseus 60 ' Wait out rest of time slot
Return
end
I have no ideea how to find the value of temperature
...
Bookmarks