i have great reservation that "on interrupt" will be successful @9600 with a 4mhz osc, use dt ints
puts your 690 in a blocking loop until 5 characters have been received, no matter how long it takes
its not isr material
my take
Code:
' ====== FUSES ====================================================================================' PIC 16F690 Fuses (MPASM)
@ __config _FCMEN_OFF &_IESO_OFF &_CPD_OFF &_WDT_OFF &_INTRC_OSC_NOCLKOUT &_BOR_OFF &_CP_OFF &_PWRTE_OFF &_MCLRE_OFF
@ ERRORLEVEL -306
' ====== REGISTERS =================================================================================
OSCCON = %01110000 'Internal RC set to 8Mhz - Register not to be used with XTal
OPTION_REG = %10000000 'PORT A&B Pull-Ups (look WPUA & WPUB)
ANSEL = %00000000 'Select analog inputs Channels 0 to 7
ANSELH = %00000000 'Select analog inputs Channels 8 to 11
INTCON = %11000000 'INTERRUPT Control
;PIE1 = %00100000 'Peripheral Interrupts
' ====== UART SETTINGS ============================================================================
RCSTA = %10010000 ' Enable serial port & continuous receive
TXSTA = %00100000 ' Enable transmit, BRGH = 0
SPBRG = 12 ' 9600 Baud @ 8MHz, 0.16%
' ====== DEFINES ==================================================================================
DEFINE OSC 8
DEFINE NO_CLRWDT 1 ' Don't waste cycles clearing WDT
DEFINE HSER_CLOERR 1 ' Automatic clear overrun error
' ====== VARIABLES ================================================================================
LED VAR PORTB.6
SData VAR BYTE(5)
rx_count var byte
rx_complete var bit
rx_hit var bit
;Print VAR BIT
clear
'======= INITIALIZE ===============================================================================
PORTB.5 = 1 ' set to avoid sending serial data garbage
,Print = 0 ' send out serial data only if some is received
'======= PROGRAM ==================================================================================
ON INTERRUPT GOTO ISR
gosub rx_start
MAIN:
IF rx_complete THEN
Hserout [STR SData\5,13,10]
gosub rx_start
ENDIF
IF rx_hit THEN
TOGGLE LED
rx_hit=0
endif
GOTO MAIN
END
rx_start ;resume /start rx
RCSTA.4=0 ;clear any rcsta error
RCSTA.4=1
rx_count=0
rx_complete=0
PIE1.5=1
return
' ====== INTERRUPT SERVICE ROUTINE ================================================================
Disable
ISR:
sdata[rx_count]=RCREG
rx_hit=1
rx_count=rx_count+1
if rx_count==5 then ;stop rx for now
rx_complete=1
PIE1.5=0
endif
RESUME
ENABLE
Bookmarks