PBP projects for R/C models


Closed Thread
Results 1 to 40 of 772

Hybrid View

  1. #1
    Join Date
    Nov 2003
    Location
    Wellton, U.S.A.
    Posts
    5,924


    Did you find this post helpful? Yes | No

    Default

    Ken,

    Darrel's site must have been down for what evere reason. It seems to work now.
    http://www.PBPgroup.com/

    ASM instuctions are normally in the devices data sheet. But... Please do not take this the wrong way. If you are having trouble with Basic I doubt it ASM will do much good.

    I like remto's sugesstion about blinky. Give that a shot.
    Dave
    Always wear safety glasses while programming.

  2. #2
    Join Date
    May 2007
    Posts
    604


    Did you find this post helpful? Yes | No

    Default

    Quote Originally Posted by mackrackit View Post
    Ken,

    ....ASM instuctions are normally in the devices data sheet. But... Please do not take this the wrong way. If you are having trouble with Basic I doubt it ASM will do much good.

    I like remto's sugesstion about blinky. Give that a shot.
    Ken, I highly recommend taking Dave's advise. You need a better understanding of what makes a PIC tick (hint, read the free book I linked to). When you have that under your belt, then the coding is the really easy part. It doesn't matter whether you use C, BASIC (PBP or some other variant) or ASM - the situation is the same.

  3. #3
    Join Date
    Feb 2006
    Location
    Gilroy, CA
    Posts
    1,530


    Did you find this post helpful? Yes | No

    Default 12f683 servo pass through

    Here is some code that will measure an RC receiver pulse width coming in on GPIO.2, perform a little math on the value, and put out the wave form out on GPIO.1, using DT Interrupts.

    It's on a little 12F683 and was written for 8mhz internal. Looks pretty good on the scope. I need to test it on a motor controller though. But time for bed.....

    Code:
    <html>
    <head></head>
    <body><!--StartFragment--><pre><code><font color="#000080"><i>
    </i></font><b>DEFINE </b>OSC 8
    <b>INCLUDE </b><font color="#FF0000">&quot;DT_INTS-14.bas&quot;</font><font color="#000080"><i>;interrupt routines
    </i></font><b>INCLUDE </b><font color="#FF0000">&quot;sub16.inc&quot;     </font><font color="#000080"><i>; subtract 16 bit macro
    
    </i></font><b>DEFINE </b>DEBUG_REG	GPIO
    <b>DEFINE </b>DEBUG_BIT	0
    <b>DEFINE </b>DEBUGIN_BIT	1
    
    <b>DEFINE </b>DEBUG_BAUD	38400
    <b>DEFINE </b>DEBUG_MODE	0
    
    INTCON = %10101000      <font color="#000080"><i>'
    </i></font>OSCCON = %01110000      <font color="#000080"><i>'set for 8mhz internal
    </i></font>CMCON0 = 7              <font color="#000080"><i>'TURN COMPARITORS OFF
    </i></font>ANSEL  = %00000000      <font color="#000080"><i>'Set A/D OFF
    </i></font>ADCON0 = %00000000      <font color="#000080"><i>'Analog converter OFF 
    </i></font>TRISIO = %010100        <font color="#000080"><i>'Set GSIO 4 and 2 to INPUT, others to OUTPUT
    </i></font>OPTION_REG = %11000010
    T1CON  = %00110001
    T2CON  = %01001110
    CCP1CON = %00000101
    
    risetime <b>VAR WORD       </b><font color="#000080"><i>;used for pulse width measure start of pw
    
    </i></font>falltime <b>VAR WORD       </b><font color="#000080"><i>;time at end of pulse width
    </i></font>falltime_l <b>VAR </b>falltime.Byte0
    falltime_h <b>VAR </b>falltime.Byte1
    risetime_l <b>VAR </b>risetime.Byte0
    risetime_h <b>VAR </b>risetime.Byte1
    pulsewidth <b>VAR WORD
    </b>pulsewidth_l <b>VAR </b>pulsewidth.Byte0
    pulsewidth_h <b>VAR </b>pulsewidth.Byte1
    
    ServoOut <b>VAR </b>GPIO.1
    ServoOut = 0
    pulse <b>VAR BYTE
    
    </b>TMR0 = 0
    pulse = 255
    bittest <b>VAR BIT
    
    ASM
    </b><font color="#008000">INT_LIST  macro    </font><font color="#000080"><i>; IntSource,        Label,  Type, ResetFlag?
            </i></font><font color="#008000">INT_Handler   TMR0_INT,   PulseOut,   ASM,  yes
            INT_Handler   TMR2_INT,   period,     ASM,  yes
            INT_Handler   CCP1_INT,   PWMeasure,  ASM,  yes
        endm
        INT_CREATE               </font><font color="#000080"><i>; Creates the interrupt processor
    
        </i></font><font color="#008000">INT_ENABLE  TMR0_INT     </font><font color="#000080"><i>; Enable pulseout interrupts  
        </i></font><font color="#008000">INT_ENABLE  TMR2_INT     </font><font color="#000080"><i>; enable period interrupt (20ms)
        </i></font><font color="#008000">INT_ENABLE  CCP1_INT     </font><font color="#000080"><i>; enable interrupt to increment pulse width (test)
    </i></font><b>ENDASM
        PAUSE </b>200
    Main:
        <b>PAUSE </b>20
        <font color="#000080"><i>;debug dec pulsewidth,&quot; &quot;,10,13
        </i></font>pulse = ((pulsewidth * 8)/10)-167 <font color="#000080"><i>;scale to fit into a byte
        </i></font>pulse = 255 - pulse               <font color="#000080"><i>;reverse the stick 
        
    
    </i></font><b>GOTO </b>Main
    
    <font color="#000080"><i>'---[TMR0_INT - interrupt handler]------------------------------------------
    
    </i></font><b>ASM
    </b><font color="#008000">PulseOut
        btfsc _bittest      </font><font color="#000080"><i>;test status of bittest bit
        </i></font><font color="#008000">goto $+7            </font><font color="#000080"><i>;if high skip 7 lines
        </i></font><font color="#008000">bcf INTCON,5        </font><font color="#000080"><i>;stop timer
        </i></font><font color="#008000">movf _pulse,w       </font><font color="#000080"><i>;load TMR0 with value of pulse variable
        </i></font><font color="#008000">movwf TMR0
        bsf _bittest        </font><font color="#000080"><i>;set bittest bit, indicating we are on second half
        </i></font><font color="#008000">bsf INTCON,5        </font><font color="#000080"><i>;start timer again for second interrupt
        </i></font><font color="#008000">goto $+3            </font><font color="#000080"><i>;skip to return from interrupt
        </i></font><font color="#008000">bcf INTCON,5        </font><font color="#000080"><i>;stop timer
        </i></font><font color="#008000">bcf _ServoOut       </font><font color="#000080"><i>;bring ServoOut pin low for end of pulse width
        </i></font><font color="#008000">INT_RETURN
    
    
    
    </font><b>ENDASM
    </b><font color="#000080"><i>'---[TMR2_INT - interrupt handler]------------------------------------------
    </i></font><b>ASM
    </b><font color="#008000">period
        movlw d'72'          </font><font color="#000080"><i>;fine tune timer2 period
        </i></font><font color="#008000">movwf TMR2    
        bcf INTCON,2         </font><font color="#000080"><i>;clear timer flag if set
        </i></font><font color="#008000">movlw d'17'          </font><font color="#000080"><i>;set timer0 first 1ms time base
        </i></font><font color="#008000">movwf TMR0    
        bsf INTCON,5         </font><font color="#000080"><i>;enable timer0 interrupt 
        </i></font><font color="#008000">bsf _ServoOut        </font><font color="#000080"><i>;set ServoOut pin high (begin pulse width)
        </i></font><font color="#008000">bcf _bittest
        INT_RETURN
    </font><b>ENDASM
    </b><font color="#000080"><i>'---[CCP1_INT - interrupt handler]------------------------------------------
    </i></font><b>ASM
    
    </b><font color="#008000">PWMeasure
    
        BTFSS   CCP1CON, CCP1M0 </font><font color="#000080"><i>; Check for falling edge watch
        </i></font><font color="#008000">GOTO    FALL_EDGE       </font><font color="#000080"><i>; Go pick up the falling edge
        </i></font><font color="#008000">MOVF    CCPR1L,W        </font><font color="#000080"><i>; else store leading edge value
        </i></font><font color="#008000">MOVWF   _risetime_l         </font><font color="#000080"><i>; into 16 bit word risetime
        </i></font><font color="#008000">MOVF    CCPR1H,W
        MOVWF   _risetime_h
        BCF     CCP1CON, CCP1M0 </font><font color="#000080"><i>; Now capture the trailing edge
        </i></font><font color="#008000">GOTO    ISR_2           </font><font color="#000080"><i>; Exit the interrupt service routine
            
    </i></font><font color="#008000">FALL_EDGE:
        BSF     CCP1CON, CCP1M0 </font><font color="#000080"><i>; Re-set for trailing edge capture
        </i></font><font color="#008000">MOVF    CCPR1L,W        </font><font color="#000080"><i>; Store the captured value into
        </i></font><font color="#008000">MOVWF   _falltime_l         </font><font color="#000080"><i>; falltime_l and ...
        </i></font><font color="#008000">MOVF    CCPR1H,W
        MOVWF   _falltime_h       </font><font color="#000080"><i>;             ... falltime_h
        ;
        ; 16 bit subtract 
        ;     falltime = falltime - risetime
        ;
        </i></font><font color="#008000">SUB16   _falltime, _risetime   </font><font color="#000080"><i>;do 16 bit subtraction to find width
        </i></font><font color="#008000">movf _falltime_l,w
        movwf _pulsewidth_l
        movf _falltime_h,w
        movwf _pulsewidth_h
    ISR_2
        INT_RETURN
    
    
    </font><b>ENDASM
    
    
    </b></code></pre><!--EndFragment--></body>
    </html>

  4. #4
    Join Date
    Nov 2009
    Location
    Fitchburg, Mass
    Posts
    483


    Did you find this post helpful? Yes | No

    Default Up to page 19 in DS33014K

    At last I am getting the correct reference materials.

    DS33014K is telling me about MPASM Assembler, Library and Linker.

    I have ordered from Belgrade "PIC Microcontrollers". It is being shipped by air. That alone is pretty amazing. Just a little paperback book.

    I have also found an online book at:

    http://www.mikroe.com/en/books/picmcubook/ch0/

    It may be the same book only on line. I am old fashioned. I like to read from paper.

    I have plenty of studying to do. Thank you again and again.

    Ken

  5. #5
    Join Date
    Nov 2009
    Location
    Fitchburg, Mass
    Posts
    483


    Did you find this post helpful? Yes | No

    Default mackrackit: where do I get your .INC

    I copied your code snip from POST #73 at 3:02 on the 28th of January.

    I noticed in the .asm code that it wanted to:

    INCLUDE "MACKRA~1.MAC"

    There is no such file in my computer. Do I need a copy? May I have one?

    Also the compiler complained that:

    Error 118: "Overwriting previous address contents (2007)

    Page 157 of DS33014K says that Error 118 occurred because "Code was previously generated for this address" I assume it is talking about address (2007). I do not see where in the .asm code this is happening. I do not even know what to look for.

    Ken

  6. #6
    Join Date
    Nov 2009
    Location
    Fitchburg, Mass
    Posts
    483


    Did you find this post helpful? Yes | No

    Default I need to send one pulse every 20ms

    Mackrackit,

    From what I understand your code will do a PWM every time TMR0 overflows.

    What I need to do is make this overflow happen every 20ms. That is 50 pulses per second. We have a 4 meg oscillator. If I were designing this counter I think I would have it set to 20,000 each time it overflows. I gather from page 74 of the Data Sheet that this is not possible. The biggest prescaler is 256.

    How about a routine that counts these interrupts until 1/50 of a second has elapsed then calls PWM? I would have it send one pulse out pin 1 with the duty as defined by "duty". It would look like

    PWM 1,duty,1

    I have found a section on Timers in a book called Running Small Motors with PIC Microcontrollers that has an example of MicroEngineering Labs code that makes an eight digit LCD display the time in hours, minutes and seconds. I think this code must do something like I need.

    Ken

  7. #7
    Join Date
    May 2007
    Posts
    604


    Did you find this post helpful? Yes | No

    Default

    You want 20,000 counts before it overflows. Setting the prescaler to 1:256, you will need 20,000/256 counts = 78. The counter rolls over (overflows and sets T0IF) when it reaches 255, so if you pre-load it with 255-78 = 177, then it will overflow approximately every 20mS.

  8. #8
    Join Date
    Nov 2003
    Location
    Wellton, U.S.A.
    Posts
    5,924


    Did you find this post helpful? Yes | No

    Default

    Quote Originally Posted by Kenjones1935 View Post
    Mackrackit,
    From what I understand your code will do a PWM every time TMR0 overflows.
    The code in post #73 will toggle a LED when TMRO overflows. The LED on PORTD.7 will gradually become brighter then turn off and start over again.

    This was just an example of an interrupt working with something else going on.

    You do have to be careful with this as things will sometimes not work as expected. Like they say, the machine will do what it is told, not what you want

    This is the same code as in post #73 with some modifications to demonstrate a "pitfall".
    The START loop still has PORTD.7 PWMing the LED with PORTD.0 added to be toggled.
    Inside of the interrupt loop the same PWM that is on PORTD.7 is now on PORTD.6.

    What do you think will happen?
    What does happen?
    Code:
    '16F887 INT RUPT
    '44 PIN DEMO BOARD
    
     @ __config _CONFIG1, _INTRC_OSC_NOCLKOUT & _WDT_ON & _MCLRE_OFF & _LVP_OFF & _CP_OFF
    
     INTCON.5 = 1    'ENABLE TMR0  DATA SHEET SECTION 14.3.2
     OSCCON = %01110000 '8 Mhz
     OPTION_REG = %10000111  ' 1:256 PRESCALE
     ON INTERRUPT GOTO TLOOP
     CNT  VAR BYTE
     D    VAR BYTE
     D = 0
     HIGH PORTD.0
     PAUSE 500
    
     START:
     FOR CNT = 0 TO 150
     PWM PORTD.7,D,100
     D = D + 2
     NEXT CNT
     TOGGLE PORTD.0
     PAUSE 100
     GOTO START
    
     DISABLE
     TLOOP:
     INTCON.2=0 ' DATA SHEET SECTION 14.3.2
     TOGGLE PORTD.4
     FOR CNT = 0 TO 150
     PWM PORTD.6,D,100
     D = D + 2
     NEXT CNT
     RESUME
     ENABLE
    Dave
    Always wear safety glasses while programming.

  9. #9
    Join Date
    Nov 2009
    Location
    Fitchburg, Mass
    Posts
    483


    Did you find this post helpful? Yes | No

    Default Code in #73 WORKS!!

    Just like you said it would.

    Now on to your next one. It compiles and works also. I see what it does. I need to figure out how.

    Thank you!!

  10. #10
    Join Date
    Nov 2003
    Location
    Wellton, U.S.A.
    Posts
    5,924


    Did you find this post helpful? Yes | No

    Default

    Quote Originally Posted by Kenjones1935 View Post
    I copied your code snip from POST #73 at 3:02 on the 28th of January.
    I noticed in the .asm code that it wanted to:
    INCLUDE "MACKRA~1.MAC"
    There is no such file in my computer. Do I need a copy? May I have one?
    Looks like you have the code named MACKRACKIT?
    The *.MAC file is the macro file generated by PBP. It will be in your project directory. The name is chopped to the 8.1? standards.
    Also the compiler complained that:
    Error 118: "Overwriting previous address contents (2007)
    Page 157 of DS33014K says that Error 118 occurred because "Code was previously generated for this address" I assume it is talking about address (2007). I do not see where in the .asm code this is happening. I do not even know what to look for.

    Ken
    Looks like you are setting the configs in the *.inc file. I have them in the code. Just comment that line out and it should be OK.
    Dave
    Always wear safety glasses while programming.

Similar Threads

  1. PBP Book
    By Bruce in forum Off Topic
    Replies: 83
    Last Post: - 4th October 2021, 12:55
  2. PBP Extensions, What are they?
    By PJALM in forum PBP Extensions
    Replies: 9
    Last Post: - 28th September 2021, 11:26
  3. 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
  4. Newby- PBP wont compile for 18F (MPLAB)
    By jd76duke in forum mel PIC BASIC Pro
    Replies: 1
    Last Post: - 17th December 2005, 23:30
  5. Making PBP code more modular
    By forgie in forum General
    Replies: 30
    Last Post: - 25th October 2005, 16:24

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