DS1302 decimal to bcd conversion
Does anyone have a sample already wrote to change a decimal number to
a bcd number that makes the bcd number equal the decimal. As such,
20 decimal is 14 in hex or bcd but the DS1302 is serially input in
bcd not decimal. So while the lcd and the register holding this
number is 20 and you need to place the hex number into the ds1302 of
20 but your register is actually 14 hex. I cannot use the hex
version to display to screen since I would be displaying the
A,B,C,D,E,F of hex and I want to be able to push a button and display
the setting of the seconds, minutes, hours on the screen. From 0 to
59 less the A,B,C,D,E,F. Now the other problem is that I have
already used up most of the program storage area and have very little
room for this conversion. I have posted the program below, the
actual part I am having trouble with is near the end.
Many thanks
Timothy Hosey
'{$STAMP BS2}
'#####################################################################
#########################
'THIS PROGRAM COPYWRITED 2001 BY TIMOTHY L. HOSEY
'LED 8 IS FOR READING TEMP
'LED 9 IS FOR READING THE PLC VIA DIRECTNET PROTOCOL
'LED 10 IS FOR WRITING TO LCD
'LED 11 IS FOR DOWNLOADING FROM VB PROGRAM
'#####################################################################
#########################
'#####################################################################
#########################
'DEFINE OUTPUT PINS USED FOR SERIAL SPI INTERFACE
'#####################################################################
#########################
DQ CON 4 'SPI SERIAL DATA PIN
CLK CON 3 'SPI SERIAL CLOCK PIN
RSTT CON 2 'SPI SERIAL RESET PIN FOR
TEMP CHIP DS-1620
RSTE CON 5 'SPI SERIAL RESET PIN FOR EEPROM CHIP
RST1302 CON 6 'SPI SERIAL RESET PIN FOR TIME CHIP
DS-1302
'#####################################################################
#########################
'DEFINE PINS USED FOR BUTTONS
'#####################################################################
#########################
BUT1 CON 12
BUT2 CON 13
BUT3 CON 14
'#####################################################################
#########################
' DEFINE VARIABLES
'#####################################################################
#########################
X VAR WORD
INFO VAR WORD ' VARIABLE TO HOLD 9-
bit INFO.
PROM_HEX VAR WORD
CHECK VAR WORD
HEADER VAR WORD
CMD VAR BYTE
CNT VAR BYTE
TEMP VAR WORD 'TEMPURATURE IS HELD HERE
PLC VAR BYTE(8)
LRC VAR WORD
ADD VAR WORD 'ADDRESS OF DIRECTNET
PROTOCOL MASTER.
'#####################################################################
#########################
'START DECLARING ALLIASES FOR WORD VARIABLES
'#####################################################################
#########################
SECONDS VAR TEMP.LOWBYTE
MINUTES VAR TEMP.HIGHBYTE
HOUR VAR LRC.LOWBYTE
DAY VAR LRC.HIGHBYTE
MONTH VAR INFO.LOWBYTE
YEAR VAR INFO.HIGHBYTE
'#####################################################################
#########################
'START DECLARING CONSTANTS FOR PLC PROGRAM
'#####################################################################
#########################
ENQ CON $05
ACK CON $06
NAK CON $15
SOH CON $01
ETB CON $17
STX CON $02
ETX CON $03
EOT CON $04
INIT CON $4E
'#####################################################################
#########################
'START DECLARING CONSTANTS FOR EEPROM
'#####################################################################
#########################
READE CON 3 'DATA FOR SPI EEPROM
WRTE CON 2 'DATA FOR SPI EEPROM
WREN CON 6 'DATA FOR SPI EEPROM
'#####################################################################
#########################
'START DECLARING CONSTANTS FOR DS1302
'#####################################################################
#########################
SecReg CON %00000
MinReg CON %00001
HrsReg CON %00010
DateReg CON %00011
MonReg CON %00100
YrReg CON %00110
CtrlReg CON %00111
BrstReg CON %11111
'#####################################################################
#########################
'MAKE PINS INPUTS FOR BUTTONS
'#####################################################################
#########################
INPUT BUT1
INPUT BUT2
INPUT BUT3
'#####################################################################
#########################
'WRITE TO THE LCD SCREEN AT START UP
'#####################################################################
#########################
HIGH RSTE
HIGH 10 'WRITING TO
LCD LED ON
PAUSE 1000
GOSUB CLEAR_SCREEN
SEROUT 15,16468,[noparse][[/noparse]"AUTOMATED PANELS"]
SEROUT 15,16468,[noparse][[/noparse]254,192]
SEROUT 15,16468,[noparse][[/noparse]"2001 TIM HOSEY"]
LOW 10 'WRITING TO
LCD LED OFF
PAUSE 3000 'WAIT 3
SECONDS
'#####################################################################
#########################
' ACTIVATE THE 1620 AND SET FOR CONTINOUS CONVERSION SET THE HIGH AND
LOW TEMPERATURES.
'#####################################################################
#########################
HIGH RSTT
SHIFTOUT DQ,CLK,LSBFIRST,[noparse][[/noparse]$0C,$0A]
SHIFTOUT DQ,CLK,LSBFIRST,[noparse][[/noparse]$00\9]
LOW RSTT
PAUSE 10
HIGH RSTT
SHIFTOUT DQ,CLK,LSBFIRST,[noparse][[/noparse]$EE]
LOW RSTT
PAUSE 10
'#####################################################################
#########################
' INITIAL ADDRESS FOR DIRECTNET PROTOCOL
'#####################################################################
#########################
ADD = $21
'THIS IS FOR ADDRESS
1
GOSUB READ_PROM 'USED FOR DIRECTNET PROTOCOL
'#####################################################################
#########################
' BEGINING OF PROGRAM LOOP
'#####################################################################
#########################
START:
'#####################################################################
#########################
' CLEAR CONTENTS OF REGISTERS
'#####################################################################
#########################
GOSUB CLEAR_PLC_ARRAY
INFO = 0
TEMP = 0
CMD = 0
CNT = 0
'#####################################################################
#########################
' IF BUTTON 12 IS PUSHED JUMP TO SET_TIME LABEL
'#####################################################################
#########################
IF IN12 = 1 THEN SET_TIME
'#####################################################################
#########################
' CHECK TO SEE IF VB PROGRAM IS DOWNLOADING
'#####################################################################
#########################
SERIN 16,16468,100,NOWAY,[noparse][[/noparse]STR PLC\2]
NOWAY:
IF PLC(0) = "O" AND PLC(1) = "K" THEN DOWNLOADING
'#####################################################################
#########################
' READING THE TEMPURATURE
'#####################################################################
#########################
HIGH 8 'CHECKING
TEMPURATURE LED 8 ON
HIGH RSTT
SHIFTOUT DQ,CLK,LSBFIRST,[noparse][[/noparse]$AA] ' REQUEST TO READ
TEMP
shiftin DQ,CLK,LSBPRE,[noparse][[/noparse]INFO\9] ' GET TEMP READING
LOW RSTT
INFO = INFO/2 ' SCALE READING TO
WHOLE DEG CELS.
INFO = (INFO */ $01CC) ' MULTIPLY BY 1.8
INFO = INFO + 32 ' COMPLETE CONVERSION
TO FERINHEIT.
TEMP = INFO
LOW 8 'CHECKING
TEMPURATURE LED 8 OFF
'#####################################################################
#########################
' START OF THE PLC READ PROTOCOL'S FOR V2000
'#####################################################################
#########################
HIGH 9 'READING PLC
LED 9 ON
SEROUT 1,16468,[noparse][[/noparse]INIT,ADD,ENQ] 'INITIATE SEQUENCING
SERIN 0,16468,500,NODATA,[noparse][[/noparse]STR PLC\7] 'RECIEVE DATA FROM
THE PLC
NODATA:
IF PLC(2) <> ACK THEN NORESP
GOSUB CLEAR_PLC_ARRAY 'CLEAR THE
PLC ARRAY
'#####################################################################
#########################
' SEND INFO TO THE PLC TO READ
'#####################################################################
#########################
SEROUT 1,16468,
[noparse][[/noparse]SOH,$30,$31,$30,$31,$30,$34,$30,$31,$30,$30,$30,$34,$30,$31,ETB,$30,$
30]
' 1 2 3 4 5 6 7 8 9 10 11
12 13 14 15 16 17 18
SERIN 0,16468,500,NODATA2,[noparse][[/noparse]STR PLC\7] 'RECIEVE THE REQUESTED INFO.
SEROUT 1,16468,[noparse][[/noparse]ACK]
SEROUT 1,16468,[noparse][[/noparse]EOT]
NODATA2:
LOW 9 'READING PLC
LED 9 OFF
'PLC(5)+PLC(6)+PLC(3)+PLC(4) THIS IS THE ORDER OF BYTES
INFO.HIGHBYTE = PLC(3)
INFO.LOWBYTE = PLC(4)
LOOKDOWN PLC(3),
[noparse][[/noparse]"0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"],INFO
.NIB1
LOOKDOWN PLC(4),
[noparse][[/noparse]"0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"],INFO
.NIB0
INFO.HIGHBYTE = 0
PROM_HEX = INFO * $20
IF PROM_HEX = CHECK THEN WRITE_PLC 'THIS TAKES YOU
AROUND WRITING TO THE SCREEN IF
CHECK = PROM_HEX 'THE SCREEN
IS WRITING THE SAME THING AGAIN.
IF PROM_HEX = $0000 THEN DISPLAY_TEMP
ENDS:
'#####################################################################
#########################
' READING THE EEPROM
'#####################################################################
#########################
HIGH 10 'WRITING TO
LCD LED ON
GOSUB CLEAR_SCREEN 'CLEARING THE
LCD SCREEN
LOW 10
'WRITING TO LCD LED OFF
FOR X = PROM_HEX TO PROM_HEX + 32
CNT = CNT + 1
IF CNT = 17 THEN LINE2
BACKTO_LINE2:
LOW RSTE
SHIFTOUT DQ,CLK,MSBFIRST,[noparse][[/noparse]READE]
SHIFTOUT DQ,CLK,MSBFIRST,[noparse][[/noparse]X\16]
SHIFTIN DQ,CLK,MSBPRE,[noparse][[/noparse]INFO]
HIGH RSTE
IF INFO = 0 THEN AROUND
HIGH 10 'WRITING TO
LCD LED ON
SEROUT 15,16468,[noparse][[/noparse]INFO] 'WRITING INFO
TO THE LCD
LOW 10
'WRITING TO LCD LED OFF
AROUND:
NEXT
HIGH RSTT
'#####################################################################
#########################
' WRITE TEMP TO PLC REGISTER V2001
'#####################################################################
#########################
WRITE_PLC:
HIGH 9 'WRITING TO
PLC LED 9 ON
GOSUB CLEAR_PLC_ARRAY
SEROUT 1,16468,[noparse][[/noparse]INIT,ADD,ENQ] 'INITIATE SEQUENCING
SERIN 0,16468,500,NO,[noparse][[/noparse]STR PLC\7] 'RECIEVE DATA FROM
THE PLC
NO:
'DUH LOOK AT BIT 4 IF IT IS 30 THEN READ IF IT IS 38 THEN WRITE
SEROUT 1,16468,
[noparse][[/noparse]SOH,$30,$31,$38,$31,$30,$34,$30,$32,$30,$30,$30,$34,$30,$31,ETB,$30,$
42]
' 1 2 3 4 5 6 7 8 9 10 11
12 13 14 15 16 17 18
SERIN 0,16468,500,NO2,[noparse][[/noparse]STR PLC\7] 'RECIEVE THE
REQUESTED INFO.
NO2:
IF PLC(0) <> ACK THEN START
GOSUB CONV_TEMP
LRC = $30 ^ $30 'XOR
LRC = LRC ^ TEMP.HIGHBYTE 'XOR
LRC = LRC ^ TEMP.LOWBYTE 'XOR
GOSUB FIND_LRC
'REMEMBER THAT 0 IS $30
SEROUT 1,16468,
[noparse][[/noparse]STX,TEMP.HIGHBYTE,TEMP.LOWBYTE,$30,$30,ETX,LRC.HIGHBYTE,LRC.LOWBYTE]
SERIN 0,16468,500,NO3,[noparse][[/noparse]STR PLC\7] 'RECIEVE THE
REQUESTED INFO.
NO3:
IF PLC(0) <> ACK THEN START
SEROUT 1,16468,[noparse][[/noparse]EOT]
GOTO START
'#####################################################################
#########################
' CONVERT TEMP FOR THE PLC TO UNDERSTAND.
'#####################################################################
#########################
CONV_TEMP:
LOOKUP TEMP.NIB1,
[noparse][[/noparse]$30,$31,$32,$33,$34,$35,$36,$37,$38,$39,$41,$42,$43,$44,$45,$46],TEMP
.HIGHBYTE
LOOKUP TEMP.NIB0,
[noparse][[/noparse]$30,$31,$32,$33,$34,$35,$36,$37,$38,$39,$41,$42,$43,$44,$45,$46],TEMP
.LOWBYTE
RETURN
'#####################################################################
#########################
' CONVERT TO CALCULATE LRC FOR THE PLC.
'#####################################################################
#########################
FIND_LRC:
LOOKUP LRC.NIB1,
[noparse][[/noparse]$30,$31,$32,$33,$34,$35,$36,$37,$38,$39,$40,$41,$42,$43,$44,$45,$46],
LRC.HIGHBYTE
LOOKUP LRC.NIB0,
[noparse][[/noparse]$30,$31,$32,$33,$34,$35,$36,$37,$38,$39,$40,$41,$42,$43,$44,$45,$46],
LRC.LOWBYTE
RETURN
NORESP:
'#####################################################################
#########################
' DISPLAY ON LCD TEMP AND CHECK PLC CABLE
'#####################################################################
#########################
HIGH 10 'WRITING TO
LCD LED ON
GOSUB DISPLAY_TEMPATURE
SEROUT 15,16468,[noparse][[/noparse]254,192]
SEROUT 15,16468,[noparse][[/noparse]"CHECK PLC CABLE"]
PAUSE 1000
'#####################################################################
#########################
' IF BUTTON 12 IS PUSHED JUMP TO SET_TIME LABEL
'#####################################################################
#########################
IF IN12 = 1 THEN SET_TIME
'#####################################################################
#########################
' DISPLAY THE TIME HERE
'#####################################################################
#########################
GOSUB ReadRTCBurst
SEROUT 15,16468,[noparse][[/noparse]254,192]
SEROUT 15,16468,[noparse][[/noparse]"TIME: "]
SEROUT 15,16468,[noparse][[/noparse]DEC1 Hour.HIGHNIB, DEC1 Hour.LOWNIB,":", DEC1
Minutes.HIGHNIB]
SEROUT 15,16468,[noparse][[/noparse]DEC1 Minutes.LOWNIB,":", DEC1 Seconds.HIGHNIB,
DEC1 Seconds.LOWNIB," "]
DEBUG SDEC Minutes.HIGHNIB,SDEC Minutes.LOWNIB,CR
PAUSE 1000
LOW 9 'WRITING TO
PLC LED 9 OFF
LOW 10 'WRITING TO
LCD LED OFF
GOTO START
LINE2:
HIGH 10 'WRITING TO
LCD LED ON
SEROUT 15,16468,[noparse][[/noparse]254,192]
LOW 10
'WRITING TO LCD LED
OFF
GOTO BACKTO_LINE2
'#####################################################################
#########################
' DOWNLOADING FROM VB PROGRAM
'#####################################################################
#########################
DOWNLOADING:
HIGH 11 'CHECK FOR
DOWNLOADING LED ON
HIGH 10 'WRITING TO
LCD LED ON
GOSUB CLEAR_SCREEN
SEROUT 15,16468,[noparse][[/noparse]" DOWNLOAD MODE!"]
SEROUT 16,16468,[noparse][[/noparse]"DOWNLOAD",13]
LOW 10 'WRITING TO
LCD LED OFF
'GATHER ADDRESS,READ,AND TEMP FROM PC
'WRITE ENABLE THE EEPROM
LOW RSTE
SHIFTOUT DQ,CLK,MSBFIRST,[noparse][[/noparse]WREN]
HIGH RSTE
PAUSE 100
'#####################################################################
#########################
' WRITE INFO FROM VB PROGRAM TO EEPROM
'#####################################################################
#########################
LOW RSTE
SHIFTOUT DQ,CLK,MSBFIRST,[noparse][[/noparse]WRTE] 'SET TO WRITE TO
EEPROM
'THIS IS THE ADDRESS OF THE PLC
SHIFTOUT DQ,CLK,MSBFIRST,[noparse][[/noparse]$0FF0\16] 'WRITE TO THIS ADDRESS
PAUSE 10
SERIN 16,16468,[noparse][[/noparse]SHEX4 HEADER]
SHIFTOUT DQ,CLK,MSBFIRST,[noparse][[/noparse]HEADER\16]
HIGH RSTE
HIGH 10 'WRITING TO
LCD LED ON
'#####################################################################
#########################
' DISPLAY STATION NUMBER DIRECTNET PROTOCOL WITH THE GOSUB
'#####################################################################
#########################
GOSUB STAT_NUMBER 'GET INFO TO
WRITE TO LCD SCREEN
LOW 10 'WRITING TO
LCD LED OFF
FOR X = 1 TO 36 'SHOULD BE 36
HEADER = 0
LOW RSTE 'WRITE ENABLE
THE EEPROM
SHIFTOUT DQ,CLK,MSBFIRST,[noparse][[/noparse]WREN]
HIGH RSTE
PAUSE 100
LOW RSTE 'WRITE TO THE
EEPROM
SHIFTOUT DQ,CLK,MSBFIRST,[noparse][[/noparse]WRTE] 'SET TO WRITE TO
EEPROM
'#####################################################################
#########################
' DISPLAY LOCATION OF EEPROM ON LCD SCREEN
'#####################################################################
#########################
SERIN 16,16468,[noparse][[/noparse]SHEX4 HEADER]
GOSUB CLEAR_SCREEN
SEROUT 15,16468,[noparse][[/noparse]"RECIEVING INFO!"]
SEROUT 15,16468,[noparse][[/noparse]254,192]
SEROUT 15,16468,[noparse][[/noparse]"POSITION #",SDEC X]
SHIFTOUT DQ,CLK,MSBFIRST,[noparse][[/noparse]HEADER\16] 'WRITE TO THIS ADDRESS
PAUSE 10
'#####################################################################
#########################
' WRITE TO THE EEPROM THE VB MESSAGE
'#####################################################################
#########################
SERIN 16,16468,[noparse][[/noparse]STR PLC\8]
SHIFTOUT DQ,CLK,MSBFIRST,[noparse][[/noparse]PLC(0),PLC(1),PLC(2),PLC(3),PLC(4),PLC
(5),PLC(6),PLC(7)\8]
SERIN 16,16468,[noparse][[/noparse]STR PLC\8]
SHIFTOUT DQ,CLK,MSBFIRST,[noparse][[/noparse]PLC(0),PLC(1),PLC(2),PLC(3),PLC(4),PLC
(5),PLC(6),PLC(7)\8]
SERIN 16,16468,[noparse][[/noparse]STR PLC\8]
SHIFTOUT DQ,CLK,MSBFIRST,[noparse][[/noparse]PLC(0),PLC(1),PLC(2),PLC(3),PLC(4),PLC
(5),PLC(6),PLC(7)\8]
SERIN 16,16468,[noparse][[/noparse]STR PLC\8]
SHIFTOUT DQ,CLK,MSBFIRST,[noparse][[/noparse]PLC(0),PLC(1),PLC(2),PLC(3),PLC(4),PLC
(5),PLC(6),PLC(7)\8]
HIGH RSTE
PAUSE 100
NEXT
GOSUB READ_PROM
LOW 11 'CHECK FOR
DOWNLOADING LED OFF
GOTO START
CLEAR_PLC_ARRAY:
PLC(0) = 0
PLC(1) = 0
PLC(2) = 0
PLC(3) = 0
PLC(4) = 0
PLC(5) = 0
PLC(6) = 0
PLC(7) = 0
PLC(8) = 0
RETURN
'#####################################################################
#########################
' READING THE EEPROM
'#####################################################################
#########################
READ_PROM:
'READING THE EEPROM
LOW RSTE
SHIFTOUT DQ,CLK,MSBFIRST,[noparse][[/noparse]READE]
PAUSE 10
SHIFTOUT DQ,CLK,MSBFIRST,[noparse][[/noparse]$0FF0\16]
PAUSE 10
SHIFTIN DQ,CLK,MSBPRE,[noparse][[/noparse]ADD\16]
HIGH RSTE
HIGH 10 'WRITING TO
LCD LED ON
GOSUB STAT_NUMBER 'GET
INFO TO WRITE TO LCD SCREEN
PAUSE 2000
LOW 10 'WRITING TO
LCD LED OFF
RETURN
'#####################################################################
#########################
' I BELIEVE THIS IS IF PLC V2000 IS A 0 YOU MAY NEED TO CHECK THIS
OUT TIM
' AND GET RID OF IT
'#####################################################################
#########################
DISPLAY_TEMP:
GOSUB DISPLAY_TEMPATURE
SEROUT 15,16468,[noparse][[/noparse]254,192]
SEROUT 15,16468,[noparse][[/noparse]" CARDINAL"]
'#####################################################################
#########################
' SENDS ME TO WRITE TEMP TO PLC IN V2000
'#####################################################################
#########################
GOTO WRITE_PLC 'YOU WILL BE SENT BACK INTO
THE START LOOP.
'#####################################################################
#########################
' THE FOLLOWING IS USED TO SET THE TIME USEING PINS 14, 13, 12
'#####################################################################
#########################
SET_TIME:
TEMP = $00 'DO THIS SO YOU SET A 0 AT
LEAST IN THE SECONDS REGISTER.
LRC = SecReg
GOSUB WriteRTC
SET_SEC:
HIGH 10
GOSUB CLEAR_SCREEN
SEROUT 15,16468,[noparse][[/noparse]"SET SECONDS: ",DEC TEMP]
PAUSE 400
IF IN14 = 1 THEN SET_MIN
IF IN13 = 0 THEN SET_SEC
TEMP = TEMP + 1
IF NOT TEMP > 59 THEN SEC_GRT
TEMP = $00
SEC_GRT:
LRC = SecReg
GOSUB WriteRTC
GOTO SET_SEC
SET_MIN:
TEMP = $00 'DO THIS SO YOU SET A 0 AT
LEAST IN THE MINUTES REGISTER.
LRC = MinReg
GOSUB WriteRTC
SET_MIN1:
GOSUB CLEAR_SCREEN
SEROUT 15,16468,[noparse][[/noparse]"SET MINUTES: ",DEC TEMP]
PAUSE 400
IF IN14 = 1 THEN SET_HR
IF IN13 = 0 THEN SET_MIN1
TEMP = TEMP + 1
IF NOT TEMP > 59 THEN MIN_GRT
TEMP = $00
MIN_GRT:
LRC = MinReg
GOSUB WriteRTC
GOTO SET_MIN1
SET_HR:
TEMP = $01 'DO THIS SO YOU SET A 1 AT
LEAST IN THE HOURS REGISTER.
LRC = HRSReg
GOSUB WriteRTC
SET_HR1:
GOSUB CLEAR_SCREEN
SEROUT 15,16468,[noparse][[/noparse]"SET HOUR: ",DEC TEMP]
PAUSE 400
IF IN14 = 1 THEN END_TIME
IF IN13 = 0 THEN SET_HR1
TEMP = TEMP + $1
IF NOT TEMP > 12 THEN HR_GRT
TEMP = $01
HR_GRT:
LRC = HRSReg
GOSUB WriteRTC
GOTO SET_HR1
END_TIME
Temp = $80
LRC = CtrlReg
GOSUB WriteRTC
LOW 10
GOTO START
'#####################################################################
#########################
' TO READ THE TIME AND DATE FROM THE DS1302
'#####################################################################
#########################
ReadRTCBurst:
HIGH RST1302
SHIFTOUT DQ, Clk, LSBFIRST, [noparse][[/noparse]%1\1,BrstReg\5,%10\2]
SHIFTIN DQ, Clk, LSBPRE, [noparse][[/noparse]Seconds,Minutes,Hour,DAY,Month,Year,Year]
LOW RST1302
RETURN
'#####################################################################
#########################
' TO WRITE THE TIME AND DATE FROM THE DS1302
'#####################################################################
#########################
WriteRTC:
'Write to DS1302
HIGH RST1302
SHIFTOUT DQ, Clk, LSBFIRST, [noparse][[/noparse]%0\1,CtrlReg\5,%10\2,$10]
LOW RST1302
HIGH RST1302
SHIFTOUT DQ, Clk, LSBFIRST, [noparse][[/noparse]%0\1,LRC\5,%10\2,Temp]
LOW RST1302
RETURN
'#####################################################################
#########################
' TO CLEAR LCD AND DISPLAY DIRECTNET PROT STATION #
'#####################################################################
#########################
STAT_NUMBER:
GOSUB CLEAR_SCREEN
SEROUT 15,16468,[noparse][[/noparse]"STATION #:",ISHEX ADD]
RETURN
'#####################################################################
#########################
' THE ROUTINES BELOW ARE TO GET MORE MEMORY OUT OF THE STAMP
' I NEEDED TO COMPILE IT TO BE SMALLER CODE
'#####################################################################
#########################
DISPLAY_TEMPATURE:
GOSUB CLEAR_SCREEN
SEROUT 15,16468,[noparse][[/noparse]"TEMP = ",SDEC TEMP," DEG F"]
RETURN
CLEAR_SCREEN:
SEROUT 15,16468,[noparse][[/noparse]254,1]
RETURN
a bcd number that makes the bcd number equal the decimal. As such,
20 decimal is 14 in hex or bcd but the DS1302 is serially input in
bcd not decimal. So while the lcd and the register holding this
number is 20 and you need to place the hex number into the ds1302 of
20 but your register is actually 14 hex. I cannot use the hex
version to display to screen since I would be displaying the
A,B,C,D,E,F of hex and I want to be able to push a button and display
the setting of the seconds, minutes, hours on the screen. From 0 to
59 less the A,B,C,D,E,F. Now the other problem is that I have
already used up most of the program storage area and have very little
room for this conversion. I have posted the program below, the
actual part I am having trouble with is near the end.
Many thanks
Timothy Hosey
'{$STAMP BS2}
'#####################################################################
#########################
'THIS PROGRAM COPYWRITED 2001 BY TIMOTHY L. HOSEY
'LED 8 IS FOR READING TEMP
'LED 9 IS FOR READING THE PLC VIA DIRECTNET PROTOCOL
'LED 10 IS FOR WRITING TO LCD
'LED 11 IS FOR DOWNLOADING FROM VB PROGRAM
'#####################################################################
#########################
'#####################################################################
#########################
'DEFINE OUTPUT PINS USED FOR SERIAL SPI INTERFACE
'#####################################################################
#########################
DQ CON 4 'SPI SERIAL DATA PIN
CLK CON 3 'SPI SERIAL CLOCK PIN
RSTT CON 2 'SPI SERIAL RESET PIN FOR
TEMP CHIP DS-1620
RSTE CON 5 'SPI SERIAL RESET PIN FOR EEPROM CHIP
RST1302 CON 6 'SPI SERIAL RESET PIN FOR TIME CHIP
DS-1302
'#####################################################################
#########################
'DEFINE PINS USED FOR BUTTONS
'#####################################################################
#########################
BUT1 CON 12
BUT2 CON 13
BUT3 CON 14
'#####################################################################
#########################
' DEFINE VARIABLES
'#####################################################################
#########################
X VAR WORD
INFO VAR WORD ' VARIABLE TO HOLD 9-
bit INFO.
PROM_HEX VAR WORD
CHECK VAR WORD
HEADER VAR WORD
CMD VAR BYTE
CNT VAR BYTE
TEMP VAR WORD 'TEMPURATURE IS HELD HERE
PLC VAR BYTE(8)
LRC VAR WORD
ADD VAR WORD 'ADDRESS OF DIRECTNET
PROTOCOL MASTER.
'#####################################################################
#########################
'START DECLARING ALLIASES FOR WORD VARIABLES
'#####################################################################
#########################
SECONDS VAR TEMP.LOWBYTE
MINUTES VAR TEMP.HIGHBYTE
HOUR VAR LRC.LOWBYTE
DAY VAR LRC.HIGHBYTE
MONTH VAR INFO.LOWBYTE
YEAR VAR INFO.HIGHBYTE
'#####################################################################
#########################
'START DECLARING CONSTANTS FOR PLC PROGRAM
'#####################################################################
#########################
ENQ CON $05
ACK CON $06
NAK CON $15
SOH CON $01
ETB CON $17
STX CON $02
ETX CON $03
EOT CON $04
INIT CON $4E
'#####################################################################
#########################
'START DECLARING CONSTANTS FOR EEPROM
'#####################################################################
#########################
READE CON 3 'DATA FOR SPI EEPROM
WRTE CON 2 'DATA FOR SPI EEPROM
WREN CON 6 'DATA FOR SPI EEPROM
'#####################################################################
#########################
'START DECLARING CONSTANTS FOR DS1302
'#####################################################################
#########################
SecReg CON %00000
MinReg CON %00001
HrsReg CON %00010
DateReg CON %00011
MonReg CON %00100
YrReg CON %00110
CtrlReg CON %00111
BrstReg CON %11111
'#####################################################################
#########################
'MAKE PINS INPUTS FOR BUTTONS
'#####################################################################
#########################
INPUT BUT1
INPUT BUT2
INPUT BUT3
'#####################################################################
#########################
'WRITE TO THE LCD SCREEN AT START UP
'#####################################################################
#########################
HIGH RSTE
HIGH 10 'WRITING TO
LCD LED ON
PAUSE 1000
GOSUB CLEAR_SCREEN
SEROUT 15,16468,[noparse][[/noparse]"AUTOMATED PANELS"]
SEROUT 15,16468,[noparse][[/noparse]254,192]
SEROUT 15,16468,[noparse][[/noparse]"2001 TIM HOSEY"]
LOW 10 'WRITING TO
LCD LED OFF
PAUSE 3000 'WAIT 3
SECONDS
'#####################################################################
#########################
' ACTIVATE THE 1620 AND SET FOR CONTINOUS CONVERSION SET THE HIGH AND
LOW TEMPERATURES.
'#####################################################################
#########################
HIGH RSTT
SHIFTOUT DQ,CLK,LSBFIRST,[noparse][[/noparse]$0C,$0A]
SHIFTOUT DQ,CLK,LSBFIRST,[noparse][[/noparse]$00\9]
LOW RSTT
PAUSE 10
HIGH RSTT
SHIFTOUT DQ,CLK,LSBFIRST,[noparse][[/noparse]$EE]
LOW RSTT
PAUSE 10
'#####################################################################
#########################
' INITIAL ADDRESS FOR DIRECTNET PROTOCOL
'#####################################################################
#########################
ADD = $21
'THIS IS FOR ADDRESS
1
GOSUB READ_PROM 'USED FOR DIRECTNET PROTOCOL
'#####################################################################
#########################
' BEGINING OF PROGRAM LOOP
'#####################################################################
#########################
START:
'#####################################################################
#########################
' CLEAR CONTENTS OF REGISTERS
'#####################################################################
#########################
GOSUB CLEAR_PLC_ARRAY
INFO = 0
TEMP = 0
CMD = 0
CNT = 0
'#####################################################################
#########################
' IF BUTTON 12 IS PUSHED JUMP TO SET_TIME LABEL
'#####################################################################
#########################
IF IN12 = 1 THEN SET_TIME
'#####################################################################
#########################
' CHECK TO SEE IF VB PROGRAM IS DOWNLOADING
'#####################################################################
#########################
SERIN 16,16468,100,NOWAY,[noparse][[/noparse]STR PLC\2]
NOWAY:
IF PLC(0) = "O" AND PLC(1) = "K" THEN DOWNLOADING
'#####################################################################
#########################
' READING THE TEMPURATURE
'#####################################################################
#########################
HIGH 8 'CHECKING
TEMPURATURE LED 8 ON
HIGH RSTT
SHIFTOUT DQ,CLK,LSBFIRST,[noparse][[/noparse]$AA] ' REQUEST TO READ
TEMP
shiftin DQ,CLK,LSBPRE,[noparse][[/noparse]INFO\9] ' GET TEMP READING
LOW RSTT
INFO = INFO/2 ' SCALE READING TO
WHOLE DEG CELS.
INFO = (INFO */ $01CC) ' MULTIPLY BY 1.8
INFO = INFO + 32 ' COMPLETE CONVERSION
TO FERINHEIT.
TEMP = INFO
LOW 8 'CHECKING
TEMPURATURE LED 8 OFF
'#####################################################################
#########################
' START OF THE PLC READ PROTOCOL'S FOR V2000
'#####################################################################
#########################
HIGH 9 'READING PLC
LED 9 ON
SEROUT 1,16468,[noparse][[/noparse]INIT,ADD,ENQ] 'INITIATE SEQUENCING
SERIN 0,16468,500,NODATA,[noparse][[/noparse]STR PLC\7] 'RECIEVE DATA FROM
THE PLC
NODATA:
IF PLC(2) <> ACK THEN NORESP
GOSUB CLEAR_PLC_ARRAY 'CLEAR THE
PLC ARRAY
'#####################################################################
#########################
' SEND INFO TO THE PLC TO READ
'#####################################################################
#########################
SEROUT 1,16468,
[noparse][[/noparse]SOH,$30,$31,$30,$31,$30,$34,$30,$31,$30,$30,$30,$34,$30,$31,ETB,$30,$
30]
' 1 2 3 4 5 6 7 8 9 10 11
12 13 14 15 16 17 18
SERIN 0,16468,500,NODATA2,[noparse][[/noparse]STR PLC\7] 'RECIEVE THE REQUESTED INFO.
SEROUT 1,16468,[noparse][[/noparse]ACK]
SEROUT 1,16468,[noparse][[/noparse]EOT]
NODATA2:
LOW 9 'READING PLC
LED 9 OFF
'PLC(5)+PLC(6)+PLC(3)+PLC(4) THIS IS THE ORDER OF BYTES
INFO.HIGHBYTE = PLC(3)
INFO.LOWBYTE = PLC(4)
LOOKDOWN PLC(3),
[noparse][[/noparse]"0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"],INFO
.NIB1
LOOKDOWN PLC(4),
[noparse][[/noparse]"0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"],INFO
.NIB0
INFO.HIGHBYTE = 0
PROM_HEX = INFO * $20
IF PROM_HEX = CHECK THEN WRITE_PLC 'THIS TAKES YOU
AROUND WRITING TO THE SCREEN IF
CHECK = PROM_HEX 'THE SCREEN
IS WRITING THE SAME THING AGAIN.
IF PROM_HEX = $0000 THEN DISPLAY_TEMP
ENDS:
'#####################################################################
#########################
' READING THE EEPROM
'#####################################################################
#########################
HIGH 10 'WRITING TO
LCD LED ON
GOSUB CLEAR_SCREEN 'CLEARING THE
LCD SCREEN
LOW 10
'WRITING TO LCD LED OFF
FOR X = PROM_HEX TO PROM_HEX + 32
CNT = CNT + 1
IF CNT = 17 THEN LINE2
BACKTO_LINE2:
LOW RSTE
SHIFTOUT DQ,CLK,MSBFIRST,[noparse][[/noparse]READE]
SHIFTOUT DQ,CLK,MSBFIRST,[noparse][[/noparse]X\16]
SHIFTIN DQ,CLK,MSBPRE,[noparse][[/noparse]INFO]
HIGH RSTE
IF INFO = 0 THEN AROUND
HIGH 10 'WRITING TO
LCD LED ON
SEROUT 15,16468,[noparse][[/noparse]INFO] 'WRITING INFO
TO THE LCD
LOW 10
'WRITING TO LCD LED OFF
AROUND:
NEXT
HIGH RSTT
'#####################################################################
#########################
' WRITE TEMP TO PLC REGISTER V2001
'#####################################################################
#########################
WRITE_PLC:
HIGH 9 'WRITING TO
PLC LED 9 ON
GOSUB CLEAR_PLC_ARRAY
SEROUT 1,16468,[noparse][[/noparse]INIT,ADD,ENQ] 'INITIATE SEQUENCING
SERIN 0,16468,500,NO,[noparse][[/noparse]STR PLC\7] 'RECIEVE DATA FROM
THE PLC
NO:
'DUH LOOK AT BIT 4 IF IT IS 30 THEN READ IF IT IS 38 THEN WRITE
SEROUT 1,16468,
[noparse][[/noparse]SOH,$30,$31,$38,$31,$30,$34,$30,$32,$30,$30,$30,$34,$30,$31,ETB,$30,$
42]
' 1 2 3 4 5 6 7 8 9 10 11
12 13 14 15 16 17 18
SERIN 0,16468,500,NO2,[noparse][[/noparse]STR PLC\7] 'RECIEVE THE
REQUESTED INFO.
NO2:
IF PLC(0) <> ACK THEN START
GOSUB CONV_TEMP
LRC = $30 ^ $30 'XOR
LRC = LRC ^ TEMP.HIGHBYTE 'XOR
LRC = LRC ^ TEMP.LOWBYTE 'XOR
GOSUB FIND_LRC
'REMEMBER THAT 0 IS $30
SEROUT 1,16468,
[noparse][[/noparse]STX,TEMP.HIGHBYTE,TEMP.LOWBYTE,$30,$30,ETX,LRC.HIGHBYTE,LRC.LOWBYTE]
SERIN 0,16468,500,NO3,[noparse][[/noparse]STR PLC\7] 'RECIEVE THE
REQUESTED INFO.
NO3:
IF PLC(0) <> ACK THEN START
SEROUT 1,16468,[noparse][[/noparse]EOT]
GOTO START
'#####################################################################
#########################
' CONVERT TEMP FOR THE PLC TO UNDERSTAND.
'#####################################################################
#########################
CONV_TEMP:
LOOKUP TEMP.NIB1,
[noparse][[/noparse]$30,$31,$32,$33,$34,$35,$36,$37,$38,$39,$41,$42,$43,$44,$45,$46],TEMP
.HIGHBYTE
LOOKUP TEMP.NIB0,
[noparse][[/noparse]$30,$31,$32,$33,$34,$35,$36,$37,$38,$39,$41,$42,$43,$44,$45,$46],TEMP
.LOWBYTE
RETURN
'#####################################################################
#########################
' CONVERT TO CALCULATE LRC FOR THE PLC.
'#####################################################################
#########################
FIND_LRC:
LOOKUP LRC.NIB1,
[noparse][[/noparse]$30,$31,$32,$33,$34,$35,$36,$37,$38,$39,$40,$41,$42,$43,$44,$45,$46],
LRC.HIGHBYTE
LOOKUP LRC.NIB0,
[noparse][[/noparse]$30,$31,$32,$33,$34,$35,$36,$37,$38,$39,$40,$41,$42,$43,$44,$45,$46],
LRC.LOWBYTE
RETURN
NORESP:
'#####################################################################
#########################
' DISPLAY ON LCD TEMP AND CHECK PLC CABLE
'#####################################################################
#########################
HIGH 10 'WRITING TO
LCD LED ON
GOSUB DISPLAY_TEMPATURE
SEROUT 15,16468,[noparse][[/noparse]254,192]
SEROUT 15,16468,[noparse][[/noparse]"CHECK PLC CABLE"]
PAUSE 1000
'#####################################################################
#########################
' IF BUTTON 12 IS PUSHED JUMP TO SET_TIME LABEL
'#####################################################################
#########################
IF IN12 = 1 THEN SET_TIME
'#####################################################################
#########################
' DISPLAY THE TIME HERE
'#####################################################################
#########################
GOSUB ReadRTCBurst
SEROUT 15,16468,[noparse][[/noparse]254,192]
SEROUT 15,16468,[noparse][[/noparse]"TIME: "]
SEROUT 15,16468,[noparse][[/noparse]DEC1 Hour.HIGHNIB, DEC1 Hour.LOWNIB,":", DEC1
Minutes.HIGHNIB]
SEROUT 15,16468,[noparse][[/noparse]DEC1 Minutes.LOWNIB,":", DEC1 Seconds.HIGHNIB,
DEC1 Seconds.LOWNIB," "]
DEBUG SDEC Minutes.HIGHNIB,SDEC Minutes.LOWNIB,CR
PAUSE 1000
LOW 9 'WRITING TO
PLC LED 9 OFF
LOW 10 'WRITING TO
LCD LED OFF
GOTO START
LINE2:
HIGH 10 'WRITING TO
LCD LED ON
SEROUT 15,16468,[noparse][[/noparse]254,192]
LOW 10
'WRITING TO LCD LED
OFF
GOTO BACKTO_LINE2
'#####################################################################
#########################
' DOWNLOADING FROM VB PROGRAM
'#####################################################################
#########################
DOWNLOADING:
HIGH 11 'CHECK FOR
DOWNLOADING LED ON
HIGH 10 'WRITING TO
LCD LED ON
GOSUB CLEAR_SCREEN
SEROUT 15,16468,[noparse][[/noparse]" DOWNLOAD MODE!"]
SEROUT 16,16468,[noparse][[/noparse]"DOWNLOAD",13]
LOW 10 'WRITING TO
LCD LED OFF
'GATHER ADDRESS,READ,AND TEMP FROM PC
'WRITE ENABLE THE EEPROM
LOW RSTE
SHIFTOUT DQ,CLK,MSBFIRST,[noparse][[/noparse]WREN]
HIGH RSTE
PAUSE 100
'#####################################################################
#########################
' WRITE INFO FROM VB PROGRAM TO EEPROM
'#####################################################################
#########################
LOW RSTE
SHIFTOUT DQ,CLK,MSBFIRST,[noparse][[/noparse]WRTE] 'SET TO WRITE TO
EEPROM
'THIS IS THE ADDRESS OF THE PLC
SHIFTOUT DQ,CLK,MSBFIRST,[noparse][[/noparse]$0FF0\16] 'WRITE TO THIS ADDRESS
PAUSE 10
SERIN 16,16468,[noparse][[/noparse]SHEX4 HEADER]
SHIFTOUT DQ,CLK,MSBFIRST,[noparse][[/noparse]HEADER\16]
HIGH RSTE
HIGH 10 'WRITING TO
LCD LED ON
'#####################################################################
#########################
' DISPLAY STATION NUMBER DIRECTNET PROTOCOL WITH THE GOSUB
'#####################################################################
#########################
GOSUB STAT_NUMBER 'GET INFO TO
WRITE TO LCD SCREEN
LOW 10 'WRITING TO
LCD LED OFF
FOR X = 1 TO 36 'SHOULD BE 36
HEADER = 0
LOW RSTE 'WRITE ENABLE
THE EEPROM
SHIFTOUT DQ,CLK,MSBFIRST,[noparse][[/noparse]WREN]
HIGH RSTE
PAUSE 100
LOW RSTE 'WRITE TO THE
EEPROM
SHIFTOUT DQ,CLK,MSBFIRST,[noparse][[/noparse]WRTE] 'SET TO WRITE TO
EEPROM
'#####################################################################
#########################
' DISPLAY LOCATION OF EEPROM ON LCD SCREEN
'#####################################################################
#########################
SERIN 16,16468,[noparse][[/noparse]SHEX4 HEADER]
GOSUB CLEAR_SCREEN
SEROUT 15,16468,[noparse][[/noparse]"RECIEVING INFO!"]
SEROUT 15,16468,[noparse][[/noparse]254,192]
SEROUT 15,16468,[noparse][[/noparse]"POSITION #",SDEC X]
SHIFTOUT DQ,CLK,MSBFIRST,[noparse][[/noparse]HEADER\16] 'WRITE TO THIS ADDRESS
PAUSE 10
'#####################################################################
#########################
' WRITE TO THE EEPROM THE VB MESSAGE
'#####################################################################
#########################
SERIN 16,16468,[noparse][[/noparse]STR PLC\8]
SHIFTOUT DQ,CLK,MSBFIRST,[noparse][[/noparse]PLC(0),PLC(1),PLC(2),PLC(3),PLC(4),PLC
(5),PLC(6),PLC(7)\8]
SERIN 16,16468,[noparse][[/noparse]STR PLC\8]
SHIFTOUT DQ,CLK,MSBFIRST,[noparse][[/noparse]PLC(0),PLC(1),PLC(2),PLC(3),PLC(4),PLC
(5),PLC(6),PLC(7)\8]
SERIN 16,16468,[noparse][[/noparse]STR PLC\8]
SHIFTOUT DQ,CLK,MSBFIRST,[noparse][[/noparse]PLC(0),PLC(1),PLC(2),PLC(3),PLC(4),PLC
(5),PLC(6),PLC(7)\8]
SERIN 16,16468,[noparse][[/noparse]STR PLC\8]
SHIFTOUT DQ,CLK,MSBFIRST,[noparse][[/noparse]PLC(0),PLC(1),PLC(2),PLC(3),PLC(4),PLC
(5),PLC(6),PLC(7)\8]
HIGH RSTE
PAUSE 100
NEXT
GOSUB READ_PROM
LOW 11 'CHECK FOR
DOWNLOADING LED OFF
GOTO START
CLEAR_PLC_ARRAY:
PLC(0) = 0
PLC(1) = 0
PLC(2) = 0
PLC(3) = 0
PLC(4) = 0
PLC(5) = 0
PLC(6) = 0
PLC(7) = 0
PLC(8) = 0
RETURN
'#####################################################################
#########################
' READING THE EEPROM
'#####################################################################
#########################
READ_PROM:
'READING THE EEPROM
LOW RSTE
SHIFTOUT DQ,CLK,MSBFIRST,[noparse][[/noparse]READE]
PAUSE 10
SHIFTOUT DQ,CLK,MSBFIRST,[noparse][[/noparse]$0FF0\16]
PAUSE 10
SHIFTIN DQ,CLK,MSBPRE,[noparse][[/noparse]ADD\16]
HIGH RSTE
HIGH 10 'WRITING TO
LCD LED ON
GOSUB STAT_NUMBER 'GET
INFO TO WRITE TO LCD SCREEN
PAUSE 2000
LOW 10 'WRITING TO
LCD LED OFF
RETURN
'#####################################################################
#########################
' I BELIEVE THIS IS IF PLC V2000 IS A 0 YOU MAY NEED TO CHECK THIS
OUT TIM
' AND GET RID OF IT
'#####################################################################
#########################
DISPLAY_TEMP:
GOSUB DISPLAY_TEMPATURE
SEROUT 15,16468,[noparse][[/noparse]254,192]
SEROUT 15,16468,[noparse][[/noparse]" CARDINAL"]
'#####################################################################
#########################
' SENDS ME TO WRITE TEMP TO PLC IN V2000
'#####################################################################
#########################
GOTO WRITE_PLC 'YOU WILL BE SENT BACK INTO
THE START LOOP.
'#####################################################################
#########################
' THE FOLLOWING IS USED TO SET THE TIME USEING PINS 14, 13, 12
'#####################################################################
#########################
SET_TIME:
TEMP = $00 'DO THIS SO YOU SET A 0 AT
LEAST IN THE SECONDS REGISTER.
LRC = SecReg
GOSUB WriteRTC
SET_SEC:
HIGH 10
GOSUB CLEAR_SCREEN
SEROUT 15,16468,[noparse][[/noparse]"SET SECONDS: ",DEC TEMP]
PAUSE 400
IF IN14 = 1 THEN SET_MIN
IF IN13 = 0 THEN SET_SEC
TEMP = TEMP + 1
IF NOT TEMP > 59 THEN SEC_GRT
TEMP = $00
SEC_GRT:
LRC = SecReg
GOSUB WriteRTC
GOTO SET_SEC
SET_MIN:
TEMP = $00 'DO THIS SO YOU SET A 0 AT
LEAST IN THE MINUTES REGISTER.
LRC = MinReg
GOSUB WriteRTC
SET_MIN1:
GOSUB CLEAR_SCREEN
SEROUT 15,16468,[noparse][[/noparse]"SET MINUTES: ",DEC TEMP]
PAUSE 400
IF IN14 = 1 THEN SET_HR
IF IN13 = 0 THEN SET_MIN1
TEMP = TEMP + 1
IF NOT TEMP > 59 THEN MIN_GRT
TEMP = $00
MIN_GRT:
LRC = MinReg
GOSUB WriteRTC
GOTO SET_MIN1
SET_HR:
TEMP = $01 'DO THIS SO YOU SET A 1 AT
LEAST IN THE HOURS REGISTER.
LRC = HRSReg
GOSUB WriteRTC
SET_HR1:
GOSUB CLEAR_SCREEN
SEROUT 15,16468,[noparse][[/noparse]"SET HOUR: ",DEC TEMP]
PAUSE 400
IF IN14 = 1 THEN END_TIME
IF IN13 = 0 THEN SET_HR1
TEMP = TEMP + $1
IF NOT TEMP > 12 THEN HR_GRT
TEMP = $01
HR_GRT:
LRC = HRSReg
GOSUB WriteRTC
GOTO SET_HR1
END_TIME
Temp = $80
LRC = CtrlReg
GOSUB WriteRTC
LOW 10
GOTO START
'#####################################################################
#########################
' TO READ THE TIME AND DATE FROM THE DS1302
'#####################################################################
#########################
ReadRTCBurst:
HIGH RST1302
SHIFTOUT DQ, Clk, LSBFIRST, [noparse][[/noparse]%1\1,BrstReg\5,%10\2]
SHIFTIN DQ, Clk, LSBPRE, [noparse][[/noparse]Seconds,Minutes,Hour,DAY,Month,Year,Year]
LOW RST1302
RETURN
'#####################################################################
#########################
' TO WRITE THE TIME AND DATE FROM THE DS1302
'#####################################################################
#########################
WriteRTC:
'Write to DS1302
HIGH RST1302
SHIFTOUT DQ, Clk, LSBFIRST, [noparse][[/noparse]%0\1,CtrlReg\5,%10\2,$10]
LOW RST1302
HIGH RST1302
SHIFTOUT DQ, Clk, LSBFIRST, [noparse][[/noparse]%0\1,LRC\5,%10\2,Temp]
LOW RST1302
RETURN
'#####################################################################
#########################
' TO CLEAR LCD AND DISPLAY DIRECTNET PROT STATION #
'#####################################################################
#########################
STAT_NUMBER:
GOSUB CLEAR_SCREEN
SEROUT 15,16468,[noparse][[/noparse]"STATION #:",ISHEX ADD]
RETURN
'#####################################################################
#########################
' THE ROUTINES BELOW ARE TO GET MORE MEMORY OUT OF THE STAMP
' I NEEDED TO COMPILE IT TO BE SMALLER CODE
'#####################################################################
#########################
DISPLAY_TEMPATURE:
GOSUB CLEAR_SCREEN
SEROUT 15,16468,[noparse][[/noparse]"TEMP = ",SDEC TEMP," DEG F"]
RETURN
CLEAR_SCREEN:
SEROUT 15,16468,[noparse][[/noparse]254,1]
RETURN
Comments
in my non-stamp system.
HOUR ends up with a value 0-23
MINUTE ends up 0-59 and the same with SECOND
HOUR=((HOUR AND 11110000\16)*10)+(HOUR AND 00001111)
MINUTE=((MINUTE AND 11110000\16)*10)+(MINUTE AND 00001111)
SECOND=((SECOND AND 11110000\16)*10)+(SECOND AND 00001111)
James R. Parish
J-Tech Internet Services
J-Com Enterprises, Inc.
Original Message
From: thosey@w... [noparse]/noparse]mailto:[url=http://forums.parallaxinc.com/group/basicstamps/post?postID=Cn1B95Yw9e27An96NfpfQhRcLsJYXwRBR7uVJp2SRKN4YMT7vvWJWNuyngFmJHdzehoTK5TnfNvwshVKuhBrGg]thosey@w...[/url
Sent: Saturday, October 20, 2001 4:36 PM
To: basicstamps@yahoogroups.com
Subject: [noparse][[/noparse]basicstamps] DS1302 decimal to bcd conversion
Does anyone have a sample already wrote to change a decimal number to
a bcd number that makes the bcd number equal the decimal. As such,
20 decimal is 14 in hex or bcd but the DS1302 is serially input in
bcd not decimal. So while the lcd and the register holding this
number is 20 and you need to place the hex number into the ds1302 of
20 but your register is actually 14 hex. I cannot use the hex
version to display to screen since I would be displaying the
A,B,C,D,E,F of hex and I want to be able to push a button and display
the setting of the seconds, minutes, hours on the screen. From 0 to
59 less the A,B,C,D,E,F. Now the other problem is that I have
already used up most of the program storage area and have very little
room for this conversion. I have posted the program below, the
actual part I am having trouble with is near the end.
Many thanks
Timothy Hosey
'{$STAMP BS2}
'#####################################################################
#########################
'THIS PROGRAM COPYWRITED 2001 BY TIMOTHY L. HOSEY
'LED 8 IS FOR READING TEMP
'LED 9 IS FOR READING THE PLC VIA DIRECTNET PROTOCOL
'LED 10 IS FOR WRITING TO LCD
'LED 11 IS FOR DOWNLOADING FROM VB PROGRAM
'#####################################################################
#########################
'#####################################################################
#########################
'DEFINE OUTPUT PINS USED FOR SERIAL SPI INTERFACE
'#####################################################################
#########################
DQ CON 4 'SPI SERIAL DATA PIN
CLK CON 3 'SPI SERIAL CLOCK PIN
RSTT CON 2 'SPI SERIAL RESET PIN FOR
TEMP CHIP DS-1620
RSTE CON 5 'SPI SERIAL RESET PIN FOR EEPROM CHIP
RST1302 CON 6 'SPI SERIAL RESET PIN FOR TIME CHIP
DS-1302
'#####################################################################
#########################
'DEFINE PINS USED FOR BUTTONS
'#####################################################################
#########################
BUT1 CON 12
BUT2 CON 13
BUT3 CON 14
'#####################################################################
#########################
' DEFINE VARIABLES
'#####################################################################
#########################
X VAR WORD
INFO VAR WORD ' VARIABLE TO HOLD 9-
bit INFO.
PROM_HEX VAR WORD
CHECK VAR WORD
HEADER VAR WORD
CMD VAR BYTE
CNT VAR BYTE
TEMP VAR WORD 'TEMPURATURE IS HELD HERE
PLC VAR BYTE(8)
LRC VAR WORD
ADD VAR WORD 'ADDRESS OF DIRECTNET
PROTOCOL MASTER.
'#####################################################################
#########################
'START DECLARING ALLIASES FOR WORD VARIABLES
'#####################################################################
#########################
SECONDS VAR TEMP.LOWBYTE
MINUTES VAR TEMP.HIGHBYTE
HOUR VAR LRC.LOWBYTE
DAY VAR LRC.HIGHBYTE
MONTH VAR INFO.LOWBYTE
YEAR VAR INFO.HIGHBYTE
'#####################################################################
#########################
'START DECLARING CONSTANTS FOR PLC PROGRAM
'#####################################################################
#########################
ENQ CON $05
ACK CON $06
NAK CON $15
SOH CON $01
ETB CON $17
STX CON $02
ETX CON $03
EOT CON $04
INIT CON $4E
'#####################################################################
#########################
'START DECLARING CONSTANTS FOR EEPROM
'#####################################################################
#########################
READE CON 3 'DATA FOR SPI EEPROM
WRTE CON 2 'DATA FOR SPI EEPROM
WREN CON 6 'DATA FOR SPI EEPROM
'#####################################################################
#########################
'START DECLARING CONSTANTS FOR DS1302
'#####################################################################
#########################
SecReg CON %00000
MinReg CON %00001
HrsReg CON %00010
DateReg CON %00011
MonReg CON %00100
YrReg CON %00110
CtrlReg CON %00111
BrstReg CON %11111
'#####################################################################
#########################
'MAKE PINS INPUTS FOR BUTTONS
'#####################################################################
#########################
INPUT BUT1
INPUT BUT2
INPUT BUT3
'#####################################################################
#########################
'WRITE TO THE LCD SCREEN AT START UP
'#####################################################################
#########################
HIGH RSTE
HIGH 10 'WRITING TO
LCD LED ON
PAUSE 1000
GOSUB CLEAR_SCREEN
SEROUT 15,16468,[noparse][[/noparse]"AUTOMATED PANELS"]
SEROUT 15,16468,[noparse][[/noparse]254,192]
SEROUT 15,16468,[noparse][[/noparse]"2001 TIM HOSEY"]
LOW 10 'WRITING TO
LCD LED OFF
PAUSE 3000 'WAIT 3
SECONDS
'#####################################################################
#########################
' ACTIVATE THE 1620 AND SET FOR CONTINOUS CONVERSION SET THE HIGH AND
LOW TEMPERATURES.
'#####################################################################
#########################
HIGH RSTT
SHIFTOUT DQ,CLK,LSBFIRST,[noparse][[/noparse]$0C,$0A]
SHIFTOUT DQ,CLK,LSBFIRST,[noparse][[/noparse]$00\9]
LOW RSTT
PAUSE 10
HIGH RSTT
SHIFTOUT DQ,CLK,LSBFIRST,[noparse][[/noparse]$EE]
LOW RSTT
PAUSE 10
'#####################################################################
#########################
' INITIAL ADDRESS FOR DIRECTNET PROTOCOL
'#####################################################################
#########################
ADD = $21
'THIS IS FOR ADDRESS
1
GOSUB READ_PROM 'USED FOR DIRECTNET PROTOCOL
'#####################################################################
#########################
' BEGINING OF PROGRAM LOOP
'#####################################################################
#########################
START:
'#####################################################################
#########################
' CLEAR CONTENTS OF REGISTERS
'#####################################################################
#########################
GOSUB CLEAR_PLC_ARRAY
INFO = 0
TEMP = 0
CMD = 0
CNT = 0
'#####################################################################
#########################
' IF BUTTON 12 IS PUSHED JUMP TO SET_TIME LABEL
'#####################################################################
#########################
IF IN12 = 1 THEN SET_TIME
'#####################################################################
#########################
' CHECK TO SEE IF VB PROGRAM IS DOWNLOADING
'#####################################################################
#########################
SERIN 16,16468,100,NOWAY,[noparse][[/noparse]STR PLC\2]
NOWAY:
IF PLC(0) = "O" AND PLC(1) = "K" THEN DOWNLOADING
'#####################################################################
#########################
' READING THE TEMPURATURE
'#####################################################################
#########################
HIGH 8 'CHECKING
TEMPURATURE LED 8 ON
HIGH RSTT
SHIFTOUT DQ,CLK,LSBFIRST,[noparse][[/noparse]$AA] ' REQUEST TO READ
TEMP
shiftin DQ,CLK,LSBPRE,[noparse][[/noparse]INFO\9] ' GET TEMP READING
LOW RSTT
INFO = INFO/2 ' SCALE READING TO
WHOLE DEG CELS.
INFO = (INFO */ $01CC) ' MULTIPLY BY 1.8
INFO = INFO + 32 ' COMPLETE CONVERSION
TO FERINHEIT.
TEMP = INFO
LOW 8 'CHECKING
TEMPURATURE LED 8 OFF
'#####################################################################
#########################
' START OF THE PLC READ PROTOCOL'S FOR V2000
'#####################################################################
#########################
HIGH 9 'READING PLC
LED 9 ON
SEROUT 1,16468,[noparse][[/noparse]INIT,ADD,ENQ] 'INITIATE SEQUENCING
SERIN 0,16468,500,NODATA,[noparse][[/noparse]STR PLC\7] 'RECIEVE DATA FROM
THE PLC
NODATA:
IF PLC(2) <> ACK THEN NORESP
GOSUB CLEAR_PLC_ARRAY 'CLEAR THE
PLC ARRAY
'#####################################################################
#########################
' SEND INFO TO THE PLC TO READ
'#####################################################################
#########################
SEROUT 1,16468,
[noparse][[/noparse]SOH,$30,$31,$30,$31,$30,$34,$30,$31,$30,$30,$30,$34,$30,$31,ETB,$30,$
30]
' 1 2 3 4 5 6 7 8 9 10 11
12 13 14 15 16 17 18
SERIN 0,16468,500,NODATA2,[noparse][[/noparse]STR PLC\7] 'RECIEVE THE REQUESTED INFO.
SEROUT 1,16468,[noparse][[/noparse]ACK]
SEROUT 1,16468,[noparse][[/noparse]EOT]
NODATA2:
LOW 9 'READING PLC
LED 9 OFF
'PLC(5)+PLC(6)+PLC(3)+PLC(4) THIS IS THE ORDER OF BYTES
INFO.HIGHBYTE = PLC(3)
INFO.LOWBYTE = PLC(4)
LOOKDOWN PLC(3),
[noparse][[/noparse]"0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"],INFO
.NIB1
LOOKDOWN PLC(4),
[noparse][[/noparse]"0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"],INFO
.NIB0
INFO.HIGHBYTE = 0
PROM_HEX = INFO * $20
IF PROM_HEX = CHECK THEN WRITE_PLC 'THIS TAKES YOU
AROUND WRITING TO THE SCREEN IF
CHECK = PROM_HEX 'THE SCREEN
IS WRITING THE SAME THING AGAIN.
IF PROM_HEX = $0000 THEN DISPLAY_TEMP
ENDS:
'#####################################################################
#########################
' READING THE EEPROM
'#####################################################################
#########################
HIGH 10 'WRITING TO
LCD LED ON
GOSUB CLEAR_SCREEN 'CLEARING THE
LCD SCREEN
LOW 10
'WRITING TO LCD LED OFF
FOR X = PROM_HEX TO PROM_HEX + 32
CNT = CNT + 1
IF CNT = 17 THEN LINE2
BACKTO_LINE2:
LOW RSTE
SHIFTOUT DQ,CLK,MSBFIRST,[noparse][[/noparse]READE]
SHIFTOUT DQ,CLK,MSBFIRST,[noparse][[/noparse]X\16]
SHIFTIN DQ,CLK,MSBPRE,[noparse][[/noparse]INFO]
HIGH RSTE
IF INFO = 0 THEN AROUND
HIGH 10 'WRITING TO
LCD LED ON
SEROUT 15,16468,[noparse][[/noparse]INFO] 'WRITING INFO
TO THE LCD
LOW 10
'WRITING TO LCD LED OFF
AROUND:
NEXT
HIGH RSTT
'#####################################################################
#########################
' WRITE TEMP TO PLC REGISTER V2001
'#####################################################################
#########################
WRITE_PLC:
HIGH 9 'WRITING TO
PLC LED 9 ON
GOSUB CLEAR_PLC_ARRAY
SEROUT 1,16468,[noparse][[/noparse]INIT,ADD,ENQ] 'INITIATE SEQUENCING
SERIN 0,16468,500,NO,[noparse][[/noparse]STR PLC\7] 'RECIEVE DATA FROM
THE PLC
NO:
'DUH LOOK AT BIT 4 IF IT IS 30 THEN READ IF IT IS 38 THEN WRITE
SEROUT 1,16468,
[noparse][[/noparse]SOH,$30,$31,$38,$31,$30,$34,$30,$32,$30,$30,$30,$34,$30,$31,ETB,$30,$
42]
' 1 2 3 4 5 6 7 8 9 10 11
12 13 14 15 16 17 18
SERIN 0,16468,500,NO2,[noparse][[/noparse]STR PLC\7] 'RECIEVE THE
REQUESTED INFO.
NO2:
IF PLC(0) <> ACK THEN START
GOSUB CONV_TEMP
LRC = $30 ^ $30 'XOR
LRC = LRC ^ TEMP.HIGHBYTE 'XOR
LRC = LRC ^ TEMP.LOWBYTE 'XOR
GOSUB FIND_LRC
'REMEMBER THAT 0 IS $30
SEROUT 1,16468,
[noparse][[/noparse]STX,TEMP.HIGHBYTE,TEMP.LOWBYTE,$30,$30,ETX,LRC.HIGHBYTE,LRC.LOWBYTE]
SERIN 0,16468,500,NO3,[noparse][[/noparse]STR PLC\7] 'RECIEVE THE
REQUESTED INFO.
NO3:
IF PLC(0) <> ACK THEN START
SEROUT 1,16468,[noparse][[/noparse]EOT]
GOTO START
'#####################################################################
#########################
' CONVERT TEMP FOR THE PLC TO UNDERSTAND.
'#####################################################################
#########################
CONV_TEMP:
LOOKUP TEMP.NIB1,
[noparse][[/noparse]$30,$31,$32,$33,$34,$35,$36,$37,$38,$39,$41,$42,$43,$44,$45,$46],TEMP
.HIGHBYTE
LOOKUP TEMP.NIB0,
[noparse][[/noparse]$30,$31,$32,$33,$34,$35,$36,$37,$38,$39,$41,$42,$43,$44,$45,$46],TEMP
.LOWBYTE
RETURN
'#####################################################################
#########################
' CONVERT TO CALCULATE LRC FOR THE PLC.
'#####################################################################
#########################
FIND_LRC:
LOOKUP LRC.NIB1,
[noparse][[/noparse]$30,$31,$32,$33,$34,$35,$36,$37,$38,$39,$40,$41,$42,$43,$44,$45,$46],
LRC.HIGHBYTE
LOOKUP LRC.NIB0,
[noparse][[/noparse]$30,$31,$32,$33,$34,$35,$36,$37,$38,$39,$40,$41,$42,$43,$44,$45,$46],
LRC.LOWBYTE
RETURN
NORESP:
'#####################################################################
#########################
' DISPLAY ON LCD TEMP AND CHECK PLC CABLE
'#####################################################################
#########################
HIGH 10 'WRITING TO
LCD LED ON
GOSUB DISPLAY_TEMPATURE
SEROUT 15,16468,[noparse][[/noparse]254,192]
SEROUT 15,16468,[noparse][[/noparse]"CHECK PLC CABLE"]
PAUSE 1000
'#####################################################################
#########################
' IF BUTTON 12 IS PUSHED JUMP TO SET_TIME LABEL
'#####################################################################
#########################
IF IN12 = 1 THEN SET_TIME
'#####################################################################
#########################
' DISPLAY THE TIME HERE
'#####################################################################
#########################
GOSUB ReadRTCBurst
SEROUT 15,16468,[noparse][[/noparse]254,192]
SEROUT 15,16468,[noparse][[/noparse]"TIME: "]
SEROUT 15,16468,[noparse][[/noparse]DEC1 Hour.HIGHNIB, DEC1 Hour.LOWNIB,":", DEC1
Minutes.HIGHNIB]
SEROUT 15,16468,[noparse][[/noparse]DEC1 Minutes.LOWNIB,":", DEC1 Seconds.HIGHNIB,
DEC1 Seconds.LOWNIB," "]
DEBUG SDEC Minutes.HIGHNIB,SDEC Minutes.LOWNIB,CR
PAUSE 1000
LOW 9 'WRITING TO
PLC LED 9 OFF
LOW 10 'WRITING TO
LCD LED OFF
GOTO START
LINE2:
HIGH 10 'WRITING TO
LCD LED ON
SEROUT 15,16468,[noparse][[/noparse]254,192]
LOW 10
'WRITING TO LCD LED
OFF
GOTO BACKTO_LINE2
'#####################################################################
#########################
' DOWNLOADING FROM VB PROGRAM
'#####################################################################
#########################
DOWNLOADING:
HIGH 11 'CHECK FOR
DOWNLOADING LED ON
HIGH 10 'WRITING TO
LCD LED ON
GOSUB CLEAR_SCREEN
SEROUT 15,16468,[noparse][[/noparse]" DOWNLOAD MODE!"]
SEROUT 16,16468,[noparse][[/noparse]"DOWNLOAD",13]
LOW 10 'WRITING TO
LCD LED OFF
'GATHER ADDRESS,READ,AND TEMP FROM PC
'WRITE ENABLE THE EEPROM
LOW RSTE
SHIFTOUT DQ,CLK,MSBFIRST,[noparse][[/noparse]WREN]
HIGH RSTE
PAUSE 100
'#####################################################################
#########################
' WRITE INFO FROM VB PROGRAM TO EEPROM
'#####################################################################
#########################
LOW RSTE
SHIFTOUT DQ,CLK,MSBFIRST,[noparse][[/noparse]WRTE] 'SET TO WRITE TO
EEPROM
'THIS IS THE ADDRESS OF THE PLC
SHIFTOUT DQ,CLK,MSBFIRST,[noparse][[/noparse]$0FF0\16] 'WRITE TO THIS ADDRESS
PAUSE 10
SERIN 16,16468,[noparse][[/noparse]SHEX4 HEADER]
SHIFTOUT DQ,CLK,MSBFIRST,[noparse][[/noparse]HEADER\16]
HIGH RSTE
HIGH 10 'WRITING TO
LCD LED ON
'#####################################################################
#########################
' DISPLAY STATION NUMBER DIRECTNET PROTOCOL WITH THE GOSUB
'#####################################################################
#########################
GOSUB STAT_NUMBER 'GET INFO TO
WRITE TO LCD SCREEN
LOW 10 'WRITING TO
LCD LED OFF
FOR X = 1 TO 36 'SHOULD BE 36
HEADER = 0
LOW RSTE 'WRITE ENABLE
THE EEPROM
SHIFTOUT DQ,CLK,MSBFIRST,[noparse][[/noparse]WREN]
HIGH RSTE
PAUSE 100
LOW RSTE 'WRITE TO THE
EEPROM
SHIFTOUT DQ,CLK,MSBFIRST,[noparse][[/noparse]WRTE] 'SET TO WRITE TO
EEPROM
'#####################################################################
#########################
' DISPLAY LOCATION OF EEPROM ON LCD SCREEN
'#####################################################################
#########################
SERIN 16,16468,[noparse][[/noparse]SHEX4 HEADER]
GOSUB CLEAR_SCREEN
SEROUT 15,16468,[noparse][[/noparse]"RECIEVING INFO!"]
SEROUT 15,16468,[noparse][[/noparse]254,192]
SEROUT 15,16468,[noparse][[/noparse]"POSITION #",SDEC X]
SHIFTOUT DQ,CLK,MSBFIRST,[noparse][[/noparse]HEADER\16] 'WRITE TO THIS ADDRESS
PAUSE 10
'#####################################################################
#########################
' WRITE TO THE EEPROM THE VB MESSAGE
'#####################################################################
#########################
SERIN 16,16468,[noparse][[/noparse]STR PLC\8]
SHIFTOUT DQ,CLK,MSBFIRST,[noparse][[/noparse]PLC(0),PLC(1),PLC(2),PLC(3),PLC(4),PLC
(5),PLC(6),PLC(7)\8]
SERIN 16,16468,[noparse][[/noparse]STR PLC\8]
SHIFTOUT DQ,CLK,MSBFIRST,[noparse][[/noparse]PLC(0),PLC(1),PLC(2),PLC(3),PLC(4),PLC
(5),PLC(6),PLC(7)\8]
SERIN 16,16468,[noparse][[/noparse]STR PLC\8]
SHIFTOUT DQ,CLK,MSBFIRST,[noparse][[/noparse]PLC(0),PLC(1),PLC(2),PLC(3),PLC(4),PLC
(5),PLC(6),PLC(7)\8]
SERIN 16,16468,[noparse][[/noparse]STR PLC\8]
SHIFTOUT DQ,CLK,MSBFIRST,[noparse][[/noparse]PLC(0),PLC(1),PLC(2),PLC(3),PLC(4),PLC
(5),PLC(6),PLC(7)\8]
HIGH RSTE
PAUSE 100
NEXT
GOSUB READ_PROM
LOW 11 'CHECK FOR
DOWNLOADING LED OFF
GOTO START
CLEAR_PLC_ARRAY:
PLC(0) = 0
PLC(1) = 0
PLC(2) = 0
PLC(3) = 0
PLC(4) = 0
PLC(5) = 0
PLC(6) = 0
PLC(7) = 0
PLC(8) = 0
RETURN
'#####################################################################
#########################
' READING THE EEPROM
'#####################################################################
#########################
READ_PROM:
'READING THE EEPROM
LOW RSTE
SHIFTOUT DQ,CLK,MSBFIRST,[noparse][[/noparse]READE]
PAUSE 10
SHIFTOUT DQ,CLK,MSBFIRST,[noparse][[/noparse]$0FF0\16]
PAUSE 10
SHIFTIN DQ,CLK,MSBPRE,[noparse][[/noparse]ADD\16]
HIGH RSTE
HIGH 10 'WRITING TO
LCD LED ON
GOSUB STAT_NUMBER 'GET
INFO TO WRITE TO LCD SCREEN
PAUSE 2000
LOW 10 'WRITING TO
LCD LED OFF
RETURN
'#####################################################################
#########################
' I BELIEVE THIS IS IF PLC V2000 IS A 0 YOU MAY NEED TO CHECK THIS
OUT TIM
' AND GET RID OF IT
'#####################################################################
#########################
DISPLAY_TEMP:
GOSUB DISPLAY_TEMPATURE
SEROUT 15,16468,[noparse][[/noparse]254,192]
SEROUT 15,16468,[noparse][[/noparse]" CARDINAL"]
'#####################################################################
#########################
' SENDS ME TO WRITE TEMP TO PLC IN V2000
'#####################################################################
#########################
GOTO WRITE_PLC 'YOU WILL BE SENT BACK INTO
THE START LOOP.
'#####################################################################
#########################
' THE FOLLOWING IS USED TO SET THE TIME USEING PINS 14, 13, 12
'#####################################################################
#########################
SET_TIME:
TEMP = $00 'DO THIS SO YOU SET A 0 AT
LEAST IN THE SECONDS REGISTER.
LRC = SecReg
GOSUB WriteRTC
SET_SEC:
HIGH 10
GOSUB CLEAR_SCREEN
SEROUT 15,16468,[noparse][[/noparse]"SET SECONDS: ",DEC TEMP]
PAUSE 400
IF IN14 = 1 THEN SET_MIN
IF IN13 = 0 THEN SET_SEC
TEMP = TEMP + 1
IF NOT TEMP > 59 THEN SEC_GRT
TEMP = $00
SEC_GRT:
LRC = SecReg
GOSUB WriteRTC
GOTO SET_SEC
SET_MIN:
TEMP = $00 'DO THIS SO YOU SET A 0 AT
LEAST IN THE MINUTES REGISTER.
LRC = MinReg
GOSUB WriteRTC
SET_MIN1:
GOSUB CLEAR_SCREEN
SEROUT 15,16468,[noparse][[/noparse]"SET MINUTES: ",DEC TEMP]
PAUSE 400
IF IN14 = 1 THEN SET_HR
IF IN13 = 0 THEN SET_MIN1
TEMP = TEMP + 1
IF NOT TEMP > 59 THEN MIN_GRT
TEMP = $00
MIN_GRT:
LRC = MinReg
GOSUB WriteRTC
GOTO SET_MIN1
SET_HR:
TEMP = $01 'DO THIS SO YOU SET A 1 AT
LEAST IN THE HOURS REGISTER.
LRC = HRSReg
GOSUB WriteRTC
SET_HR1:
GOSUB CLEAR_SCREEN
SEROUT 15,16468,[noparse][[/noparse]"SET HOUR: ",DEC TEMP]
PAUSE 400
IF IN14 = 1 THEN END_TIME
IF IN13 = 0 THEN SET_HR1
TEMP = TEMP + $1
IF NOT TEMP > 12 THEN HR_GRT
TEMP = $01
HR_GRT:
LRC = HRSReg
GOSUB WriteRTC
GOTO SET_HR1
END_TIME
Temp = $80
LRC = CtrlReg
GOSUB WriteRTC
LOW 10
GOTO START
'#####################################################################
#########################
' TO READ THE TIME AND DATE FROM THE DS1302
'#####################################################################
#########################
ReadRTCBurst:
HIGH RST1302
SHIFTOUT DQ, Clk, LSBFIRST, [noparse][[/noparse]%1\1,BrstReg\5,%10\2]
SHIFTIN DQ, Clk, LSBPRE, [noparse][[/noparse]Seconds,Minutes,Hour,DAY,Month,Year,Year]
LOW RST1302
RETURN
'#####################################################################
#########################
' TO WRITE THE TIME AND DATE FROM THE DS1302
'#####################################################################
#########################
WriteRTC:
'Write to DS1302
HIGH RST1302
SHIFTOUT DQ, Clk, LSBFIRST, [noparse][[/noparse]%0\1,CtrlReg\5,%10\2,$10]
LOW RST1302
HIGH RST1302
SHIFTOUT DQ, Clk, LSBFIRST, [noparse][[/noparse]%0\1,LRC\5,%10\2,Temp]
LOW RST1302
RETURN
'#####################################################################
#########################
' TO CLEAR LCD AND DISPLAY DIRECTNET PROT STATION #
'#####################################################################
#########################
STAT_NUMBER:
GOSUB CLEAR_SCREEN
SEROUT 15,16468,[noparse][[/noparse]"STATION #:",ISHEX ADD]
RETURN
'#####################################################################
#########################
' THE ROUTINES BELOW ARE TO GET MORE MEMORY OUT OF THE STAMP
' I NEEDED TO COMPILE IT TO BE SMALLER CODE
'#####################################################################
#########################
DISPLAY_TEMPATURE:
GOSUB CLEAR_SCREEN
SEROUT 15,16468,[noparse][[/noparse]"TEMP = ",SDEC TEMP," DEG F"]
RETURN
CLEAR_SCREEN:
SEROUT 15,16468,[noparse][[/noparse]254,1]
RETURN
To UNSUBSCRIBE, just send mail to:
basicstamps-unsubscribe@yahoogroups.com
from the same email address that you subscribed. Text in the Subject and
Body of the message will be ignored.
Your use of Yahoo! Groups is subject to http://docs.yahoo.com/info/terms/
The DS1302 does store the data in BCD, which is simply a subset of
Hex (hex without A-F).
In your routine, when you are adding to the hour for example, add 1,
if the digit (hour.lownib) > 9 then add 6 to correct for BCD.
The following code snippit is from the upcoming new version of the
Stamps In Class Industrial Control text with an added chapter on real
time control.
AdjustTime:
'BCD Time adjust routine
IF Cseconds.lownib < $A THEN HighSec
Cseconds = Cseconds + 6
HighSec:
If Cseconds < $60 Then LowMin
Cseconds = Cseconds - $60
Cminutes = Cminutes + 1
LowMin:
IF Cminutes.lownib < $A THEN HighMin
Cminutes = Cminutes + 6
HighMin:
IF Cminutes < $60 THEN LowHours
CMinutes = Cminutes - $60
Chours = Chours + 1
LowHours:
IF CHours.lownib < $A THEN HighHours
Chours = Chours + 6
HighHours:
IF Chours < $24 THEN AdjustDone
Chours = Chours - $24
AdjustDone:
RETURN
When you send your data to the display, do not send it as
DEC hour
Send it as a hex value invalue instead
HEX Hour
and it should display fine.
-Martin Hebel
http://www.selmaware.com/s-plot
http://www.siu.edu/~imsasa/est
--- In basicstamps@y..., thosey@w... wrote:
> Does anyone have a sample already wrote to change a decimal number
to
> a bcd number that makes the bcd number equal the decimal. As such,
> 20 decimal is 14 in hex or bcd but the DS1302 is serially input in
> bcd not decimal. So while the lcd and the register holding this
> number is 20 and you need to place the hex number into the ds1302
of
> 20 but your register is actually 14 hex. I cannot use the hex
> version to display to screen since I would be displaying the
> A,B,C,D,E,F of hex and I want to be able to push a button and
display
> the setting of the seconds, minutes, hours on the screen. From 0 to
> 59 less the A,B,C,D,E,F. Now the other problem is that I have
> already used up most of the program storage area and have very
little
> room for this conversion. I have posted the program below, the
> actual part I am having trouble with is near the end.
> Many thanks
> Timothy Hosey
>
>
> '{$STAMP BS2}
>
> '###################################################################
##
> #########################
> 'THIS PROGRAM COPYWRITED 2001 BY TIMOTHY L. HOSEY
> 'LED 8 IS FOR READING TEMP
> 'LED 9 IS FOR READING THE PLC VIA DIRECTNET PROTOCOL
> 'LED 10 IS FOR WRITING TO LCD
> 'LED 11 IS FOR DOWNLOADING FROM VB PROGRAM
> '###################################################################
##
> #########################
>
>
> '###################################################################
##
> #########################
> 'DEFINE OUTPUT PINS USED FOR SERIAL SPI INTERFACE
> '###################################################################
##
> #########################
>
> DQ CON 4 'SPI SERIAL DATA PIN
> CLK CON 3 'SPI SERIAL CLOCK PIN
> RSTT CON 2 'SPI SERIAL RESET PIN FOR
> TEMP CHIP DS-1620
> RSTE CON 5 'SPI SERIAL RESET PIN FOR EEPROM CHIP
> RST1302 CON 6 'SPI SERIAL RESET PIN FOR
TIME CHIP
> DS-1302
>
> '###################################################################
##
> #########################
> 'DEFINE PINS USED FOR BUTTONS
> '###################################################################
##
> #########################
>
> BUT1 CON 12
> BUT2 CON 13
> BUT3 CON 14
>
> '###################################################################
##
> #########################
> ' DEFINE VARIABLES
> '###################################################################
##
> #########################
>
> X VAR WORD
> INFO VAR WORD ' VARIABLE TO HOLD 9-
> bit INFO.
> PROM_HEX VAR WORD
> CHECK VAR WORD
> HEADER VAR WORD
> CMD VAR BYTE
> CNT VAR BYTE
> TEMP VAR WORD 'TEMPURATURE IS HELD
HERE
> PLC VAR BYTE(8)
> LRC VAR WORD
> ADD VAR WORD 'ADDRESS OF DIRECTNET
> PROTOCOL MASTER.
>
> '###################################################################
##
> #########################
> 'START DECLARING ALLIASES FOR WORD VARIABLES
> '###################################################################
##
> #########################
>
> SECONDS VAR TEMP.LOWBYTE
> MINUTES VAR TEMP.HIGHBYTE
> HOUR VAR LRC.LOWBYTE
> DAY VAR LRC.HIGHBYTE
> MONTH VAR INFO.LOWBYTE
> YEAR VAR INFO.HIGHBYTE
>
> '###################################################################
##
> #########################
> 'START DECLARING CONSTANTS FOR PLC PROGRAM
> '###################################################################
##
> #########################
>
> ENQ CON $05
> ACK CON $06
> NAK CON $15
> SOH CON $01
> ETB CON $17
> STX CON $02
> ETX CON $03
> EOT CON $04
> INIT CON $4E
>
> '###################################################################
##
> #########################
> 'START DECLARING CONSTANTS FOR EEPROM
> '###################################################################
##
> #########################
>
> READE CON 3 'DATA FOR SPI EEPROM
> WRTE CON 2 'DATA FOR SPI EEPROM
> WREN CON 6 'DATA FOR SPI EEPROM
>
> '###################################################################
##
> #########################
> 'START DECLARING CONSTANTS FOR DS1302
> '###################################################################
##
> #########################
>
> SecReg CON %00000
> MinReg CON %00001
> HrsReg CON %00010
> DateReg CON %00011
> MonReg CON %00100
> YrReg CON %00110
> CtrlReg CON %00111
> BrstReg CON %11111
>
> '###################################################################
##
> #########################
> 'MAKE PINS INPUTS FOR BUTTONS
> '###################################################################
##
> #########################
>
> INPUT BUT1
> INPUT BUT2
> INPUT BUT3
>
> '###################################################################
##
> #########################
> 'WRITE TO THE LCD SCREEN AT START UP
> '###################################################################
##
> #########################
>
> HIGH RSTE
> HIGH 10 'WRITING TO
> LCD LED ON
> PAUSE 1000
> GOSUB CLEAR_SCREEN
> SEROUT 15,16468,[noparse][[/noparse]"AUTOMATED PANELS"]
> SEROUT 15,16468,[noparse][[/noparse]254,192]
> SEROUT 15,16468,[noparse][[/noparse]"2001 TIM HOSEY"]
> LOW 10 'WRITING TO
> LCD LED OFF
> PAUSE 3000 'WAIT 3
> SECONDS
>
> '###################################################################
##
> #########################
> ' ACTIVATE THE 1620 AND SET FOR CONTINOUS CONVERSION SET THE HIGH
AND
> LOW TEMPERATURES.
> '###################################################################
##
> #########################
>
> HIGH RSTT
> SHIFTOUT DQ,CLK,LSBFIRST,[noparse][[/noparse]$0C,$0A]
> SHIFTOUT DQ,CLK,LSBFIRST,[noparse][[/noparse]$00\9]
> LOW RSTT
> PAUSE 10
>
>
> HIGH RSTT
> SHIFTOUT DQ,CLK,LSBFIRST,[noparse][[/noparse]$EE]
> LOW RSTT
> PAUSE 10
>
> '###################################################################
##
> #########################
> ' INITIAL ADDRESS FOR DIRECTNET PROTOCOL
> '###################################################################
##
> #########################
>
> ADD = $21
> 'THIS IS FOR ADDRESS
> 1
> GOSUB READ_PROM 'USED FOR DIRECTNET
PROTOCOL
>
> '###################################################################
##
> #########################
> ' BEGINING OF PROGRAM LOOP
> '###################################################################
##
> #########################
>
> START:
>
> '###################################################################
##
> #########################
> ' CLEAR CONTENTS OF REGISTERS
> '###################################################################
##
> #########################
>
> GOSUB CLEAR_PLC_ARRAY
> INFO = 0
> TEMP = 0
> CMD = 0
> CNT = 0
>
> '###################################################################
##
> #########################
> ' IF BUTTON 12 IS PUSHED JUMP TO SET_TIME LABEL
> '###################################################################
##
> #########################
>
> IF IN12 = 1 THEN SET_TIME
>
> '###################################################################
##
> #########################
> ' CHECK TO SEE IF VB PROGRAM IS DOWNLOADING
> '###################################################################
##
> #########################
>
> SERIN 16,16468,100,NOWAY,[noparse][[/noparse]STR PLC\2]
>
> NOWAY:
>
> IF PLC(0) = "O" AND PLC(1) = "K" THEN DOWNLOADING
>
> '###################################################################
##
> #########################
> ' READING THE TEMPURATURE
> '###################################################################
##
> #########################
>
> HIGH 8 'CHECKING
> TEMPURATURE LED 8 ON
>
> HIGH RSTT
> SHIFTOUT DQ,CLK,LSBFIRST,[noparse][[/noparse]$AA] ' REQUEST TO READ
> TEMP
> shiftin DQ,CLK,LSBPRE,[noparse][[/noparse]INFO\9] ' GET TEMP READING
> LOW RSTT
> INFO = INFO/2 ' SCALE
READING TO
> WHOLE DEG CELS.
> INFO = (INFO */ $01CC) ' MULTIPLY BY 1.8
> INFO = INFO + 32 ' COMPLETE CONVERSION
> TO FERINHEIT.
> TEMP = INFO
> LOW 8 'CHECKING
> TEMPURATURE LED 8 OFF
>
> '###################################################################
##
> #########################
> ' START OF THE PLC READ PROTOCOL'S FOR V2000
> '###################################################################
##
> #########################
>
> HIGH 9
'READING PLC
> LED 9 ON
> SEROUT 1,16468,[noparse][[/noparse]INIT,ADD,ENQ] 'INITIATE
SEQUENCING
> SERIN 0,16468,500,NODATA,[noparse][[/noparse]STR PLC\7] 'RECIEVE DATA
FROM
> THE PLC
>
> NODATA:
>
> IF PLC(2) <> ACK THEN NORESP
>
> GOSUB CLEAR_PLC_ARRAY
'CLEAR THE
> PLC ARRAY
>
> '###################################################################
##
> #########################
> ' SEND INFO TO THE PLC TO READ
> '###################################################################
##
> #########################
>
> SEROUT 1,16468,
>
[noparse][[/noparse]SOH,$30,$31,$30,$31,$30,$34,$30,$31,$30,$30,$30,$34,$30,$31,ETB,$30,$
> 30]
> ' 1 2 3 4 5 6 7 8 9 10 11
> 12 13 14 15 16 17 18
>
> SERIN 0,16468,500,NODATA2,[noparse][[/noparse]STR PLC\7] 'RECIEVE THE
REQUESTED INFO.
>
> SEROUT 1,16468,[noparse][[/noparse]ACK]
> SEROUT 1,16468,[noparse][[/noparse]EOT]
>
> NODATA2:
> LOW 9 'READING PLC
> LED 9 OFF
>
> 'PLC(5)+PLC(6)+PLC(3)+PLC(4) THIS IS THE ORDER OF BYTES
>
> INFO.HIGHBYTE = PLC(3)
> INFO.LOWBYTE = PLC(4)
>
> LOOKDOWN PLC(3),
>
[noparse][[/noparse]"0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"],INFO
> .NIB1
> LOOKDOWN PLC(4),
>
[noparse][[/noparse]"0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"],INFO
> .NIB0
> INFO.HIGHBYTE = 0
>
> PROM_HEX = INFO * $20
> IF PROM_HEX = CHECK THEN WRITE_PLC 'THIS TAKES YOU
> AROUND WRITING TO THE SCREEN IF
> CHECK = PROM_HEX 'THE SCREEN
> IS WRITING THE SAME THING AGAIN.
> IF PROM_HEX = $0000 THEN DISPLAY_TEMP
>
> ENDS:
>
> '###################################################################
##
> #########################
> ' READING THE EEPROM
> '###################################################################
##
> #########################
>
> HIGH 10
'WRITING TO
> LCD LED ON
> GOSUB CLEAR_SCREEN 'CLEARING THE
> LCD SCREEN
> LOW 10
> 'WRITING TO LCD LED OFF
> FOR X = PROM_HEX TO PROM_HEX + 32
> CNT = CNT + 1
> IF CNT = 17 THEN LINE2
>
> BACKTO_LINE2:
>
> LOW RSTE
> SHIFTOUT DQ,CLK,MSBFIRST,[noparse][[/noparse]READE]
> SHIFTOUT DQ,CLK,MSBFIRST,[noparse][[/noparse]X\16]
> SHIFTIN DQ,CLK,MSBPRE,[noparse][[/noparse]INFO]
> HIGH RSTE
> IF INFO = 0 THEN AROUND
> HIGH 10
'WRITING TO
> LCD LED ON
> SEROUT 15,16468,[noparse][[/noparse]INFO] 'WRITING INFO
> TO THE LCD
> LOW 10
> 'WRITING TO LCD LED OFF
>
> AROUND:
>
> NEXT
> HIGH RSTT
>
> '###################################################################
##
> #########################
> ' WRITE TEMP TO PLC REGISTER V2001
> '###################################################################
##
> #########################
>
> WRITE_PLC:
>
> HIGH 9
'WRITING TO
> PLC LED 9 ON
>
> GOSUB CLEAR_PLC_ARRAY
>
> SEROUT 1,16468,[noparse][[/noparse]INIT,ADD,ENQ] 'INITIATE
SEQUENCING
> SERIN 0,16468,500,NO,[noparse][[/noparse]STR PLC\7] 'RECIEVE DATA FROM
> THE PLC
>
> NO:
>
> 'DUH LOOK AT BIT 4 IF IT IS 30 THEN READ IF IT IS 38 THEN WRITE
> SEROUT 1,16468,
>
[noparse][[/noparse]SOH,$30,$31,$38,$31,$30,$34,$30,$32,$30,$30,$30,$34,$30,$31,ETB,$30,$
> 42]
> ' 1 2 3 4 5 6 7 8 9 10 11
> 12 13 14 15 16 17 18
> SERIN 0,16468,500,NO2,[noparse][[/noparse]STR PLC\7] 'RECIEVE THE
> REQUESTED INFO.
>
> NO2:
>
> IF PLC(0) <> ACK THEN START
>
> GOSUB CONV_TEMP
>
> LRC = $30 ^ $30 'XOR
> LRC = LRC ^ TEMP.HIGHBYTE 'XOR
> LRC = LRC ^ TEMP.LOWBYTE 'XOR
> GOSUB FIND_LRC
>
>
> 'REMEMBER THAT 0 IS $30
> SEROUT 1,16468,
>
[noparse][[/noparse]STX,TEMP.HIGHBYTE,TEMP.LOWBYTE,$30,$30,ETX,LRC.HIGHBYTE,LRC.LOWBYTE]
> SERIN 0,16468,500,NO3,[noparse][[/noparse]STR PLC\7] 'RECIEVE THE
> REQUESTED INFO.
>
> NO3:
>
> IF PLC(0) <> ACK THEN START
> SEROUT 1,16468,[noparse][[/noparse]EOT]
>
> GOTO START
>
> '###################################################################
##
> #########################
> ' CONVERT TEMP FOR THE PLC TO UNDERSTAND.
> '###################################################################
##
> #########################
>
> CONV_TEMP:
>
> LOOKUP TEMP.NIB1,
>
[noparse][[/noparse]$30,$31,$32,$33,$34,$35,$36,$37,$38,$39,$41,$42,$43,$44,$45,$46],TEMP
> .HIGHBYTE
> LOOKUP TEMP.NIB0,
>
[noparse][[/noparse]$30,$31,$32,$33,$34,$35,$36,$37,$38,$39,$41,$42,$43,$44,$45,$46],TEMP
> .LOWBYTE
>
> RETURN
>
> '###################################################################
##
> #########################
> ' CONVERT TO CALCULATE LRC FOR THE PLC.
> '###################################################################
##
> #########################
>
> FIND_LRC:
>
> LOOKUP LRC.NIB1,
>
[noparse][[/noparse]$30,$31,$32,$33,$34,$35,$36,$37,$38,$39,$40,$41,$42,$43,$44,$45,$46],
> LRC.HIGHBYTE
> LOOKUP LRC.NIB0,
>
[noparse][[/noparse]$30,$31,$32,$33,$34,$35,$36,$37,$38,$39,$40,$41,$42,$43,$44,$45,$46],
> LRC.LOWBYTE
>
> RETURN
>
>
> NORESP:
>
> '###################################################################
##
> #########################
> ' DISPLAY ON LCD TEMP AND CHECK PLC CABLE
> '###################################################################
##
> #########################
>
> HIGH 10
'WRITING TO
> LCD LED ON
>
> GOSUB DISPLAY_TEMPATURE
>
> SEROUT 15,16468,[noparse][[/noparse]254,192]
> SEROUT 15,16468,[noparse][[/noparse]"CHECK PLC CABLE"]
>
> PAUSE 1000
>
> '###################################################################
##
> #########################
> ' IF BUTTON 12 IS PUSHED JUMP TO SET_TIME LABEL
> '###################################################################
##
> #########################
>
> IF IN12 = 1 THEN SET_TIME
> '###################################################################
##
> #########################
> ' DISPLAY THE TIME HERE
> '###################################################################
##
> #########################
>
> GOSUB ReadRTCBurst
> SEROUT 15,16468,[noparse][[/noparse]254,192]
> SEROUT 15,16468,[noparse][[/noparse]"TIME: "]
> SEROUT 15,16468,[noparse][[/noparse]DEC1 Hour.HIGHNIB, DEC1 Hour.LOWNIB,":", DEC1
> Minutes.HIGHNIB]
> SEROUT 15,16468,[noparse][[/noparse]DEC1 Minutes.LOWNIB,":", DEC1 Seconds.HIGHNIB,
> DEC1 Seconds.LOWNIB," "]
>
>
> DEBUG SDEC Minutes.HIGHNIB,SDEC Minutes.LOWNIB,CR
>
>
> PAUSE 1000
> LOW 9 'WRITING TO
> PLC LED 9 OFF
> LOW 10 'WRITING TO
> LCD LED OFF
>
> GOTO START
>
> LINE2:
>
> HIGH 10
'WRITING TO
> LCD LED ON
> SEROUT 15,16468,[noparse][[/noparse]254,192]
> LOW 10
> 'WRITING TO LCD LED
> OFF
> GOTO BACKTO_LINE2
>
> '###################################################################
##
> #########################
> ' DOWNLOADING FROM VB PROGRAM
> '###################################################################
##
> #########################
>
> DOWNLOADING:
>
> HIGH 11
'CHECK FOR
> DOWNLOADING LED ON
> HIGH 10
'WRITING TO
> LCD LED ON
> GOSUB CLEAR_SCREEN
> SEROUT 15,16468,[noparse][[/noparse]" DOWNLOAD MODE!"]
> SEROUT 16,16468,[noparse][[/noparse]"DOWNLOAD",13]
> LOW 10 'WRITING TO
> LCD LED OFF
> 'GATHER ADDRESS,READ,AND TEMP FROM PC
> 'WRITE ENABLE THE EEPROM
> LOW RSTE
> SHIFTOUT DQ,CLK,MSBFIRST,[noparse][[/noparse]WREN]
> HIGH RSTE
>
> PAUSE 100
>
> '###################################################################
##
> #########################
> ' WRITE INFO FROM VB PROGRAM TO EEPROM
> '###################################################################
##
> #########################
>
> LOW RSTE
> SHIFTOUT DQ,CLK,MSBFIRST,[noparse][[/noparse]WRTE] 'SET TO WRITE TO
> EEPROM
> 'THIS IS THE ADDRESS OF THE PLC
> SHIFTOUT DQ,CLK,MSBFIRST,[noparse][[/noparse]$0FF0\16] 'WRITE TO THIS ADDRESS
> PAUSE 10
> SERIN 16,16468,[noparse][[/noparse]SHEX4 HEADER]
> SHIFTOUT DQ,CLK,MSBFIRST,[noparse][[/noparse]HEADER\16]
> HIGH RSTE
> HIGH 10
'WRITING TO
> LCD LED ON
>
> '###################################################################
##
> #########################
> ' DISPLAY STATION NUMBER DIRECTNET PROTOCOL WITH THE GOSUB
> '###################################################################
##
> #########################
>
> GOSUB STAT_NUMBER 'GET INFO TO
> WRITE TO LCD SCREEN
>
> LOW 10 'WRITING TO
> LCD LED OFF
>
> FOR X = 1 TO 36 'SHOULD BE 36
> HEADER = 0
> LOW RSTE 'WRITE ENABLE
> THE EEPROM
> SHIFTOUT DQ,CLK,MSBFIRST,[noparse][[/noparse]WREN]
> HIGH RSTE
> PAUSE 100
> LOW RSTE 'WRITE TO THE
> EEPROM
> SHIFTOUT DQ,CLK,MSBFIRST,[noparse][[/noparse]WRTE] 'SET TO WRITE TO
> EEPROM
>
> '###################################################################
##
> #########################
> ' DISPLAY LOCATION OF EEPROM ON LCD SCREEN
> '###################################################################
##
> #########################
>
> SERIN 16,16468,[noparse][[/noparse]SHEX4 HEADER]
> GOSUB CLEAR_SCREEN
> SEROUT 15,16468,[noparse][[/noparse]"RECIEVING INFO!"]
> SEROUT 15,16468,[noparse][[/noparse]254,192]
> SEROUT 15,16468,[noparse][[/noparse]"POSITION #",SDEC X]
>
> SHIFTOUT DQ,CLK,MSBFIRST,[noparse][[/noparse]HEADER\16] 'WRITE TO THIS ADDRESS
> PAUSE 10
>
> '###################################################################
##
> #########################
> ' WRITE TO THE EEPROM THE VB MESSAGE
> '###################################################################
##
> #########################
>
> SERIN 16,16468,[noparse][[/noparse]STR PLC\8]
> SHIFTOUT DQ,CLK,MSBFIRST,[noparse][[/noparse]PLC(0),PLC(1),PLC(2),PLC(3),PLC(4),PLC
> (5),PLC(6),PLC(7)\8]
> SERIN 16,16468,[noparse][[/noparse]STR PLC\8]
> SHIFTOUT DQ,CLK,MSBFIRST,[noparse][[/noparse]PLC(0),PLC(1),PLC(2),PLC(3),PLC(4),PLC
> (5),PLC(6),PLC(7)\8]
> SERIN 16,16468,[noparse][[/noparse]STR PLC\8]
> SHIFTOUT DQ,CLK,MSBFIRST,[noparse][[/noparse]PLC(0),PLC(1),PLC(2),PLC(3),PLC(4),PLC
> (5),PLC(6),PLC(7)\8]
> SERIN 16,16468,[noparse][[/noparse]STR PLC\8]
> SHIFTOUT DQ,CLK,MSBFIRST,[noparse][[/noparse]PLC(0),PLC(1),PLC(2),PLC(3),PLC(4),PLC
> (5),PLC(6),PLC(7)\8]
>
> HIGH RSTE
> PAUSE 100
> NEXT
>
> GOSUB READ_PROM
>
> LOW 11 'CHECK FOR
> DOWNLOADING LED OFF
>
> GOTO START
>
> CLEAR_PLC_ARRAY:
>
> PLC(0) = 0
> PLC(1) = 0
> PLC(2) = 0
> PLC(3) = 0
> PLC(4) = 0
> PLC(5) = 0
> PLC(6) = 0
> PLC(7) = 0
> PLC(8) = 0
>
> RETURN
>
> '###################################################################
##
> #########################
> ' READING THE EEPROM
> '###################################################################
##
> #########################
>
> READ_PROM:
>
> 'READING THE EEPROM
> LOW RSTE
> SHIFTOUT DQ,CLK,MSBFIRST,[noparse][[/noparse]READE]
> PAUSE 10
> SHIFTOUT DQ,CLK,MSBFIRST,[noparse][[/noparse]$0FF0\16]
> PAUSE 10
> SHIFTIN DQ,CLK,MSBPRE,[noparse][[/noparse]ADD\16]
> HIGH RSTE
> HIGH 10
'WRITING TO
> LCD LED ON
>
> GOSUB STAT_NUMBER 'GET
> INFO TO WRITE TO LCD SCREEN
>
> PAUSE 2000
> LOW 10 'WRITING TO
> LCD LED OFF
>
> RETURN
>
> '###################################################################
##
> #########################
> ' I BELIEVE THIS IS IF PLC V2000 IS A 0 YOU MAY NEED TO CHECK THIS
> OUT TIM
> ' AND GET RID OF IT
> '###################################################################
##
> #########################
>
> DISPLAY_TEMP:
>
> GOSUB DISPLAY_TEMPATURE
>
> SEROUT 15,16468,[noparse][[/noparse]254,192]
> SEROUT 15,16468,[noparse][[/noparse]" CARDINAL"]
>
> '###################################################################
##
> #########################
> ' SENDS ME TO WRITE TEMP TO PLC IN V2000
> '###################################################################
##
> #########################
>
> GOTO WRITE_PLC 'YOU WILL BE SENT
BACK INTO
> THE START LOOP.
>
> '###################################################################
##
> #########################
> ' THE FOLLOWING IS USED TO SET THE TIME USEING PINS 14, 13, 12
> '###################################################################
##
> #########################
>
> SET_TIME:
>
> TEMP = $00 'DO THIS SO YOU SET A
0 AT
> LEAST IN THE SECONDS REGISTER.
> LRC = SecReg
>
> GOSUB WriteRTC
>
> SET_SEC:
>
> HIGH 10
> GOSUB CLEAR_SCREEN
> SEROUT 15,16468,[noparse][[/noparse]"SET SECONDS: ",DEC TEMP]
> PAUSE 400
> IF IN14 = 1 THEN SET_MIN
> IF IN13 = 0 THEN SET_SEC
> TEMP = TEMP + 1
> IF NOT TEMP > 59 THEN SEC_GRT
> TEMP = $00
>
> SEC_GRT:
>
> LRC = SecReg
> GOSUB WriteRTC
>
> GOTO SET_SEC
>
> SET_MIN:
>
> TEMP = $00 'DO THIS SO YOU SET A
0 AT
> LEAST IN THE MINUTES REGISTER.
> LRC = MinReg
>
> GOSUB WriteRTC
>
> SET_MIN1:
>
> GOSUB CLEAR_SCREEN
> SEROUT 15,16468,[noparse][[/noparse]"SET MINUTES: ",DEC TEMP]
> PAUSE 400
> IF IN14 = 1 THEN SET_HR
> IF IN13 = 0 THEN SET_MIN1
> TEMP = TEMP + 1
>
> IF NOT TEMP > 59 THEN MIN_GRT
> TEMP = $00
>
> MIN_GRT:
>
> LRC = MinReg
> GOSUB WriteRTC
>
> GOTO SET_MIN1
>
> SET_HR:
>
> TEMP = $01 'DO THIS SO YOU SET A
1 AT
> LEAST IN THE HOURS REGISTER.
> LRC = HRSReg
>
> GOSUB WriteRTC
>
> SET_HR1:
>
> GOSUB CLEAR_SCREEN
> SEROUT 15,16468,[noparse][[/noparse]"SET HOUR: ",DEC TEMP]
> PAUSE 400
> IF IN14 = 1 THEN END_TIME
> IF IN13 = 0 THEN SET_HR1
> TEMP = TEMP + $1
> IF NOT TEMP > 12 THEN HR_GRT
> TEMP = $01
>
> HR_GRT:
>
> LRC = HRSReg
>
> GOSUB WriteRTC
>
> GOTO SET_HR1
>
> END_TIME
>
> Temp = $80
> LRC = CtrlReg
> GOSUB WriteRTC
>
> LOW 10
>
> GOTO START
>
> '###################################################################
##
> #########################
> ' TO READ THE TIME AND DATE FROM THE DS1302
> '###################################################################
##
> #########################
>
> ReadRTCBurst:
>
> HIGH RST1302
> SHIFTOUT DQ, Clk, LSBFIRST, [noparse][[/noparse]%1\1,BrstReg\5,%10\2]
> SHIFTIN DQ, Clk, LSBPRE,
[noparse][[/noparse]Seconds,Minutes,Hour,DAY,Month,Year,Year]
> LOW RST1302
>
> RETURN
>
> '###################################################################
##
> #########################
> ' TO WRITE THE TIME AND DATE FROM THE DS1302
> '###################################################################
##
> #########################
>
> WriteRTC:
>
> 'Write to DS1302
> HIGH RST1302
> SHIFTOUT DQ, Clk, LSBFIRST, [noparse][[/noparse]%0\1,CtrlReg\5,%10\2,$10]
> LOW RST1302
> HIGH RST1302
> SHIFTOUT DQ, Clk, LSBFIRST, [noparse][[/noparse]%0\1,LRC\5,%10\2,Temp]
> LOW RST1302
>
> RETURN
>
> '###################################################################
##
> #########################
> ' TO CLEAR LCD AND DISPLAY DIRECTNET PROT STATION #
> '###################################################################
##
> #########################
>
> STAT_NUMBER:
>
> GOSUB CLEAR_SCREEN
> SEROUT 15,16468,[noparse][[/noparse]"STATION #:",ISHEX ADD]
>
> RETURN
>
> '###################################################################
##
> #########################
> ' THE ROUTINES BELOW ARE TO GET MORE MEMORY OUT OF THE STAMP
> ' I NEEDED TO COMPILE IT TO BE SMALLER CODE
> '###################################################################
##
> #########################
>
>
> DISPLAY_TEMPATURE:
>
> GOSUB CLEAR_SCREEN
> SEROUT 15,16468,[noparse][[/noparse]"TEMP = ",SDEC TEMP," DEG F"]
>
> RETURN
>
> CLEAR_SCREEN:
>
> SEROUT 15,16468,[noparse][[/noparse]254,1]
>
> RETURN
Like yourself I am into the industrial area. I had to really
optimize the code to the best I could and I still have 77 words left
over that I can use, will need them sooner or later. Before
optimizing I was getting prom full.
This program reads with the directnet protocol from a directlogic plc
(koyo) the memory location V2000 and looks at the bcd number and
displays the corresponding text that is stored in the eeprom. So for
error troubleshooting you would move a word into v2000 and it would
display the error that you are looking for. It also writes the temp
to the plc into V2001 so you can start or stop things if you like
like a cabinet fan for example. You write the messages using a VB
program that I wrote for it. I should be porting it for the Allen
Bradley DF1 sometime. But I usually use the Basic Stamp to prove
then I will use the Scenic chips to do. Alot cheaper.
Any way
The biggy was that I needed to re-look at the sample code for the DS-
1302 while the one sample used dec the other used hex. Go figure.
So I changed it to hex when displaying it out since it is read out in
bcd as well as in. The other problem of displaying it to the lcd in
decimal was equated sort of like your program but a lot more
compact. Take a look at this you may want to include it with yours
to show optimized code. adjust_time would be the dec value from
adding adjust_time = adjust_time + $01 from each button push. This
will also not show a a,b,c,d,e,f like in hex.
WriteRTC:
TIME = ADJ_TIME 'this is more optimized.
TIME_MULT = ADJ_TIME / 10
IF ADJ_TIME < 10 THEN SKIP_ADJ
FOR X = 1 TO TIME_MULT
TIME = TIME + 6
NEXT
SKIP_ADJ:
'Write to DS1302
HIGH RST1302
SHIFTOUT DQ, Clk, LSBFIRST, [noparse][[/noparse]%0\1,CtrlReg\5,%10\2,$10]
LOW RST1302
HIGH RST1302
SHIFTOUT DQ, Clk, LSBFIRST, [noparse][[/noparse]%0\1,LRC\5,%10\2,TIME]
LOW RST1302
RETURN
To reverse it I did this. I did this to display the dec on the
screen to show where to start from.
BCD_DEC:
TIME_MULT = ADJ_TIME / 15 'THIS WORKS INSTEAD OF 10
IF ADJ_TIME < 10 THEN SKIP_ADJ_SUB
FOR X = 1 TO TIME_MULT
ADJ_TIME = ADJ_TIME - 6
NEXT
SKIP_ADJ_SUB:
RETURN
Don't take me wrong but I am going to have to disagree with this.
> The DS1302 does store the data in BCD, which is simply a subset of
> Hex (hex without A-F).
The DS1302 will write an A-F and time with it but also look at the
chart below. This method is what we use in programming Plc's And
was taught by Rockwell Automation for binary to BCD conversion's.
Since there are usually 16 inputs or outputs to a plc card.
8 4 2 1 8 4 2 1 8 4 2 1 8 4 2 1
15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
Say bits 0 - 3 are all on which is a nibble.
Take the number on top and add it to the next for each bit that is on
8 + 4 + 2 + 1 = 15 or F
1 1 1 1
b3 b2 b1 b0
or
8 + 0 + 2 + 1 = 11 or B
1 0 1 1
b3 b2 b1 b0
or
0 + 0 + 2 + 1 = 3
0 0 1 1
b3 b2 b1 b0
Well any way here is the program with 77 words to spare.
'{$STAMP BS2}
'#####################################################################
#########################
'THIS PROGRAM COPYWRITED 2001 BY TIMOTHY L. HOSEY
'LED 8 IS FOR READING TEMP
'LED 9 IS FOR READING THE PLC VIA DIRECTNET PROTOCOL
'LED 10 IS FOR WRITING TO LCD
'LED 11 IS FOR DOWNLOADING FROM VB PROGRAM
'#####################################################################
#########################
'#####################################################################
#########################
'DEFINE OUTPUT PINS USED FOR SERIAL SPI INTERFACE
'#####################################################################
#########################
DQ CON 4 'SPI SERIAL DATA PIN
CLK CON 3 'SPI SERIAL CLOCK PIN
RSTT CON 2 'SPI SERIAL RESET PIN FOR
TEMP CHIP DS-1620
RSTE CON 5 'SPI SERIAL RESET PIN FOR EEPROM CHIP
RST1302 CON 6 'SPI SERIAL RESET PIN FOR TIME CHIP
DS-1302
'#####################################################################
#########################
'DEFINE PINS USED FOR BUTTONS
'#####################################################################
#########################
BUT1 CON 12
BUT2 CON 13
BUT3 CON 14
'#####################################################################
#########################
' DEFINE VARIABLES
'#####################################################################
#########################
X VAR WORD
INFO VAR WORD ' VARIABLE TO HOLD 9-
bit INFO.
PROM_HEX VAR WORD
CHECK VAR WORD
HEADER VAR WORD
CMD VAR BYTE
CNT VAR BYTE
TEMP VAR WORD 'TEMPURATURE IS HELD HERE
PLC VAR BYTE(8)
LRC VAR WORD
ADD VAR WORD 'ADDRESS OF DIRECTNET
PROTOCOL MASTER.
'#####################################################################
#########################
'START DECLARING ALLIASES FOR WORD VARIABLES
'#####################################################################
#########################
SECONDS VAR TEMP.LOWBYTE
MINUTES VAR TEMP.HIGHBYTE
HOUR VAR LRC.LOWBYTE
DAY VAR LRC.HIGHBYTE
MONTH VAR INFO.LOWBYTE
YEAR VAR INFO.HIGHBYTE
TIME VAR PLC
ADJ_TIME VAR SECONDS 'THIS IS THE DECIMAL THAT YOU
WILL CHANGE TO BCD IN TIME.
TIME_MULT VAR MINUTES 'THIS IS THE TIMES MULTIPLIER.
'#####################################################################
#########################
'START DECLARING CONSTANTS FOR PLC PROGRAM
'#####################################################################
#########################
ENQ CON $05
ACK CON $06
NAK CON $15
SOH CON $01
ETB CON $17
STX CON $02
ETX CON $03
EOT CON $04
INIT CON $4E
'#####################################################################
#########################
'START DECLARING CONSTANTS FOR EEPROM
'#####################################################################
#########################
READE CON 3 'DATA FOR SPI EEPROM
WRTE CON 2 'DATA FOR SPI EEPROM
WREN CON 6 'DATA FOR SPI EEPROM
'#####################################################################
#########################
'START DECLARING CONSTANTS FOR DS1302
'#####################################################################
#########################
SecReg CON %00000
MinReg CON %00001
HrsReg CON %00010
DateReg CON %00011
MonReg CON %00100
YrReg CON %00110
CtrlReg CON %00111
BrstReg CON %11111
'#####################################################################
#########################
'MAKE PINS INPUTS FOR BUTTONS
'#####################################################################
#########################
INPUT BUT1
INPUT BUT2
INPUT BUT3
'#####################################################################
#########################
'WRITE TO THE LCD SCREEN AT START UP
'#####################################################################
#########################
HIGH RSTE
HIGH 10 'WRITING TO
LCD LED ON
PAUSE 1000
GOSUB CLEAR_SCREEN
SEROUT 15,16468,[noparse][[/noparse]"AUTOMATED PANELS"]
SEROUT 15,16468,[noparse][[/noparse]254,192]
SEROUT 15,16468,[noparse][[/noparse]"2001 TIM HOSEY"]
LOW 10 'WRITING TO
LCD LED OFF
PAUSE 3000 'WAIT 3
SECONDS
'#####################################################################
#########################
' ACTIVATE THE 1620 AND SET FOR CONTINOUS CONVERSION SET THE HIGH AND
LOW TEMPERATURES.
'#####################################################################
#########################
HIGH RSTT
SHIFTOUT DQ,CLK,LSBFIRST,[noparse][[/noparse]$0C,$0A]
SHIFTOUT DQ,CLK,LSBFIRST,[noparse][[/noparse]$00\9]
LOW RSTT
PAUSE 10
HIGH RSTT
SHIFTOUT DQ,CLK,LSBFIRST,[noparse][[/noparse]$EE]
LOW RSTT
PAUSE 10
'#####################################################################
#########################
' INITIAL ADDRESS FOR DIRECTNET PROTOCOL
'#####################################################################
#########################
ADD = $21
'THIS IS FOR ADDRESS
1
GOSUB READ_PROM 'USED FOR DIRECTNET PROTOCOL
'#####################################################################
#########################
' BEGINING OF PROGRAM LOOP
'#####################################################################
#########################
START:
'#####################################################################
#########################
' CLEAR CONTENTS OF REGISTERS
'#####################################################################
#########################
GOSUB CLEAR_PLC_ARRAY
INFO = 0
TEMP = 0
CMD = 0
CNT = 0
'#####################################################################
#########################
' IF BUTTON 12 IS PUSHED JUMP TO SET_TIME LABEL
'#####################################################################
#########################
IF IN12 = 1 THEN SET_TIME
'#####################################################################
#########################
' CHECK TO SEE IF VB PROGRAM IS DOWNLOADING
'#####################################################################
#########################
SERIN 16,16468,100,NOWAY,[noparse][[/noparse]STR PLC\2]
NOWAY:
IF PLC(0) = "O" AND PLC(1) = "K" THEN DOWNLOADING
'#####################################################################
#########################
' READING THE TEMPURATURE
'#####################################################################
#########################
HIGH 8 'CHECKING
TEMPURATURE LED 8 ON
HIGH RSTT
SHIFTOUT DQ,CLK,LSBFIRST,[noparse][[/noparse]$AA] ' REQUEST TO READ
TEMP
shiftin DQ,CLK,LSBPRE,[noparse][[/noparse]INFO\9] ' GET TEMP READING
LOW RSTT
INFO = INFO/2 ' SCALE READING TO
WHOLE DEG CELS.
INFO = (INFO */ $01CC) ' MULTIPLY BY 1.8
INFO = INFO + 32 ' COMPLETE CONVERSION
TO FERINHEIT.
TEMP = INFO
LOW 8 'CHECKING
TEMPURATURE LED 8 OFF
'#####################################################################
#########################
' START OF THE PLC READ PROTOCOL'S FOR V2000
'#####################################################################
#########################
HIGH 9 'READING PLC
LED 9 ON
SEROUT 1,16468,[noparse][[/noparse]INIT,ADD,ENQ] 'INITIATE SEQUENCING
SERIN 0,16468,500,NODATA,[noparse][[/noparse]STR PLC\7] 'RECIEVE DATA FROM
THE PLC
NODATA:
IF PLC(2) <> ACK THEN NORESP
GOSUB CLEAR_PLC_ARRAY 'CLEAR THE
PLC ARRAY
'#####################################################################
#########################
' SEND INFO TO THE PLC TO READ
'#####################################################################
#########################
SEROUT 1,16468,
[noparse][[/noparse]SOH,$30,$31,$30,$31,$30,$34,$30,$31,$30,$30,$30,$34,$30,$31,ETB,$30,$
30]
' 1 2 3 4 5 6 7 8 9 10 11
12 13 14 15 16 17 18
SERIN 0,16468,500,NODATA2,[noparse][[/noparse]STR PLC\7] 'RECIEVE THE REQUESTED INFO.
SEROUT 1,16468,[noparse][[/noparse]ACK]
SEROUT 1,16468,[noparse][[/noparse]EOT]
NODATA2:
LOW 9 'READING PLC
LED 9 OFF
'PLC(5)+PLC(6)+PLC(3)+PLC(4) THIS IS THE ORDER OF BYTES
INFO.HIGHBYTE = PLC(3)
INFO.LOWBYTE = PLC(4)
LOOKDOWN PLC(3),
[noparse][[/noparse]"0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"],INFO
.NIB1
LOOKDOWN PLC(4),
[noparse][[/noparse]"0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"],INFO
.NIB0
INFO.HIGHBYTE = 0
PROM_HEX = INFO * $20
IF PROM_HEX = CHECK THEN WRITE_PLC 'THIS TAKES YOU
AROUND WRITING TO THE SCREEN IF
CHECK = PROM_HEX 'THE SCREEN
IS WRITING THE SAME THING AGAIN.
IF PROM_HEX = $0000 THEN DISPLAY_TEMP
ENDS:
'#####################################################################
#########################
' READING THE EEPROM
'#####################################################################
#########################
HIGH 10 'WRITING TO
LCD LED ON
GOSUB CLEAR_SCREEN 'CLEARING THE
LCD SCREEN
LOW 10
'WRITING TO LCD LED OFF
FOR X = PROM_HEX TO PROM_HEX + 32
CNT = CNT + 1
IF CNT = 17 THEN LINE2
BACKTO_LINE2:
LOW RSTE
SHIFTOUT DQ,CLK,MSBFIRST,[noparse][[/noparse]READE]
SHIFTOUT DQ,CLK,MSBFIRST,[noparse][[/noparse]X\16]
SHIFTIN DQ,CLK,MSBPRE,[noparse][[/noparse]INFO]
HIGH RSTE
IF INFO = 0 THEN AROUND
HIGH 10 'WRITING TO
LCD LED ON
SEROUT 15,16468,[noparse][[/noparse]INFO] 'WRITING INFO
TO THE LCD
LOW 10
'WRITING TO LCD LED OFF
AROUND:
NEXT
HIGH RSTT
'#####################################################################
#########################
' WRITE TEMP TO PLC REGISTER V2001
'#####################################################################
#########################
WRITE_PLC:
HIGH 9 'WRITING TO
PLC LED 9 ON
GOSUB CLEAR_PLC_ARRAY
SEROUT 1,16468,[noparse][[/noparse]INIT,ADD,ENQ] 'INITIATE SEQUENCING
SERIN 0,16468,500,NO,[noparse][[/noparse]STR PLC\7] 'RECIEVE DATA FROM
THE PLC
NO:
'DUH LOOK AT BIT 4 IF IT IS 30 THEN READ IF IT IS 38 THEN WRITE
SEROUT 1,16468,
[noparse][[/noparse]SOH,$30,$31,$38,$31,$30,$34,$30,$32,$30,$30,$30,$34,$30,$31,ETB,$30,$
42]
' 1 2 3 4 5 6 7 8 9 10 11
12 13 14 15 16 17 18
SERIN 0,16468,500,NO2,[noparse][[/noparse]STR PLC\7] 'RECIEVE THE
REQUESTED INFO.
NO2:
IF PLC(0) <> ACK THEN START
GOSUB CONV_TEMP
LRC = $30 ^ $30 'XOR
LRC = LRC ^ TEMP.HIGHBYTE 'XOR
LRC = LRC ^ TEMP.LOWBYTE 'XOR
GOSUB FIND_LRC
'REMEMBER THAT 0 IS $30
SEROUT 1,16468,
[noparse][[/noparse]STX,TEMP.HIGHBYTE,TEMP.LOWBYTE,$30,$30,ETX,LRC.HIGHBYTE,LRC.LOWBYTE]
SERIN 0,16468,500,NO3,[noparse][[/noparse]STR PLC\7] 'RECIEVE THE
REQUESTED INFO.
NO3:
IF PLC(0) <> ACK THEN START
SEROUT 1,16468,[noparse][[/noparse]EOT]
GOTO START
'#####################################################################
#########################
' CONVERT TEMP FOR THE PLC TO UNDERSTAND.
'#####################################################################
#########################
CONV_TEMP:
LOOKUP TEMP.NIB1,
[noparse][[/noparse]$30,$31,$32,$33,$34,$35,$36,$37,$38,$39,$41,$42,$43,$44,$45,$46],TEMP
.HIGHBYTE
LOOKUP TEMP.NIB0,
[noparse][[/noparse]$30,$31,$32,$33,$34,$35,$36,$37,$38,$39,$41,$42,$43,$44,$45,$46],TEMP
.LOWBYTE
RETURN
'#####################################################################
#########################
' CONVERT TO CALCULATE LRC FOR THE PLC.
'#####################################################################
#########################
FIND_LRC:
LOOKUP LRC.NIB1,
[noparse][[/noparse]$30,$31,$32,$33,$34,$35,$36,$37,$38,$39,$40,$41,$42,$43,$44,$45,$46],
LRC.HIGHBYTE
LOOKUP LRC.NIB0,
[noparse][[/noparse]$30,$31,$32,$33,$34,$35,$36,$37,$38,$39,$40,$41,$42,$43,$44,$45,$46],
LRC.LOWBYTE
RETURN
NORESP:
'#####################################################################
#########################
' IF BUTTON 12 IS PUSHED JUMP TO SET_TIME LABEL
'#####################################################################
#########################
IF IN12 = 1 THEN SET_TIME
'#####################################################################
#########################
' DISPLAY ON LCD TEMP AND CHECK PLC CABLE
'#####################################################################
#########################
HIGH 10 'WRITING TO
LCD LED ON
GOSUB DISPLAY_TEMPATURE
SEROUT 15,16468,[noparse][[/noparse]254,192]
SEROUT 15,16468,[noparse][[/noparse]"CHECK PLC CABLE"]
PAUSE 1000
'#####################################################################
#########################
' IF BUTTON 12 IS PUSHED JUMP TO SET_TIME LABEL
'#####################################################################
#########################
IF IN12 = 1 THEN SET_TIME
'#####################################################################
#########################
' DISPLAY THE TIME HERE
'#####################################################################
#########################
GOSUB ReadRTCBurst
SEROUT 15,16468,[noparse][[/noparse]254,192]
SEROUT 15,16468,[noparse][[/noparse]"TIME: ",HEX2 Hour,":", HEX2 Minutes,":", HEX2
Seconds, " "]
PAUSE 1000
'#####################################################################
#########################
' IF BUTTON 12 IS PUSHED JUMP TO SET_TIME LABEL
'#####################################################################
#########################
IF IN12 = 1 THEN SET_TIME
LOW 9 'WRITING TO
PLC LED 9 OFF
LOW 10 'WRITING TO
LCD LED OFF
GOTO START
LINE2:
HIGH 10 'WRITING TO
LCD LED ON
SEROUT 15,16468,[noparse][[/noparse]254,192]
LOW 10
'WRITING TO LCD LED
OFF
GOTO BACKTO_LINE2
'#####################################################################
#########################
' DOWNLOADING FROM VB PROGRAM
'#####################################################################
#########################
DOWNLOADING:
HIGH 11 'CHECK FOR
DOWNLOADING LED ON
HIGH 10 'WRITING TO
LCD LED ON
GOSUB CLEAR_SCREEN
SEROUT 15,16468,[noparse][[/noparse]" DOWNLOAD MODE!"]
SEROUT 16,16468,[noparse][[/noparse]"DOWNLOAD",13]
LOW 10 'WRITING TO
LCD LED OFF
'GATHER ADDRESS,READ,AND TEMP FROM PC
'WRITE ENABLE THE EEPROM
LOW RSTE
SHIFTOUT DQ,CLK,MSBFIRST,[noparse][[/noparse]WREN]
HIGH RSTE
PAUSE 100
'#####################################################################
#########################
' WRITE INFO FROM VB PROGRAM TO EEPROM
'#####################################################################
#########################
LOW RSTE
SHIFTOUT DQ,CLK,MSBFIRST,[noparse][[/noparse]WRTE] 'SET TO WRITE TO
EEPROM
'THIS IS THE ADDRESS OF THE PLC
SHIFTOUT DQ,CLK,MSBFIRST,[noparse][[/noparse]$0FF0\16] 'WRITE TO THIS ADDRESS
PAUSE 10
SERIN 16,16468,[noparse][[/noparse]SHEX4 HEADER]
SHIFTOUT DQ,CLK,MSBFIRST,[noparse][[/noparse]HEADER\16]
HIGH RSTE
HIGH 10 'WRITING TO
LCD LED ON
'#####################################################################
#########################
' DISPLAY STATION NUMBER DIRECTNET PROTOCOL WITH THE GOSUB
'#####################################################################
#########################
GOSUB STAT_NUMBER 'GET INFO TO
WRITE TO LCD SCREEN
LOW 10 'WRITING TO
LCD LED OFF
FOR X = 1 TO 36 'SHOULD BE 36
HEADER = 0
LOW RSTE 'WRITE ENABLE
THE EEPROM
SHIFTOUT DQ,CLK,MSBFIRST,[noparse][[/noparse]WREN]
HIGH RSTE
PAUSE 100
LOW RSTE 'WRITE TO THE
EEPROM
SHIFTOUT DQ,CLK,MSBFIRST,[noparse][[/noparse]WRTE] 'SET TO WRITE TO
EEPROM
'#####################################################################
#########################
' DISPLAY LOCATION OF EEPROM ON LCD SCREEN
'#####################################################################
#########################
SERIN 16,16468,[noparse][[/noparse]SHEX4 HEADER]
GOSUB CLEAR_SCREEN
SEROUT 15,16468,[noparse][[/noparse]"RECIEVING INFO!"]
SEROUT 15,16468,[noparse][[/noparse]254,192]
SEROUT 15,16468,[noparse][[/noparse]"POSITION #",SDEC X]
SHIFTOUT DQ,CLK,MSBFIRST,[noparse][[/noparse]HEADER\16] 'WRITE TO THIS ADDRESS
PAUSE 10
'#####################################################################
#########################
' WRITE TO THE EEPROM THE VB MESSAGE
'#####################################################################
#########################
SERIN 16,16468,[noparse][[/noparse]STR PLC\8]
SHIFTOUT DQ,CLK,MSBFIRST,[noparse][[/noparse]PLC(0),PLC(1),PLC(2),PLC(3),PLC(4),PLC
(5),PLC(6),PLC(7)\8]
SERIN 16,16468,[noparse][[/noparse]STR PLC\8]
SHIFTOUT DQ,CLK,MSBFIRST,[noparse][[/noparse]PLC(0),PLC(1),PLC(2),PLC(3),PLC(4),PLC
(5),PLC(6),PLC(7)\8]
SERIN 16,16468,[noparse][[/noparse]STR PLC\8]
SHIFTOUT DQ,CLK,MSBFIRST,[noparse][[/noparse]PLC(0),PLC(1),PLC(2),PLC(3),PLC(4),PLC
(5),PLC(6),PLC(7)\8]
SERIN 16,16468,[noparse][[/noparse]STR PLC\8]
SHIFTOUT DQ,CLK,MSBFIRST,[noparse][[/noparse]PLC(0),PLC(1),PLC(2),PLC(3),PLC(4),PLC
(5),PLC(6),PLC(7)\8]
HIGH RSTE
PAUSE 100
NEXT
GOSUB READ_PROM
LOW 11 'CHECK FOR
DOWNLOADING LED OFF
GOTO START
CLEAR_PLC_ARRAY:
PLC(0) = 0
PLC(1) = 0
PLC(2) = 0
PLC(3) = 0
PLC(4) = 0
PLC(5) = 0
PLC(6) = 0
PLC(7) = 0
PLC(8) = 0
RETURN
'#####################################################################
#########################
' READING THE EEPROM
'#####################################################################
#########################
READ_PROM:
'READING THE EEPROM
LOW RSTE
SHIFTOUT DQ,CLK,MSBFIRST,[noparse][[/noparse]READE]
PAUSE 10
SHIFTOUT DQ,CLK,MSBFIRST,[noparse][[/noparse]$0FF0\16]
PAUSE 10
SHIFTIN DQ,CLK,MSBPRE,[noparse][[/noparse]ADD\16]
HIGH RSTE
HIGH 10 'WRITING TO
LCD LED ON
GOSUB STAT_NUMBER 'GET
INFO TO WRITE TO LCD SCREEN
PAUSE 2000
LOW 10 'WRITING TO
LCD LED OFF
RETURN
'#####################################################################
#########################
' I BELIEVE THIS IS IF PLC V2000 IS A 0 YOU MAY NEED TO CHECK THIS
OUT TIM
' AND GET RID OF IT
'#####################################################################
#########################
DISPLAY_TEMP:
GOSUB DISPLAY_TEMPATURE
SEROUT 15,16468,[noparse][[/noparse]254,192]
SEROUT 15,16468,[noparse][[/noparse]" CARDINAL"]
'#####################################################################
#########################
' SENDS ME TO WRITE TEMP TO PLC IN V2000
'#####################################################################
#########################
GOTO WRITE_PLC 'YOU WILL BE SENT BACK INTO
THE START LOOP.
'#####################################################################
#########################
' THE FOLLOWING IS USED TO SET THE TIME USEING PINS 14, 13, 12
'#####################################################################
#########################
SET_TIME:
ADJ_TIME = $00 'DO THIS SO YOU SET A
0 AT LEAST IN THE SECONDS REGISTER.
LRC = SecReg
GOSUB WriteRTC
SET_MIN:
GOSUB ReadRTCBurst
ADJ_TIME = MINUTES
GOSUB BCD_DEC
SET_MIN1:
GOSUB CLEAR_SCREEN
SEROUT 15,16468,[noparse][[/noparse]"SET MINUTES: ",DEC ADJ_TIME]
PAUSE 400
IF IN14 = 1 THEN SET_HR
IF IN13 = 0 THEN SET_MIN1
ADJ_TIME = ADJ_TIME + 1
IF NOT ADJ_TIME > 59 THEN MIN_GRT
ADJ_TIME = $00
MIN_GRT:
LRC = MinReg
GOSUB WriteRTC
GOTO SET_MIN1
SET_HR:
GOSUB ReadRTCBurst
ADJ_TIME = HOUR
GOSUB BCD_DEC
SET_HR1:
GOSUB CLEAR_SCREEN
SEROUT 15,16468,[noparse][[/noparse]"SET HOUR: ",DEC ADJ_TIME]
PAUSE 400
IF IN14 = 1 THEN END_TIME
IF IN13 = 0 THEN SET_HR1
ADJ_TIME = ADJ_TIME + $01
IF NOT ADJ_TIME > 12 THEN HR_GRT
ADJ_TIME = $01
HR_GRT:
LRC = HRSReg
GOSUB WriteRTC
GOTO SET_HR1
END_TIME
ADJ_TIME = $80
LRC = CtrlReg
GOSUB WriteRTC
LOW 10
GOTO START
'#####################################################################
#########################
' TO READ THE TIME AND DATE FROM THE DS1302
'#####################################################################
#########################
ReadRTCBurst:
HIGH RST1302
SHIFTOUT DQ, Clk, LSBFIRST, [noparse][[/noparse]%1\1,BrstReg\5,%10\2]
SHIFTIN DQ, Clk, LSBPRE, [noparse][[/noparse]Seconds,Minutes,Hour,DAY,Month,Year,Year]
LOW RST1302
RETURN
'#####################################################################
#########################
' TO WRITE THE TIME AND DATE FROM THE DS1302
'#####################################################################
#########################
WriteRTC:
TIME = ADJ_TIME
TIME_MULT = ADJ_TIME / 10
IF ADJ_TIME < 10 THEN SKIP_ADJ
FOR X = 1 TO TIME_MULT
TIME = TIME + 6
NEXT
SKIP_ADJ:
'Write to DS1302
HIGH RST1302
SHIFTOUT DQ, Clk, LSBFIRST, [noparse][[/noparse]%0\1,CtrlReg\5,%10\2,$10]
LOW RST1302
HIGH RST1302
SHIFTOUT DQ, Clk, LSBFIRST, [noparse][[/noparse]%0\1,LRC\5,%10\2,TIME]
LOW RST1302
RETURN
'#####################################################################
#########################
' USED TO LOOK AT THE SETTING OF TIME IN BCD AND MAKE IT A DECIMAL
SETTING
'#####################################################################
#########################
BCD_DEC:
TIME_MULT = ADJ_TIME / 15 'THIS WORKS INSTEAD OF 10
IF ADJ_TIME < 10 THEN SKIP_ADJ_SUB
FOR X = 1 TO TIME_MULT
ADJ_TIME = ADJ_TIME - 6
NEXT
SKIP_ADJ_SUB:
RETURN
'#####################################################################
#########################
' TO CLEAR LCD AND DISPLAY DIRECTNET PROT STATION #
'#####################################################################
#########################
STAT_NUMBER:
GOSUB CLEAR_SCREEN
SEROUT 15,16468,[noparse][[/noparse]"STATION #:",ISHEX ADD]
RETURN
'#####################################################################
#########################
' THE ROUTINES BELOW ARE TO GET MORE MEMORY OUT OF THE STAMP
' I NEEDED TO COMPILE IT TO BE SMALLER CODE
'#####################################################################
#########################
DISPLAY_TEMPATURE:
GOSUB CLEAR_SCREEN
SEROUT 15,16468,[noparse][[/noparse]"TEMP = ",SDEC TEMP," DEG F"]
RETURN
CLEAR_SCREEN:
SEROUT 15,16468,[noparse][[/noparse]254,1]
RETURN
--- In basicstamps@y..., martin@s... wrote:
> Little confused here, but I'll give you my ideas.
>
> The DS1302 does store the data in BCD, which is simply a subset of
> Hex (hex without A-F).
>
> In your routine, when you are adding to the hour for example, add
1,
> if the digit (hour.lownib) > 9 then add 6 to correct for BCD.
>
> The following code snippit is from the upcoming new version of the
> Stamps In Class Industrial Control text with an added chapter on
real
> time control.
>
> AdjustTime:
> 'BCD Time adjust routine
> IF Cseconds.lownib < $A THEN HighSec
> Cseconds = Cseconds + 6
> HighSec:
> If Cseconds < $60 Then LowMin
> Cseconds = Cseconds - $60
> Cminutes = Cminutes + 1
> LowMin:
> IF Cminutes.lownib < $A THEN HighMin
> Cminutes = Cminutes + 6
> HighMin:
> IF Cminutes < $60 THEN LowHours
> CMinutes = Cminutes - $60
> Chours = Chours + 1
> LowHours:
> IF CHours.lownib < $A THEN HighHours
> Chours = Chours + 6
> HighHours:
> IF Chours < $24 THEN AdjustDone
> Chours = Chours - $24
> AdjustDone:
> RETURN
>
>
> When you send your data to the display, do not send it as
> DEC hour
> Send it as a hex value invalue instead
> HEX Hour
> and it should display fine.
>
> -Martin Hebel
> http://www.selmaware.com/s-plot
> http://www.siu.edu/~imsasa/est
>
Regards,
Steve
I also have an issue similar to this. (good thing I did an archive
search 1st [noparse]:)[/noparse]). I am working with experiment #30 which has source
code for the 1302. I am trying to optimize it. My goal is to reduce
the number of variables needed since I want to use the RAM for other
variables needed for the voice chip. I was successful in doing so.
I eliminated the rawtime word variable which was a huge step. I also
was successful in sharing the hour and minute variables for the
QV306M4 voice chip and the DS1302 with subroutines to convert BCD to
decimal and vice versa.
I was successful in converting from BCD to decimal using only one
variable. Here is an example:
hour var byte
hour = 10*hour.highnib + hour.lownib
That's "the formula" for BCD to decimal conversion on 1 variable.
The tricky problem is decimal to BCD (with 1 variable only).
Here's my way of how it was implemented:
Lookup hours, [noparse][[/noparse]$00,$01,$02,.....,$23], hours
Lookup minutes, [noparse][[/noparse]$00,$01,.....,$59],minutes
I realized this was the wrong way:
hours.highnib = hours/10
hours.lownib = hours//10
I doubt the use of a lookup table is the most optimal way but my goal
is to reduce the amount of variables needed since the voice chip is
being interfaced. Has anyone been able to come up with a formula to
convert decimal to BCD without the use of a 2nd variable?
Thanks,
RP
--- In basicstamps@y..., thosey@w... wrote:
> Does anyone have a sample already wrote to change a decimal number
to
> a bcd number that makes the bcd number equal the decimal. As such,
> 20 decimal is 14 in hex or bcd but the DS1302 is serially input in
> bcd not decimal. So while the lcd and the register holding this
> number is 20 and you need to place the hex number into the ds1302
of
> 20 but your register is actually 14 hex. I cannot use the hex
> version to display to screen since I would be displaying the
> A,B,C,D,E,F of hex and I want to be able to push a button and
display
> the setting of the seconds, minutes, hours on the screen. From 0 to
> 59 less the A,B,C,D,E,F. Now the other problem is that I have
> already used up most of the program storage area and have very
little
> room for this conversion. I have posted the program below, the
> actual part I am having trouble with is near the end.
> Many thanks
> Timothy Hosey
>
>
> '{$STAMP BS2}
>
> '###################################################################
##
> #########################
> 'THIS PROGRAM COPYWRITED 2001 BY TIMOTHY L. HOSEY
> 'LED 8 IS FOR READING TEMP
> 'LED 9 IS FOR READING THE PLC VIA DIRECTNET PROTOCOL
> 'LED 10 IS FOR WRITING TO LCD
> 'LED 11 IS FOR DOWNLOADING FROM VB PROGRAM
> '###################################################################
##
> #########################
>
>
> '###################################################################
##
> #########################
> 'DEFINE OUTPUT PINS USED FOR SERIAL SPI INTERFACE
> '###################################################################
##
> #########################
>
> DQ CON 4 'SPI SERIAL DATA PIN
> CLK CON 3 'SPI SERIAL CLOCK PIN
> RSTT CON 2 'SPI SERIAL RESET PIN FOR
> TEMP CHIP DS-1620
> RSTE CON 5 'SPI SERIAL RESET PIN FOR EEPROM CHIP
> RST1302 CON 6 'SPI SERIAL RESET PIN FOR
TIME CHIP
> DS-1302
>
> '###################################################################
##
> #########################
> 'DEFINE PINS USED FOR BUTTONS
> '###################################################################
##
> #########################
>
> BUT1 CON 12
> BUT2 CON 13
> BUT3 CON 14
>
> '###################################################################
##
> #########################
> ' DEFINE VARIABLES
> '###################################################################
##
> #########################
>
> X VAR WORD
> INFO VAR WORD ' VARIABLE TO HOLD 9-
> bit INFO.
> PROM_HEX VAR WORD
> CHECK VAR WORD
> HEADER VAR WORD
> CMD VAR BYTE
> CNT VAR BYTE
> TEMP VAR WORD 'TEMPURATURE IS HELD
HERE
> PLC VAR BYTE(8)
> LRC VAR WORD
> ADD VAR WORD 'ADDRESS OF DIRECTNET
> PROTOCOL MASTER.
>
> '###################################################################
##
> #########################
> 'START DECLARING ALLIASES FOR WORD VARIABLES
> '###################################################################
##
> #########################
>
> SECONDS VAR TEMP.LOWBYTE
> MINUTES VAR TEMP.HIGHBYTE
> HOUR VAR LRC.LOWBYTE
> DAY VAR LRC.HIGHBYTE
> MONTH VAR INFO.LOWBYTE
> YEAR VAR INFO.HIGHBYTE
>
> '###################################################################
##
> #########################
> 'START DECLARING CONSTANTS FOR PLC PROGRAM
> '###################################################################
##
> #########################
>
> ENQ CON $05
> ACK CON $06
> NAK CON $15
> SOH CON $01
> ETB CON $17
> STX CON $02
> ETX CON $03
> EOT CON $04
> INIT CON $4E
>
> '###################################################################
##
> #########################
> 'START DECLARING CONSTANTS FOR EEPROM
> '###################################################################
##
> #########################
>
> READE CON 3 'DATA FOR SPI EEPROM
> WRTE CON 2 'DATA FOR SPI EEPROM
> WREN CON 6 'DATA FOR SPI EEPROM
>
> '###################################################################
##
> #########################
> 'START DECLARING CONSTANTS FOR DS1302
> '###################################################################
##
> #########################
>
> SecReg CON %00000
> MinReg CON %00001
> HrsReg CON %00010
> DateReg CON %00011
> MonReg CON %00100
> YrReg CON %00110
> CtrlReg CON %00111
> BrstReg CON %11111
>
> '###################################################################
##
> #########################
> 'MAKE PINS INPUTS FOR BUTTONS
> '###################################################################
##
> #########################
>
> INPUT BUT1
> INPUT BUT2
> INPUT BUT3
>
> '###################################################################
##
> #########################
> 'WRITE TO THE LCD SCREEN AT START UP
> '###################################################################
##
> #########################
>
> HIGH RSTE
> HIGH 10 'WRITING TO
> LCD LED ON
> PAUSE 1000
> GOSUB CLEAR_SCREEN
> SEROUT 15,16468,[noparse][[/noparse]"AUTOMATED PANELS"]
> SEROUT 15,16468,[noparse][[/noparse]254,192]
> SEROUT 15,16468,[noparse][[/noparse]"2001 TIM HOSEY"]
> LOW 10 'WRITING TO
> LCD LED OFF
> PAUSE 3000 'WAIT 3
> SECONDS
>
> '###################################################################
##
> #########################
> ' ACTIVATE THE 1620 AND SET FOR CONTINOUS CONVERSION SET THE HIGH
AND
> LOW TEMPERATURES.
> '###################################################################
##
> #########################
>
> HIGH RSTT
> SHIFTOUT DQ,CLK,LSBFIRST,[noparse][[/noparse]$0C,$0A]
> SHIFTOUT DQ,CLK,LSBFIRST,[noparse][[/noparse]$00\9]
> LOW RSTT
> PAUSE 10
>
>
> HIGH RSTT
> SHIFTOUT DQ,CLK,LSBFIRST,[noparse][[/noparse]$EE]
> LOW RSTT
> PAUSE 10
>
> '###################################################################
##
> #########################
> ' INITIAL ADDRESS FOR DIRECTNET PROTOCOL
> '###################################################################
##
> #########################
>
> ADD = $21
> 'THIS IS FOR ADDRESS
> 1
> GOSUB READ_PROM 'USED FOR DIRECTNET
PROTOCOL
>
> '###################################################################
##
> #########################
> ' BEGINING OF PROGRAM LOOP
> '###################################################################
##
> #########################
>
> START:
>
> '###################################################################
##
> #########################
> ' CLEAR CONTENTS OF REGISTERS
> '###################################################################
##
> #########################
>
> GOSUB CLEAR_PLC_ARRAY
> INFO = 0
> TEMP = 0
> CMD = 0
> CNT = 0
>
> '###################################################################
##
> #########################
> ' IF BUTTON 12 IS PUSHED JUMP TO SET_TIME LABEL
> '###################################################################
##
> #########################
>
> IF IN12 = 1 THEN SET_TIME
>
> '###################################################################
##
> #########################
> ' CHECK TO SEE IF VB PROGRAM IS DOWNLOADING
> '###################################################################
##
> #########################
>
> SERIN 16,16468,100,NOWAY,[noparse][[/noparse]STR PLC\2]
>
> NOWAY:
>
> IF PLC(0) = "O" AND PLC(1) = "K" THEN DOWNLOADING
>
> '###################################################################
##
> #########################
> ' READING THE TEMPURATURE
> '###################################################################
##
> #########################
>
> HIGH 8 'CHECKING
> TEMPURATURE LED 8 ON
>
> HIGH RSTT
> SHIFTOUT DQ,CLK,LSBFIRST,[noparse][[/noparse]$AA] ' REQUEST TO READ
> TEMP
> shiftin DQ,CLK,LSBPRE,[noparse][[/noparse]INFO\9] ' GET TEMP READING
> LOW RSTT
> INFO = INFO/2 ' SCALE
READING TO
> WHOLE DEG CELS.
> INFO = (INFO */ $01CC) ' MULTIPLY BY 1.8
> INFO = INFO + 32 ' COMPLETE CONVERSION
> TO FERINHEIT.
> TEMP = INFO
> LOW 8 'CHECKING
> TEMPURATURE LED 8 OFF
>
> '###################################################################
##
> #########################
> ' START OF THE PLC READ PROTOCOL'S FOR V2000
> '###################################################################
##
> #########################
>
> HIGH 9
'READING PLC
> LED 9 ON
> SEROUT 1,16468,[noparse][[/noparse]INIT,ADD,ENQ] 'INITIATE
SEQUENCING
> SERIN 0,16468,500,NODATA,[noparse][[/noparse]STR PLC\7] 'RECIEVE DATA
FROM
> THE PLC
>
> NODATA:
>
> IF PLC(2) <> ACK THEN NORESP
>
> GOSUB CLEAR_PLC_ARRAY
'CLEAR THE
> PLC ARRAY
>
> '###################################################################
##
> #########################
> ' SEND INFO TO THE PLC TO READ
> '###################################################################
##
> #########################
>
> SEROUT 1,16468,
>
[noparse][[/noparse]SOH,$30,$31,$30,$31,$30,$34,$30,$31,$30,$30,$30,$34,$30,$31,ETB,$30,$
> 30]
> ' 1 2 3 4 5 6 7 8 9 10 11
> 12 13 14 15 16 17 18
>
> SERIN 0,16468,500,NODATA2,[noparse][[/noparse]STR PLC\7] 'RECIEVE THE
REQUESTED INFO.
>
> SEROUT 1,16468,[noparse][[/noparse]ACK]
> SEROUT 1,16468,[noparse][[/noparse]EOT]
>
> NODATA2:
> LOW 9 'READING PLC
> LED 9 OFF
>
> 'PLC(5)+PLC(6)+PLC(3)+PLC(4) THIS IS THE ORDER OF BYTES
>
> INFO.HIGHBYTE = PLC(3)
> INFO.LOWBYTE = PLC(4)
>
> LOOKDOWN PLC(3),
>
[noparse][[/noparse]"0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"],INFO
> .NIB1
> LOOKDOWN PLC(4),
>
[noparse][[/noparse]"0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"],INFO
> .NIB0
> INFO.HIGHBYTE = 0
>
> PROM_HEX = INFO * $20
> IF PROM_HEX = CHECK THEN WRITE_PLC 'THIS TAKES YOU
> AROUND WRITING TO THE SCREEN IF
> CHECK = PROM_HEX 'THE SCREEN
> IS WRITING THE SAME THING AGAIN.
> IF PROM_HEX = $0000 THEN DISPLAY_TEMP
>
> ENDS:
>
> '###################################################################
##
> #########################
> ' READING THE EEPROM
> '###################################################################
##
> #########################
>
> HIGH 10
'WRITING TO
> LCD LED ON
> GOSUB CLEAR_SCREEN 'CLEARING THE
> LCD SCREEN
> LOW 10
> 'WRITING TO LCD LED OFF
> FOR X = PROM_HEX TO PROM_HEX + 32
> CNT = CNT + 1
> IF CNT = 17 THEN LINE2
>
> BACKTO_LINE2:
>
> LOW RSTE
> SHIFTOUT DQ,CLK,MSBFIRST,[noparse][[/noparse]READE]
> SHIFTOUT DQ,CLK,MSBFIRST,[noparse][[/noparse]X\16]
> SHIFTIN DQ,CLK,MSBPRE,[noparse][[/noparse]INFO]
> HIGH RSTE
> IF INFO = 0 THEN AROUND
> HIGH 10
'WRITING TO
> LCD LED ON
> SEROUT 15,16468,[noparse][[/noparse]INFO] 'WRITING INFO
> TO THE LCD
> LOW 10
> 'WRITING TO LCD LED OFF
>
> AROUND:
>
> NEXT
> HIGH RSTT
>
> '###################################################################
##
> #########################
> ' WRITE TEMP TO PLC REGISTER V2001
> '###################################################################
##
> #########################
>
> WRITE_PLC:
>
> HIGH 9
'WRITING TO
> PLC LED 9 ON
>
> GOSUB CLEAR_PLC_ARRAY
>
> SEROUT 1,16468,[noparse][[/noparse]INIT,ADD,ENQ] 'INITIATE
SEQUENCING
> SERIN 0,16468,500,NO,[noparse][[/noparse]STR PLC\7] 'RECIEVE DATA FROM
> THE PLC
>
> NO:
>
> 'DUH LOOK AT BIT 4 IF IT IS 30 THEN READ IF IT IS 38 THEN WRITE
> SEROUT 1,16468,
>
[noparse][[/noparse]SOH,$30,$31,$38,$31,$30,$34,$30,$32,$30,$30,$30,$34,$30,$31,ETB,$30,$
> 42]
> ' 1 2 3 4 5 6 7 8 9 10 11
> 12 13 14 15 16 17 18
> SERIN 0,16468,500,NO2,[noparse][[/noparse]STR PLC\7] 'RECIEVE THE
> REQUESTED INFO.
>
> NO2:
>
> IF PLC(0) <> ACK THEN START
>
> GOSUB CONV_TEMP
>
> LRC = $30 ^ $30 'XOR
> LRC = LRC ^ TEMP.HIGHBYTE 'XOR
> LRC = LRC ^ TEMP.LOWBYTE 'XOR
> GOSUB FIND_LRC
>
>
> 'REMEMBER THAT 0 IS $30
> SEROUT 1,16468,
>
[noparse][[/noparse]STX,TEMP.HIGHBYTE,TEMP.LOWBYTE,$30,$30,ETX,LRC.HIGHBYTE,LRC.LOWBYTE]
> SERIN 0,16468,500,NO3,[noparse][[/noparse]STR PLC\7] 'RECIEVE THE
> REQUESTED INFO.
>
> NO3:
>
> IF PLC(0) <> ACK THEN START
> SEROUT 1,16468,[noparse][[/noparse]EOT]
>
> GOTO START
>
> '###################################################################
##
> #########################
> ' CONVERT TEMP FOR THE PLC TO UNDERSTAND.
> '###################################################################
##
> #########################
>
> CONV_TEMP:
>
> LOOKUP TEMP.NIB1,
>
[noparse][[/noparse]$30,$31,$32,$33,$34,$35,$36,$37,$38,$39,$41,$42,$43,$44,$45,$46],TEMP
> .HIGHBYTE
> LOOKUP TEMP.NIB0,
>
[noparse][[/noparse]$30,$31,$32,$33,$34,$35,$36,$37,$38,$39,$41,$42,$43,$44,$45,$46],TEMP
> .LOWBYTE
>
> RETURN
>
> '###################################################################
##
> #########################
> ' CONVERT TO CALCULATE LRC FOR THE PLC.
> '###################################################################
##
> #########################
>
> FIND_LRC:
>
> LOOKUP LRC.NIB1,
>
[noparse][[/noparse]$30,$31,$32,$33,$34,$35,$36,$37,$38,$39,$40,$41,$42,$43,$44,$45,$46],
> LRC.HIGHBYTE
> LOOKUP LRC.NIB0,
>
[noparse][[/noparse]$30,$31,$32,$33,$34,$35,$36,$37,$38,$39,$40,$41,$42,$43,$44,$45,$46],
> LRC.LOWBYTE
>
> RETURN
>
>
> NORESP:
>
> '###################################################################
##
> #########################
> ' DISPLAY ON LCD TEMP AND CHECK PLC CABLE
> '###################################################################
##
> #########################
>
> HIGH 10
'WRITING TO
> LCD LED ON
>
> GOSUB DISPLAY_TEMPATURE
>
> SEROUT 15,16468,[noparse][[/noparse]254,192]
> SEROUT 15,16468,[noparse][[/noparse]"CHECK PLC CABLE"]
>
> PAUSE 1000
>
> '###################################################################
##
> #########################
> ' IF BUTTON 12 IS PUSHED JUMP TO SET_TIME LABEL
> '###################################################################
##
> #########################
>
> IF IN12 = 1 THEN SET_TIME
> '###################################################################
##
> #########################
> ' DISPLAY THE TIME HERE
> '###################################################################
##
> #########################
>
> GOSUB ReadRTCBurst
> SEROUT 15,16468,[noparse][[/noparse]254,192]
> SEROUT 15,16468,[noparse][[/noparse]"TIME: "]
> SEROUT 15,16468,[noparse][[/noparse]DEC1 Hour.HIGHNIB, DEC1 Hour.LOWNIB,":", DEC1
> Minutes.HIGHNIB]
> SEROUT 15,16468,[noparse][[/noparse]DEC1 Minutes.LOWNIB,":", DEC1 Seconds.HIGHNIB,
> DEC1 Seconds.LOWNIB," "]
>
>
> DEBUG SDEC Minutes.HIGHNIB,SDEC Minutes.LOWNIB,CR
>
>
> PAUSE 1000
> LOW 9 'WRITING TO
> PLC LED 9 OFF
> LOW 10 'WRITING TO
> LCD LED OFF
>
> GOTO START
>
> LINE2:
>
> HIGH 10
'WRITING TO
> LCD LED ON
> SEROUT 15,16468,[noparse][[/noparse]254,192]
> LOW 10
> 'WRITING TO LCD LED
> OFF
> GOTO BACKTO_LINE2
>
> '###################################################################
##
> #########################
> ' DOWNLOADING FROM VB PROGRAM
> '###################################################################
##
> #########################
>
> DOWNLOADING:
>
> HIGH 11
'CHECK FOR
> DOWNLOADING LED ON
> HIGH 10
'WRITING TO
> LCD LED ON
> GOSUB CLEAR_SCREEN
> SEROUT 15,16468,[noparse][[/noparse]" DOWNLOAD MODE!"]
> SEROUT 16,16468,[noparse][[/noparse]"DOWNLOAD",13]
> LOW 10 'WRITING TO
> LCD LED OFF
> 'GATHER ADDRESS,READ,AND TEMP FROM PC
> 'WRITE ENABLE THE EEPROM
> LOW RSTE
> SHIFTOUT DQ,CLK,MSBFIRST,[noparse][[/noparse]WREN]
> HIGH RSTE
>
> PAUSE 100
>
> '###################################################################
##
> #########################
> ' WRITE INFO FROM VB PROGRAM TO EEPROM
> '###################################################################
##
> #########################
>
> LOW RSTE
> SHIFTOUT DQ,CLK,MSBFIRST,[noparse][[/noparse]WRTE] 'SET TO WRITE TO
> EEPROM
> 'THIS IS THE ADDRESS OF THE PLC
> SHIFTOUT DQ,CLK,MSBFIRST,[noparse][[/noparse]$0FF0\16] 'WRITE TO THIS ADDRESS
> PAUSE 10
> SERIN 16,16468,[noparse][[/noparse]SHEX4 HEADER]
> SHIFTOUT DQ,CLK,MSBFIRST,[noparse][[/noparse]HEADER\16]
> HIGH RSTE
> HIGH 10
'WRITING TO
> LCD LED ON
>
> '###################################################################
##
> #########################
> ' DISPLAY STATION NUMBER DIRECTNET PROTOCOL WITH THE GOSUB
> '###################################################################
##
> #########################
>
> GOSUB STAT_NUMBER 'GET INFO TO
> WRITE TO LCD SCREEN
>
> LOW 10 'WRITING TO
> LCD LED OFF
>
> FOR X = 1 TO 36 'SHOULD BE 36
> HEADER = 0
> LOW RSTE 'WRITE ENABLE
> THE EEPROM
> SHIFTOUT DQ,CLK,MSBFIRST,[noparse][[/noparse]WREN]
> HIGH RSTE
> PAUSE 100
> LOW RSTE 'WRITE TO THE
> EEPROM
> SHIFTOUT DQ,CLK,MSBFIRST,[noparse][[/noparse]WRTE] 'SET TO WRITE TO
> EEPROM
>
> '###################################################################
##
> #########################
> ' DISPLAY LOCATION OF EEPROM ON LCD SCREEN
> '###################################################################
##
> #########################
>
> SERIN 16,16468,[noparse][[/noparse]SHEX4 HEADER]
> GOSUB CLEAR_SCREEN
> SEROUT 15,16468,[noparse][[/noparse]"RECIEVING INFO!"]
> SEROUT 15,16468,[noparse][[/noparse]254,192]
> SEROUT 15,16468,[noparse][[/noparse]"POSITION #",SDEC X]
>
> SHIFTOUT DQ,CLK,MSBFIRST,[noparse][[/noparse]HEADER\16] 'WRITE TO THIS ADDRESS
> PAUSE 10
>
> '###################################################################
##
> #########################
> ' WRITE TO THE EEPROM THE VB MESSAGE
> '###################################################################
##
> #########################
>
> SERIN 16,16468,[noparse][[/noparse]STR PLC\8]
> SHIFTOUT DQ,CLK,MSBFIRST,[noparse][[/noparse]PLC(0),PLC(1),PLC(2),PLC(3),PLC(4),PLC
> (5),PLC(6),PLC(7)\8]
> SERIN 16,16468,[noparse][[/noparse]STR PLC\8]
> SHIFTOUT DQ,CLK,MSBFIRST,[noparse][[/noparse]PLC(0),PLC(1),PLC(2),PLC(3),PLC(4),PLC
> (5),PLC(6),PLC(7)\8]
> SERIN 16,16468,[noparse][[/noparse]STR PLC\8]
> SHIFTOUT DQ,CLK,MSBFIRST,[noparse][[/noparse]PLC(0),PLC(1),PLC(2),PLC(3),PLC(4),PLC
> (5),PLC(6),PLC(7)\8]
> SERIN 16,16468,[noparse][[/noparse]STR PLC\8]
> SHIFTOUT DQ,CLK,MSBFIRST,[noparse][[/noparse]PLC(0),PLC(1),PLC(2),PLC(3),PLC(4),PLC
> (5),PLC(6),PLC(7)\8]
>
> HIGH RSTE
> PAUSE 100
> NEXT
>
> GOSUB READ_PROM
>
> LOW 11 'CHECK FOR
> DOWNLOADING LED OFF
>
> GOTO START
>
> CLEAR_PLC_ARRAY:
>
> PLC(0) = 0
> PLC(1) = 0
> PLC(2) = 0
> PLC(3) = 0
> PLC(4) = 0
> PLC(5) = 0
> PLC(6) = 0
> PLC(7) = 0
> PLC(8) = 0
>
> RETURN
>
> '###################################################################
##
> #########################
> ' READING THE EEPROM
> '###################################################################
##
> #########################
>
> READ_PROM:
>
> 'READING THE EEPROM
> LOW RSTE
> SHIFTOUT DQ,CLK,MSBFIRST,[noparse][[/noparse]READE]
> PAUSE 10
> SHIFTOUT DQ,CLK,MSBFIRST,[noparse][[/noparse]$0FF0\16]
> PAUSE 10
> SHIFTIN DQ,CLK,MSBPRE,[noparse][[/noparse]ADD\16]
> HIGH RSTE
> HIGH 10
'WRITING TO
> LCD LED ON
>
> GOSUB STAT_NUMBER 'GET
> INFO TO WRITE TO LCD SCREEN
>
> PAUSE 2000
> LOW 10 'WRITING TO
> LCD LED OFF
>
> RETURN
>
> '###################################################################
##
> #########################
> ' I BELIEVE THIS IS IF PLC V2000 IS A 0 YOU MAY NEED TO CHECK THIS
> OUT TIM
> ' AND GET RID OF IT
> '###################################################################
##
> #########################
>
> DISPLAY_TEMP:
>
> GOSUB DISPLAY_TEMPATURE
>
> SEROUT 15,16468,[noparse][[/noparse]254,192]
> SEROUT 15,16468,[noparse][[/noparse]" CARDINAL"]
>
> '###################################################################
##
> #########################
> ' SENDS ME TO WRITE TEMP TO PLC IN V2000
> '###################################################################
##
> #########################
>
> GOTO WRITE_PLC 'YOU WILL BE SENT
BACK INTO
> THE START LOOP.
>
> '###################################################################
##
> #########################
> ' THE FOLLOWING IS USED TO SET THE TIME USEING PINS 14, 13, 12
> '###################################################################
##
> #########################
>
> SET_TIME:
>
> TEMP = $00 'DO THIS SO YOU SET A
0 AT
> LEAST IN THE SECONDS REGISTER.
> LRC = SecReg
>
> GOSUB WriteRTC
>
> SET_SEC:
>
> HIGH 10
> GOSUB CLEAR_SCREEN
> SEROUT 15,16468,[noparse][[/noparse]"SET SECONDS: ",DEC TEMP]
> PAUSE 400
> IF IN14 = 1 THEN SET_MIN
> IF IN13 = 0 THEN SET_SEC
> TEMP = TEMP + 1
> IF NOT TEMP > 59 THEN SEC_GRT
> TEMP = $00
>
> SEC_GRT:
>
> LRC = SecReg
> GOSUB WriteRTC
>
> GOTO SET_SEC
>
> SET_MIN:
>
> TEMP = $00 'DO THIS SO YOU SET A
0 AT
> LEAST IN THE MINUTES REGISTER.
> LRC = MinReg
>
> GOSUB WriteRTC
>
> SET_MIN1:
>
> GOSUB CLEAR_SCREEN
> SEROUT 15,16468,[noparse][[/noparse]"SET MINUTES: ",DEC TEMP]
> PAUSE 400
> IF IN14 = 1 THEN SET_HR
> IF IN13 = 0 THEN SET_MIN1
> TEMP = TEMP + 1
>
> IF NOT TEMP > 59 THEN MIN_GRT
> TEMP = $00
>
> MIN_GRT:
>
> LRC = MinReg
> GOSUB WriteRTC
>
> GOTO SET_MIN1
>
> SET_HR:
>
> TEMP = $01 'DO THIS SO YOU SET A
1 AT
> LEAST IN THE HOURS REGISTER.
> LRC = HRSReg
>
> GOSUB WriteRTC
>
> SET_HR1:
>
> GOSUB CLEAR_SCREEN
> SEROUT 15,16468,[noparse][[/noparse]"SET HOUR: ",DEC TEMP]
> PAUSE 400
> IF IN14 = 1 THEN END_TIME
> IF IN13 = 0 THEN SET_HR1
> TEMP = TEMP + $1
> IF NOT TEMP > 12 THEN HR_GRT
> TEMP = $01
>
> HR_GRT:
>
> LRC = HRSReg
>
> GOSUB WriteRTC
>
> GOTO SET_HR1
>
> END_TIME
>
> Temp = $80
> LRC = CtrlReg
> GOSUB WriteRTC
>
> LOW 10
>
> GOTO START
>
> '###################################################################
##
> #########################
> ' TO READ THE TIME AND DATE FROM THE DS1302
> '###################################################################
##
> #########################
>
> ReadRTCBurst:
>
> HIGH RST1302
> SHIFTOUT DQ, Clk, LSBFIRST, [noparse][[/noparse]%1\1,BrstReg\5,%10\2]
> SHIFTIN DQ, Clk, LSBPRE,
[noparse][[/noparse]Seconds,Minutes,Hour,DAY,Month,Year,Year]
> LOW RST1302
>
> RETURN
>
> '###################################################################
##
> #########################
> ' TO WRITE THE TIME AND DATE FROM THE DS1302
> '###################################################################
##
> #########################
>
> WriteRTC:
>
> 'Write to DS1302
> HIGH RST1302
> SHIFTOUT DQ, Clk, LSBFIRST, [noparse][[/noparse]%0\1,CtrlReg\5,%10\2,$10]
> LOW RST1302
> HIGH RST1302
> SHIFTOUT DQ, Clk, LSBFIRST, [noparse][[/noparse]%0\1,LRC\5,%10\2,Temp]
> LOW RST1302
>
> RETURN
>
> '###################################################################
##
> #########################
> ' TO CLEAR LCD AND DISPLAY DIRECTNET PROT STATION #
> '###################################################################
##
> #########################
>
> STAT_NUMBER:
>
> GOSUB CLEAR_SCREEN
> SEROUT 15,16468,[noparse][[/noparse]"STATION #:",ISHEX ADD]
>
> RETURN
>
> '###################################################################
##
> #########################
> ' THE ROUTINES BELOW ARE TO GET MORE MEMORY OUT OF THE STAMP
> ' I NEEDED TO COMPILE IT TO BE SMALLER CODE
> '###################################################################
##
> #########################
>
>
> DISPLAY_TEMPATURE:
>
> GOSUB CLEAR_SCREEN
> SEROUT 15,16468,[noparse][[/noparse]"TEMP = ",SDEC TEMP," DEG F"]
>
> RETURN
>
> CLEAR_SCREEN:
>
> SEROUT 15,16468,[noparse][[/noparse]254,1]
>
> RETURN
Actually, I am using a formula that Jon came up with.
It is
hours = ((hours/10) << 4) + (hours//10)
Thanks anyway.
RP
--- In basicstamps@y..., "S Parkis" <parkiss@e...> wrote:
> How about: hours = ( hours >> 4 * 10 ) + ( hours // 16 )
>
> Regards,
>
> Steve