Hmm, my checksum routine does not work and gives $ff as the last byte when using this data which I think is wrong.



My code is here any thoughts?

Code:
'-------------------------------------
' PBP BCM CODE 25/10/09 V.15 8mhz
'-------------------------------------

@ DEVICE PIC16F88,INTRC_OSC_NOCLKOUT
@ DEVICE PIC16F88,PROTECT_OFF
@ DEVICE PIC16F88,WDT_ON
@ DEVICE PIC16F88,PWRT_ON
@ DEVICE PIC16F88,MCLR_ON
@ DEVICE PIC16F88,BOD_OFF
@ DEVICE PIC16F88,LVP_OFF
@ DEVICE PIC16F88,CPD_OFF
@ DEVICE PIC16F88,DEBUG_OFF
@ DEVICE PIC16F88,CCPMX_OFF

DEFINE OSC 8 			'Set oscilator speed to 8mHz 
OSCCON=%01111000 		'8 Mhz

'DEFINE OSC 4 			'Set oscilator speed to 4mHz  
'OSCCON =%01100000		'4 Mhz
 
DEFINE HSER_BAUD 9600		'Set Baud rate to 9600bps
DEFINE HSER_BITS 9		'Set to 9 bit mode
DEFINE HSER_EVEN 1		'Set Even Parity
DEFINE HSER_CLROERR 1 		'Clear overflow error automatically

ANSEL = 0 			'ALL DIGITAL
CMCON = 7 			'COMPARATORS OFF
INTCON = 0 			'Disable interrupts
TRISB = %00000100 		'SET PORTB RB2(RX) as input, others to OUTPUT
TRISA = %11111111 		'SET PORTA AS INPUTS

'Variables

BCMDATA VAR BYTE[11]		'Define BCMDATA as a byte array (11 Bytes) 
Count1 VAR BYTE			'Define Count1 as a byte variable (Used in For/Next Loops)
CheckSum VAR BYTE		'Define CheckSum as a byte variable
Led1 VAR PORTB.0		'Define PortB.0 as Led1
Led2 VAR PORTB.1		'Define PortB.1 as Led2

'Constants


'Main Program Start

Commloop: 					'Start of Communications Loop

	HSERIN [WAIT($87), STR BCMDATA\11]	'Wait for packet start $87 then Receive 11 bytes into array BCMDATA
	
    BCMDATA[2] = $15            'Load Soc Byte with $15 (19 Bars)
    BCMDATA[3] = $6F	        'Load Soc Byte with $6F (19 Bars)
	CheckSum = $87				'Load Checksum with packet start byte value
	Gosub CalcSum				'Gosub CalcSum to Calculate Checksum 

	HSEROUT [$87,str BCMDATA\11]		'Transmit 12 bytes inc packet start byte $87
		
	HSERIN [WAIT($AA), STR BCMDATA\11]	'Wait for packet start $AA then Receive 11 bytes into array BCMDATA           	
	'CheckSum = $AA				'Load Checksum with packet start byte value
	'Gosub CalcSum				'Gosub CalcSum to Calculate Checksum 

	HSEROUT [$AA,str BCMDATA\11]		'Transmit 12 bytes inc packet start byte $AA

	goto CommlooP			'Goto Loop      
    
CalcSum:					'Calculate Packet CheckSum Routine
	
	For Count1 = 0 to 9			'For Count1 = 0 to 9 (Start 10 byte loop)
	CheckSum = CheckSum + BCMDATA[Count1]	'Add Bytes
	Next Count1				'Repeat until 10 bytes added
	CheckSum = NOT CheckSum			'Not CheckSum
	CheckSum = CheckSum + 1			'Add 1 to CheckSum
	BCMDATA[10] = CheckSum AND $7F 		'AND result
	Return					'Return 	


END
My understanding of how the checksum is generated comes from this info.

"Here's what I figured out so far: There are basically 10 data bytes per message. Before the first is the message type (AA or 87), and after the last is the checksum. You can compute it by adding the other 11 bytes, negating that (2's complement), then and'ing by 0x7f.
It makes the entire message add to 0 when you and by 0x7f."


And here is an known good sample.

0x87,0x40,0x58,0x15,0x6E,0x10,0x01,0x32,0x2F,0x2F, 0x04,0x39

Checksum byte is 0x39 at end.


Ooppps I think I have been an idiot and included the AND part in my routine which should not be there and in fact is done by the receiving device to see if the result is 0!!!