Thank you for the information Darrel.
Here is a sample code for me to understand it better.
Code:
CLEAR
@ __config _HS_OSC & _WDT_OFF & _PWRTE_OFF & _BODEN_OFF & _LVP_OFF & _CP_ON & _WRT_OFF
DEFINE OSC 20
Number1Adr data word 0
'DEFINE WRITE_INT 1
DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
DEFINE HSER_TXSTA 24h ' Enable transmit, BRGH = 1
DEFINE HSER_SPBRG 64 ' 19200 Baud @ 20MHz, 0,16%
DEFINE HSER_CLROERR 1 ' Clear overflow automatically
CMCON = 7 ' Disable Comps.
PAUSEUS 10
CVRCON = 0 ' Turn off VRCON.
PAUSEUS 10
ADCON0 = 0
ADCON1 = %00001111 ' All digital.
TRISA = 0
TRISB = 0
TRISC = %10000000 ' RC7 RS232 RX pin.
PORTA = 0
PORTB = 0
PORTC = 0
RXLED var PORTC.4
' ========= RS232 RX ===========
Header1 var byte
Header2 var byte
Komut var byte
Kimlik var byte
DataInLow var byte
DataInHigh var byte
WriteFlag var byte
OldNumber var word
Number var word
INCLUDE "DT_INTS-14_F873A.bas" ; Base Interrupt System
INCLUDE "ReEnterPBP.bas" ; Include if using PBP interrupts
ASM
INT_LIST macro ; IntSource, Label, Type, ResetFlag?
INT_Handler RX_INT, _RS232RX, PBP, yes
endm
INT_CREATE ; Creates the interrupt processor
ENDASM
Pause 10
Begin:
header1 = 254
header2 = 252
WriteFlag = 0
@ INT_ENABLE RX_INT ; enable external (INT) interrupts
Start:
if writeflag > 0 then
; disable interrupts
@ INT_DISABLE RX_INT
@ BCF INTCON, GIE
read Number1Adr, word oldnumber ' Read old value first.
if oldnumber <> number then write Number1Adr,word number
' If the incoming value changed, then write. Otherwise, do not write.
; enable interrupts
@ BSF INTCON, GIE
@ INT_ENABLE RX_INT
writeflag = 0 ' Clear write flag.
endif
goto start
RS232RX:
rxled = 1
hserin 50,Jump,[WAIT(header1,header2),komut,datainLow,DatainHigh]
if komut = 100 then
WriteFlag = 1
number.lowbyte = datainlow
number.highbyte = datainhigh
endif
Jump:
RXLED = 0
@ INT_RETURN
END
If I remove GIE, and use WRITE_INT, eeprom does not write right.
Bookmarks