Can PBP & 16f88 really do 9600,8,E,1


Closed Thread
Results 1 to 39 of 39

Hybrid View

  1. #1


    Did you find this post helpful? Yes | No

    Default

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

  2. #2
    Join Date
    Dec 2005
    Posts
    1,073


    Did you find this post helpful? Yes | No

    Default

    Quote Originally Posted by retepsnikrep View Post
    0x87,0x40,0x58,0x15,0x6E,0x10,0x01,0x32,0x2F,0x2F, 0x04,0x39
    Code:
    checksum=BCMDATA[0]
    For i=1 To 10
      checksum=checksum+BCMDATA[i]
    Next i
    checksum=~checksum     '1's complement
    checksum=checksum+1    '2's complement
    checksum=checksum & $7F
    For your example, checksum=0x39
    Last edited by dhouston; - 25th October 2009 at 22:18.

  3. #3


    Did you find this post helpful? Yes | No

    Default

    Thanks Dave.

    I was using logical operators instead of maths ones!!!

  4. #4
    Join Date
    Dec 2005
    Posts
    1,073


    Did you find this post helpful? Yes | No

    Default

    Quote Originally Posted by retepsnikrep View Post
    I was using logical operators instead of maths ones!!!
    Yeah - that's one area where various implementations of Basic vary widely - you need to study the documentation, ask lots of questions and take note of examples posted here as well as those on meLabs web site.

    For example, the syntax for bit arrays is rather obscure. AFAIK it's only documented in an example in the Repeat/Until explanation in the manual. I'm not sure I would have ever grasped it without an example posted by Melanie.

  5. #5


    Did you find this post helpful? Yes | No

    Default Ring Buffer

    Thanks to the members on here my project has been working well for over a year.
    But now I need to enhance it and move to using a ring buffer to receive the incomming data and
    some sort of interrupt driven routine as i need more time for code execution and can't afford to wait
    for the data.

    So I need to work directly with the USART hardware and use darell's interrupts.
    I have been reading up on here but i'm pretty confused.

    So if i explain what is happening then perhaps members can chip in with some more advice.

    My application (16F88 chip running at 8mhz) has to receive data on a 9600, 8,E,1 in 12 byte packets on the USART RX Line,manipulate the data if reqd and then squirt if back out of the USART TX port on a different Line in same format.
    I have no control over the incomming data and the packets have about 15ms between them.
    The bytes in the packets are back to back no gaps.

    I have been receiving the packets using hserin and then squrting them back out via hserout, but this
    only leaves a couple of ms before next packet is arriving. No time to do anything especially when
    i am trying to use the debug command on another pin to send some data to an LCD.

    I can't really afford to drop packets so any advice appreciated.

    I understand the USART has a two byte RX/TX buffer. Can it RX & TX at the same time?

    Any simple examples of a ring buffer doing USART RX and TX as described?

  6. #6
    Join Date
    Dec 2005
    Posts
    1,073


    Did you find this post helpful? Yes | No

    Default

    Using a 20MHz clock would give you a few more clock cycles (i.e. more statements can be executed in the same amount of time) between input & output. Other than that, you'd probably need a bit of ASM optimization to make significant gains.

Similar Threads

  1. PBP Book
    By Bruce in forum Off Topic
    Replies: 83
    Last Post: - 4th October 2021, 12:55
  2. PBP migration from 16F88 to 16F1827
    By RussMartin in forum mel PIC BASIC Pro
    Replies: 20
    Last Post: - 21st June 2010, 18:14
  3. PBP, ASM and LST files
    By HenrikOlsson in forum mel PIC BASIC Pro
    Replies: 5
    Last Post: - 12th January 2010, 13:43
  4. Compiler differences between PBP 2.33 & 2.46
    By nikopolis in forum mel PIC BASIC Pro
    Replies: 3
    Last Post: - 2nd May 2006, 19:01
  5. Newby- PBP wont compile for 18F (MPLAB)
    By jd76duke in forum mel PIC BASIC Pro
    Replies: 1
    Last Post: - 17th December 2005, 23:30

Members who have read this thread : 0

You do not have permission to view the list of names.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts