TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: Thulsa Doom en 14 de Noviembre de 2024, 10:19:09
-
Hola a todos, hace tiempo que no entro en el foro, ya saben problemas de tiempo.
Tengo una duda sobre la configuración del oscilador de los pic's, por ejemplo, utilicemos el PIC18F4620, en su hoja de datos dice que se puede utilizar cristales de hasta 25MHz.
En la hoja de datos dice que si utilizo la opción de HSPLL multiplico la frecuencia del cristal por 4.
Entonces ¿si utilizo un cristal de 4MHz se multiplicaría esa frecuencia por 4 dando un resultado de 16MHz? y ¿éste último valor sería el que utilizaría para los cálculos de la velocidad de timer?
Y según la formula de cálculo del ciclo máquina es :
Tcm= 4/Fosc
donde Tcm es el ciclo máquina, 4 es una constante y ¿Fosc es la velocidad del cristal que le he puesto al pic en lugar de poner 4MHz tendría que hacer el cálculo con 16MHz?
Saludos
-
Hola a todos, hace tiempo que no entro en el foro, ya saben problemas de tiempo.
Tengo una duda sobre la configuración del oscilador de los pic's, por ejemplo, utilicemos el PIC18F4620, en su hoja de datos dice que se puede utilizar cristales de hasta 25MHz.
En la hoja de datos dice que si utilizo la opción de HSPLL multiplico la frecuencia del cristal por 4.
Entonces ¿si utilizo un cristal de 4MHz se multiplicaría esa frecuencia por 4 dando un resultado de 16MHz? y ¿éste último valor sería el que utilizaría para los cálculos de la velocidad de timer?
Y según la formula de cálculo del ciclo máquina es :
Tcm= 4/Fosc
donde Tcm es el ciclo máquina, 4 es una constante y ¿Fosc es la velocidad del cristal que le he puesto al pic en lugar de poner 4MHz tendría que hacer el cálculo con 16MHz?
Saludos
Yo tengo entendido que Fosc es la frecuencia del CPU, y en este microcontrolador, parece ser el mismo para los periféricos.
(https://pbs.twimg.com/media/GcWWIFWXYAAZU0-?format=jpg&name=small)
-
... por ejemplo, utilicemos el PIC18F4620, en su hoja de datos dice que se puede utilizar cristales de hasta 25MHz.
En la hoja de datos dice que si utilizo la opción de HSPLL multiplico la frecuencia del cristal por 4.
Entonces ¿si utilizo un cristal de 4MHz se multiplicaría esa frecuencia por 4 dando un resultado de 16MHz? y ¿éste último valor sería el que utilizaría para los cálculos de la velocidad de timer?
Si.
Y según la formula de cálculo del ciclo máquina es :
Tcm= 4/Fosc
Si, pero ojo que es la frecuencia ya multiplicada. O sea 16MHz.
Una manera cómoda de configurar es usando el Project Wizard que trae el CCS (PCWWIZ.exe).
- Tienes que ingresar para ver archivos adjuntos -
(ojo que los tiempos a la salida del prescaler están redondeados)
-
Vale mucha gracias, he estado haciendo cálculos para que mi timer0 se desborde a los 1ms luego me hago una función que cuente esos desbordamientos para encender un led a los 1 segundos, pero los cálculos parecen buenos pero el tiempo no se ajusta, ¿alguien me puede echar una mano con eso?.
Saludos
-
Subí el código.
-
es que no uso CCs si no C18 pero de todas maneras me gustaría aprenderlo por las formulas
-
es que no uso CCs si no C18 pero de todas maneras me gustaría aprenderlo por las formulas
Igual deberías subirlo.
-
Datos proporcionados:
1). Timer0 de 8 bits: El contador va de 0 a 255 (total de 256 valores).
2). Preescaler de 1:128: El prescaler divide la frecuencia de reloj del timer.
3). Cristal de 4 MHz: La frecuencia del oscilador principal es de 4 MHz.
4). HSPLL activado: Este configura el microcontrolador para usar el PLL (Phase-Locked Loop) que multiplica la frecuencia del cristal por 4. Entonces, la frecuencia del reloj del sistema será:
Frecuencia del sistema = 4MHz × 4 = 16 MHz
Calcular el ciclo de reloj del Timer0:
El temporizador del PIC18F4620 se ejecuta a la frecuencia de reloj del sistema, que en este caso es 16 MHz.
La frecuencia del Timer0 (sin prescaler) sería simplemente la frecuencia del sistema:
𝑓timer = 16MHz
El prescaler de 1:128 divide esta frecuencia entre 128, por lo que la frecuencia real del Timer0 será:
𝑓timer, real = 16MHz/128 = 125KHz
Esto significa que el temporizador cuenta cada 1/125,000 segundos, o lo que es lo mismo, 8 microsegundos por cada incremento del contador.
Calcular el tiempo que tarda el Timer0 en desbordarse:
Un Timer0 de 8 bits tiene un rango de conteo de 0 a 255, lo que da un total de 256 ciclos. Por lo tanto, el tiempo total que tarda en desbordarse es:
Tiempo para desbordarse = 256 × 8𝜇s = 2048𝜇s = 2.048ms
Ajustar el valor de inicio para obtener 1 ms:
El tiempo de desbordamiento es un múltiplo de 2.048 ms. Necesitamos que el temporizador se desborde en 1 ms, así que debemos hacer que el temporizador cuente hasta un valor menor para que el desbordamiento ocurra a 1 ms. La cantidad de tiempo que queremos contar es 1 ms, y sabemos que cada ciclo del timer dura 8 microsegundos. Entonces, el número de ciclos necesarios es:
Ciclos necesarios = 1ms/8μs = 125
Dado que el Timer0 es de 8 bits, podemos iniciar el contador con un valor que haga que cuente 125 ciclos antes de desbordarse. Como el contador comienza en 0, necesitamos que el valor inicial sea:
255 − 125 = 130
Entonces, se deberá configurar el Timer0 para que empiece a contar desde el valor 130.
¿son correctos esos cálculos?
Y añado el proyecto por si sirve de algo y comparto un enlace a dropbox por que es demasiado grande y no lo puedo subir aquí
Timer0. (https://www.dropbox.com/scl/fi/k8jcsh1kwdq999oit541g/Tick_Timer0.7z?rlkey=g0hftwvw5wdch47mcaesqnsya&st=7uqes7eg&dl=0)
gracias y un saludo
-
...
Calcular el ciclo de reloj del Timer0:
El temporizador del PIC18F4620 se ejecuta a la frecuencia de reloj del sistema, que en este caso es 16 MHz.
La frecuencia del Timer0 (sin prescaler) sería simplemente la frecuencia del sistema:
𝑓timer = 16MHz
No, la frecuencia de entrada al timer es fosc/4 --> 𝑓timer = 4MHz , tclk = 0.25us
El resto del procedimiento está bien.
-
No, la frecuencia de entrada al timer es fosc/4 --> 𝑓timer = 4MHz , tclk = 0.25us
Para reforzar la idea:
(https://pbs.twimg.com/media/Gcct9whXQAAiWEa?format=jpg&name=large)
Una recomendación al OP, es que lea las hojas de datos del MCU
-
...
Calcular el ciclo de reloj del Timer0:
El temporizador del PIC18F4620 se ejecuta a la frecuencia de reloj del sistema, que en este caso es 16 MHz.
La frecuencia del Timer0 (sin prescaler) sería simplemente la frecuencia del sistema:
𝑓timer = 16MHz
No, la frecuencia de entrada al timer es fosc/4 --> 𝑓timer = 4MHz , tclk = 0.25us
El resto del procedimiento está bien.
Entiendo que es 16MHz por que tengo activado el HSPLL que multiplica por 4 la velocidad del cristal, al ser un cristal de 4MHz el resulado es 16MHz... ¿es así o no?
-
Hola a todos de nuevo, pues creo que ya he dado con la solución y la pongo aquí a ver si está bien o tengo algún fallo.
* Formulas para el cálculo del timer0 para ajustarlo a que se desborde
a los 1000ms, lo usaremos de 8Bits, se puede configurar a 16Bits pero
pasa más tiempo para que se desborde el timer0 así que lo dejamos en 8bits
* En los microcontroladores pic si se tiene la opción de HSPLL se multiplica
por 4 la frecuencia del oscilador, si utilizamos un cristal de 4MHz
y activamos esa opción la frecuencia del oscilador será de 16MHz
-DATOS DEL PIC-
XTAL = 4MHz
HSPLL activado = x 4
*Cálculo de Fosc:
Fosc = 4 x 4000000; Fosc = 16000000
*Calculamos el ciclo máquina:
Tcm = 4/Fosc donde Fosc es la frecuencia del oscilador,
Tcm = 4/16000000; Tcm = 0,00000025
*Cálculo del Tiempo máximo del TIMER0 con esto calculamos el valor que tenemos que
escribir en el registro TMR0L para que se derborde el timer0 al tiempo deseado
T = Tcm x Preescaler (256 - TMR0);
T = Tiempo máximo deseado
Tcm = Ciclo máquina
Preescaler = lo que configuramos en el microcontrolador
256 = valor constante
TMR0 = Valor a cargar en el registro, como no lo sabemos se le pone 0
T = (0,00000025 x 128) x (256 - 0); T = 0,008192sg; T = 8,2ms
*Cálculo carga del Timer0
TMR0 = 256 - ((T.Deseado x Fosc)/(4 x Preescaler));
*Datos:
T.Deseado = 1000ms = 0,001sg
Preescaler = 1:128
TMR0 = 256 - ((0,001 x 16000000)/(4 x 128)); TMR0 = 224,75
Cómo el registro del Timer0 (TMR0L) no puede tener numeros decimales pues redondeamos
hacia arriba por que está más cerca del 225 que del 224 y este es el valor que cargamos
en el TMR0L, ya que los timers no son exactos tendremos que ajustar para lograr la mejor
presición posible y para eso dejando el resultado que nos dio en la formula fijo, vamos
cambiando la función que hace el conteo del tiempo.
Así que dejando el TMR0L a 225 tengo que jugar con la función
void TickUpdate(void){
static long cont_TMR0 = 0;
if(INTCONbits.TMR0IF)
{
//Se limpia la bandera
if(cont_TMR0++ == 955){
LED_STATUS_0 ^= 1; //Parpadeo del led
cont_TMR0 = 0;
}
INTCONbits.TMR0IF = 0; //Limpiamos la bandera de aviso de desbordamiento del buffer del Timer0
TMR0L = TICK_LOAD;
}
}
Dejando la variable cont_TMR0 a 955 para que mas o menos se ajuste a la velocidad de un cronómetro comercial, habrá que ajustar más si se quiere más precisión pero así tira bien
Comparto proyecto por si alguien le quiere echar un vistazo:
Timer0 (https://drive.google.com/file/d/1BAzX-TcjnbyAKv4joGforpr6_a0uC_Tj/view?usp=sharing)