Hola--
Cucaracha tiene razon.. logre la frecuencia deseada 102Khz, Gracias cucaracha.. pongo el programa.
Codigo:
#include <16F873A.h>
#use delay(clock=20000000)
#fuses NOWDT,HS, NOPUT, NOPROTECT, NODEBUG, BROWNOUT, LVP, NOCPD, NOWRT
void main()
{
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_spi(FALSE);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DIV_BY_1,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
setup_ccp1(CCP_PWM); // Configura CCP1 como PWM
setup_timer_2(T2_DIV_BY_1, 48, 1);
set_pwm1_duty(25);
while(TRUE){}
}
De esta forma se podrian generar 2 frecuencias en un pic como el 16f873, ya que este solo tienes dos modulos ccp.
Saludos
Vale, la pwm la genera un módulo. Conectando y desconectando el módulo, listo. En C es muy sencillo:
Codigo:
Encender:
void chopeo(void){
long duty;
setup_timer_2(T2_DIV_BY_1, 49, 1);
setup_ccp2 (CCP_PWM);
duty = 75;
set_pwm2_duty(duty);
}
y para apagar:
setup_ccp2(CCP_OFF); //Desconecta el PWM. Para el motor.
No recuerdo exactamente la frecuencia de este ejemplo, pero eso da lo mismo, no viene al caso. Es para que veas como se haría. EN tu caso el duty sería del 50%, para que sea cuadrada. Deberias de calcular el duty pues para 50%. Pero como ves es fácil.
Teienes dos módulos de PWM, pero aunque son independientes, la frecuencia de ambos es la misma, ya que trabajan con el mismo timer. Por tanto, entre una y otra la diferencia es el duty. Así que si necesitas dos frecuencias distintas no sirve. Pero puedes hacer una mediante el PWM y otra por otro medio.
En cuanto al resto de tu post... pues no me entero muy bien de lo que necesitas exactamente.
A ver, lo que necesitas que es... Una frecuencia de 102Khz por un pin y luego una temporización de 20hz?
Saludos!!
PD: por cierto, aunque es una tontería.. En el diagrama de flujo si se cumple la condición C1=N1? además de poner a cero C1, cambiar el pin, deberías incrementar también C2 no?
Hola
Bueno esto es lo que hice, ya estan las tres frecuencias, la de 20Hz esta por el pin B2, la de 425Hz esta por B1, y la de 102Khz por C2..
Codigo:
#include <16F873A.h>
#use delay(clock=20000000)
#fuses NOWDT,HS, NOPUT, NOPROTECT, NODEBUG, BROWNOUT, LVP, NOCPD, NOWRT
#define INTS_FREC_425Hz 6
#define INTS_FREC_20Hz 122
byte cont, cont1;
int int_count, int_count1;
short flag, flag1;
#int_RTCC
RTCC_isr()
{
if(--int_count==0) {
++cont;
int_count=INTS_FREC_425Hz;
if(flag==0){
flag=1;
output_high(PIN_B1);
}else{
flag=0;
output_low(PIN_B1);
}
}
if(--int_count1==0) {
++cont1;
int_count1=INTS_FREC_20Hz;
if(flag1==0){
flag1=1;
output_high(PIN_B2);
}else{
flag1=0;
output_low(PIN_B2);
}
}
}
void main()
{
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_spi(FALSE);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_4);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DIV_BY_1,48,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
enable_interrupts(INT_RTCC);
enable_interrupts(GLOBAL);
setup_ccp1(CCP_PWM);
set_pwm1_duty(25);
while(TRUE){}
}