martes, 5 de abril de 2011

Adaptador de control de SNES a USB (Round 2).

Con más confianza que conocimiento de causa compré un par de microcontroladores ATTINY25-20PU, a un precio unitario de 40 pesos mexicanos. Mi escaso conocimiento sobre la programación de los microcontroladores (no es lo mismo diseñar el firmware que sólo quemarlo) me llevó a una nueva aventura.

Mi pensamiento simple me llevó a sacar conclusiones equivocadas, basándome en premisas equivocadas, lo cual me llevó a hacer mi primer programa en microcontroladores para no terminar con un par de chips caros sin poder utilizar. La primera fue pensar que el código necesario para realizar la conexión USB utilizando V-USB era compacto. La segunda fue pensar que el leer el estado de un control de SNES era simple. La tercera y peor equivocación fue pensar que el código del ATTINY2313 me serviría para el ATTINY25.

En la página de Hobbyelektronik hay dos versiones del firmware para el ATTINY45, la primera con un valor de calibración del oscilador interno fijo y la segunda con calibración automática. En palabras simples, el ATTINYx5 puede funcionar a una alta frecuencia de operación utilizando su oscilador interno, lo que elimina la necesidad de utilizar un cristal oscilador como señal de reloj. Ahora bien, el oscilador no es muy preciso, por lo que puede tener desviaciones en su periodo de hasta el 5 por ciento. Dicha incertidumbre es inadmisible en un sistema que se conecta al puerto USB, donde los tiempos deben ser precisos, con una incertidumbre máxima del 1 por ciento. Es por ello que el oscilador debe calibrarse, colocando un valor en el registro OSCCAL (primer byte de la EEPROM del microcontrolador).

Ahora bien, la calibración del oscilador obedece a dos factores principales: el voltaje y el calor. Una variación en el voltaje de unos cuantos milivolts o una variación en la temperatura de operación puede variar la frecuencia del oscilador, por lo que el microcontrolador es incapaz de mantener la comunicación con el puerto USB. Si el firmware usa un valor de calibración fijo, dicho valor debe modificarse de forma manual en el firmware y volverse a grabar en el microcontrolador, en un proceso de prueba y error, hasta que se logre la comunicación entre el adaptador y el puerto USB. Cuando se emplea la calibración automática, el microcontrolador se sincroniza con el puerto USB en cada ciclo de RESET. La desventaja de la calibración automática es que si el adaptador comparte el hub USB con otros dispositivos, es muy probable que nunca pueda calibrarse.

Además, la rutina de calibración utiliza espacio en memoria muy valioso, ante todo cuando sólo se dispone de 2048 bytes. En primera instancia la opción ganadora es el firmware con calibración automática, sin embargo el firmware de Hobbyelektronik tiene dos problemas: el primero es que utiliza más de 2048 bytes y el segundo es que según su autor, no funciona.

En Instructables, un usuario llamado Andreq realizó unas optimizaciones que permitián utilizar un microcontrolador de 2kB para hacer el adaptador. Sin embargo el firmware de Andreq no contaba con la calibración automática. Con estos antecedentes, decidí poner manos a la obra con dos objetivos en mente: lograr optimizar el código lo suficiente como para entrar en un ATTINY25 y la segunda, implementar una función de calibración automática optimizada.

Seguimiento de trasteos.

Hola, ¿Cómo están? Bienvenidos sean de nueva cuenta a este nuestro blog, donde yo escribo los debrayes y ustedes abuchean mis malos chiste...