fbpx

Expresate

Si además quieres enviarnos un Artículo para el Blog y redes sociales, pulsa el siguiente botón:

Avisos
Vaciar todo

Problemas con CPU Clock de Pinguino

8 Respuestas
3 Usuarios
0 Reactions
3,079 Visitas
sphinx
Respuestas: 651
Topic starter
(@sphinx)
Ardero
Registrado: hace 17 años

Hola a todos,

Con esto de seguir preparando el PartyKit con Pinguino, me enfrasqué en una rutina nueva para controlar servos, que en principio sería distinta a la librería que incluye la versión Beta 8 de pinguino. Bueno, al grano, el caso es que que después de pegarme con el tema de la duración de los pulsos que generaba mi rutina, me he dado cuenta de que la base de tiempos que creemos que tiene pinguino, no es exactamente esa.

Me explico. Resulta que estamos utilizando un xtal de 20 Mhz en la versión del 18F2550 (aunque creo que este problema aplica tanto a esta versión como a la del 18F4550).

Supuestamente el ciclo de instrucción debería ser Fosc / 4 ¿correcto? . Bien, si hacéis 20Mhz/4 = 5 Mhz, luego cada ciclo de instrucción sería de 1/(5Mhz) = 0,2 microsegundos.........Pues NO. Esto no es así.
Después de pegarme con varias rutinas para ver si las distintas funciones del código de pinguino (delay, millis, servo...) les pasaba lo mismo que a mi rutina, he llegado a la conclusión de que el ciclo de instrucción real que tenemos con la config (bootloader) actual es de 0,16 microsegundos por instrucción. Lo cual si hacéis los cálculos, sería como decir que tenemos un reloj de 25 Mhz.... 😮 (???) (ver los 2 siguientes posts)

Este problema ya lo había detectado ubanov en su rutina para el control de servos: http://ubanov.wordpress.com/2010/02/03/control-de-servos-desde-pinguino-microchip-pic/ " onclick="window.open(this.href);return false; (en sus comentarios podéis leer que veía unas duraciones de pulsos mas corta de la que el esperaba que se produjesen).

Para comprobar que esto es así, simplemente cargad la siguiente rutina. Es una de las de ejemplo que vienen en el paquete de Pinguino:
// first test with Pinguino

void setup(void)
{
pinMode(0,OUTPUT);
}

void loop(void)
{
digitalWrite(0,HIGH);
delay(5);
digitalWrite(0,LOW);
delay(5);
}

Como veis, esta debería producir una señal cuadrada de pulso alto = 5 ms y pulso bajo = 5 ms, es decir, con un periodo de T=10ms y frecuencia F=100Khz.

Sin embargo lo que se obtiene a la salida es esto:

Vamos, una señal de 125Khz. Es decir, que la instrucción delay(5); no produce un delay de 5ms, sino de 4 ms.

No soy experto con estos PICs, pero después de leer la datasheet, y mirar la configuración que se carga con el bootloader, es probable que lo que estemos obteniendo sea lo que dice la tabla 2-3 de la misma datasheet. Aquí os pongo el trozo:

Entiendo que dado que los bits Fosc3:Fosc1 del registro de configuración se le ha dicho que el modo de reloj sea HS+PLL, el CPU clock que obtenemos sea el que he marcado en la imagen.

Probablemente alguno de vosotros, si tenéis más experiencia con estos PICs nos podáis orientar.

He indicado este tema en los foros de Pinguino también ( http://www.italentshare.com/pinguinoforum/viewtopic.php?f=2&p=116#p115 " onclick="window.open(this.href);return false;), y voy a intentar escribir a J.P. Mandon, para ver si se puede solucionar.

Creo que la solución más interesante es asumir ese reloj, y modificar las librerías que tienen que ver con delays y tiempos, etc....

Si hay noticias, las pongo por aquí.
¿ Alguno de vosotros había experimentado algún problema derivado de este tema de los tiempos ?

Gracias & Saludos,
Sphinx.

Responder
7 respuestas
sphinx
Respuestas: 651
Topic starter
(@sphinx)
Ardero
Registrado: hace 17 años

Es correcto lo que dices, son 12000. Lo he estado comentando con J.P. Mamdon esto también. De hecho también le comentaba sobre el retardo de microsegundos que mencionas. La función de Delayus no creo que genere el retardo que busca de microsegundos. Me ha dicho que va a arreglar esto de las temporizaciones y va a sacar una nueva beta dentro de nada:

Aquí está el hilo en los foros de Pinguino sobre la charla: http://www.italentshare.com/pinguinoforum/viewtopic.php?f=2&p=123#p123 " onclick="window.open(this.href);return false;

Gracias.

Por cierto Bastian, releyendo tu primera replica, me preguntabas si el USB me interfería con los servos. Perdona que se me pasó contestarte.
No sé si te refieres a que tu rutina utilizaba también la conexión USB para intercambiar información con el PC en tu rutina de control de servos. En la mía no lo utiliza. Pero si me preguntabas si interfería en cualquier caso, te diré que no. No tuve ningún tipo de problema con el conector USB conectado a Pinguino a la vez que corría mi rutina de servos.

Slds,
Sphinx.

Responder
juanjo
Respuestas: 451
(@juanjo)
Ardero
Registrado: hace 18 años

Hola SPX,

NO todas las instrucciones son de 1 ciclo de máquina, hay instrucciones que son de 2 ciclos de máquina. Si la Rutina está constituidada por saltos, estas suelen ser de dos ciclos de máquina. No se si habéis tenido esto en cuenta.

Normalmente estas subrutinas se programan con bucles anidados. Si tienes el código en ensamblador es muy fácil calcular el retardo, ya que te queda una expresión algebraica simple. Con esta expresión si cambias la frecuencia del socilador puedes calcular fácilmente el tiempo de nuevo.

NO tengo un código a mano si no te lo pegaba.

Responder
sphinx
Respuestas: 651
Topic starter
(@sphinx)
Ardero
Registrado: hace 17 años

Es cierto Juanjo. En la rutina de retardo de milisegundos puede que no se note, pero en la de microsegundos, los saltos del bucle son 2 ciclos y esto se debería de notar. Lo tengo que mirar con el osciloscopio.
Gracias por la nota.

Un saludo,
Sphinx.

Responder
Página 2 / 2
Compartir: