Autor Tema: Problema con la frecuencia de oscilacion y tiempos.  (Leído 2272 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Sesag

  • PIC10
  • *
  • Mensajes: 5
Problema con la frecuencia de oscilacion y tiempos.
« en: 25 de Abril de 2013, 17:08:28 »

Buenas,

suelo leer el foro para las dudas que me surgen en mi primer proyecto con PIC programando en CCS. Me ha sido de mucha ayuda para el teclado y el modulo CCP o poner tablas en la EEPROM por ejemplo.

Pues bien, escribo porque ando programando un 18F4550 y los tiempos (pongamos encender/apagar un LED) no me concuerdan.
Aquí les pongo un ejemplo:
Código: [Seleccionar]
#include <18f4550.h>
#fuses MCLR       //Reset encendido
#fuses XTpll      //Utilizamos un crystal de alta velocidad = 4MHZ con el PLL activo
#fuses NOWDT      //No vamos utilizar el perro guardián
#fuses NOPROTECT  //Desactivamos la protección del código
#fuses NOLVP      //Desactivamos la programación a bajo voltaje.
#fuses NODEBUG    //Modo debug desactivado
#fuses PLL1       //No PLL prescaler no dividira la entrada del cristal(4Mhz)
//#fuses USBDIV     //No queremos sistema postscaler
#fuses CPUDIV1    //No queremos sistema postscaler
#fuses VREGEN     //Habilita el regulador de 3.3 volts que usa el módulo USB
#fuses NOPBADEN   //


#use standard_io(c)
#use standard_io(b)

int8 cont=0;

#int_TIMER1         //Interrupción Timer1
void temp1s(void)   //Función
{
  cont++;
  if (cont==20)
  {output_toggle(PIN_c0);   
  cont=0;}
  set_timer1 (15536);                     //recarga del TMR1

  }

void main()
{
 setup_timer_1 (T1_INTERNAL | T1_DIV_BY_1);
 set_timer1 (15536);                          //recarga del TMR1
 enable_interrupts(INT_TIMER1);             //habilita interrupcion timer1
 enable_interrupts(global);                //habilita interrupción general
 port_b_pullups(true);
 
 while(true)

}

Estoy utilizando el Timer 1 para contar 20 ciclos de 0.05 segundos (1s), y encender/apagar un LED que tengo en el pin C0 según la fórmula T= 4/fosc(65536-carga TMR1).
Utilizo un cristal de 4 MHz que tengo conectado con sus condensadores y conexion que me dice el datasheet del PIC.
El caso es que ya puedo cambiar los fuses que sea, ya puedo meter un cristal de 20MHz, ya puedo hacer funcionar el PIC sin cristal conectado, que en vez de 1 segundo, me hace SIEMPRE 4 segundos. Llego a la conclusion que de alguna manera tengo metida una fosc=1MHz y no hay manera de moverla.

Todo este programa con tantos fuses viene a raíz de que usando el cristal de 4MHz y la directiva #use delay(clock=4000000); al usar delay_ms(1000) también me daba 4 segundos. En cambio, si cambiaba la directiva a #use delay(clock=1000000) sí cambiaba el LED cada 1s.

La frecuencia de oscilacion en mi caso es de vital importancia porque debo tratar motores con PWM (lo haré con el modulo CCP en modo comparación).

Alguien sabe algo o le ha pasado lo mismo? es algun fuse que me dejo o utilizo mal? es cosa del 18F4550?
Cualquier duda sobre mi planteamiento sera respondida :P

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: Problema con la frecuencia de oscilacion y tiempos.
« Respuesta #1 en: 25 de Abril de 2013, 19:18:41 »
debes cargar tu timer cada que ocurre la interrupcion, no cada que se cumplan 20 interrupciones


void temp1s(void)   //Función
{
 set_timer1 (15536);                     //recarga del TMR1
  cont++;
  if (cont==20)
  {output_toggle(PIN_c0);  
  cont=0;}


  }
"Nada es imposible, no si puedes imaginarlo"

Desconectado Sesag

  • PIC10
  • *
  • Mensajes: 5
Re: Problema con la frecuencia de oscilacion y tiempos.
« Respuesta #2 en: 26 de Abril de 2013, 11:43:40 »
Hmmm, si no me equivoco el Timer se está recargando cada vez que se desborda(0.05s) y entra en la interrupcion.
Cuando hay 20 desbordamientos inicializa la cuenta, y cambia en el PIN C0.

Desconectado reiniertl

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1187
Re: Problema con la frecuencia de oscilacion y tiempos.
« Respuesta #3 en: 26 de Abril de 2013, 12:31:38 »
Es cierto que el TIMER se recarga en cada INT, pero debes ponerlo como te dice rivale, de modo que sea lo primero que hagas, así evitas el jitter de recargarlo después del resto código de la interruptción.

Lo otro que debes hacer sin dudar es asegurarte que cuando configuras el timer los registros toman los valores correctos. Me ha pasado varias veces que utilizando funciones de biblioteca incorporadas con el compilador algunas veces trabajan bien y otras no.  Verifica sobre todo que el preescaler esté tomando el verdadero valor que lo hace entrar en la interrupción como debe ser.

Y MUY IMPORTANTE. Aseguráte que el oscilador quede bien configurado. CCS me dio en cuando lo utilizaba hace ya tiempo problema con eso. Uno se creía que los fuses estaban bien configurados (y lo estaban) pero el puto compilador te ponía la configuración que le daba la gana. Asegúrate de instruirle que los fuses son los que les pones tu y no los que el cree que deben ser. Yo me acostumbré a especificarlos en el código y le dejaba bien claro al IDE que los tomara del código.

Un saludo
Reinier

Desconectado Sesag

  • PIC10
  • *
  • Mensajes: 5
Re: Problema con la frecuencia de oscilacion y tiempos.
« Respuesta #4 en: 27 de Abril de 2013, 09:03:37 »
Lo otro que debes hacer sin dudar es asegurarte que cuando configuras el timer los registros toman los valores correctos. Me ha pasado varias veces que utilizando funciones de biblioteca incorporadas con el compilador algunas veces trabajan bien y otras no.  Verifica sobre todo que el preescaler esté tomando el verdadero valor que lo hace entrar en la interrupción como debe ser.

Y MUY IMPORTANTE. Aseguráte que el oscilador quede bien configurado. CCS me dio en cuando lo utilizaba hace ya tiempo problema con eso. Uno se creía que los fuses estaban bien configurados (y lo estaban) pero el puto compilador te ponía la configuración que le daba la gana. Asegúrate de instruirle que los fuses son los que les pones tu y no los que el cree que deben ser. Yo me acostumbré a especificarlos en el código y le dejaba bien claro al IDE que los tomara del código.

Un saludo
Reinier

Gracias, yo creo que el fallo está allí. Pero no tengo todavía muchos conocimientos, ya con programar tengo faena, pero el tema de ver y leer los registros reales en el PIC se me escapan. Cual seria la manera de ver el valor verdadero que está tomando el prescaler?
Y como puedo ver si verdaderamente los fuses que yo pongo son los que hay?

Gracias de antemano.

Desconectado reiniertl

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1187
Re: Problema con la frecuencia de oscilacion y tiempos.
« Respuesta #5 en: 02 de Mayo de 2013, 10:03:57 »
Tres soluciones existen.

1. Si tienes un programador debugger (PICKIT2 PICKIT3, etc) puedes depurar con el mismo programador y de esa forma ver el valor real de los registros del uC.

2. Utilizar el simulador de MPLAB para ver que valores toman los registros al cargar el .hex en el uC. El problema de esta aproximación es que es difícil simular las entradas externas, pero no es eso lo que estás tratando de resolver ahora (respuesta a los estímulos excternos)

3. Simular con Proteus, este te permite ver la memoria de programas y simular muy fácilmente los estímulos externos.

Con cualquiera de los simuladores tendrás que ver para los fuses la memoria de programa y localizar las direcciones donde se guardan y lo que se guarda en cada bit. Las direcciones están en el datasheet del dispositivo. En el caso de los registros del uC tendrás que poner punto de ruptura en las funciones de configuración y ver que estado toman los registros una vez que ejecutas esas funciones.

Para el caso de los fuses existe además la posibilidad de leer el micro luego de grabar y ver que te dice el programador que leyó en las direcciones de los fuses. Requiere que se programe el dispositivo con las opciones de protección de memoria deshabilitadas.

Un saludo
Reinier