Shop OBEX P1 Docs P2 Docs Learn Events
DS1302 decimal to bcd conversion — Parallax Forums

DS1302 decimal to bcd conversion

ArchiverArchiver Posts: 46,084
edited 2001-11-16 23:10 in General Discussion
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

Comments

  • ArchiverArchiver Posts: 46,084
    edited 2001-10-21 01:50
    I'm not sure how the BS2 handles binary numbers but this is what I have used
    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/
  • ArchiverArchiver Posts: 46,084
    edited 2001-10-21 04:19
    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

    --- 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
  • ArchiverArchiver Posts: 46,084
    edited 2001-10-21 07:28
    Martin, Thanks for the info.

    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
    >
  • ArchiverArchiver Posts: 46,084
    edited 2001-11-16 05:54
    How about: hours = ( hours >> 4 * 10 ) + ( hours // 16 )

    Regards,

    Steve
  • ArchiverArchiver Posts: 46,084
    edited 2001-11-16 20:40
    Hi guys,
    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
  • ArchiverArchiver Posts: 46,084
    edited 2001-11-16 23:10
    Hi Steve,
    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
Sign In or Register to comment.