Many thanks ! Now I wait for account validation ... for see the example. Thanks again !
Many thanks ! Now I wait for account validation ... for see the example. Thanks again !
I'm stuck ...at red lines bellow ...
I have no ideea how to find the value of temperatureCode:; 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 can't figure SIGN yet, but TEMPERATURE is set in READ1820 one bit at a time.
Robert
Thanks for reply !
...I know that, but on display I have only "0" ...so I think I need to ...re-define temperature ?!?
I still have no clue how the sign is set, but you GOTO MAIN from within INIT1820; not a good thing, messes up the stack.
Robert
Don't you need something like this at bottom of READ1820?Code:If Temperature.15 then Temperature= ~Temperature +1 Sign = 1 Endif
Robert
No matter what temperature I set to DS18B20 ; the display show always "0,1".
It's beyond on my understanding and mental capabilities...
Code:; Termometru 7 segmente '====================================================================================== ;@ 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 INCLUDE "DT_INTS-14.bas" ' Base Interrupt System INCLUDE "ReEnterPBP.bas" ' Include if using PBP interrupts ASM INT_LIST macro ; IntSource, Label, Type, ResetFlag? INT_Handler TMR1_INT, _show, PBP, yes endm INT_CREATE ; Creates the interrupt processor ENDASM T1CON = $31 ; Prescaler=8, TMR1ON @ INT_ENABLE TMR1_INT ; enable Timer 1 interrupts '====================================================================================== Gosub init1820 ' Init the DS1820 command = $cc ' Issue Skip ROM command Gosub write1820 command = $44 ' Start temperature conversion Gosub write1820 Gosub init1820 ' Do another init command = $cc ' Issue Skip ROM command Gosub write1820 MainLOOP: command = $be ' Read the temperature Gosub write1820 Gosub read1820 TEMPERATURE = ((tempERATURE>> 1)*100)+((TEMPERATURE.0*5)*10) Gosub Selectie Goto MainLOOP '====================================================================================== 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 '====================================================================================== show: 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 @ INT_RETURN '====================================================================================== ' 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 mainLOOP ' 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 If Temperature.15 then Temperature= ~Temperature +1 Sign = 1 Endif 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
ERROR Line 23: Redefinition of VAR. (DT_INTS-14.bas) ?!?
Can not be done a simple termometer with LED display ?
Bookmarks