1. Welcome to our site! Electro Tech is an online community (with over 170,000 members) who enjoy talking about and building electronic circuits, projects and gadgets. To participate you need to register. Registration is free. Click here to register now.
    Dismiss Notice

input and save input

Discussion in 'Microcontrollers' started by MrDEB, Nov 7, 2017.

  1. Pommie

    Pommie Well-Known Member Most Helpful Member

    Joined:
    Mar 18, 2005
    Messages:
    10,566
    Likes:
    394
    Location:
    Brisbane Australia
    If you use 10 1k resistors and a large tiedown (50k) the voltage will be 0V for no press and 0.5V to 5V in 0.5V steps. Simple and obvious.

    Mike.
     
    • Agree Agree x 1
  2. be80be

    be80be Well-Known Member

    Joined:
    Aug 23, 2008
    Messages:
    5,159
    Likes:
    155
    Location:
    morristown,tn
    That's why you paid the big bucks this works good too.
    Screenshot from 2017-12-30 00-33-27.png
     
  3. JonSea

    JonSea Well-Known Member

    Joined:
    Oct 1, 2012
    Messages:
    1,559
    Likes:
    139
    Location:
    Seattle, WA
    IF you understand how a voltage divider works and can make simple calculations

    AND

    IF you understand how the ADC works and the meaning of a ratiometric system

    THEN the rest is simple. Some choices make it easier to make calculations, but it's just more convenient if you do so.

    IF you don't understand that this is just a big voltage divider problem, you'll have no clue why your readings simply cannot clump around the middle of the range and you will jump to erroneous conclusions like "it would work properly with 1% tolerance resistors."

    Yay! 10,pages in the forum and still nowhere near a solution! This may be a MrDEB record - not for the number of posts but for keeping them in a single thread instead of multiple threads on multiple boards so no one can follow any of it.

    Jon's Rule of Forums: When looking for an answer to a problem, a thread with a multitude of answers is probably not a worthwhile place to look. The key information may be there, but there's so much rubbish, it's not worth your time to muck about.
     
  4. dave miyares

    Dave New Member

    Joined:
    Jan 12, 1997
    Messages:
    2
    Likes:
    -10
  5. MrDEB

    MrDEB Well-Known Member

    Joined:
    Apr 16, 2007
    Messages:
    4,576
    Likes:
    25
    ``I looked at several examples and every one had result = (ADC.Read(0)+1)*500/1024 Saw one example where instead of 500 they used 5000.Why??
    The reason for the 2K resistor is it was suggested in post #126
    I realize I must have gone astray on this so an apology is in order "sorry"
    While laying in bed this morning it dawned on me that I have 13 junctions 2 for Vcc & ground, 1 for the 2 1K resistors and 10 for the switches so 1023/13 = 79 BUT Mike stated I need to account for the no button press??(1023/26= 39)
    So my first switch should be 79+39 = 118
    Another issue might be I have no DIM statements defining INTEGER.
     
  6. Pommie

    Pommie Well-Known Member Most Helpful Member

    Joined:
    Mar 18, 2005
    Messages:
    10,566
    Likes:
    394
    Location:
    Brisbane Australia
    Your posts inspire me. There must be so many people that have learnt so much from these threads. Well done MrDEB.

    Mike
     
    • Like Like x 1
  7. JonSea

    JonSea Well-Known Member

    Joined:
    Oct 1, 2012
    Messages:
    1,559
    Likes:
    139
    Location:
    Seattle, WA
    p02ns7nj.jpg
    I'm done. Everything has been explained to death by multiple people. The exact circuit to use had been drawn up. The values to measure have been calculated and verified by testing. The code has been outlined. And still MrDEB is as clueless as a gold fish.

    Goldfish-gold-fish-clip-art-2.png

    Mike, Burt, Tumbleweed, care to join me at the pub? I think we have done all we can here.
     
    • Like Like x 1
  8. dave miyares

    Dave New Member

    Joined:
    Jan 12, 1997
    Messages:
    2
    Likes:
    -10
  9. be80be

    be80be Well-Known Member

    Joined:
    Aug 23, 2008
    Messages:
    5,159
    Likes:
    155
    Location:
    morristown,tn
    There scaling for volts Mrdeb you don't need any of that for what your doing just a old result = ADC.Read .................................................
    you want a value 0 to 1024 not a voltage 1 volt 2 volt LOL your just adding more to the clock doing math that's not needed.
     
  10. JonSea

    JonSea Well-Known Member

    Joined:
    Oct 1, 2012
    Messages:
    1,559
    Likes:
    139
    Location:
    Seattle, WA

    I explained that at least twice already....
     
    • Like Like x 1
  11. be80be

    be80be Well-Known Member

    Joined:
    Aug 23, 2008
    Messages:
    5,159
    Likes:
    155
    Location:
    morristown,tn
    I know nothing better to do work was called off christmas slower then they was thinking. Not good I guess seeing where I work.
     
  12. MrDEB

    MrDEB Well-Known Member

    Joined:
    Apr 16, 2007
    Messages:
    4,576
    Likes:
    25
    The example I was referrng to n post #183 was doing exactly what I am trying to do, read 10 switches. One big difference was the example had the port pin tied high with a 100K resistor.
    I tried
    FUNCTION ADInAsmVolt() AS WORD
    result = (ADC.Read(0) + 1) / 1024
    END FUNCTION

    but it didn't work at all.
    My setup, as mentioned in a post was it appeared that I was only reading 1/2 of the full 0-1024 scale.
    going to try tying the port pin high with a 100K resistor.
    Crazy idea but wondering about
    result = (ADC.Read(0) + 1) * 1024 / 10 (need 10 readings??) Just a thought.
     
  13. Pommie

    Pommie Well-Known Member Most Helpful Member

    Joined:
    Mar 18, 2005
    Messages:
    10,566
    Likes:
    394
    Location:
    Brisbane Australia
    You are trying to put a fraction into a word.

    Mike.
     
  14. JonSea

    JonSea Well-Known Member

    Joined:
    Oct 1, 2012
    Messages:
    1,559
    Likes:
    139
    Location:
    Seattle, WA
    Everything you need to know has been explained here. Apply your thought process to understanding what has already been posted.

    Geez oh grief, what a waste of so many people's time.
     
  15. JonSea

    JonSea Well-Known Member

    Joined:
    Oct 1, 2012
    Messages:
    1,559
    Likes:
    139
    Location:
    Seattle, WA
    Words don't mean much to MrDEB, as evidenced by this entire thread.
     
  16. be80be

    be80be Well-Known Member

    Joined:
    Aug 23, 2008
    Messages:
    5,159
    Likes:
    155
    Location:
    morristown,tn
    Well i would write some code to try but I deleted windows by mistake and lost about five years of my life. Going blind does that to you
    thought i was formatting a usb drive and phone rang i wasn't watching i guess and clicked On my windows drive hit format gave root password
    ask if I was sure and I cried. LOL not really but wanted too.
     
    • Dislike Dislike x 1
  17. MrDEB

    MrDEB Well-Known Member

    Joined:
    Apr 16, 2007
    Messages:
    4,576
    Likes:
    25
    I understand what the circuit is supposed to do as well as the ratio between each adc output but the output is not correct.
    Am wondering if the code I am using is at fault?? won't be the first time.
    Will clean up my code and post if maybe it would help??
     
  18. tumbleweed

    tumbleweed Active Member

    Joined:
    Jan 25, 2007
    Messages:
    110
    Likes:
    32
    go ahead and post it, along with exactly how you have the resistors connected (all of them)

    don't clean it up... just post what you're using.
     
  19. JonSea

    JonSea Well-Known Member

    Joined:
    Oct 1, 2012
    Messages:
    1,559
    Likes:
    139
    Location:
    Seattle, WA

    Oh man Burt. Ouch! That sucks big time. Hell of a way to end the year.

    I hope you can recover some of it at least, and get Windows back in business.

    Too late to help, but thst's why I use Dropbox. Anything of importance gets saved there so even if someone....I mean something....pushes me over the edge and I destroy my computer with an axe, my files will be safe. I am not exactly sure how Dropbox does it, but I can save a file on my laptop and by the time I sit down at my desktop (admittedly, that takes a while with my new knees) or look on my phone, the file is there ready to use.
     
  20. be80be

    be80be Well-Known Member

    Joined:
    Aug 23, 2008
    Messages:
    5,159
    Likes:
    155
    Location:
    morristown,tn
    Should be something more like this
    Code (text):

    function ADInAsVolt() as word
       result = ADC.Read(0)
    end function
    Select ADInAsVolt()
         Case <25
               'no button pressed
         Case <100       ' ideal=92
               'button 1 pressed
         Case <200       ' ideal=185
               'button 2 pressed
         Case <300       'ideal=278
               'button 3 pressed
         Case <400       'ideal=371
               'button 4 pressed
         Case <500       'ideal=464
               'button 5 pressed
         Case <600       'ideal=557
               'button 6 pressed
         Case <700       'ideal=650
               'button 7 pressed
         Case <800       'ideal=743
               'button 8 pressed
         Case <900       'ideal=836
               'button 9 pressed
         Case <1000       'ideal=929
               'button 10 pressed
         else
               'something is wrong
    End Select
     
     
    Last edited: Dec 31, 2017
  21. JonSea

    JonSea Well-Known Member

    Joined:
    Oct 1, 2012
    Messages:
    1,559
    Likes:
    139
    Location:
    Seattle, WA
    Trust me. You don't have to wonder about that. It goes without saying.

    I must say, the Swordfish documentation and example files are the worst. They don't explain why they are doing what they do and they are not complete.
    I suggest you read and understand the following. Barring that, the ONLY things you need in your code as far as this switch ladder is concerned is in blue below. Copy and paste NOTHING ELSE.

    First, INCLUDE ADC.BAS. This is the module that handles the details for you.

    Next, forget about the examples you have read. You do not want to convert the readings to volts. This is needless math and it's just wrong because you're operating from 3-something volts, so using Vdd as a reference where you are assuming it's 5 volts makes the numbers wrong anyway. You want the raw ADC output, which is a 10 bit number meaning it can range between 0 - 1023. A reading of 1023 means the level you are measuring is the same as Vdd, a reading of 512 means the level is 50% of Vdd, etc. We don't know what Vdd from your battery is and we don't care what the actual voltage is. The only thing we care about is the ratio of the measured level compared to full scale.

    From the Swordfish help file, next we need:

    // initialise <-------- this goes at the start of the program code, after subroutines
    TRISA.0 = 1 // configure AN0 as an input
    ADCON1.7 = 1 // set analogue input on PORTA.0
    delayms (500)


    This function is in the ADC module, and is what we will use to read the ADC.

    function Read(pChannel as byte) as word <---------- This is in the ADC module. Don't put this in your code any place. You need to look at it to understand what you are doing.

    ADResult as word
    <---------- This is in the ADC module. Don't put this in your code any place. You need to look at it to understand what you are doing.

    After making a call to Read, ADResult will hold the last ADC sample value.

    So your brain freezes up at pChannel. It's just the ADC channel to read.

    When you want to read the ADC value, this is what you use:

    Read(AN0)
    <------------- this reads the ADC

    Now to do something with it. The value you read is in ADResult.

    Select ADResult
    Case <93

    (this has all been explained in other posts. Figure it out from here)
     
  22. JonSea

    JonSea Well-Known Member

    Joined:
    Oct 1, 2012
    Messages:
    1,559
    Likes:
    139
    Location:
    Seattle, WA
    Ignore the first 3 lines in what Burt posted. You don't want the readings in volts, as I explained above.


    Delete those 3 lines (and insert NOTHING IN THEIR PLACE) and change line 4 to

    Select Read(AN0)

    The rest is perfect.
     
    Last edited: Dec 31, 2017

Share This Page