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?
My understanding of how the checksum is generated comes from this info.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
"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