Conversion AD, lanzada cada 1ms con CCP

Hola, hace poco habia comprado el libro Compilador C CCS y Simulador Proteus para Microcontroladores PIC, y me encontre con este programa que lanza una conversion AD, utilizando el comparador del modulo CCP2, y dependiendo de la lectura genera una salida PWM con el CCP1. Lo que pasa es que me parecio extraña la estructura del programa.

Queria ver si lo podian chequear y opinar acerca del funcionamiento del programa, y si esta bien q me expliquen que es lo que hace porque la verdad no lo entendi muy bien la explicacion del autor. El dice que configura el CCP2 para que coincida con el TMR1 cada 1ms, cargandole 1000. Y entonces no se de que forma hace que realize una conversion A/D, la cual luego la usa para determinar el ciclo de trabajo. El punto es que la interrupcion que el utiliza es la del converson A/D, no la del CCP2.

En el libro el ejemplo decia lo siguiente "Mediante la configuracion del modulo CCP lanza una conversion AD, automatica cada 1ms. Caon el valor obtenido se realizara una conversion DA utilizando el PWM y un filtro pasabajo (figura).

Código:
#include <16f876.h>
#device adc=10
#fuses XT,NOWDT
int16 valor;
#int_ad                 
void ad_int(){                 //Función interrupción AD
valor=read_adc();             //Valor de fuente analógica...
set_pwm1_duty(valor);         //a Duty de PWM
}
                                             
void main() {
  disable_interrupts(global);
    
  setup_adc_ports(AN0);             //Habilitación RA0 analógico
  setup_adc(ADC_CLOCK_INTERNAL);   //Reloj interno RC
  set_adc_channel(0);              //Canal 0
  
  setup_timer_2(T2_DIV_BY_1,224,1);   //PR2=224, Tpwm=225us
  setup_ccp1(CCP_PWM);                      //CCP1 en modo PWM
  setup_ccp2(CCP_COMPARE_RESET_TIMER); //CCP2 modo COMPARACION…
                                       // y disparo especial
  setup_timer_1(T1_INTERNAL | T1_DIV_BY_1); //Configuración TMR1
  set_timer1(0);                           //Puesta a 0
  ccp_2=1000;                              //Muestreo cada 1ms a 4MHz
  enable_interrupts(INT_AD);      //Habilitación Interrupción AD
  enable_interrupts(global);      //Habilitación Interrupción global
do {
  } while (TRUE);
}
 

Adjuntos

  • Dibujo.jpg
    Dibujo.jpg
    67.2 KB · Visitas: 38
:) Jaja ya investigando en la hoja de datos encontre mi respuesta, la coloco por si alguien leyo el tema y quedo igual de confundido que yo. Se puede configurar el modulo CCP en comparacion, para que cuando el timer 1 iguale en su cuenta el valor fijado en el registro CCP_2, haga una de dos cosas:
1-Resetear el timer 1 o
2- Lanzar una conversion del ADC si este esta habilitado.

Entonces nada mas se calcula el valor del registro del CCP dependiendo de como este configurado el timer y ya se logra lanzar una conversion AD cada intervalo de tiempo fijado por el ususario
 
Atrás
Arriba