Continue to Site

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.

  • 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.

caputre problem and pwm

Status
Not open for further replies.

ami85t

New Member
Hi,
I'm having trouble with the capture module and might be also with the PWM module.
I inserted the led section in the program for verifying that the loop in the code works for the different sections.
The led does turn on and the first transmitting part does it's job. but the led doesn't flicker - what means that
there's something wrong at the loop for checking the PIR2, CCP2IF.
Do the sections of the code for the PWM and capture seem correct? do I need to power on the timer1 only before the
capturing process and use the flags the way I did?

Thanks, Amitai


Code:
LIST    P=PIC16F877
       
include    <P16f877.inc>
org        0x00

    __CONFIG _LVP_OFF &_WDT_OFF &_PWRTE_OFF &_CP_OFF & _HS_OSC   

    reset:
    nop
    goto    start
    org        0x20

start:
; configuration
;-----------------------------------

; used_ registers:
    MUX_sel            EQU H'0021'          ; for not transmitting '000000000'
    del1            EQU H'0030'          ; for delay
    del2            EQU H'0031'          ; for delay
    tro_transmit    EQU H'0050'          ; Frequency data register
    chk_zero        EQU H'0055'          ; for not transmitting '000000000'
    demo_send         EQU H'0056'          ; FF sent in beginning
    led1            EQU H'0070'          ; for led delay

    banksel        ADCON1
    movlw        0x07                ; pin RA5 is configured as a digital I/O                                   
    movwf        ADCON1

;UART/*/*/
    banksel      TXSTA
    movlw        0x24                 ; master, transmit EN, sync mode, Transmit Shift Register empty
    movwf        TXSTA                   ; Baud Rate = Fosc/(4(SPBRG+1)) , BRGH (baud rate) ignored in sync
   
    banksel        TRISC
    bsf              TRISC, 6
    bsf             TRISC, 7   
   
    banksel        SPBRG
    movlw         0x10                   ; = d"16" which corresponds to 15Kbps with 8MHz clock
    movwf         SPBRG
   
    banksel      RCSTA
    movlw        0x80                  ; enable UART   
    movwf        RCSTA   
   
;PWM, timer2/*/*/
    banksel        TRISC
    bcf            TRISC, 2             ; make the CCP1 pin an output.
    banksel        T2CON
   
    movlw        0x04
    movwf        T2CON                ; no post/Prescaler (1:1) , TMR2 ON
   
    banksel        PR2                    ; output frequency = 15000hz     =           
    movlw        0x84
    movwf        PR2                    ; 1 / [(PR2) + 1] • 4 • TOSC •(TMR2 prescale value)
   
    banksel        CCPR1L                ;duty cycle =(CCPR1L:CCP1CON<5:4>) • TOSC • (TMR2 prescale value)
    movlw        0b01000010    
    movwf        CCPR1L               
    banksel        CCP1CON
    movlw        0b00111100    
    movwf        CCP1CON

;capture, timer1 /*/*/
    banksel        TRISC
    bcf            TRISC, 1             ; make the CCP2 pin an output.

    banksel        T1CON
    movlw        0x09                ; Timer1 Input Clock Prescale 1:1, en TMR1
    movwf        T1CON                ; , int clk (fosc/4) , oscillator en
    banksel        CCP2CON
    movlw        0x07
    movwf        CCP2CON                ; Capture mode, every 16th rising edge
    banksel        PIE2
    bcf            PIE2, CCP2IE        ; avoid false interrupts
   
;MUX select
    banksel        TRISD
    bcf            TRISD, 0
    bcf            TRISD, 1
    bcf            TRISD, 2

;LED general delay
    bcf            TRISD, 4
    bcf            TRISD, 5
    banksel        PORTD   
    bcf            PORTD, 4
    bcf            PORTD, 5
   
; end configuration --------------------------------------




;************ MAIN PROGRAM ***************
;*****************************************

main:
   
;MUX init
    movlw        0x07
    movwf        MUX_sel
   
;transmit check /*/*/*/*
    CALL        DELAY
    movlw        0xFF
    movwf        demo_send
    movf        demo_send, w 
    CALL         transmitting_data      

main_loop:

        Led_flicker:
        movlw         0xFF
        movwf        led1
        t2:
        CALL        DELAY
        CALL        DELAY
        CALL        DELAY
        CALL        DELAY
        decfsz        led1
        goto        t2
       
        bcf            PORTD,5
        bsf            PORTD,4       
       
        banksel        led1       
        movlw         0xFF
        movwf        led1
        t1:
        CALL        DELAY
        CALL        DELAY
        CALL        DELAY
        CALL        DELAY
        decfsz        led1
        goto        t1

        bcf            PORTD,4
        bsf            PORTD,5
;---end Led flicker

;capture frequency/*/*
    banksel        TMR1H   
    clrf        TMR1H
    clrf        TMR1L
    check_capture:       
    banksel        PIR2
    btfss        PIR2, CCP2IF                            ; 1  = A TMR1 register capture occurred (must be cleared in software)
    goto        check_capture

;transmitting data   
    banksel        CCPR2H                            ; transmit MSB
    movf        CCPR2H, w
    banksel        tro_transmit
    movwf        tro_transmit
    CALL         transmitting_data
   
    banksel        CCPR2L                            ; transmit LSB
    movf        CCPR2L, w
    banksel        tro_transmit
    movwf        tro_transmit
    CALL         transmitting_data
       
;MUX select/*/*/
    movf        MUX_sel,w
    banksel        PORTD
    movwf        PORTD
    decfsz        MUX_sel
    goto        main_loop
    movlw        0x07
    movwf        MUX_sel
   
goto main_loop

   
               
;******** END MAIN LOOP ********************       

transmitting_data:
    banksel        TXREG
    movwf       TXREG                            ; writing to TXREG clears TXIF
    trans_wait2:
    btfss        PIR1, TXIF                        ; wait for the frame to be transmitted
    goto        trans_wait2
    CALL        DELAY
    return

DELAY:
        movlw    0xFF
        movwf    del1
        movlw    0xFF
        movwf    del2
   
        loopa:
        decfsz    del1, f
        goto    loopa
        loopb:
        decfsz    del2, f
        goto    loopb
        return
       
end
 
Status
Not open for further replies.

New Articles From Microcontroller Tips

Back
Top