Hola, estoy intentando usar el modo PWM para controlar las RPM de un cooler : el codigo es el siguiente:
;-------------------------------------------------
;
;Palabra de configuracion
;
;-------------------------------------------------
list P=16F877A ;Comando que indica el Pic usado
#include "p16F877A.inc" ;Etiquetas genéricas para el Pic16F887
; __config 0xFFFD
__CONFIG _FOSC_XT & _WDTE_OFF & _PWRTE_OFF & _BOREN_ON & _LVP_ON & _CPD_OFF & _WRT_OFF & _CP_OFF
;-------------------------------------------------
;
; Definicion de variables
;
;-------------------------------------------------
;-------------------------------------------------
;
; Vectores de reset/interrupcion
;
;-------------------------------------------------
ORG 0x00
GOTO EMPEZAR
ORG 0x04
GOTO INTERRUPCION
;-------------------------------------------------
;
; Configuracion
;
;-------------------------------------------------
EMPEZAR
MOVLW 0x07
MOVWF CMCON
BSF STATUS, RP0 ; Banco 1
BCF STATUS, RP1
BCF TRISC,2
;-----------Congurar PWM
MOVLW D'255'
MOVWF PR2 ; PERIODO del PWM
;----------------------
MOVLW B'10000111' ; ------ Configuramos el option REG con disivor 1:64 y R PULL up
MOVWF OPTION_REG
MOVLW B'11000000' ; ------ Habilito Interrupcione por EXT
MOVWF INTCON
MOVLW 0x06
MOVWF ADCON1
BCF STATUS, RP0 ; Banco 0
;-------Configuracion PWM
MOVlW B'00011100' ; Habilita el MODO-PWM , Bits 4 y 5 se confugran en base al ciclo que queramps ( ver 2 bits restantes de ccpr1l)
MOVWF CCP1CON
;MOVLW D'255' ; Ciclo de trabajo 100% , los bit restantes del CCp1 van en Restante (11)
;MOVLW D'166' ; Ciclo a 65%; los restantes(01)
MOVLW D'76' ; Ciclo a 30%; los restantes (11)
MOVWF CCPR1L
BCF PIR1,TMR2IF ; Limpia bandera por desbordamiento de TMR2
MOVLW B'00000100' ; Habilita y selecciona el prescaler del TMR2 ( divisor 1:1)
MOVWF T2CON
; HAY que esperar desbordamiento de tmr2 para poner el tris como salida
;-----------------
BSF INTCON, GIE
;-------------------------------------------------
;
; Programa Principal
;
;-------------------------------------------------
INICIO
nop
BTFSC PIR1, TMR2IF
BCF,TMR2IF
GOTO INICIO
;-------------------------------------------------
INTERRUPCION
GOTO INICIO
END
El problema que se me presenta es que, si no le pongo la instruccion " BCF,TMR2IF " en el main que es para limpiar el flag de cuando TMR2 iguala al PR2 en el proteus me tira error de "Stack overflow interruption" o algo asi, supongo que es porque nunca limpio la bandera esa, agregando esa instruccion, que limpia la bandera, no me tira mas ese error, pero la idea mia es que si hay que limpiar esa bandera lo pueda hacer desde una sub-rutina de interrupcion y no todo el tiempo preguntando desde el "main" , como estoy haciendo en el codigo que subi, si esa bandera esta en 1 o 0. En teoria deberia saltarme la interrupcion ( cuando se pone en 1 la flag de TRM2) e irme a la posicion 0x04 y de ahi a la subrutina de INTERRUPCION, pero no pasa eso como las demas interrupcion que use antes ( TMR0, INT/RB0 , RB4-RB7), obviamente algo mal estoy haciendo. Con esas dos instrucciones "BTFSC PIR1, TMR2IF y BCF,TMR2IF " que estan en el main anda bien en el proteus, pero no me agrada la idea, como dije anteriormente, de preguntar todo el tiempo si esta o no en 1 esa bandera, espero que me puedan ayudar.
Saludos.