newbie Q - edge detection?


Closed Thread
Results 1 to 16 of 16

Hybrid View

  1. #1
    Join Date
    Sep 2005
    Location
    Campbell, CA
    Posts
    1,107


    Did you find this post helpful? Yes | No

    Default

    Interrupts are the best way, but if you can't use those you can do it as follows:






    TopOfLoop:

    If Old.Y ^ PortX.Y > 0 THEN
    Old.Y = PortX.Y
    IF PortX.Y = 1 THEN GOTO DoSomething
    ENDIF
    GOTO TopOfLoop


    DoSomething:



    The program loops and tests the port bit against a saved value using
    the bitwise exclusive OR. If the saved value is different, then "Old"
    is set equal to the port bit. Only when the Port bit has switched from
    "0" to "1" will it jump out of the loop.
    Charles Linquist

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


    Did you find this post helpful? Yes | No

    Thumbs up

    If you need to detect say only one or two pins on falling (or rising edge), then you may want to use timers in counter mode. Should work for you.

    Then have a check like

    Code:
    IF TMR0=1 THEN 'TMR0 is either on falling or rising edge as you need.
    TMR0=0
    GOSUB GET_PIZZA
    ENDIF
    "If the Earth were a single state, Istanbul would be its capital." Napoleon Bonaparte

  3. #3
    Join Date
    Mar 2006
    Location
    INDIA
    Posts
    89


    Did you find this post helpful? Yes | No

  4. #4
    Join Date
    Jun 2005
    Location
    Wisconsin
    Posts
    382


    Did you find this post helpful? Yes | No

    Default

    I know you're new to PICBasic but you may want to take a look here:

    http://ww1.microchip.com/downloads/e...Doc/41214a.pdf

    Read through this document and see if anything in there is close to what you were looking for. If so the Capture/Compare/PWM module in the pic is what you will want to use.

  5. #5
    RMCRAVEN's Avatar
    RMCRAVEN Guest


    Did you find this post helpful? Yes | No

    Default

    Many thanks for the varied and detailed replies. I've downloaded the PDFs as recommended and I am trying to make sense of the info therein. I do appreciate the replies and I was hoping to be able to embrace some of the information, but ...

    I have a question relating to the learning curve - could someone have a look through the following prose and let me know if I should pack it in or persevere please?

    Now is the time for me to admit that I have spent at least 3-4 hours most evenings for the last fortnight trying to compile something that I can understand. So far, all I have managed is to modify an example program to get a couple of buttons to latch a couple of LEDs and a third button to switch them off. I estimate a total of about 30 hours of my effort to get to this stage.

    I had a choice of PicBasic or C or ASM and I chose what I hoped would be the easiest. I think I made the right choice but I am also beginning to think that even Basic is beyond me.

    I have tried drawing a flowchart of what I need - it helped slightly but the fundamental problem is one of understanding the Basic commands. Here are my observations regarding my own dismal progress:

    1) Things like (for example) the BUTTON command don't seem to behave the way I expect them to behave.

    2)How on earth anyone ever follows more than one for..next loop, especially nested ones, is beyond me.

    3) More than one variable? How do you ever keep track of it in your mind, or even by using loads of diagrams and paperwork?

    4) Conditionals such as If..then..else doesn't seem to work - I can see the "if" and "then" parts but the "else" seems to be missing in most examples, or at least the "flow" of the program appears incongruous.

    There are a dozen applications for PICs that even I can see should be simple to arrive at (relating to MIDI and aspects of analogue electronic music in particular - trigger generators, clock dividers, interfaces and so on) but the time is approaching for me to throw in the towel.

    I had thought that I should see some useful prgoress in two weeks ! Perhaps I should invest in some books - can anyone recommend an ideal title for someone who has ZERO programming skill?

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


    Did you find this post helpful? Yes | No

    Default

    I will take number 1.

    Quote Originally Posted by RMCRAVEN

    1) Things like (for example) the BUTTON command don't seem to behave the way I expect them to behave.

    I never used Button command so far because it is complicated for me too.
    Use IF...THEN instead. Much simplier, easier...

    But of course this does not remove Button command from the Earth! It will always be there for someone.
    "If the Earth were a single state, Istanbul would be its capital." Napoleon Bonaparte

  7. #7
    Join Date
    May 2004
    Location
    New England
    Posts
    164


    Did you find this post helpful? Yes | No

    Default

    I'll try 2 & 3...

    Code:
    For CounterA = 1 To 20   ; "CounterA" keeps track of the loop count for the first FOR/NEXT loop
    
        For CounterB = 1 To 10   ; "CounterB" keeps track of the loop count for the second FOR/NEXT loop
            Pause 1
        Next CounterB
        
        Pause 1
    Next CounterA
    What happens is...

    The first loop begins (call it the "A" loop), and "CounterA" is automatically set to '1' at its start.

    The next line of code starts up a second loop (the "B" loop), setting "CounterB" to '1' at the start of that loop.

    Since the first "Next" command is the "Next CounterB" line of code, the "B" loop will now continue for 10 iterations until it is finished.

    We now hit the "Next CounterA" line - we go back to the beginning of "A" loop, the "CounterA" variable is incremented by 1, and then we restart the "B" loop again, finishing it before again going back to the "A" loop.

    The "B" loop runs start to finish each time through the "A" loop. The "B" loop will be run a total of 20 times, for a total of 200 cycles (10 cycles per "B" loop, times 20 "A" loops).

    While a FOR/NEXT loop is running, you want to make sure your code does not alter the "Counter" variable that is used to store the loop count (unless you are intentionaly changing it!).
    Before a FOR/NEXT loop starts, or once the loop is finished, the variable can be used freely for other purposes in your code.


    On #3... Give the variables names that mean something to you - instead of x, y, z, etc, use RedLED, GreenLED (pin variables), EventCount, PumpStatus, etc. Try not to use abbreviations, as you'll forget what they mean after a short time (I always do anyways).


    Clear as mud? :-)

    Arch
    Last edited by Archilochus; - 1st October 2006 at 17:04.
    "Data sheets? I ain't got no data sheets. I don't need no data sheets. I don't have to read any stinking data sheets!"

  8. #8
    RMCRAVEN's Avatar
    RMCRAVEN Guest


    Did you find this post helpful? Yes | No

    Default

    Well, those responses were both quick and illuminating! Unfortunately, a couple of hours of experimenting and my loops won't work (the compiler tells me I need an "else" and then tells me that the else isn't associated with a for..next!).

    I've spent too long on trying to learn today - time to try again tomorrow. Thanks for everybody's assistance though; I'll press on with it during the week and see if anything begins to sink in.

    Cheers

    RMC, England

  9. #9
    malc-c's Avatar
    malc-c Guest


    Did you find this post helpful? Yes | No

    Default

    Sometimes the best way to understand how to structure code is to look at some examples and work your way through it, and then modify it. To give you some idea on how FOR / NEXT loops work:

    For (variable) = (start value) to (stop value)
    Do something
    Next (variable)

    so:

    led var PORTB.0
    i var byte

    For i = 1 to 10
    high LED
    pause 1000
    low led
    pause 1000
    NEXT i

    Would turn on an LED on PORTB.0 for 1 second, then turn it off for a second ten times (ie untl i = 10)

    If you want to count up in jumps, or count down you use the STEP command

    For (variable) = (start value) to (stop value) step (value)

    So
    For i = 20 to 1 step -1
    would effectively count down from 20 to 1 in single digits (ie 19,18,17.... etc)

    For i = 1 to 100 step 2
    would count give values for i in even values upto 100 (2,4,6,8... etc)

    Hope this helps

Similar Threads

  1. mS Timer
    By whmeade10 in forum mel PIC BASIC Pro
    Replies: 6
    Last Post: - 8th September 2020, 12:12
  2. Newbie making an ignition timer
    By ChrisHelvey in forum mel PIC BASIC Pro
    Replies: 17
    Last Post: - 5th August 2012, 17:45
  3. RC Servo decoding/encoding using 12F683
    By ScaleRobotics in forum Code Examples
    Replies: 13
    Last Post: - 14th September 2010, 00:49
  4. Phase failure detection
    By ardhuru in forum mel PIC BASIC Pro
    Replies: 3
    Last Post: - 9th January 2007, 00:53
  5. Auto Baud Rate Detection
    By mytekcontrols in forum Serial
    Replies: 10
    Last Post: - 31st October 2005, 02:17

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