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.


 
		
		 
						
					 
			 
			 
			 
					
					 Problem with multiple interrupts
 Problem with multiple interrupts
		



Bookmarks