18F2580 with strange behaviour when using Hserin and RX interrupt
Hi guys,
I'm facing a weird behaviour with my 18F2580 using Hserin and RX interrupts and I was hoping someone could help.
I'm trying to run a code that when an incoming 2 characters is received, it triggers the interrupt and reads the message.
Once it reads the message, it goes back the the main routine.
The issue is that, once it is turned on, it does not show the correct characters being sent.
However, the interrupt trigger is being done and once it reads the message, goes back to the main routine.
But if I send a long message, from that point on, it will show the correct characters being sent but no longer goes back to the main routine!
Not sure why it does not show the correct message in the first place and also, can't understand why it fails to jump from the interrupt routine back to the main routine!
The message is being sent via bluetooth with a BT module connected directly to the MCU.
The TX from the MCU is disabled because i only need to receive and not transmit.
I filmed this behaviour which can be seen in the link below.
This is the code:
Code:
'****************************************************************
'* Name : IC_3_COMTEST2.PBP *
'* Author : *
'* Notice : Copyright (c) 2024 [select VIEW...EDITOR OPTIONS] *
'* : All Rights Reserved *
'* Date : 19/12/2024 *
'* Version : 1.0 *
'* Notes : 18F2580 MCU *
'* : *
'****************************************************************
'
;----[18F2580 Hardware Configuration]-------------------------------------------
#IF __PROCESSOR__ = "18F2580"
#DEFINE MCU_FOUND 1
#CONFIG
CONFIG OSC = IRCIO67 ; Internal oscillator block, port function on RA6 and RA7
CONFIG FCMEN = ON ; Fail-Safe Clock Monitor ENABLED
CONFIG IESO = OFF ; Oscillator Switchover mode disabled
CONFIG PWRT = OFF ; PWRT disabled
CONFIG BOREN = OFF ; Brown-out Reset disabled in hardware and software
CONFIG BORV = 3 ; VBOR set to 2.1V
CONFIG WDT = ON ; WDT ENABLED (control is placed on the SWDTEN bit)
CONFIG WDTPS = 512 ; 1:512
CONFIG PBADEN = OFF ; PORTB<4:0> pins are configured as digital I/O on Reset
CONFIG LPT1OSC = OFF ; Timer1 configured for higher power operation
CONFIG MCLRE = OFF ; RE3 input pin enabled; MCLR disabled
CONFIG STVREN = OFF ; Stack full/underflow will NOT cause Reset
CONFIG LVP = OFF ; Single-Supply ICSP disabled
CONFIG BBSIZ = 1024 ; 1K words (2K bytes) boot block
CONFIG XINST = OFF ; Instruction set extension and Indexed Addressing mode disabled (Legacy mode)
CONFIG DEBUG = OFF ; Background debugger disabled, RB6 and RB7 configured as general purpose I/O pins
CONFIG CP0 = OFF ; Block 0 (000800-001FFFh) not code-protected
CONFIG CP1 = OFF ; Block 1 (002000-003FFFh) not code-protected
CONFIG CP2 = OFF ; Block 2 (004000-005FFFh) not code-protected
CONFIG CP3 = OFF ; Block 3 (006000-007FFFh) not code-protected
CONFIG CPB = OFF ; Boot block (000000-0007FFh) not code-protected
CONFIG CPD = OFF ; Data EEPROM not code-protected
CONFIG WRT0 = OFF ; Block 0 (000800-001FFFh) not write-protected
CONFIG WRT1 = OFF ; Block 1 (002000-003FFFh) not write-protected
CONFIG WRT2 = OFF ; Block 2 (004000-005FFFh) not write-protected
CONFIG WRT3 = OFF ; Block 3 (006000-007FFFh) not write-protected
CONFIG WRTC = OFF ; Configuration registers (300000-3000FFh) not write-protected
CONFIG WRTB = OFF ; Boot block (000000-0007FFh) not write-protected
CONFIG WRTD = OFF ; Data EEPROM not write-protected
CONFIG EBTR0 = OFF ; Block 0 (000800-001FFFh) not protected from table reads executed in other blocks
CONFIG EBTR1 = OFF ; Block 1 (002000-003FFFh) not protected from table reads executed in other blocks
CONFIG EBTR2 = OFF ; Block 2 (004000-005FFFh) not protected from table reads executed in other blocks
CONFIG EBTR3 = OFF ; Block 3 (006000-007FFFh) not protected from table reads executed in other blocks
CONFIG EBTRB = OFF ; Boot block (000000-0007FFh) not protected from table reads executed in other blocks
#ENDCONFIG
#ENDIF
;----[Verify Configs have been specified for Selected Processor]----------------
; Note: Only include this routine once, after all #CONFIG blocks
#IFNDEF MCU_FOUND
#ERROR "No CONFIGs found for [" + __PROCESSOR__ +"]"
#ENDIF
'*****************************************************************************
OSCCON =%01110010 '8MHz INTOSC
OSCTUNE=%01000000 '
DEFINE OSC 8
'*****************************************************************************
INCLUDE "ALLDIGITAL.pbp"
DEFINE SHOWDIGITAL 1
'*****************************************************************************
Define HSER_BAUD 9600
DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
'DEFINE HSER_TXSTA 24h ' Enable transmit, BRGH = 1
DEFINE HSER_SPBRG 12 '
DEFINE HSER_CLROERR 1 ' Clear overflow automatically
'DEFINE HSER_CLEAR = On
RXBYTE VAR BYTE
RXFLAG VAR BIT
RX1 VAR BYTE
RX2 VAR BYTE
RX3 VAR BYTE
RX4 VAR BYTE
RX5 VAR BYTE
RX6 VAR BYTE
CT VAR BYTE
CT2 VAR BYTE
INTFLAG VAR BYTE
MOODCHANGE VAR WORD
'PIE1.5 = 1 ' RCIE
INTCON = %11000000 ' GIE + PEIE
'*****************************************************************************
PORTA=%00000000
PORTB=%00000000
PORTC=%00000000
TRISA=%00000000
TRISB=%00000000
TRISC=%10000000 'RC7 - RX pin as input
'*****************************************************************************
'PORTS & PINS
A0 VAR PORTA.0 '
A1 VAR PORTA.1 '
A2 VAR PORTA.2 '
A3 VAR PORTA.3 '
A4 VAR PORTA.4 '
A5 VAR PORTA.5 '
A6 VAR PORTA.6 '
LED1 VAR PORTA.7 '
B0 VAR PORTB.0 '
B1 VAR PORTB.1 '
B2 VAR PORTB.2 '
B3 VAR PORTB.3 '
LED2 VAR PORTB.4 '
B5 VAR PORTB.5 '
B6 VAR PORTB.6 '
B7 VAR PORTB.7 '
C0 VAR PORTC.0 '
C1 VAR PORTC.1 '
C2 VAR PORTC.2 '
C3 VAR PORTC.3 '
C4 VAR PORTC.4 '
C5 VAR PORTC.5 '
IC_TX VAR PORTC.6 'TX HARDWARE PIN / Not Used as TX
IC_RX VAR PORTC.7 'RX HARDWARE PIN
INCLUDE "modedefs.bas"
'[DISPLAY SETTINGS]*****************************************************************************
char var byte
x var byte
y var byte
BUFF VAR BYTE[16]
;use this define for hw i2c
'#define hwi2c 1
;set and uncomment these to use softi2c
SCL var PortA.6 ' I2C Clock
SDA var PortC.0 ' I2C Data
;set these to match display
ssdheight con 3 ; 7 = 8 PAGES 64*128 , 3 = 4 pages 32*128
ssdwidth con 127 ; 128 PIXELS WIDE
sdd1306_addr con $78
Include "ssd1306_I2C.INC" ' bring it in
include "font7x5_18.bas"
'[INTERRUPT SETTINGS]*****************************************************************************
INCLUDE "DT_INTS-18.bas"
INCLUDE "ReEnterPBP-18.bas"
ASM
INT_LIST macro ; IntSource, Label, Type, ResetFlag?
INT_Handler RX_INT, _RxISR, PBP, yes
ENDM
INT_CREATE
INT_ENABLE RX_INT ;enables external (INT) interrupts
ENDASM
'*****************************************************************************
'wsave var byte $20 system ;location for W if in bank0
'wsave var byte $70 system ;location for W if in bank0
'..... If any of these next three lines cause an error ...Comment them out to fix the problem...
'............which variables are needed, depends on the chip you are using.......
wsave1 var byte $A0 system ;location for W if in bank0
wsave2 var byte $120 system ;location for W if in bank0
wsave3 var byte $1A0 system ;location for W if in bank0
'[INIT]*****************************************************************************
INIT:
clear
PORTB=%00000000
BIG_TEXT = 0
PAUSE 1000
high led1
high led2
pause 500
low led1
low led2
PAUSE 500
gosub glcd_init
GLCD_CLR
ARRAYWRITE BUFF,["INIT OK",0]
GLCDSTR 0,0,BUFF
PAUSE 500
goto main
'[MAIN ROUTINE]*****************************************************************************
main:
gosub glcd_init
GLCD_CLR
ARRAYWRITE BUFF,["WAITING",0]
GLCDSTR 0,0,BUFF
toggle LED1
pause 1000
gosub calculat
goto main
'[INTERRUPT ROUTINE]*****************************************************************************
RxISR:
HSERIN [RX1, RX2, RX3, rx4]
'ASCII TO DECIMAL CONVERSION
rx1 = (rx3 - "0") * 10
rx1 = rx1 + (rx4 - "0")
gosub glcd_init
GLCD_CLR
ARRAYWRITE BUFF,["RX1= ", dec RX1,0]
GLCDSTR 0,0,BUFF
PAUSE 1000
@ INT_RETURN
'[CONFIRMATION ROUTINE]*****************************************************************************
calculat:
if RX1=57 then
gosub glcd_init
GLCD_CLR
ARRAYWRITE BUFF,["GOOD DATA RECEIVED",0]
GLCDSTR 0,0,BUFF
PAUSE 500
high led2
PAUSE 5000
LOW led2
endif
return
'*****************************************************************************
end
Link for the video showing how it behaves:
https://www.canva.com/design/DAHBZ6V...ce=sharebutton
Thanks in advance for any tips on how to get this code working as it is supposed to.