¿Necesita ayuda con la salida PWM PIC16F887

3

Estoy intentando que el subsistema PWM funcione en un PIC16F887. He repasado esto varias veces y parece que no puedo encontrar mi problema.
Esto es parte de un programa más grande, pero por simplicidad reescribí solo la parte de PWM. Estoy utilizando la hoja de datos como mi guía para configurar el subsistema PWM, específicamente la página 131. no realmente preocupado por tener una frecuencia específica o ciclo de trabajo fuera. Solo estoy tratando de ver algún tipo de forma de onda fuera de los pines de PWM.
El código se compila bien, pero no obtengo salida de RC2.

Gracias por cualquier ayuda
No estoy seguro de por qué se dañó un poco la tabulación del código cuando se pegó en esta pregunta.

Placa: PIC16F887 c / w tarjeta de demostración de 44 pines (Microchip).
Programador: PICkit3
Compilador: gpasm

;*******************************************************
;Notes
;PWM is used on CCP1 which is P1A which is RC2
;********************************************************
    INCLUDE registers.asm
    __CONFIG 0X2EFF20E5

    ORG 0x00
    GOTO    MAIN

;******************************************************
;Main Program Loop
;******************************************************
    ORG 0X05
MAIN
    CALL    SETUP
    CALL    SETUP_PWM
wait
    BTFSS   PIR1,1  ;TEST TR2IF
    GOTO    wait
    BSF STATUS,5    ;Select Bank1
    CLRF    TRISC   ;START PWM
    BCF STATUS,5    ;Select Bank0
    BSF PORTD,0     ;ENTERING MAIN LOOP
main_loop
    GOTO    main_loop

;****************************************************************
;Setup Subroutine
;general setup
;****************************************************************
SETUP
    BSF STATUS,6    ;SELECT BANK 3
    BSF STATUS,5
    MOVLW   0X00
    MOVWF   ANSELH  ;CONFIGURE ALL PINS FOR DIGITAL IO
    MOVWF   ANSEL  
    BCF STATUS,6    ;SELECT BANK1
    BSF OSCCON,4    ;OSCILLATOR TO LOW SPEED
    BSF OSCCON,5
    BSF OSCCON,6
    MOVLW   0XFF    
    CLRF    INTCON  ;DISABLE INTERRUPTS
    CLRF    TRISD   ;PORTD AS OUTPUT  
    BCF STATUS,5    ;SELECT BANK0
    RETURN  
;********************************************************
;SETUP PWM MODULE 
;********************************************************
SETUP_PWM
    BCF STATUS,6    ;SELECT BANK1
    BSF STATUS,5
    MOVLW   0XFF    ;DEFINE PORT B AS INPUT
    MOVWF   TRISC   ;PORT C INPUT
    MOVWF   PR2     ;SET PWM PERIOD TO 33ms

    BCF STATUS,5    ;SELECT BANK0
    MOVLW   0X0C    ;SET FOR SINGLE OUTPUT ON P1A AND
    MOVWF   CCP1CON ;ACTIVE HIGH. LSBS OF DUTY =0
    MOVLW   0X25
    MOVWF   CCPR1L  ;SET HIGH BITS FOR DC=50% (Roughly)
    BCF PIR1,1      ;CLEAR TMR2IF
    BCF T2CON,0     ;SET TIMER2 PRESCALER TO 1
    BCF T2CON,1
    BSF T2CON,2     ;START TMR2
    RETURN  
    END

Según lo solicitado, registers.asm

;*******************************************
;ANY BANK
;*******************************************
STATUS  equ 0x03    
INTCON  equ 0x0B

;*******************************************
;Bank 0 Registers
;*******************************************
PORTB   equ 0x06    
PORTC   equ 0x07    
PORTD   equ 0x08
PIR1    equ 0x0c    
T2CON   equ 0x12    
CCPR1L  equ 0x15    
CCPR1H  equ 0x16    
CCP1CON equ 0x17
CCPR2L  equ 0x1b    
CCPR2H  equ 0x1c    
CCP2CON equ 0x1d

;*******************************************
;Bank 1 Registers
;*******************************************
OPTION_REG  equ 0x81
TRISB   equ 0x86    
TRISC   equ 0x87    
TRISD   equ 0x88    
PIE1    equ 0x8c
OSCCON  equ 0x8f
PR2 equ 0x92    
WPUB    equ 0x95    

;*******************************************
;Bank 3 Registers
;*******************************************
ANSEL   equ 0x0188
ANSELH  equ 0x0189
    
pregunta Michael

1 respuesta

1

Este es un proyecto en otro compilador (MPASM) y otro PIC16, pero podría ayudarle, tenga en cuenta la configuración del registro. El siguiente código se usa para controlar la velocidad de un motor utilizando un puente H, espero que funcione para usted:

;use of the CCP module to control motor speed using PWM include p16F877A.inc

cntr equ 20 cntr1 equ 21

__CONFIG _RC_OSC & _CP_OFF & _WDT_OFF org 00 goto start org 04 goto ISR org 06 ;main program************************************* start bsf STATUS, RP0 bcf STATUS, RP1 ; select bank 1 movlw 00 movwf TRISC movlw B'11111111' movwf TRISB movwf PR2 ; 255 to PR2 bcf OPTION_REG, 7 ; active pull-up bcf STATUS, RP0 ; select bank 0 movlw 00 movwf PORTC movlw B'00001100' ; enable PWM movwf CCP1CON movlw D'128' movwf CCPR1 ; 50% duty cycle(motor off) bsf T2CON, TMR2ON ; shoot tmr2 without post nor preescale bsf T2CON, T2CKPS1 ; prescaler in 16 movlw B'10001000' ; INTCON pattern movwf INTCON goto $ ;************************************************* ;SUBROUTINE DELAY********************************* ;************************************************* delay movlw D'255' movwf cntr del1 movlw D'10' movwf cntr1 del decfsz cntr1 goto del
decfsz cntr goto del1 return ;************************************************

;************************************************* ;INTERRUPT SERVICE ROUTINE************************ ;************************************************* ISR btfss PORTB, RB4 goto incSpeed btfss PORTB, RB5 goto decSpeed goto exit

incSpeed movlw D'255' xorwf CCPR1, W btfsc STATUS, Z ;test increment limit goto exit
call delay movlw D'1' addwf CCPR1, F btfss PORTB, RB4 goto incSpeed goto exit

decSpeed movlw 0 xorwf CCPR1, W btfsc STATUS, Z ;test decrement limit goto exit
call delay movlw D'1' subwf CCPR1, F btfss PORTB, RB5 goto decSpeed goto exit

exit bcf INTCON, RBIF retfie ;********************************************
end

Sugiero programar en compilador C

mirar el hardware (ISIS PROTEUS):

    
respondido por el user57657

Lea otras preguntas en las etiquetas