Modo de comparación, configurar salida en el partido (se establece el bit CCP1IF) - microcontrolador PIC16F88

0

Hy.

Quiero hacer un programa que alterne un led usando el modo de comparación, establecer salida en coincidencia (se establece el bit CCP1IF). No sé si es posible lo que quiero hacer. De todos modos el RB0 siempre está encendido. Lo sé, debe estar ENCENDIDO porque cuando el valor cargado en el registro ccpr1 coincide con el valor del registro tmr1, se establece el RB0. Pero si quieres restablecer la salida RB0? He hecho esto en la función de interrupción () escribiendo la siguiente instrucción: ccp1con = 0b00001001; Y ahora el RB0 permanece siempre apagado.

#include <system.h>
#pragma DATA _CONFIG1, _EXTRC_CLKOUT & _WDT_OFF & _LVP_OFF

void interrupt() 
{    
    if((pir1 & 0x01) && (pir1 & 0x04))                       
    {                      
        clear_bit(pir1, 0);      // clear TMR1IF
        clear_bit(pir1, 2);      // clear CCP1IF
        ccp1con = 0b00001001;    // clear output on match
    }             
}

void main()
{
     trisb = 0xf0;
     portb = 0x00;
     tmr1h = 0;
     tmr1l = 0;
     ccpr1l = 0x60;
     ccpr1h = 0xEA;
     cmcon = 0x07;
     t1con = 0b00000001;      // prescaler = 1
     intcon = 0b11000000;
     pie1 = 0b00000101;
     ccp1con = 0b00001000;    // set output on match
     while(1)
     {

     } 
}
    
pregunta user18050

1 respuesta

1

He hecho esto al hacer que la comparación de coincidencias active una interrupción, y luego la interrupción alterna el pin leyendo los datos.

Lo siento, mi ejemplo está en el ensamblador, pero debes obtener la información esencial:

(dentro del código de servicio de interrupción)

    btfss   PIR1,CCP1IF     ; is there a timer 1/compare interrupt?
    goto    INotTmr1

    ;; process timer 1 interrupt.
    clrf    TMR1L           ; clear timer 1
    clrf    TMR1H           ; clear timer 1
    bcf     PIR1,CCP1IF     ; clear compare match interrupt bit.
    btfss   PORTC,LED1      ; is led1 hi?
    goto    ITmr11          ; no.
    bcf     PORTC,LED1      ; lower led1 bit.
    goto    INotTmr1        ; done.
ITmr11                      ; led1 bit was low.
    bsf     PORTC,LED1      ; raise led1 bit.
INotTmr1                    ; end of timer 1 interrupt code.

(en el código de configuración)

    ;; set up timer 1
    movlw   b'00000000'     ; set up timer 1.
    movwf   T1CON           ; set up timer 1.
    movlw   b'00001010'     ; timer 1 compare throws interrupt.
    movwf   CCP1CON         ; set up compare mode.
    movlw   h'ff'           ; init compare value.
    movwf   CCPR1L          ; set up initial compare (invalid)
    movwf   CCPR1H          ; set up initial compare (invalid)

luego active el temporizador 1 cuando esté listo para comenzar a alternar

Buena suerte con tu proyecto.

    
respondido por el n1kdo

Lea otras preguntas en las etiquetas