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!!!
Bookmarks