Code:
DEFINE OSC 40 'Oscillator speed in MHz: 3(3.58) 4 8 10 12 16 20 24 25 32 33 40
;define LOADER_USED 1
@ __CONFIG _CONFIG1H, _OSC_HSPLL_1H
@ __CONFIG _CONFIG2H, _WDT_OFF_2H & _WDTPS_128_2H
@ __CONFIG _CONFIG3H, _PBADEN_OFF_3H
@ __CONFIG _CONFIG4L, _LVP_OFF_4L & _XINST_OFF_4L
;DEFINE NO_CLRWDT 1
DEFINE HSER_RCSTA 90H
DEFINE HSER_TXSTA 20H
DEFINE HSER_BAUD 9600
DEFINE HSER_CLROERR 1
DEFINE LOADER_USED 1 ' Bootloader
Define USE_LFSR 1
T0CON = %10001000
INTCON = %11100000 ' Timer0 and Peripheral interrupts enabled
PIE1 = %00100000 ' USART 1 receive buffer int enable
'************************************************* ***************************************
'* *
'* Declare variables *
'* *
'************************************************* ***************************************
W_HP_Save var byte BANKA ' Save location for W in BANKA
STATUS_HP_Save var byte BANKA ' Save location for STATUS register in BANKA
BSR_HP_Save var byte BANKA ' Save location for BSR register in BANKA
R0_2 var WORD BANKA ' PBP VARS TO SAVE
R1_2 VAR WORD BANKA
R2_2 VAR WORD BANKA
R3_2 VAR WORD BANKA
R4_2 VAR WORD BANKA
R5_2 VAR WORD BANKA
R6_2 VAR WORD BANKA
R7_2 VAR WORD BANKA
R8_2 VAR WORD BANKA
FLAGS_2 VAR BYTE BANKA
GOP_2 VAR BYTE BANKA
RM1_2 VAR BYTE BANKA
RM2_2 VAR BYTE BANKA
RR1_2 VAR BYTE BANKA
RR2_2 VAR BYTE BANKA
TIMER VAR WORd
X VAR WORD
Y VAR BYTE
SecondsCounter VAR BYTE
TimerFlag VAR BIT
KeyHitFlag VAR BIT
DEFINE INTHAND INT_CODE 'Tell PBP Where your code starts on an interrupt
T0CON = %10001000
INTCON = %11100000 ' Timer0 and Peripheral interrupts enabled
PIE1 = %00100000 ' Usart1 int enabled
TimerFlag = 0
Timer = 0
X = 0
SecondsCounter = 0
KeyHitFlag = 0
GOTO OVER_INT_CODE
asm
INT_CODE
movwf _W_HP_Save ; 1 copy W to W_HP_Save register
movff STATUS, _STATUS_HP_Save ; 2 copy status reg to STATUS_HP_Save
movff BSR, _BSR_HP_Save ; 3 copy BSR to BSR_HP_Save
MOVFF R0,_R0_2
MOVFF R0+1,_R0_2+1
MOVFF R1,_R1_2
MOVFF R1+1,_R1_2+1
MOVFF R2,_R2_2
MOVFF R2+1,_R2_2+1
MOVFF R3,_R3_2
MOVFF R3+1,_R3_2+1
MOVFF R4,_R4_2
MOVFF R4+1,_R4_2+1
MOVFF R5,_R5_2
MOVFF R5+1,_R5_2+1
MOVFF R6,_R6_2
MOVFF R6+1,_R6_2+1
MOVFF R7,_R7_2
MOVFF R7+1,_R7_2+1
MOVFF R8,_R8_2
MOVFF R8+1,_R8_2+1
IFDEF T2
MOVFF T2,_T2_2
ENDIF
IFDEF FLAGS
MOVFF FLAGS,_FLAGS_2
ENDIF
IFDEF GOP
MOVFF GOP,_GOP_2
ENDIF
IFDEF RM1
MOVFF RM1,_RM1_2
ENDIF
IFDEF RM2
MOVFF RM2,_RM2_2
ENDIF
IFDEF RR1
MOVFF RR1,_RR1_2
ENDIF
IFDEF RR2
MOVFF RR2,_RR2_2
ENDIF
endasm
;%%%%%%%%%%%%%%%%%%%%%%%%% Interrupt handler written in PBP %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
IF INTCON.2 = 1 THEN
TMR0H = $EC ; Reload TMR0 to 65535 - 5000
TMR0L = $77
Timer = Timer + 1
IF Timer >= 1000 THEN
TimerFlag = 1
ENDIF
ENDIF
IF PIR1.5 = 1 THEN
KeyHitFlag = 1
ENDIF
INTCON.2 = 0 ; Clear the timer flag
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%``
ASM
MOVFF _R0_2,R0
MOVFF _R0_2 + 1,R0 + 1
MOVFF _R1_2,R1
MOVFF _R1_2 + 1,R1 + 1
MOVFF _R2_2,R2
MOVFF _R2_2 + 1,R2 + 1
MOVFF _R3_2,R3
MOVFF _R3_2 + 1,R3 + 1
MOVFF _R4_2,R4
MOVFF _R4_2 + 1,R4 + 1
MOVFF _R5_2,R5
MOVFF _R5_2 + 1,R5 + 1
MOVFF _R6_2,R6
MOVFF _R6_2 + 1,R6 + 1
MOVFF _R7_2,R7
MOVFF _R7_2 + 1,R7 + 1
MOVFF _R8_2,R8
MOVFF _R8_2 + 1,R8 + 1
IFDEF FLAGS
MOVFF _FLAGS_2,FLAGS
ENDIF
IFDEF FLAGS
MOVFF _GOP_2,FLAGS
ENDIF
IFDEF RM1
MOVFF _RM1_2,RM1
ENDIF
IFDEF RM2
MOVFF _RM2_2,RM2
ENDIF
IFDEF RR1
MOVFF _RR1_2,RR1
ENDIF
IFDEF RR2
MOVFF _RR2_2,RR2
ENDIF
IFDEF T2
MOVFF _T2_2,T2
ENDIF
movff _BSR_HP_Save, BSR ; Restore the BSR reg
movf _W_HP_Save, W ; Restore W
movff _STATUS_HP_Save, STATUS ; Restore the STATUS reg
Retfie ; Exit the interrupt routine
ENDASM
OVER_INT_CODE:
Topp:
IF TimerFlag = 1 THEN
SecondsCounter = SecondsCounter + 1
HSEROUT ["Seconds = ",#SecondsCounter,13,10]
HSEROUT ["abcdefghijklmnopqrstuvwxyz1234567890ABCDEFGHIJKLMNOPQRSTUVWZYZ1234567890",_
rep "1"\10,rep "2"\10,rep "3"\10,rep "4"\10,rep "5"\10,13,10]
TimerFlag = 0
Timer = 0
ENDIF
IF KeyHitFlag = 1 THEN
HSERIN [Y]
HSEROUT[Y]
KeyHitFlag = 0
ENDIF
INTCON.7 = 1 ; Turn global Ints back on
Goto Topp
Here is the output:
Bookmarks