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).
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);
}