Code:
INCLUDE "DT_INTS-14.bas" ; Base Interrupt System
INCLUDE "ReEnterPBP.bas" ; Include if using PBP interrupts
Include "modedefs.bas"
DEFINE LOADER_USED 1 ' Using boot-loader for initial prototype
DEFINE DEBUG_REG PORTB
DEFINE DEBUG_BIT 0
DEFINE DEBUG_BAUD 19200
define DEBUG_MODE 0 ' 1 = inverted, 0 = true
Enter CON 11 'Enter key on remote
Out VAR BYTE(4) '7 seg display
TChange VAR BYTE(4) 'Time change digits
Enable1 VAR BYTE(4) 'Power goes on for memory 1
Disable1 VAR BYTE(4) 'Power goes off for memory 1
Enable2 VAR BYTE(4) 'Power goes on for memory 2
Disable2 VAR BYTE(4) 'Power goes off for memory 2
TimeSet VAR BIT '1 = Enabled 0= Disabled
Second var byte
Minute2 VAR BYTE ' Ones column for minutes
Minute1 VAR BYTE ' Tens column for minutes
Hour2 VAR BYTE ' Ones column for hours
Hour1 VAR BYTE ' Tens column for hours
Counts VAR BYTE ' Counts for timer
Loop VAR BYTE ' Loop counter
Index VAR BYTE ' Index counter
IR_PULSE VAR BYTE(13) ' 13-bytes. 8 data ; 5 address
PULSE_IN VAR WORD ' Raw pulsin value
DBYTE VAR BYTE ' Holds 8-bit data byte
ABYTE VAR BYTE ' Holds 5-bit hardware address
Second = 0
Minute1 = 0
Minute2 = 0
Hour1 = 1
Hour2 = 2
Loop = 0
ASM
INT_LIST macro ; IntSource, Label, Type, ResetFlag?
INT_Handler TMR1_INT, ReloadTMR1, ASM, no ; MUST be first
INT_Handler TMR1_INT, _T1handler, PBP, yes
endm
INT_CREATE ; Creates the interrupt processor
ENDASM
;--- Change these to match the desired interrupt frequency -------------------
;--- See http://DarrelTaylor.com/DT_INTS-14/TimerTemplate.html for more Info.
@Freq = 10 ; Frequency of Interrupts in Hz
@Prescaler = 2 ; Timers Prescaler setting
T1CON = $10 ; $30 = Prescaler 1:8, TMR1 OFF
; $00=1:1, $10=1:2, $20=1:4, $30=1:8 -- Must match @Prescaler value
@ INT_ENABLE TMR1_INT ; enable Timer 1 interrupts
GOSUB StartTimer ; Start the Timer
Main:
@ INT_ENABLE TMR1_INT
PULSIN PORTB.7,0,PULSE_IN '// Read-in start pulse
IF (PULSE_IN < 200) OR (PULSE_IN = 0) THEN '// Less than Start pulse, then keep looking
GOTO Main '// so clear outputs & return.
ENDIF
@ INT_DISABLE TMR1_INT
GOTO Verify
'--Main 2 used after values have been entered without Enter press to get around INT
Main2:
PULSIN PORTB.7,0,PULSE_IN '// Read-in start pulse
IF (PULSE_IN < 200) OR (PULSE_IN = 0) THEN '// Less than Start pulse, then keep looking
GOTO Main2 '// so clear outputs & return.
ENDIF
Verify: '// Read, Decode, then verify data
FOR Index = 0 TO 12 '// Setup to read-in 13 pulses
PULSIN PORTB.7,0,IR_PULSE[Index] '// Read 13 low-going pulses on RA.7
NEXT Index '// Loop x times
DBYTE = $FF '// Start with all 1's and find each 0
FOR Index = 0 TO 7 '// Get 8 "data" bits
IF IR_PULSE[Index] < 100 THEN DBYTE.0[Index]=0 '// Less than 1mS = 0
NEXT Index
Result:
Loop = Loop + 1
Out[Loop] = DBYTE + 1
If Out[Loop] = 10 then
Out[Loop] = 0
EndIF
DEBUG "D", Out[1],out[2],out[3],out[4]
PAUSE 500
IF Loop = 5 Then
Loop = 0
EndIF
If TimeSet = 1 then 'Time change
IF OUt[5] = 12 THEN 'If enter pressed, with valid time entry
IF (Out[1] = 2 AND OUt[2]<=4) AND (Out[3]<=5) And (out[4] <=9) Then
Second = 0
HOur1 =Out[1] 'Set new time
Hour2 =Out[2]
Minute1 =Out[3]
Minute2 =Out[4] 'Clear time entry bit.
Out[1] = 20
Out[2] = 20
Out[3] = 20
Out[4] = 20
Out[5] = 20
TimeSet = 0
GOTO Main
ENDIF
IF (Out[1] <= 2 AND OUt[2]<=4) AND (Out[3]<=5) And (out[4] <=9) Then
Second = 0
HOur1 =Out[1] 'Set new time
Hour2 =Out[2]
Minute1 =Out[3]
Minute2 =Out[4] 'Clear time entry bit.
Out[1] = 20
Out[2] = 20
Out[3] = 20
Out[4] = 20
Out[5] = 20
TimeSet = 0
GOTO Main
EndIF
GOTO Main
ENDIF
ENDIF
IF OUT[1]=1 AND Out[2]=7 and OUt[3]=7 and Out[4]=12 THEN 'TimeSet entry correct (177 + enter)?
Out[1] = 20
Out[2] = 20
Out[3] = 20
Out[4] = 20
Out[5] = 20
TimeSet = 1 'If they enter the correct code, then unlock features
GOTO Main
ENDIF
GOTO Main2
T1handler:
Counts = Counts + 1 ; Increase the 1/10th sec count
IF counts = 10 then
Counts = 0
Second = Second + 1 'Calculate time and change values
If Second = 60 then
Minute2 = Minute2 +1
Second = 0
IF Minute2 = 10 THEN
Minute1 = Minute1 + 1
Minute2 = 0
IF Minute1 = 6 then
Hour2 = Hour2 + 1
Minute1 = 0
IF Hour2 = 10 THEN
Hour1 = Hour1 + 1
Hour2 = 0
endif
endif
endif
endif
IF Hour1 = 2 AND HOUR2 = 4 THEN 'Roll clock over from 23 to 0
Hour1 = 0
Hour2 = 0
endif
If Hour1 = 0 then 'If hour 1 is 0 then do not display it
Hour1 = 20 'SLED-C4 will not display anything if the
Endif 'value is above 10
DEBUG "D", Hour1,Hour2,Minute1,Minute2 ' Display time
DEBUG "P",12,"~" ' Display Colon
ELSE
@ INT_RETURN
ENDIF
@ INT_RETURN
;---[TMR1 reload - interrupt handler]-----------------------------------------
ASM ; Calculate Timer Reload Constant
ReloadInst = 8 ; # of Intructions used to reload timer
if ((Prescaler == 1)||(Prescaler == 2)||(Prescaler == 4)||(Prescaler == 8))
MaxCount = 65536 + (ReloadInst / Prescaler)
TimerReload = MaxCount - (OSC*1000000/4/Prescaler/Freq)
if ((TimerReload < 0) || (TimerReload > (65535-ReloadInst)))
error Invalid Timer Values - check "OSC", "Freq" and "Prescaler"
endif
else
error Invalid Prescaler
endif
ENDASM
@Timer1 = TMR1L ; map timer registers to a word variable
Timer1 VAR WORD EXT
TimerReload CON EXT ; Get the External Constant
TMR1ON VAR T1CON.0 ; Alias the Timers ON/OFF bit
;---Reload Timer1------
ASM
ReloadTMR1
MOVE?CT 0, T1CON, TMR1ON ; 1 stop timer
MOVLW LOW(TimerReload) ; 1 Add TimerReload to the
ADDWF TMR1L,F ; 1 value in Timer1
BTFSC STATUS,C ; 1/2
INCF TMR1H,F ; 1
MOVLW HIGH(TimerReload) ; 1
ADDWF TMR1H,F ; 1
MOVE?CT 1, T1CON, TMR1ON ; 1 start timer
INT_RETURN
ENDASM
;---Start/Stop controls -----
StartTimer:
Timer1 = TimerReload ; Load Timer
TMR1ON = 1 ; start timer
RETURN
StopTimer:
TMR1ON = 0 ; stop timer
RETURN
Thanks for the help
Bookmarks