7 de Mayo, 2015

»pysdl2 fácil · No hace falta que introduzca SDL por aquí, pero sí recordar que SDL2 es bastante diferente, sobretodo porque soprta 2D con aceleración por hardware. Hay algunos módulos que permiten trabajar con SDL2 en Python, pero tienen interfaces poco pitónicos. En un par de días he llegado a algo funcional en pysdl2-harness, que son un par de clases para usar pysdl2 ocultando la parte fea de SDL, un poco como si fuera pyglet (pero mucho más sencillo).

Hay 0 comentarios, anotación clasificada en: sdl, python.

25 de Abril, 2015

Cuidado con los "fuses"

Los fuses (¿fusibles?) son 3 bytes de memoria permanente que determinan ciertas partes del comportamiento del microcontrolador.

Esta semana he estado trabajando con los ATtiny84, que es un microcontrolador de la subfamilia tiny de AVR. Es un MCU más pequeńo que el que viene con el Arduino Uno, y tiene algunas diferencias en cuanto a funcionalidad (ya hablaré de eso en otro momento).

Estos microcontroladores vienen de casa configurados para usar un oscilador RC interno a 8 MHz, pero tienen activado el flag CKDIV8 que divide por 8 la velocidad del oscilador, con lo que el MCU funciona a solo 1 MHz.

Como para mi proyecto quiero usar los 8 MHz (que además es una frecuencia soportada para 3v que puedes conseguir con dos pilas AAA), tengo que cambiar los fuses para desactivar ese flag.

Estoy usando un programador muy barato llamado USBasp que utiliza el interfaz SPI del microcontrolador sin la necesidad de un bootloader (como usa el Arduino), y nos deja disponible así toda la memoria para nuestro programa.

USBasp está soportado por avrdude, así que es bastante fácil reprogramar el MCU.

En primer lugar hay que usar la opción -B de avrdude a un valor de al menos 10 porque sino no será capaz de compunicarse con el MCU a 1 MHz.

Podemos confirmar que los fuses están como esperamos con:

avrdude -c usbasp -p attiny84 -P usb -v -B 10

Y cambiamos el low fuse para desactivar CKDIV8:

avrdude -c usbasp -p attiny84 -P usb -v -B 10 -U lfuse:w:0xe2:m

Muy fácil. A partir de ahora ya no es necesario usar la opción -B porque el MCU funcionará a 8 MHz.

La documentación del microcontrolador explica los fuses en detalle, pero hay que ir con mucho ojo porque podemos inutilizar el MCU (sin la ayuda del microcontrolador, USBasp es incapaz de programarlo).

Por ejemplo yo me equivoqué probando un cristal externo, confundiendo reloj externo con cristal externo; y no es lo mismo. De hecho no tengo un reloj externo y básicamente inutilicé el MCU porque no arrancaba sin el reloj :(.

Bueno, realmente no ;). Teniendo un Arduino a mano se puede generar una señal de reloj, lo que me permitió recuperar el microcontrolador y configurar los fuses correctamente.

Este es mi código de rescate:

// Generate a clock pulse with Aduino (digital port 5)
#define F_CPU	16000000

#include <avr/io.h>
#include <avr/interrupt.h>

int
main()
{
    cli();

    DDRD |= _BV(DDD5);

    TCCR0A = _BV(WGM00) | _BV(WGM01) | _BV(COM0B1);
    TCCR0B = _BV(CS00);
    TCNT0 = 0;
    TIFR0 = 0;
    OCR0B = 127;

    sei();

    while(1);
}

Ese código genera una señal de reloj en el pin 5 como la que espera el ATtiny84 configurado para usar un reloj externo, así que por esta vez... he podido salvar la situación fácilmente ;).

Hay 0 comentarios, anotación clasificada en: avr.

19 de Abril, 2015

»Reproduciendo audio · Todavía no me he decidido a soldar una de las placas, básicamente porque las de Elecrow están rotas, y las de OSH Park tienen un fallo (este sí es culpa mía). En teoría puedo meter una ñapa y todavía usar las de OSH Park, pero mientras me decido he estado revisando mi código para reproducir módulos de sonido con PWM (en el ejemplo ya con soporte para módulos de Impulse Tracker, porque uso Schism Tracker en Linux). Todavía es pronto, pero estoy pensando en el siguiente proyecto, que espero tenga menos componentes (no es que DAN64 tenga tantos, pero la placa no es tan sencilla).

Hay 2 comentarios, anotación clasificada en: avr, arduino.

6 de Abril, 2015

»DAN64 publicado · Ahora el proyecto tienene página web pública: DAN64, y el código está disponible en dan64 en GitHub. Todavía no he soldado una de las placas, pero como todo lo demás estaba listo, he decidido publicar versión (bueno, lo decidí ayer que era mi cumpleaños; pero entre una cosa y otra no he podido acabar hasta hoy :P).

Actualización: notas en the DAN64: a Minimal Hardware AVR Microcomputer (Hackaday) y Building a minimal 8-bit microcomputer with AVR (Atmel); entre otros. Parece que el proyecto ha gustado :).

Hay 1 comentario, anotación clasificada en: avr, arduino.

3 de Abril, 2015

»Grabando programas · Resulta que grabar los programas es más complicado de lo que pensaba. Bueno, no tanto grabarlos como cargarlos de nuevo. Básicamente los ficheros de audio que genero en mi portátil son perfectos (no pasan por nungún cable o capturador de audio) y con calidad CD; pero el audio generado usando uno de los pins PWM del ATmega328p hay que capturarlo con un dispositivo externo (por ejemplo la tarjeta de sonido de mi portátil), y además tiene una resolución de 8-bits, con lo que la calidad no es muy alta para cargarlos de nuevo en el microcomputador :(. En general es bastante estable para grabar unos cuantos KB, así que estoy contento con el resultado. Aquí hay un vídeo del prototipo.

Hay 0 comentarios, anotación clasificada en: avr, arduino.

30 de Marzo, 2015

Listos para soldar

Hace casi un mes que encargué mis placas PCB, antes de descubir que había intercambiado 2 pines en el conector PS/2 (error de novato, pero me dicen que pasa mucho :P).

Aunque se puede arreglar con un jumper y tal, mientras las placas llegaban o no, investigué un poco a ver qué otros fabricantes para prototipos hay que cumplan los requisitos que todos buscamos: lo más rápido posible, económico, y con buen nivel de calidad. Las placas del primero pedido (desde USA) llegaron hace unos días, y hoy ha llegado la segunda remesa (desde China).

Comparando PCBs
A mi ojo inexperto parecen de la misma calidad

No me veo capacitado para evaluar qué placa es mejor, aunque a simple vista parecen de una calidad similar (no he soldado ninguna; solo he verificado que la continuidad es correcta y poco más). Si acaso me parece que la capa silk screen de la placa de arriba tiene un acabado algo mejor, pero si no tuviera las dos placas delante, la de abajo me parece perfecta.

Voy a comentar mi experiencia como cliente de ambos proveedores, sin mencionar precios porque para eso ya está la página web de cada fabricante ;).

La placa de arriba es de OSH Park. El servicio excelente, con buen precio y buenos tiempos. Además su web es una pasada y realiza muchas pruebas automatizadas que permiten detectar fallos en el diseño (la experiencia para un novato como yo ha sido muy buena). Por buscar alguna pega: hay menos opciones que en el otro fabricante (no puedes elegir color en las placas, no soportan agujeros que no sean redondos). Son 3 placas y han tardado más en fabricarse, pero han estado menos tiempo en el correo.

La placa de abajo es de Elecrow. El servicio también muy bueno; aunque su web es menos intuitiva que la de OSH Park, tampoco tuve problemas para hacer el pedido (aunque soportan muchas más opciones; al final hice un pedido equivalente al de OSH Park, por una tercera parte del coste). Son 5 placas y han estado menos tiempo en fabricación, aunque con lo que ha tardado el paquete en llegar, los tiempos quedan empatados con los del otro fabricante.

La gente de Elecrow te envía una foto de las placas finalizadas antes de echarlas al correo, lo cual me ha parecido un detalle muy majo. Además me han llegado 7 placas, aunque pedí solo 5 (el mínimo, y así lo atestigua la factura). Puede que sea debido a dimensiones de la placa (tuve que pedir 10x10 cm, aunque mi diseño es de 7.366x7.620 cm, por eso puede que me hayan entrado más placas; pero no tengo ni idea, la verdad).

El fin de semana pasado tenía pensado empezar a soldar, pero estoy con gripe, así que tendrá que esperar :S.

Actualización: malas noticias, todas las placas de Elecrow están rotas. Básicamente los tres pines del interruptor S1 están conectados (tierra, 5v y pin al interruptor; lo cual crea un cortocircuito). No me di cuenta cuando testee las placas ¡y he llegado a soldar una! Hasta ahora la atención al cliente de Elecrow se limita a decir que los ficheros Gerber están bien; y en dichos ficheros los pins no están conectados. Así que muy mal con Elecrow :(.

Hay 2 comentarios, anotación clasificada en: avr, arduino, pcb.

21 de Marzo, 2015

Independiente por fin

He acabado el ensamblador, y revisado el desensamblador porque descubrí varios errores al probar ambas partes a la vez.

La idea es encadenar los dos módulos hasta que el resultado sea el mismo. Por ejemplo, supongamos un binario programa.bin:

$ ./dasm -ds programa.bin > fuente.s
$ ./dasm fuente.s > programa2.bin
$ ./dasm -ds programa2.bin > fuente2.s
$ diff -u fuente.s fuente2.s

En realidad hay que ajustar un poco la salida del desensamblador porque genera ??? cuando no encuentra una instrucción válida del 6502, pero se pueden reemplazar esos casos por un BRK (por ejemplo), que sí es válido para el ensamblador.

Por supuesto todo el desarrollo se hace en una máquina normal, y luego se integra con el sistema operativo del microcomputador para la prueba final.

Esto significa que ya puedo programar mi microcomputador sin la ayuda de un compilador cruzado ejecutándose en otra máquina :). Aquí hay un vídeo de ejemplo (en el que cometo un error; ya he corregido el ensamblador para que detecte esos despistes y muestre un mensaje de error).

Al final el entorno permite el comando list para leer memoria y mostrar el desendamblado (opcionalmente admite una posición de memoria), y as para ensamblar (que nuevamente permite indicar una posición de memoria).

La funcionalidad del ensamblador es bastante básica, pero proporciona lo que podemos esperar de un ensamblador para el 6502 (# para valores inmediatos, $ como prefijo para números hexadecimales, etc).

Además soporta la entrada de cadenas de texto y bytes arbitrarios usando el operador punto, con el ejemplo del vídeo:

as 1b00
 1b00: ."Hello world!", $0a, 0
Ok

Lo que almacena la cadena de texto y los dos bytes que le siguen en la posición de memoria 0x1b00.

Desde luego es bastante rudimentario, porque solo se puede introducir linea a linea y no soporta etiquetas o comentarios, pero creo que es suficiente para poder escribir programas sin ayuda externa ;).

Hay 0 comentarios, anotación clasificada en: avr, arduino.

11 de Marzo, 2015

»Desensamblando código 6502 · Ha sido más sencillo de lo que esperaba y en un par de ratos he implementado un desensamblador de código 6502 para mi microcomputador. El principal motivo es que considero que un microcomputador debe ser programable sin usar herramientas externas (por ahora he estado usando compiladores cruzados, ejecutando en mi portátil con Linux y generando código para el 6502 o nativo del ATmega328p). Ahora se pueden listar los programas, el siguiente paso: ¡un ensamblador!

Hay 0 comentarios, anotación clasificada en: avr, arduino.

9 de Marzo, 2015

»Cargando un pantallazo al estilo de los 80 · Ayer estuve revisando y ajustando la carga de programas vía audio. He creado una llamada al sistema para que los programas ejecutando en la máquina virtual puedan cargar datos en cualquier posición de memoria, de forma que cargar un pantallazo en memoria de vídeo es posible (cuidado, el volumen del vídeo está algo alto). Finalmente he decidido desactivar el vídeo cuando cargan los programas, porque el MCU no tiene suficiente potencia para hacer las dos cosas a la vez ;).

Hay 0 comentarios, anotación clasificada en: avr, arduino.

8 de Marzo, 2015

¡PCB en fabricación!

Hace un par de días pude acabar el diseño del PCB para mi proyecto: DAN64: un microcomputador de 8-bits basado en AVR.

El PCB
Me ha llevado varios días conseguir esta distribución

La verdad es que como primer proyecto es quizás algo ambicioso, y es posible que una vez llegue el PCB el diseño tenga algún fallo fundamental que haga que no funcione como se espera.

En primer lugar mi prototipo está montado en un breadboard, con cables más o menos largos, que hacen que los componentes estén razonablemente separados unos de otros. El PCB contiene el circuito completo en 2.9" x 2", con lo que se pueden dar intereferencias entre componentes que no he podido preveer en el prototipo (algunas sí: el conector del teclado PS/2 tiene un condensador porque generaba una gran cantidad de ruido cuando el teclado no estaba conectado).

Además está la posibilidad de que haya cometido algún error, ya sea al dibujar el esquema de lo que iba montando en el breadborad o porque me he dejado algún detalle que no conozco (a fin de cuentas voy aprendiendo sobre la marcha). La verdad es que KiCad tiene muchas herramientas que te ayudan a detectar fallos (¡y funciona! la primera versión que pensaba que estaba acabada era un total desastre :P), pero no es infalible. Por ejemplo: el footprint que usaba para el conector RCA del vídeo tenía las capas mal y no hubiera podido soldarlo.

Aún con todo lo estoy pasando muy bien con el proyecto. Las placas tardarán aún unas semanas en llegar, precio que hay que pagar por el bajo coste del fabricante; pero es mejor así porque aún tengo que trabajar en el software y si todo sale mal es mejor reducir pérdidas ;).

Actualización: estaba volviendo a soldar el conector PS/2 porque se me había soltado un cable y me he dado cuenta que he cambiado dos pines en el conector PS/2 del PCB :'(. Creo que he metido la pata al mirar el componente, porque en el PCB las cosas se ven desde arriba pero los pines quedan abajo. Espero poder parchear el problema y poder usar las placas, sobretodo para detectar otros posibles problemas, y quizás entonces hacer un nuevo pedido corregido.

Hay 2 comentarios, anotación clasificada en: avr, pcb.

Entradas antiguas