Dear friends, I am trying to make two pic16F88 to serially communicate between them.
Pic_A Pic_B
portB.6 (Tx) >-------------------------> portB.7 (Rx)
portB.7(Rx) <-------------------------< portB.6(Tx)
To be sure to have a reliable communication, I am using DT int on portB.0 to activate serial transmission as per the code below.
Code:
INCLUDE "Modedefs.bas"
INCLUDE "DT_INTS-14_3.bas" ; Base Interrupt System
INCLUDE "ReEnterPBP.bas" ; Include if using PBP interrupts
ANSEL = 0
CMCON = 7
OPTION_REG.6 = 1
TrisA = %00010000
TrisB = %10000101
PortA = 0
DEFINE OSC 8
DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
DEFINE HSER_TXSTA 20h ' Enable transmit, BRGH = 0
DEFINE HSER_SPBRG 12 ' 9600 Baud @ 8MHz, 0,16%
DEFINE HSER_CLROERR 1 ' Clear overflow automatically
SCall var PortB.3
PwrL var PortA.0
PwrM var PortA.1
Led var PortA.2
Buz var PortA.3
STx var PortB.6
SRx var PortB.7
ZCrox var PortA.4
X10Tx var PortB.1
TxEnable var PortB.4
low TxEnable
low SCall
input SRx
high STx
A0 var Byte
DataFlag var byte
House var byte
Unit var Byte
Job var Byte
Rdata var Byte[30]
Flag0 var dataflag.0
Flag1 var DataFlag.1 ' Hserin interrupt channel
Flag2 var dataFlag.2 ' PortB.0 interrupt channel
Flag3 var DataFlag.3
Flag7 var dataFlag.7
'-------------------- Rx & PB0 DT interrupt definition -----------------
ASM
INT_LIST macro ; IntSource, Label, Type, ResetFlag?
INT_Handler RX_INT, _Getbytes, PBP, yes
INT_Handler INT_INT, _DataReady, PBP, yes
endm
INT_CREATE ; Creates the interrupt processor
ENDASM
@ INT_ENABLE RX_INT ; enable RX_INT interrupts
'----------------------------------------------------------------------
gosub Buzzer
low led
A0=0
DataFlag=0
pause 500
hserout ["System Ready",10,13]
Main:
pause 1
IF Rdata[0] = 36 and Flag0 = 1 then
High led
If Rdata[1] = 49 then
House = ((Rdata[4]-48)*10) + (Rdata[5]-49) ' X10 house value
Unit = ((Rdata[6]-48)*10) + (Rdata[7]-49) ' X10 Unit value
Flag7 = 0
If Rdata[8] = 49 then Job = 18 : Flag7 = 1
If Rdata[8] = 50 then Job = 26 : Flag7 = 1
If Rdata[8] = 98 then Job = 20: Flag7 = 1
If Rdata[8] = 99 then Job = 28: Flag7 = 1
if Flag7 = 0 Then Skip00
High TxEnable ' enable X10 transmission
pause 1 ' delay before X10 Tx
Xout X10Tx,Zcrox,[House\Unit,House\Job] ' X10 transmission
low TxEnable ' disable X10 Transmission
goto Skip00
Endif
If Rdata[1] = 52 then ' intra system comand
If Rdata[8] = 250 then gosub Power01
If Rdata[8] = 240 then gosub Power02
If Rdata[8] = 230 then gosub Modem01
If Rdata[8] = 220 then gosub Modem02
goto Skip00
endif
If Rdata[1] = 51 then ' intra system communication
High Scall
Pause 10
serout2 STx,84,5,[str Rdata\30]
Low Scall
goto Skip00
endif
IF Rdata[1] = 57 and Flag2 = 1 then ' send out via wifi string recived
hserout [str Rdata\30]
endif
Skip00: ' reset main pointers & flag
Rdata[0] = 0
Rdata[1] = 0
Rdata[2] = 0
Rdata[8] = 0
Flag0 = 0
Flag1 = 0
Flag2 = 0
A0=0
gosub buzzer
Low led
endif
goto Main
Getbytes: ' Rx interrupt data from Xbee module
hserin 100, Nodata, [Str Rdata\9]
Flag0 = 1
@ INT_RETURN
Nodata:
Flag0 = 0
Flag1 = 1
@ INT_RETURN
DataReady: ' Intracom interrupt data from chip
hserout ["PB0 Interrupt"] ' this message never show up
Flag0 = 0
Flag1 = 0
Flag2 = 0
serin2 STx,84,500,JumpOut,[str Rdata\30]
Flag2 = 1
Flag0 = 1
Loop:
if PortB.0 = 1 then Loop
@ INT_RETURN
JumpOut:
Flag0 = 0
Flag1 = 0
Flag2 = 0
Flag3 = 1
@ INT_RETURN
Power01:
hserout ["PowerLine Off",10,13]
pause 1
low PwrL
return
Power02:
hserout ["PowerLine On",10,13]
pause 1
high PwrL
return
Modem01:
hserout ["Modem Off",10,13]
pause 1
low PwrM
return
Modem02:
hserout ["Modem On",10,13]
pause 1
high PwrM
return
Buzzer:
high buz
pause 20
low buz
return
The Rx interrupt works fine, while the portB.0 interrupt doesn't work at all, so I am anable to get data transfer between the two pics.
There must be something wrong but I am anable to find it! Any help will be greatly appreciated.
Al.
Bookmarks