Configuración reloj interno con PIC12F683

Buenos días,

Estoy intentando configurar el reloj interno del PIC12F683 a 8Mhz pero no lo consigo... El caso es que estoy probando en generar una señal cuadrada con el timer1 ( sé que puedo generar el PWM tambien por el módulo CCP ).

El caso es que quiero generar una señal cuadrada de frecuencia 2Khz y un duty cicle del 50%:

T = 1/2000 = 0,5 ms

Al querer un duty cicle de 50%, había pensado en ir cambiando de nivel de salida cada 0,25 ms que lo usaria mediante interrupción por el Timer1 de 16 bits.

Para calcular el TMR1, con frecuencia interna de 8Mhz i 8 de prescale:

0,25 ms= 4/8000000Hz * 8 * (2^16 - TMR1) -> TMR1 = 65437 ( 0xFF9D )

y el codigo programa ( en CCS) es el siguiente:

Código:
#include <12F683.h>
#FUSES NOWDT                    //No Watch Dog Timer
#FUSES INTRC_IO                 //Internal RC Osc, no CLKOUT
#FUSES NOPROTECT                //Code not protected from reading
#FUSES MCLR                     //Master Clear pin enabled
#use delay(clock=8000000)                    // Configuración reloj interno
#byte porta=0x05                             // Asignación bytes del puerto GPIO

#define oscilador PIN_A0

#INT_TIMER1

void oscilacion(void)
{
   output_toggle(oscilador);
   set_timer1(0xFF9D);
}

void main()
{
   disable_interrupts(GLOBAL);
   set_tris_a(0b001000);      // Configuramos salidas y entradas
   porta=0;               // salidas porta a nivel bajo
   setup_timer_1(T1_INTERNAL|T1_DIV_BY_8); // Configuración timer1
   setup_oscillator(OSC_8MHZ);
   enable_interrupts(INT_TIMER1);      // habilitar interrupcion timer 1
   enable_interrupts(GLOBAL);          // habilitar interrupciones
   output_low(oscilador);
   set_timer1(0xFF9D);                 // tiempo desborde 0.25ms

   while(1)
   {

   }
}

Y la sorpresa es que al probarlo en la protoboard y mirando por el osciloscopio, observo una señal cuadrada de 1Khz ( la mitad de lo que necesito ).

Hay algún error de configuración de reloj interno a 8Mhz o el codigo esta mal?

Edit:

Bueno despues de muchas pruebas he arrastrado todos los decimales del cálculo y me da un TMR1 de 65473, consiguiendo una señal cuadrada de 1,94 Khz. Lo que cambia el calculo redondeando y arrastrando los decimales... Redondeando conseguia 1,1Khz y arrastrando 1,94Khz, 700Hz de diferencia.
 
Última edición por un moderador:
Tio mira en css hay una opción que te dice todas directivas que puedes usar para configurar el pic. De todas formas en el datasheet, al final suele haber un apartado con las configuraciones y los nombres que suelen coincidir con las directives que te estoy diciendo(Datasheeet sección 12, special features of the cpu)
Te dejo una foto donde se encuentra la opción de ver los fuses disponibles para la config del dispositivo

Use delay solo es para las funciones delay. Los PWM deberías hacerlos con interrupciones y un ciclo for teniendo en cuenta la configuración del reloj interno.
 

Adjuntos

  • PIC12F688.pdf
    1.9 MB · Visitas: 11
  • FOTO.jpg
    FOTO.jpg
    58 KB · Visitas: 27
Te recomiendo que mejor escojas otro divisor en el preescaler, por ejemplo con un pree de 4 tenemos:

TMR1=2^16-(8x10^6)(.25x10^-3)/(4)(4)=65411 exactitos

Saludos
 
Buenos días,

Estoy intentando configurar el reloj interno del PIC12F683 a 8Mhz pero no lo consigo.
El caso es que estoy probando en generar una señal cuadrada con el timer1 ( sé que puedo generar el PWM también por el módulo CCP ).

El caso es que quiero generar una señal cuadrada de frecuencia 2Khz y un duty cicle del 50%:
Lo mejor es que aproveches el módulo CCP1 de ese PIC.
Yo me lio mucho con el PICC Compiler para generar PWM y prefiero usar los registros en vez de sus instrucciones.

Mira este código sobre como lo haría yo:
Código:
#include <12f683.h>
#fuses   NOBROWNOUT
#use     delay(internal = 8MHz)

#byte    PR2 = getenv("SFR:PR2")
#byte    T2CON = getenv("SFR:T2CON")
#byte    CCP1CON = getenv("SFR:CCP1CON")
#byte    CCPR1L = getenv("SFR:CCPR1L")

void main (void)
{
/*
Configuración de los registros para generar PWM
Timer2: Prescaler = 1:4, Postescaler = 1:1
CCP1 modo PWM, Frecuencia = 2000 Hz, Ciclo activo = 50%
*/
   PR2      = 0xF9;
   T2CON    = 0x05;
   CCP1CON  = 0x0C;
   CCPR1L   = 0x7D;
   output_low(pin_a2);     // Pin GP2 (CCP1) como salida.
   
   
   while (true)
   {
         output_toggle(pin_a0);  // Programa (Hola Mundo)
         delay_ms(500);
   }
   
}
Con esa configuración en la cabecera, el compilador configura el registro OSCCON para trabajar a 8MHz. (Reloj interno)
De hecho el compilador también configura por defecto los registros CMCON0 y ANSEL para modo digital.

Suerte.
 
Gracias a todos, lo que intentaba era conocer como generar PWM por software. Ahora estoy intentando generar 3 PWM por software a partir de 3 potenciometros en el que mediante conversor A/D pueda variar su ciclo de trabajo para controlar un LED RGB de 3W. Ya os contaré los avances.

La única duda es la etapa de potencia para el LED RGB ( adjunto datasheet )donde sus características más relevantes:

Potencia = 3W
Vrojo= 2,1V / I=300mA
Vverde= 3,5V / I = 350mA
Vazul = 3,5V / I = 350mA

Alimentación 4,5V

Rrojo = 4,5-2,1/300mA = 8 ohmios ( P = RxI^2 = 8 x 0,3^2 = 0,72W)
Rverde = Razul = 4,5-3,5/ 3,5 = 3 ohmios ( P = RxI^2 = 3 x 0,35^2 = 0,36W )

Para los transistores BC337 (800mA), con hfe(min) = 100

Ib = 0,3 / 100 = 3mA
Ib = 0,35/100 = 3,5mA

Rbase pwm rojo = 4,5-0,7 / 3mA = 1K2
Rbase pwm verde/azul = 4,5 - 0,7 / 3,5mA = 1K




Y el circuito el siguiente:

2mw7ds3.jpg



O estoy haciendo una barbaridad? Ya que leyendo en el foro recomiendan una fuente de corriente constante pero no sé por dónde empezar... Agradezco sugerencias/acompañamiento.
 

Adjuntos

  • RGB led.pdf
    72.5 KB · Visitas: 15
Los cálculos los veo bien y los valores que colocaste en el esquema también.

Por seguridad los valores de potencia de disipación para R1, R2 y R3 deben ser del doble o más.
Así que, con resistencias de 2 Watts para los 3 LED, debe andar bien.
 
Última edición:
Atrás
Arriba