I'm using an 18F part and have a 1mSec timer interrupt using TMR0.

I wanted to test everything by building a simple seconds counter. Inside my ISR I would count to 1000, and then set a flag. My PBP program would sit in a tight loop and test for that flag, and when it detected it was set, it would increment a counter and display the running count via the HSEROUT command. The trouble is the interrupt would crash HSEROUT. The first few characters get sent out, then a bunch of garbage. This happens every second, so I have proof that the interrupt is still running.

I thought my trouble was because I was trashing a system variable inside my assembly-language ISR, so I went back to Tim Box's routine where virturally every PBP variable is saved and restored, and I rewrote the ISR in PBP.

I STILL have the same problem. Is there some software timing loop inside HSEROUT that is getting screwed up?

The program is below:

'************************************************* ***************
'* Name : INT_CTRL.BAS *
'* Author : Tim Box *
'* Notice : Copyright (c) 2002 TJBSYSTEMS *
'* : All Rights Reserved *
'* Date : 28-Sep-02 *
'* Version : 1.0 *
'* Notes : *
'* : Modified by C. Linquist for 18F parts 5/1/04 *
'************************************************* ***************

DEFINE OSC 20 ' Set for 20Mhz operation
DEFINE NO_CLRWDT 1
DEFINE _18F8720 1
DEFINE HSER_RCSTA 90H
DEFINE HSER_TXSTA 20H
DEFINE HSER_BAUD 9600
DEFINE HSER_CLROERR 1
DEFINE CCP1_REG PORTC
DEFINE CCP1_BIT 2
DEFINE LOADER_USED 1 ' Bootloader
Define USE_LFSR 1


TRISA = %11111111
TRISB = %11111111
TRISC = %10010001
TRISD = %00111000
TRISE = %00000000
TRISF = %01111111
TRISG = %11111100
TRISH = %00000000
TRISJ = %10010000




ADCON2 = %10000010 ' Right justify 10 bit output, Clock = Fosc/32

ADCON1 = %00010011 ' Set Vref on RA3, 12 chan A/D (AN0-AN11)

ADCON0 = %00000001 ' Set A/D to ON, chan 0

PSPCON = %00000000 ' No PSP
MEMCON = %10000000 ' No External Memory
CMCON = %00000111 ' No Comparator used, turn it off

T0CON = %10001000
INTCON = %11100000 ' Timer0 and Peripheral interrupts enabled
PIE1 = %00100000 ' USART 1 receive buffer int enable

CCPR1L = %00010000
CCPR1H = %00000000 ' Initialize to 0, PWM register
PR2 = $1F ' PWM register,158 Khz@20Mhz, 7 bits
T2CON = %00000100 ' Prescale 1 - Needed for PWM
CCP1CON= %00001100 ' Set up for PWM



'************************************************* ***************************************
'* *
'* Declare variables *
'* *
'************************************************* ***************************************




wsave VAR BYTE $20 SYSTEM ' Save location for the W register if in bank0

ssave VAR BYTE Bank0 SYSTEM ' Save location for the STATUS register
psave VAR BYTE Bank0 SYSTEM ' Save location for the PCLATH register
fsave VAR BYTE Bank0 SYSTEM ' Save location for the FSR register

R0_2 var WORD BANK0 ' PBP VARS TO SAVE
R1_2 VAR WORD BANK0
R2_2 VAR WORD BANK0
R3_2 VAR WORD BANK0
R4_2 VAR WORD BANK0
R5_2 VAR WORD BANK0
R6_2 VAR WORD BANK0
R7_2 VAR WORD BANK0
R8_2 VAR WORD BANK0
FLAGS_2 VAR BYTE BANK0
GOP_2 VAR BYTE BANK0
RM1_2 VAR BYTE BANK0
RM2_2 VAR BYTE BANK0
RR1_2 VAR BYTE BANK0
RR2_2 VAR BYTE BANK0

TIMER VAR WORd
X VAR WORD
Y VAR BYTE
SecondsCounter VAR BYTE
TimerFlag 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

GOTO OVER_INT_CODE



asm


INT_CODE
MOVF R0,W
MOVWF _R0_2
MOVF R0 + 1,W
MOVWF _R0_2 + 1

MOVF R1,W
MOVWF _R1_2
MOVF R1 + 1,W
MOVWF _R1_2 + 1

MOVF R2,W
MOVWF _R2_2
MOVF R2 + 1,W
MOVWF _R2_2 + 1

MOVF R3,W
MOVWF _R3_2
MOVF R3 + 1,W
MOVWF _R3_2 + 1

MOVF R4,W
MOVWF _R4_2
MOVF R4 + 1,W
MOVWF _R4_2 + 1

MOVF R5,W
MOVWF _R5_2
MOVF R5 + 1,W
MOVWF _R5_2 + 1

MOVF R6,W
MOVWF _R6_2
MOVF R6 + 1,W
MOVWF _R6_2 + 1

MOVF R7,W
MOVWF _R7_2
MOVF R7 + 1 ,W
MOVWF _R7_2 + 1

MOVF R8,W
MOVWF _R8_2
MOVF R8 + 1 ,W
MOVWF _R8_2 + 1


IFDEF T2
MOVF T2,W
MOVWF _T2_2
ENDIF
IFDEF FLAGS
MOVF FLAGS,W
MOVWF _FLAGS_2
ENDIF
IFDEF GOP
MOVF GOP,W
MOVWF _GOP_2
ENDIF
IFDEF RM1
MOVF RM1,W
MOVWF _RM1_2
ENDIF
IFDEF RM2
MOVF RM2,W
MOVWF _RM2_2
ENDIF
IFDEF RR1
MOVF RR1,W
MOVWF _RR1_2
ENDIF
IFDEF RR2
MOVF RR2,W
MOVWF _RR2_2
ENDIF


endasm
;%%%%%%%%%%%%%%%%%%%%%%%%% Interrupt handler written in PBP %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
IF INTCON.2 = 1 THEN
TMR0H = $EC
TMR0L = $77
Timer = Timer + 1
IF Timer >= 1000 THEN
TimerFlag = 1
Timer = 0
ENDIF
INTCON.2 = 0
ENDIF
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%``

ASM

MOVF _R0_2,W
MOVWF R0
MOVF _R0_2 + 1,W
MOVWF R0 + 1

MOVF _R1_2,W
MOVWF R1
MOVF _R1_2 + 1,W
MOVWF R1 + 1

MOVF _R2_2,W
MOVWF R2
MOVF _R2_2 + 1,W
MOVWF R2 + 1

MOVF _R3_2,W
MOVWF R3
MOVF _R3_2 + 1,W
MOVWF R3 + 1

MOVF _R4_2,W
MOVWF R4
MOVF _R4_2 + 1,W
MOVWF R4 + 1

MOVF _R5_2,W
MOVWF R5
MOVF _R5_2 + 1,W
MOVWF R5 + 1

MOVF _R6_2,W
MOVWF R6
MOVF _R6_2 + 1,W
MOVWF R6 + 1

MOVF _R7_2,W
MOVWF R7
MOVF _R7_2 + 1,W
MOVWF R7 + 1

MOVF _R8_2,W
MOVWF R8
MOVF _R8_2 + 1,W
MOVWF R8 + 1

IFDEF FLAGS
MOVF _FLAGS_2,W
MOVWF FLAGS
ENDIF
IFDEF FLAGS
MOVF _GOP_2,W
MOVWF FLAGS
ENDIF
IFDEF RM1
MOVF _RM1_2,W
MOVWF RM1
ENDIF
IFDEF RM2
MOVF _RM2_2,W
MOVWF RM2
ENDIF
IFDEF RR1
MOVF _RR1_2,W
MOVWF RR1
ENDIF
IFDEF RR2
MOVF _RR2_2,W
MOVWF RR2
ENDIF

IFDEF T2
MOVF _T2_2,W
MOVWF T2
ENDIF

Movf psave,w ; Restore the PCLATH reg
Movwf PCLATH
swapf ssave,w ; Restore the STATUS reg
movwf STATUS
swapf wsave,f
swapf wsave,w ; Restore W reg
Retfie ; Exit the interrupt routine

ENDASM
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%


OVER_INT_CODE:

Topp:
IF TimerFlag = 1 THEN
SecondsCounter = SecondsCounter + 1
HSEROUT ["Seconds = ",#SecondsCounter,13,10]
TimerFlag = 0
INTCON.7 = 1 ; Turn global ints back on
ENDIF
Goto Topp