My PIC can't do the math! Can yours?


Closed Thread
Results 1 to 6 of 6
  1. #1
    Join Date
    Jan 2006
    Location
    Istanbul
    Posts
    1,185

    Exclamation My PIC can't do the math! Can yours?

    Is it too early to call this a bug? Or the bug is in my head?

    Attached is an excel file (file extension needs to be changed to xls).

    There is a match-table in the file. The red cells are incorrect math results from PIC. All other values provide the correct math result.

    (16F877 with PBP2.46)

    - All variables are word size.
    - 20Mhz OSC and 10-bit ADC res.

    Code:
    '
    'This is only the loop part.
    '
    
    Loop:
    
    ADCIN 1,TempRead
    IF tempread>51200 THEN tempread=51200 'Min. temp.
    IF tempread<41600 THEN tempread=41600 'Max. temp.
    
    
    XF=( TempRead /64)-650	       'This is the formula with 1 unit increments.
    
    XB=303		               'This is the initial matching Temp value.
    FOR XA=0 to 150	               
       XB=XB-2		       'Each 64 unit increment/decrement is 2˚C
       if XF =XA then XF =XB       'We get the actual temp in Celsius.
    next XA
    
    Lcdout $fe,1,”Temp:”, #XF
    
    
    GoTo loop


    For example, if the TempRead value is 44864, then I get the XF as 199 which is correct.

    However, if the TemRead value is 46464 then I get XF as 3 which is incorrect. I should be getting 149.

    From 46464 to 48000 all results are incorrect. Remaining values are correct.


    Should we call this a bug, I am not sure.


    ------------------------
    Attached Files Attached Files
    Last edited by sayzer; - 11th May 2006 at 07:45.
    "If the Earth were a single state, Istanbul would be its capital." Napoleon Bonaparte

  2. #2
    Join Date
    Mar 2006
    Location
    China
    Posts
    266


    Did you find this post helpful? Yes | No

    Default That big numbers?

    Hi,

    My guess is that you have forgotten to right justify the AD conversion, on the 877 and a 10-bit AD the highest number would be 1024. Start by checking the setup since the numbers coming out seems tooo big.

    There was a post some time ago with a similar problem, search and see if you can find it.

    The bug is probably not in the PIC :-)

    /

  3. #3
    Join Date
    Feb 2003
    Location
    Salt Lake City, Utah USA
    Posts
    517


    Did you find this post helpful? Yes | No

    Smile

    Sayzer,

    Your PIC's math is working great!

    Change the last part of your code to this:

    FOR XA=0 to 150
    XB=XB-2
    IF XF = XA THEN
    XF = XB
    GOTO HERE
    ENDIF
    NEXT XA

    HERE:
    LCDOUT $FE,1,”Temp:”,#XF

    Your code is actually changing the value of XF twice in the region you thought was flawed (e.g., for 46464, XB = 149. Your If Then sets XF = 149. Your loop continues and finds XF = 149. 303 - (149+1)*2 = 3 ... the math is correct)

    Paul Borgmeier
    Salt Lake City, Utah
    USA

  4. #4
    Join Date
    Jan 2006
    Location
    Istanbul
    Posts
    1,185


    Did you find this post helpful? Yes | No

    Thumbs up

    Thanks Paul. I fixed the problem considering your catch.
    I make the loop value the end number so it exits the loop.


    Code:
    XB=303
    for XA=0 to 150
    
       XB=XB-2
       if xf=XA then 
         xf=XB
         XA=150    'once we have the match, lets exit immediately as Paul mentioned above.
       endif
     
    next XA

    Also, Thanks to you Jumper. I see what you are saying about ADCON1 but I have no issue with that register. I am now getting the correct results;

    I found the bug :-)


    ------------
    Last edited by sayzer; - 11th May 2006 at 13:30.
    "If the Earth were a single state, Istanbul would be its capital." Napoleon Bonaparte

  5. #5
    Join Date
    Jul 2003
    Location
    Sweden
    Posts
    237


    Did you find this post helpful? Yes | No

    Lightbulb

    If this is all your program is supposed to do, i'd use something like this instead. Much faster.

    Code:
    ADCON1.7 = 1                          'right justified
    Loop:
        ADCIN 1,TempRead
        IF tempread>800 THEN tempread=800 'Min. temp.
        IF tempread<650 THEN tempread=650 'Max. temp.
        XF = 301 - ((TempRead - 650)<<1)  '301-((TempRead-650)*2)
        Lcdout $fe,1,”Temp:”, #XF
    GoTo loop
    /Ingvar

  6. #6
    Join Date
    Jan 2006
    Location
    Istanbul
    Posts
    1,185


    Did you find this post helpful? Yes | No

    Question Sometimes the rules are to be broken, I guess!

    Thanks for all replies.

    When I use "right justified" ADCON1 register, as Jumper and Ingvar suggested, the scale does not behave linear. Thus, I can not match the temp reading with Celsius.

    Currently, “left justified” ADCON1 register provides a scale that is perfectly linear and the formula works great (thanks to Paul's catch).

    By the way, Ingvar's code is indeed nice but I can not use it.



    ----------
    "If the Earth were a single state, Istanbul would be its capital." Napoleon Bonaparte

Similar Threads

  1. SMS via pic
    By kenandere in forum GSM
    Replies: 15
    Last Post: - 10th March 2010, 10:00
  2. HSERIN & Interupts (aka controlling PIC programs from a remote PC)
    By HankMcSpank in forum mel PIC BASIC Pro
    Replies: 16
    Last Post: - 17th June 2009, 14:46
  3. pic to pic ir link versus wired link : help please anyone
    By xnihilo in forum mel PIC BASIC Pro
    Replies: 13
    Last Post: - 30th May 2008, 21:01
  4. PIC Math - the need for speed
    By HenrikOlsson in forum mel PIC BASIC Pro
    Replies: 18
    Last Post: - 14th October 2005, 08:45
  5. Serial Pic to Pic using HSER
    By Chadhammer in forum mel PIC BASIC Pro
    Replies: 5
    Last Post: - 11th March 2005, 23:14

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