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

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:
 
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
 
(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:
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:
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...
 
: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:
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:
Atrás
Arriba