Velocidad de los PIC

A lo mejor quieres algo relacionado con PWM, ya me dirás.

Meta, te comento que ya probé los ejemplos de Capture con algunos cambios para mi pic y también utilicé display de 7 segmentos de manera conmutada. Probé con diferentes tiempos y timer, tanto XT como INTRC. Obtuve lecturas de la captura y todo muy bien. Muchas gracias.

Ahora, si no es abusar mucho, me gustaría ensayar con PWM ¿Podrías poner algo para darme una idea de cómo manejar esa característica?

Te quedo muy agradecido.
 
Última edición:
Hola:

Ningún problema. Me alegro que te funcionase los ejemplos de CCP.

Código:
;Los módulos CCPx.
;Modo PWM. Modulación de anchura de pulsos.
;
;Consiste en generar una señal de onda cuadrada por la línea RC2/CCP1 cuyo periodo puede
;ser modificado así como la anchura del pulso (Duty Cycle). El periodo se determina según la 
;fórmula T=(PR2+1)*4*Tosc*TMR2 preescaler. La duración del pulso o "Duty Cycle" (d) se deter-
;mina según d=(CCPR1L:CCP1CON<5:4>)*Tosc*TMR2 preescaler.
;
;El ejemplo emplea al módulo CCP1 con salida de señal por la línea RC2/CCP1. La señal de 
;salida tiene un periodo determinado pora la constante "Periodo" y una anchura "Duty" 
;determinada por la constante "Duty". Un osciloscopio conectado en RC2/CCP1 puede ayudar
;a realizar las oportunas medidas. Nosotros hemos empleado el modelo PoScope Basic 2.

        List    p=16F886        ;Tipo de procesador
        include    "P16F886.INC"    ;Definiciones de registros internos

;Ajusta los valores de las palabras de configuración durante el ensamblado.Los bits no empleados
;adquieren el valor por defecto.Estos y otros valores se pueden modificar según las necesidades

        __config    _CONFIG1, _LVP_OFF&_PWRTE_ON&_WDT_OFF&_EC_OSC&_FCMEN_OFF&_BOR_OFF    ;Palabra 1 de configuración
        __config    _CONFIG2, _WRT_OFF&_BOR40V                                    ;Palabra 2 de configuración

Periodo        equ    .250            ;Periodo de 1000 uS (250 * 4 de preescaler)
Duty        equ    .70                ;Anchura 280 uS (70 * 4 de preescaler)

            org    0x00            ;Vector de RESET    
            goto    Inicio    
            org    0x05

;Programa principal

Inicio          bsf        STATUS,RP0    
            bsf        STATUS,RP1    ;Banco 3
            clrf    ANSEL        
            clrf    ANSELH        ;Puertas A y B digitales
            bcf        STATUS,RP1    ;Banco 1
            movlw    b'11111011'
            movwf    TRISC        ;RC2 salida
            movlw    Periodo-1
            movwf    PR2            ;Carga el registro de periodos
            bcf        STATUS,RP0    ;Selecciona banco 0
            movlw    Duty
            movwf    CCPR1L        ;Carga la anchura del pulso

;El módulo CCP1 actúa en el modo PWM con salida de señal por RC2/CCP1

            movlw    b'00001100'
            movwf    CCP1CON

;El TMR2 trabaja con un preescaler 1:4 por lo que con una frecuencia de 4MHz evoluciona
;cada 4uS ((4*Tosc)*4)

            movlw    b'00000101'
            movwf    T2CON        ;T2 en On
    
Loop        nop
            goto    Loop        ;Bucle infinito        

            end                    ;Fin del programa fuente
Código:
;Los módulos CCPx
;Modo PWM. Variando la anchura del pulso a partir de una tensión analógica
;
;Los dispositivos PIC16F88X disponen de un convertidor A/D de 10 bits de resolución y 5 u 8 
;canales de entrada analógica. La tensión de referencia determina la resolución por bit:
;(Res. = Vref/1024). Con Vref=5 --> res.= 4.8 mV/Bit; con Vref=2.5V --> res.= 2.4 mV/Bit
;
;Se propone realizar una modulación de anchura de pulsos (PWM) mediante el módulo CCP1 y con
;salida de señal por la línea RC2/CCP1. La anchura se ajusta a partir de una tensión analógica
;que se introduce por RA0/AN0. Se establece un periodo fijo de 3200uS
;
;El TMR2 trabajando con un preescaler de 1:16 y a una frecuencia de 4 MHz evoluciona cada 16 uS
;
;Un osciloscopio conectado en RC2/CCP1 permitirá visualizar las variaciones del ancho de pulso 
;en la señal salida RC2/CCP1 según la tensión analógica aplicada por RA0/AN0. Nosotros hemos 
;empleado el modelo PoScope Basic 2.

        List    p=16F886        ;Tipo de procesador
        include    "P16F886.INC"    ;Definiciones de registros internos

;Ajusta los valores de las palabras de configuración durante el ensamblado.Los bits no empleados
;adquieren el valor por defecto.Estos y otros valores se pueden modificar según las necesidades

        __config    _CONFIG1, _LVP_OFF&_PWRTE_ON&_WDT_OFF&_EC_OSC&_FCMEN_OFF&_BOR_OFF    ;Palabra 1 de configuración
        __config    _CONFIG2, _WRT_OFF&_BOR40V                                    ;Palabra 2 de configuración

Periodo        equ    .200        ;Valor para el periodo de 3200uS (200*Preescaler de 16)

Duty_H        equ    0x20
Duty_L        equ    0x21        ;Variable para la anchura de pulso

            org    0x00        ;Vector de RESET    
            goto    Inicio
            org    0x05
    
;Programa principal

Inicio           bsf        STATUS,RP0
            bsf        STATUS,RP1    ;Banco 3
            movlw    b'00000001'
            movwf    ANSEL        ;RA0/AN0/C12IN0- entrada analógica, resto digitales
            clrf    ANSELH        ;Puerta B digital
            bcf        STATUS,RP1    ;Banco 1
            movlw    b'11111011'
            movwf    TRISC        ;RC2/CCP1 salida
            bcf        STATUS,RP0    ;Selecciona banco 0

            bsf        STATUS,RP0    ;Selecciona página 1
            clrf    ADCON1        ;Alineación izda. Vref= VDD para el convertidor
            bcf        STATUS,RP0    ;Selecciona página 0

;Se activa el ADC y se selecciona el canal RA0/AN0. Frecuencia de trabajo Fosc/32

Loop        movlw    b'10000001'
            movwf    ADCON0        ;ADC en On, seleciona canal AN0
            bcf        PIR1,ADIF    ;Restaura el flag del conversor AD
            bsf        ADCON0,GO    ;Inicia la conversión

;Esperar el final de la conversión y leer el resultado
ADC_Wait_0    btfss    PIR1,ADIF    ;Fin de conversión ??
            goto    ADC_Wait_0    ;Todavía no        
            movf    ADRESH,W
            movwf    Duty_H        ;Registra valor actual para el periodo
            bsf        STATUS,RP0    ;Selecciona página 1
            rrf        ADRESL,F
            rrf        ADRESL,W
            bcf        STATUS,RP0    ;Selecciona página 0
            andlw    b'00110000'
            movwf    Duty_L        ;Salva parte baja de la conversión
        
;El módulo CCP1 se configura en modo PWM con salida por RC2/CCP1. Los bits LSB se obtienen
;de la variable Duty_L

            movlw    b'00001100'
            iorwf    Duty_L,F
            movwf    CCP1CON        ;Modo PWM para el módulo CCP1

;El periodo se determina según el valor de la constante "Periodo". Este se carga sobre el
;registro PR2.

            movlw    Periodo-1
            bsf        STATUS,RP0    ;Selecciona página 1
            movwf    PR2
            bcf        STATUS,RP0    ;Selecciona página 0

;La anchura del pulso o "Duty" se determina según el valor con que se cargue el registro
;CCPR1L concatenado con los bits 4 y 5 de CCP1CON. Dichos valores se obtiene de las varia-
;bles Duty_H y Duty_L respectivamente.

            movf    Duty_H,W
            movwf    CCPR1L

;Trabajando con un preescaler 1:16 y a una frecuancia de 4MHz, el TMR2 evoluciona cada 16 uS.

            movlw    b'00000111'
            movwf    T2CON        ;TMR2 en On
            goto    Loop

            end                    ;Fin del programa fuente
Código:
;Los módulos CCPx
;PWM mejorado. Se aplica sólo al generador PWM del módulo CCP1.
;
;El modo PULSE STEERING. Permite obtener la misma señal PWM de salida, por hasta 4 patillas
;del controlador: RC2/P1A, RB2/P1B, RB1/P1C y RB4/P1C.
;
;En el ejemplo se genera una señal PWM a partir de una tensión analógica por RA0/AN0. Dicha 
;señal PWM se obtiene simultáneamente por las 4 salidas RC2/P1A, RB2/P1B, RB1/P1C y RB4/P1D
;
;Mediante un osciloscopio de doble trazo podemos ir analizando las señales de salida, de 2 en 2,
;para observar que son idénticas entre sí. También se puede emplear un analizador lógico para 
;visualizar simultánemante los cuatro canales de salida. Nosotros hemos empleado el modelo 
;PoScope Basic 2 en el modo analizador lógico de funcionamiento.

        List    p=16F886        ;Tipo de procesador
        include    "P16F886.INC"    ;Definiciones de registros internos

;Ajusta los valores de las palabras de configuración durante el ensamblado.Los bits no empleados
;adquieren el valor por defecto.Estos y otros valores se pueden modificar según las necesidades

        __config    _CONFIG1, _LVP_OFF&_PWRTE_ON&_WDT_OFF&_EC_OSC&_FCMEN_OFF&_BOR_OFF    ;Palabra 1 de configuración
        __config    _CONFIG2, _WRT_OFF&_BOR40V                                    ;Palabra 2 de configuración

Periodo        equ    .200        ;Valor para el periodo de 3200uS (200*Preescaler de 16)

Duty_H        equ    0x20
Duty_L        equ    0x21        ;Variable para la anchura de pulso

            org    0x00        ;Vector de RESET    
            goto    Inicio
            org    0x05
    
;Programa principal

Inicio           bsf        STATUS,RP0
            bsf        STATUS,RP1    ;Banco 3
            movlw    b'00000001'
            movwf    ANSEL        ;RA0/AN0/C12IN0- entrada analógica, resto digitales
            clrf    ANSELH        ;Puerta B digital
            bcf        STATUS,RP1    ;Banco 1

;RC2/P1A, RB2/P1B, RB1/P1C y RB4/P1D salidas PWM para el modo "PULSE STEERING"
            movlw    b'11101001'
            movwf    TRISB        
            movlw    b'11111011'
            movwf    TRISC        
            clrf    ADCON1        ;Alineación izda. Vref= VDD para el convertidor
            movlw    b'00001111'
            movwf    PSTRCON        ;Modo PULSE STEERING para P1A, P1B, P1C y P1D
            bcf        STATUS,RP0    ;Banco 0

;El periodo se determina según el valor de la constante "Periodo". Este se carga sobre el
;registro PR2.
            movlw    Periodo-1
            bsf        STATUS,RP0    ;Selecciona página 1
            movwf    PR2
            bcf        STATUS,RP0    ;Selecciona página 0

;Trabajando con un preescaler 1:16 y a una frecuancia de 4MHz, el TMR2 evoluciona cada 16 uS.
            movlw    b'00000111'
            movwf    T2CON        ;TMR2 en On

;Se activa el ADC y se selecciona el canal RA0/AN0. Frecuencia de trabajo Fosc/32
Loop        movlw    b'10000001'
            movwf    ADCON0        ;ADC en On, seleciona canal AN0
            bcf        PIR1,ADIF    ;Restaura el flag del conversor AD
            bsf        ADCON0,GO    ;Inicia la conversión

;Esperar el final de la conversión y leer el resultado
ADC_Wait_0    btfss    PIR1,ADIF    ;Fin de conversión ??
            goto    ADC_Wait_0    ;Todavía no        
            movf    ADRESH,W
            movwf    Duty_H        ;Registra valor actual para el periodo
            bsf        STATUS,RP0    ;Selecciona página 1
            rrf        ADRESL,F
            rrf        ADRESL,W
            bcf        STATUS,RP0    ;Selecciona página 0
            andlw    b'00110000'
            movwf    Duty_L        ;Salva parte baja de la conversión
        
;El módulo CCP1 se configura en modo PWM con salida por RC2/CCP1. Los bits LSB se obtienen
;de la variable Duty_L

            movlw    b'00001100'
            iorwf    Duty_L,F
            movwf    CCP1CON        ;Modo PWM para el módulo CCP1

;La anchura del pulso o "Duty" se determina según el valor con que se cargue el registro
;CCPR1L concatenado con los bits 4 y 5 de CCP1CON. Dichos valores se obtiene de las varia-
;bles Duty_H y Duty_L respectivamente.

            movf    Duty_H,W
            movwf    CCPR1L

            goto    Loop

            end                    ;Fin del programa fuente

Código:
;Los módulos CCPx
;PWM mejorado. Se aplica sólo al generador PWM del módulo CCP1.
;
;El modo semi puente en H (Half-Bridge). Genera dos señales de salida para activar cargas
;push-pull. La señal PWM se obtiene por RC2/P1A y su complementaria por RB2/P1B. Para evitar
;instantes en que ambas cargas push-pull pudieran estar activadas simultáneamente, con el
;consiguiente corto circuito que esto pudiera provocar, se puede generar un retardo programable
;entre ambas señales ("Dead-Band Delay").
;
;En el ejemplo se genera una señal PWM a partir de una tensión analógica por RA0/AN0. 
;
;Mediante un osciloscopio de doble trazo podemos analizar las señales de salida en RC2/P1A y en
;RB2/P1B, medir el periodo de las mismas, la anchura del pulso y el retardo entre ambas.
;Nosotros hemos empleado el modelo PoScope Basic 2 en el modo oscilador de funcionamiento.

        List    p=16F886        ;Tipo de procesador
        include    "P16F886.INC"    ;Definiciones de registros internos

;Ajusta los valores de las palabras de configuración durante el ensamblado.Los bits no empleados
;adquieren el valor por defecto.Estos y otros valores se pueden modificar según las necesidades

        __config    _CONFIG1, _LVP_OFF&_PWRTE_ON&_WDT_OFF&_EC_OSC&_FCMEN_OFF&_BOR_OFF    ;Palabra 1 de configuración
        __config    _CONFIG2, _WRT_OFF&_BOR40V                                    ;Palabra 2 de configuración

Periodo        equ    .200        ;Valor para el periodo de 3200uS (200*Preescaler de 16)

Duty_H        equ    0x20
Duty_L        equ    0x21        ;Variable para la anchura de pulso

            org    0x00        ;Vector de RESET    
            goto    Inicio
            org    0x05
    
;Programa principal

Inicio           bsf        STATUS,RP0
            bsf        STATUS,RP1    ;Banco 3
            movlw    b'00000001'
            movwf    ANSEL        ;RA0/AN0/C12IN0- entrada analógica, resto digitales
            clrf    ANSELH        ;Puerta B digital
            bcf        STATUS,RP1    ;Banco 1

;RC2/P1A y RB2/P1B salidas PWM para el modo semi puente en H ("Half-Bridge")
            movlw    b'11111011'
            movwf    TRISB        
            movlw    b'11111011'
            movwf    TRISC        

;El registro PW1CON establece el retardo entre ambas señales de salida (Dead-Band Delay)
            movlw    .100
            movwf    PWM1CON        ;Retardo de 100*(4Tosc) (a 4MHz, 100uS)

;Configuración del ADC
            clrf    ADCON1        ;Alineación izda. Vref= VDD para el convertidor
            bcf        STATUS,RP0    ;Banco 0

;El periodo se determina según el valor de la constante "Periodo". Este se carga sobre el
;registro PR2.
            movlw    Periodo-1
            bsf        STATUS,RP0    ;Selecciona página 1
            movwf    PR2
            bcf        STATUS,RP0    ;Selecciona página 0

;Trabajando con un preescaler 1:16 y a una frecuancia de 4MHz, el TMR2 evoluciona cada 16 uS.
            movlw    b'00000111'
            movwf    T2CON        ;TMR2 en On

;Se activa el ADC y se selecciona el canal RA0/AN0. Frecuencia de trabajo Fosc/32
Loop        movlw    b'10000001'
            movwf    ADCON0        ;ADC en On, seleciona canal AN0
            bcf        PIR1,ADIF    ;Restaura el flag del conversor AD
            bsf        ADCON0,GO    ;Inicia la conversión

;Esperar el final de la conversión y leer el resultado
ADC_Wait_0    btfss    PIR1,ADIF    ;Fin de conversión ??
            goto    ADC_Wait_0    ;Todavía no        
            movf    ADRESH,W
            movwf    Duty_H        ;Registra valor actual para el periodo
            bsf        STATUS,RP0    ;Selecciona página 1
            rrf        ADRESL,F
            rrf        ADRESL,W
            bcf        STATUS,RP0    ;Selecciona página 0
            andlw    b'00110000'
            movwf    Duty_L        ;Salva parte baja de la conversión
        
;El módulo CCP1 se configura en modo PWM semi puente en H (Half-Bridge) con salida por RC2/P1A
;y RB2/P1B. Los bits LSB se obtienen de la variable Duty_L

            movlw    b'10001100'
            iorwf    Duty_L,F
            movwf    CCP1CON        ;Modo PWM para el módulo CCP1

;La anchura del pulso o "Duty" se determina según el valor con que se cargue el registro
;CCPR1L concatenado con los bits 4 y 5 de CCP1CON. Dichos valores se obtiene de las varia-
;bles Duty_H y Duty_L respectivamente.

            movf    Duty_H,W
            movwf    CCPR1L

            goto    Loop

            end                    ;Fin del programa fuente

Código:
;El modo puente en H (Full-Bridge). Genera cuatro señales de salida para controlar las cuatro
;entradas típicas de un puente en H. En el modo directo la salida RC2/P1A se mantiene activa
;mientras que por RB4/P1D se obtiene la señal PWM. RB2/P1B y RB1/P1C se mantienen inactivas.
;En el modo inverso la salida RB1/P1C se mantiene activa mientras que por RB2/P1B se obtiene
;la señal PWM. RC2/P1A y RB4/P1D se mantienen inactivas. 
;
;En el ejemplo se genera una señal PWM a partir de una tensión analógica por RA0/AN0. Mediante
;la entrada digital RA2 se controla el modo: a "0" modo directo, a "1" modo inverso del puente H.
;
;Con un osciloscopio de doble trazo podemos analizar las señales de salida: en RC2/P1A y RB4/P1D
;para el modo directo y en RB1/P1C y RB2/P1B para el modo inverso. También podríamos emplear un
;analizador lógico para visualizar simultáneamente las 4 señales. Nosotros hemos empleado el 
;modelo PoScope Basic 2 en el modo analizador de funcionamiento.

        List    p=16F886        ;Tipo de procesador
        include    "P16F886.INC"    ;Definiciones de registros internos

;Ajusta los valores de las palabras de configuración durante el ensamblado.Los bits no empleados
;adquieren el valor por defecto.Estos y otros valores se pueden modificar según las necesidades

        __config    _CONFIG1, _LVP_OFF&_PWRTE_ON&_WDT_OFF&_EC_OSC&_FCMEN_OFF&_BOR_OFF    ;Palabra 1 de configuración
        __config    _CONFIG2, _WRT_OFF&_BOR40V                                    ;Palabra 2 de configuración

Periodo        equ    .200        ;Valor para el periodo de 3200uS (200*Preescaler de 16)

Duty_H        equ    0x20
Duty_L        equ    0x21        ;Variable para la anchura de pulso

            org    0x00        ;Vector de RESET    
            goto    Inicio
            org    0x05
    
;Programa principal

Inicio           bsf        STATUS,RP0
            bsf        STATUS,RP1    ;Banco 3
            movlw    b'00000001'
            movwf    ANSEL        ;RA0/AN0/C12IN0- entrada analógica, resto digitales
            clrf    ANSELH        ;Puerta B digital
            bcf        STATUS,RP1    ;Banco 1

;RC2/P1A, RB2/P1B, RB1/P1C y RB4/P1D salidas PWM para el puente en H ("Full-Bridge")
            movlw    b'11101001'
            movwf    TRISB        
            movlw    b'11111011'
            movwf    TRISC        

;Configuración del ADC
            clrf    ADCON1        ;Alineación izda. Vref= VDD para el convertidor
            bcf        STATUS,RP0    ;Banco 0

;El periodo se determina según el valor de la constante "Periodo". Este se carga sobre el
;registro PR2.
            movlw    Periodo-1
            bsf        STATUS,RP0    ;Selecciona página 1
            movwf    PR2
            bcf        STATUS,RP0    ;Selecciona página 0

;Trabajando con un preescaler 1:16 y a una frecuancia de 4MHz, el TMR2 evoluciona cada 16 uS.
            movlw    b'00000111'
            movwf    T2CON        ;TMR2 en On

;Se activa el ADC y se selecciona el canal RA0/AN0. Frecuencia de trabajo Fosc/32
Loop        movlw    b'10000001'
            movwf    ADCON0        ;ADC en On, seleciona canal AN0
            bcf        PIR1,ADIF    ;Restaura el flag del conversor AD
            bsf        ADCON0,GO    ;Inicia la conversión

;Esperar el final de la conversión y leer el resultado
ADC_Wait_0    btfss    PIR1,ADIF    ;Fin de conversión ??
            goto    ADC_Wait_0    ;Todavía no        
            movf    ADRESH,W
            movwf    Duty_H        ;Registra valor actual para el periodo
            bsf        STATUS,RP0    ;Selecciona página 1
            rrf        ADRESL,F
            rrf        ADRESL,W
            bcf        STATUS,RP0    ;Selecciona página 0
            andlw    b'00110000'
            movwf    Duty_L        ;Salva parte baja de la conversión
        
;El módulo CCP1 se configura en modo PWM en puente en H (Full-Bridge) con salidas por RC2/P1A,
;RB2/P1B, RB1/P1C y RB4/P1D. Los bits LSB se obtienen de la variable Duty_L

            movlw    b'01001100'
            iorwf    Duty_L,F
            movwf    CCP1CON        ;Modo PWM directo para el módulo CCP1

;Si RA2=1 se selecciona el modo inverso
            btfsc    PORTA,2
            bsf        CCP1CON,P1M1

;La anchura del pulso o "Duty" se determina según el valor con que se cargue el registro
;CCPR1L concatenado con los bits 4 y 5 de CCP1CON. Dichos valores se obtiene de las varia-
;bles Duty_H y Duty_L respectivamente.

            movf    Duty_H,W
            movwf    CCPR1L

            goto    Loop

            end                    ;Fin del programa fuente

Hay más ejemplos como regulñando la velocidad del mmotor, otro lo mismo y el sentido del giro de un motor, control de dos motores y control de movimientos.

Ya me dirás.
 
Muchas gracias, Meta, muy amable de tu parte.

Voy a estudiar los ejemplos y tengo confianza en que me van a ilustrar mucho, como los tips y ayuda que ya antes he tomado de tus valiosas aportaciones.

Te reitero mi agradecimiento.
 
Código:
;Los módulos CCPx
;PWM mejorado. Se aplica sólo al generador PWM del módulo CCP1.
;
;El modo puente en H (Full-Bridge) con Auto-Shutdown. Genera cuatro señales de salida para 
;controlar las cuatro entradas típicas de un puente en H. En el modo directo la salida RC2/P1A 
;se mantiene activa mientrás que por RB4/P1D se obtiene la señal PWM. RB2/P1B y RB1/P1C se 
;mantienen inactivas. En el modo inverso la salida RB1/P1C se mantiene activa mientrás que por 
;RB2/P1B se obtiene la señal PWM. RC2/P1A y RB4/P1D se mantienen inactivas. 
;
;En el ejemplo se genera una señal PWM a partir de una tensión analógica por RA0/AN0. Mediante
;la entrada digital RA2 se controla el modo: a "0" modo directo, a "1" modo inverso del puente H.
;
;También se usa el control Auto-Shutdown. Este consiste en desactivar automáticamente todas las
;salidas cuando ocurre un determinado evento. En este caso el evento es el generado por el módulo
;comparador C1. Este compara una tensión analógica externa, aplicada por la entrada RA1/C12IN1-, 
;con la que genera el módulo CVREF y que es fija de 2.5V. Cuando la externa sea superior a 2.5V
;todas las salidas quedarán desactivadas a nivel "0". También se utiliza la facultad del rearme
;automático. Este consiste en que las salidas se activan de nuevo automáticamente  cuando desaparezca
;la causa o evento que las desactivó, es decir, la tensión en RA1/C12IN1- sea inferior a 2.5V.
;
;Con un osciloscopio de doble trazo podemos analizar las señales de salida: en RC2/P1A y RB4/P1D
;para el modo directo y en RB1/P1C y RB2/P1B para el modo inverso. También podríamos emplear un
;analizador lógico para visualizar simultáneamente las 4 señales. Nosotros hemos empleado el 
;modelo PoScope Basic 2 en el modo analizador de funcionamiento.

        List    p=16F886        ;Tipo de procesador
        include    "P16F886.INC"    ;Definiciones de registros internos

;Ajusta los valores de las palabras de configuración durante el ensamblado.Los bits no empleados
;adquieren el valor por defecto.Estos y otros valores se pueden modificar según las necesidades

        __config    _CONFIG1, _LVP_OFF&_PWRTE_ON&_WDT_OFF&_EC_OSC&_FCMEN_OFF&_BOR_OFF    ;Palabra 1 de configuración
        __config    _CONFIG2, _WRT_OFF&_BOR40V                                    ;Palabra 2 de configuración

Periodo        equ    .200        ;Valor para el periodo de 3200uS (200*Preescaler de 16)

Duty_H        equ    0x20
Duty_L        equ    0x21        ;Variable para la anchura de pulso

            org    0x00        ;Vector de RESET    
            goto    Inicio
            org    0x05
    
;Programa principal

Inicio           bsf        STATUS,RP0
            bsf        STATUS,RP1    ;Banco 3
            movlw    b'00000011'
            movwf    ANSEL        ;RA0/AN0/C12IN0- y RA1/AN1/C12IN1- analógicas, resto digitales
            clrf    ANSELH        ;Puerta B digital
            bcf        STATUS,RP0        
            bsf        STATUS,RP1    ;Banco 2

;El comparador C1 se configura con una entrada por RA1/C12IN1- y la otra por la generada por el módulo CVREF.
;La salida es invertida y se activará cuando la tensión de RA1/C12IN1- sea mayor que la proporcionada 
;por el módulo CVREF (2.5V)
            movlw    b'11010101'
            movwf    CM1CON0            ;Configuración del módulo comparador C1
            bsf        CM2CON1,C1RSEL    ;La tensión generada por CVREF se asocia como entrada + al comparador C1            
            bsf        STATUS,RP0
            bcf        STATUS,RP1    ;Banco 1

;Configura el módulo generador CVREF para generar una tensión fija de referencia de 2.5V
            movlw    b'10101100'
            movwf    VRCON        ;Mód. CVREF=ON, rango bajo y VREF fuente=VDD. Genera 2.5V

;RC2/P1A, RB2/P1B, RB1/P1C y RB4/P1D salidas PWM para el puente en H ("Full-Bridge")
            movlw    b'11101001'
            movwf    TRISB        
            movlw    b'11111011'
            movwf    TRISC
        
;Control de Auto-Shutdown. Las salidas RC2/P1A, RB2/P1B, RB1/P1C y RB4/P1D pasan a "0" cuando
;el comparador C1 detecta una tensión en RA1/C12IN1- superior a 2.5V
            movlw    b'00010000'
            movwf    ECCPAS

;Rearmado automático de la salida PWM cuando la tensión en RA1/C12IN1- sea inferior a 2.5V
            bsf        PWM1CON,PRSEN    
            
;Configuración del ADC
            clrf    ADCON1        ;Alineación izda. Vref= VDD para el convertidor
            bcf        STATUS,RP0    ;Banco 0

;El periodo se determina según el valor de la constante "Periodo". Este se carga sobre el
;registro PR2.
            movlw    Periodo-1
            bsf        STATUS,RP0    ;Selecciona página 1
            movwf    PR2
            bcf        STATUS,RP0    ;Selecciona página 0

;Trabajando con un preescaler 1:16 y a una frecuancia de 4MHz, el TMR2 evoluciona cada 16 uS.
            movlw    b'00000111'
            movwf    T2CON        ;TMR2 en On

            
;Se activa el ADC y se selecciona el canal RA0/AN0. Frecuencia de trabajo Fosc/32
Loop        movlw    b'10000001'
            movwf    ADCON0        ;ADC en On, seleciona canal AN0
            bcf        PIR1,ADIF    ;Restaura el flag del conversor AD
            bsf        ADCON0,GO    ;Inicia la conversión

;Esperar el final de la conversión y leer el resultado
ADC_Wait_0    btfss    PIR1,ADIF    ;Fin de conversión ??
            goto    ADC_Wait_0    ;Todavía no        
            movf    ADRESH,W
            movwf    Duty_H        ;Registra valor actual para el periodo
            bsf        STATUS,RP0    ;Selecciona página 1
            rrf        ADRESL,F
            rrf        ADRESL,W
            bcf        STATUS,RP0    ;Selecciona página 0
            andlw    b'00110000'
            movwf    Duty_L        ;Salva parte baja de la conversión
        
;El módulo CCP1 se configura en modo PWM en puente en H (Full-Bridge) con salidas por RC2/P1A,
;RB2/P1B, RB1/P1C y RB4/P1D. Los bits LSB se obtienen de la variable Duty_L

            movlw    b'01001100'
            iorwf    Duty_L,F
            movwf    CCP1CON        ;Modo PWM directo para el módulo CCP1

;Si RA2=1 se selecciona el modo inverso
            btfsc    PORTA,2
            bsf        CCP1CON,P1M1

;La anchura del pulso o "Duty" se determina según el valor con que se cargue el registro
;CCPR1L concatenado con los bits 4 y 5 de CCP1CON. Dichos valores se obtiene de las varia-
;bles Duty_H y Duty_L respectivamente.

            movf    Duty_H,W
            movwf    CCPR1L

            goto    Loop

            end                    ;Fin del programa fuente
 
Atrás
Arriba