Bueno, ayer estuve con los alumnos del proyecto y estuvimos viendo el código que debería ejecutar el micro y se nos presentaron algunas dudas.
Primeros los datos:
El LPC1347 posee 2 timer/counter de 16bits y 2 de 32 bits. El micro puede correr (y va a correr) a 72MHz.
Necesitamos 2 timer funcionando constantemente. Uno para medir las RPM del motor y el otro que interrumpe cada vez que hemos avanzado el tiempo correspondiente a la resolucion elegida. Por ejemplo:
Si el motor es de 1500RPM, tenemos 40mseg de período de revolucion y con un timer debemos medir tiempos en ese entorno.
Si la resolucion elegida es de 1° entonces tendremos 40mseg/360° = 111useg para el segundo timer.
El Tick que obtenemos a 72MHz es de 0,0138888 useg. Con el timer de 16bits podemos contar hasta 910 useg, este timer es ideal para usarlo como interrupcion entre "radio y radio". Con el de 32 bits podemos contar hasta 59,65 segundos!!!! por lo que será ideal para contar RPM. Notar que en este micro, de 32bits, usar el timer de 32 bits no implica ningún esfuerzo, al micro le resulta igual usar el de 16 o el de 32 bits. Distinto pasa con un pic de 8 bits usando el timer de 16 bits
. Tambien hay que notar que cuando el motor esta acelerando, el período será bastante mayor a 40mseg y seguramente podremos ir mostrando igual algo.
Bien, la primer cuestion que surge es medir las RPM del motor usando una entrada CAPTURE del TIMER de 32 bits o directamente usar un pin configurado como interrupcion externa (en este micro, podemos elegir 8 cualesquiera pines y configurarlo como interrupcion externa, dandole la prioridad que queramos a cada uno). En el primer caso, no perdemos uno o mas ciclos almacenando el valor del timer al momento de la interrupcion. Usando int externa perdemos unos cuantos ciclos hasta que entra la interrupcion y llegamos a la instruccion que almacena el valor del timer... me parece que lo mejor es usar una entrada CAPTURE, que por hardware nos almacene el valor del timer en el registro CAPTURE asociado. verdad?
Luego estuvimos viendo la forma de corregir las variaciones de velocidad y ahí recrdé lo que habian hablado en el post sobre el GiroPlay y la técnica, creo que de Manolo, para corregir. Básicamente debemos tener un contador de pixel actual y un contador de pixel total en la vuelta anterior. Entonces en la Interrupcion Externa de sincronismo hacemos:
timer = 65535 - (TMR32bits / PIXELES) // Precargamos el TMR de 16 bits para que interrumpa en cada cambio de pixel
TMR16bits = timer
TMR32bits = 0
cnt_pixel = cnt_pixel_actual
cnt_pixel_actual = 0;
y en la interrupcion del timer de 16 bits haríamos
TMR16bits = timer
cnt_pixel_actual ++
Pulso_Latch_TLC();
Esto es lo que tenía del año pasado, pero al analizarlo, no le encontramos demasiado sentido al contador de pixel total y actual... no recuerdo que tipo de correccion se hacía con esos valores... esta es la segunda duda que nos surgio.
Bien, una vez resolvamos esas cuestiones ya estaremos en condiciones de avanzar con la programacion.
Aún falta decidir donde estará el llamado a la funcion que envía los 4 uint16_t a los TLC... Como el FIFO del SSP es de 8 frames, estimo que lo haremos de forma asincronica en el main, poniendo un dato detras del otro sin hacer demasiadas verificaciones.
Por ahora es lo que tenemos!
saludos!