Como generar una señal de reloj con un PIC en CCS de 250khz hasta 1Mhz

#1
Hola ha todos estoy tratando de generar una señal de reloj con un PIC, porque me interesa generar una señal cuadrada de mínimo unos 250khz y máximo 1Mhz para la operación de unos módulos RF. Pero se me ha hecho imposible estoy programando en CCS y lo máximo que he llegado es ha unos 67khz con un cristal de 20Mhz y con timer1. Si alguien tiene un programa o tiene idea de cómo configurar el PIC o sabe algo que yo este pasando por alto y que me impide sacar estas frecuencias por fa ayuda.:unsure::unsure:
 
#2
Para generar una senal cuadrada a maxima velocidad no veo la necesidad de usar el timer el codigo seria asi

#bit RB7=0x06.7

RB7 = 0;
while(1){
RB7=~RB7;
}

Si usara el timer tendria que esperar a que se desbordara retrasando la siguiente instruccion
 
#3
(y) Ha esa es la ayuda que necesito. Voy a probar lo que me comentaste y mirar que frecuencia me genera, o que resultado me da, te agradezco tu colaboración ALBERTOXX

La idea la tome y me quedo de la siguiente manera. Sacando una frecuencia de reloj de 208khz con cristal de 10Mhz ahora me toca implementarlo en el diseño de control de mi circuito y ver si me activa la recepción de los datos, bueno si tienen otra idea bienvenido sea:
void main(){
//RB7 = 0;
while(1){
//RB7=~RB7;
output_toggle(pin_b1);
delay_us(1);
}
 
Última edición:
#4
Es mas recomendable usar el CCP del microcontrolador modo PWM.
un ejemplo sencillo del PWM en CCS
Código:
///////////////////////////////////////
//AUTOR:george
//TITLE;Convertidor de analogo a digital
//DATE:23/JULIO/'09
///////////////////////////////////////

//CONFIGURACION///////////////////
#include<16F886.h>                            //Incluimos los registros del Micro
#fuses INTRC_IO,NOWDT,NOLVP,MCLR,NOPROTECT

//INTRC_IO = Reloj Interno
//NOWDT       = No al perro guardian
//NLVP        = No al Voltaje de programacion
//MCLR       = Master Clean Activado
//NOPROTECT= No protegemos al codigo

#use delay(clock=8000000)                    //Reloj Interno trabajando a 8Mhz

unsigned int sA;

void main(void){
    set_tris_a(0x01);
    set_tris_c(0x00);
    setup_comparator(NC_NC_NC_NC);    //COMPRADORES APAGADOS
    /************************************************
        Canales PWM activados                    *****
    *************************************************/

    setup_ccp1(CCP_PWM);
[COLOR=Red]    /************************************************
        value=[(1/Frec)/(preescalarx(4/osc)]-1 ******
        frec~1kHz                               ******
        preescalar=16                           ******
        osc=8Mhz                               ******
        value=124                               ******
    *************************************************/[/COLOR]
    setup_timer_2(T2_DIV_BY_16,124,1); 
    set_pwm1_duty(0);                   //apagado

    setup_adc(ADC_CLOCK_INTERNAL|VSS_VDD);
    setup_adc_ports(sAN0);

    while(TRUE){
        delay_ms(100);
        sA=read_adc();
        set_pwm1_duty(sA);
    }
}
mmm..solo bastaria de cambiar algunas cosas como buscar el valor mas optimo para que trabaje a la frecuencia deseada
SALUDOS.
 
Última edición:
#5
Bien fijate que ahi tenes 1us en alto y 1us en bajo, sacando cuentas...P=2uS...F=1/P La frecuencia deberia ser de 500KHz...(creo, no estoy seguro de que este bien...) probá y contanos, haber si ando bien con las matemáticas...
 
#6
:unsure:Bien GEORGEE.MASON.69 le echare un vistazo esta noche para ver que pasa, aunque ya lo avía hecho con el CCP del PIC 16f877 y lo máximo que obtuve fue algunos 47khz pero voy haber tu código y mirar si me falto algo bien gracias:

Bueno VEGETAL DIGITAL voy ha echarle un poco de mate a la cuestión y comento mañana:
 
Última edición:
#7
Baya tenia problema con el CCS al parecer las versiones 4.110 (no reconoce la librería de LCD.C) y que dolor de cabeza. Entonces me pase 4.108 (no reconoce los CCP como PWM) y anoche me mate la cabeza tratando de compilar estos programas, y hoy en la mañana decidí probar la versión 4.104 y todo okey
Bueno si este comentario le sirve a alguien que lo tenga en cuenta:

Bien fijate que ahi tenes 1us en alto y 1us en bajo, sacando cuentas...P=2uS...F=1/P La frecuencia deberia ser de 500KHz...(creo, no estoy seguro de que este bien...) probá y contanos, haber si ando bien con las matemáticas...


Bueno metiéndole calculo a la vuelta a mi menos que me cuadra: pero si se porque, al parecer cualquier compilador de c para PIC no son exacto a la hora de generar cualquier tipo de señal don haya que utilizar los ciclos de maquina (instrucción = 4ciclos de reloj y si es salto = 8ciclo de reloj en ASM) del PIC porque c genera mas códigos para realizar estos procesos aumentando los ciclos de reloj y por ende se hacen mas lentos
Los cálculos conocido en ASM no aplica en totalidad para C y por ende se hace necesario algunos ajuste por parte del programador.
Para el caso del TIMER0 = 8bits (256) o TIMER1 Y TIMER2 = 16bits (65536)
T=TCM*PRESCALER(256-CARGATMR0)
TCM= ciclo de maquina
Y viene dada por la ecuación TCM=4⁄Fosc
Entonces si queremos generar una señal de reloj de 1Khz, se necesita un semiperiodo de 500us con un cristal de 4Mhz quedando la ecuación de la manera siguiente:
500us=(4⁄4000000)*2*(256-cargaTIMER0)
2= PRESCALER
CARGA DEL TIMER0 = 6
Pero para que de los 1Khz, deberá ser cargado con 29 hagan la prueba
 
Última edición:
Arriba