Programador de ATmega16 en Arduino

Saturday, January 7th, 2012

Después de buscar sin resultados durante la semana un ATmega16, ayer viernes lo compré para poder probar este proyecto…

El código se descarga de la siguiente dirección y ahí trae documentación sobre cómo usarlo y cómo funciona.

ATmega16_programmer

En resumen es un programador en Arduino para el microcontrolador ATmega16 usando SPI.

😀

Una foto de mi setup de pruebas donde trata de apreciarse lo sencillo del sistema:

Desde que llevé Microcontroladores (TE2023) me surgió con Dante la inquietud de hacer un programador, en ese entonces para un 8051. De proyecto final terminé haciendo más bien un ensamblador del lenguaje ensamblador de ese micro (veo que no lo he subido por acá), pero bueno, siguió la idea.

El semestre pasado la materia cambió a usar el ATmega16, y bueno, en estos días pensé que estaría bien hacer un programador en Arduino porque es una herramienta que se ha hecho popular y ubicua. Así los nuevos alumnos de la materia, en vez de usar el TopMax del laboratorio o de comprar un programador propio, pueden usar la tarjeta Arduino que probablemente ya tengan.

El lunes programé las funciones de SPI, dejé pausado el proyecto hasta tener un micro donde probarlo, y ya que el viernes lo conseguí, escribí el parseo de los archivos HEX. Ahorita estuve asegurándome de que funcionara bien (escribiéndole al micro archivos HEX que tengo por aquí y revisando la memoria de programa), escribiendo la documentación que está en el código, y agregándole la licencia de Software Libre (¡los invito a mejorarlo!).

No sé (todavía) escribir código para ese microcontrolador, así que agradeceré que me avisen cuando le pongan un programa funcional usando esta herramienta.

¡Feliz inicio de semestre!

🙂

 

Árbol de Navidad con displays de 7 segmentos

Wednesday, December 21st, 2011

http://www.youtube.com/watch?v=7SR2s0dW_-M

Hace como dos semanas tuve la idea pero apenas estos días pude llevarla a cabo.

El lunes compré los materiales y hoy acabé, la verdad es que el sistema es muy simple pero armarlo fue más talachudo de lo que pensé.

El circuito consiste en 15 displays de 7 (8) segmentos de cátodo común. Los cátodos de cada lámpara van a un decodificador de 4 a 16, y todos los ánodos están en mismos nodos. Así, se requieren 12 líneas para controlar: 4 para seleccionar la lámpara a encender, y 8 para encender o apagar cada segmento o punto.

El algoritmo de control no es novedad: cada cierto tiempo se selecciona una lámpara y se colocan los valores de encendido / apagado que se desean para esa lámpara, así una por una. Esto se hace a una velocidad tal que para el ojo humano parece que todas están encendidas al mismo tiempo.

Adjunto un archivo que sirve como plantilla para controlar el árbol con un Arduino Uno. Si alguien quisiera probar alguna animación / patrón, puede modificarla y enviármela para que lo pruebe

😛

SevenSeg_XmasTree_Layout

Brainfuck Microcomputer

Sunday, June 19th, 2011

Brainfuck implemented in hardware 😀

Download it here:

brainfuckmicrocomputer.zip

Extract from README.txt:


The brainfuck Microcomputer is a VHDL-designed computer that uses
a VHDL-designed microprocessor with brainfuck programming language
as its assembly language.

With a proper suite of software, the hardware described by these
files can be configured in a FPGA in order to make the brainfuck
Microcomputer ‘come alive’.

What does the computer contains
Internally, the brainfuck Microcomputer has the following components:
* User-configurable brainfuck Microprocessor
* Program memory with an user-defined size
* User-configurable RS-232 UART
* Hardware to assist in memory programming

Externally, the brainfuck Microcomputer has the following pins:
* System clock input
* Mode Switch input
* Reset Button input
* UART receiving input
* UART transmitting output

Modes of operation
The computer described has two modes of operation: Programming Mode
(Mode Switch on) and Normal Mode (Mode Switch off). The first one allows
the user to download a program into the computer’s memory and the second
one executes it.
If the Reset Button and/or the Mode Switch is on, brainfuck
microprocessor is reset: the program counter, stack pointer and
registers are all set to zero.

Input / Output
Communication with the brainfuck Microcomputer happens through its
user-configurable RS-232 UART.
If the computer is in Programming Mode, bytes received by the UART
will be sequentially stored in program memory starting from the first
address.
If the computer is in Normal Mode, the UART will be used as the
input/output device required by the brainfuck programming language.
Note: the only UART parameter that can be configured is its baud rate.
The other parameters are 8/N/1
(8 bits of data, no parity bits, 1 stop bit).

User configuration
The brainfuck Microcomputer has some user-configurable parameters in
the GENERIC section of the main file:
* CLK_FREQ: The frequency (in Hz) of the clock that will run the computer
* BAUD_RATE: The baud rate of the UART
* D: Number of bits of the Program Memory Address
(i.e. program memory will have 2^ D words)
* P: Number of bits of Microprocessor Register Pointer
(i.e. there will be 2^ P registers to use by the program)
* S: Number of bits of Microprocessor Stack Pointer
(i.e. stack for nested loops will have 2^ S locations).

Brainfuck compilation
The brainfuck Microprocessor needs a compiled version of brainfuck
programming language. The binary file format is just a sequence of
compiled instructions.
The brainfuck commands are translated into instructions according to the
following rules:
* > becomes 0x80
* < becomes 0x81
* + becomes 0x82
* – becomes 0x83
* . becomes 0x84
* , becomes 0x85
* ] becomes 0x87
* [ becomes the offset-1 of the matching ].

As an example, let’s consider the following program:
++++ > , < [ > ++ < – ] > . ,

It has to be sent to brainfuck Microcomputer as the following sequence:
0x82 0x82 0x82 0x82 0x80 0x85 0x81 0x05
0x80 0x82 0x82 0x81 0x83 0x87 0x80 0x84
0x85

Note that the ] offset relative to the [ is 6, so [ has to be compiled
as 0x05.
Note also that if the ‘,’ at the end is ommited, program execution will
continue throughout the memory, overflowing the program counter and
returning to the beginning.

Brainfuck Microprocessor operation
The brainfuck Microprocessor is a physical implementation of the machine
model required by the language. It has a register bank that can
increment, decrement, output and store the register addressed by
a register pointer, which in turn can be incremented and decremented.
It also has a program counter with increment and load capabilities and
a stack that is used for return addresses of a loop.
The microprocessor has also a control unit and an instruction decoder.

The machine cycle of the processor consists of four clock cycles,
each with a corresponding state:
1) Output Program Counter to read program memory
2) Read, register and decode instruction
3) Execute instruction
4) Continue with instruction execution and update Program Counter

A summary of how the brainfuck instructions are executed:
(‘PC’ is ‘Program Counter’ and ‘current register’ is used to refer to
‘register pointed by Register Pointer’)
(0) > Increment Register Pointer and increment PC
(1) < Decrement Register Pointer and increment PC
(2) + Increment current register and increment PC
(3) – Decrement current register and increment PC
(4) . Ouput current register and assert activation signal
of output device.
If done signal is returned, increment PC, else do not modify PC
(stay here until done signal is returned – until data has been sent)
(5) , Assert activation signal of input device.
If done signal is returned, increment PC and save data to current
register, else do not modify PC
(stay here until done signal is returned – until data has been received)
(6) [ If current register is zero, add to PC the value of the
instruction (offset-1 of matching bracket) plus two in order to make
PC point to the instruction following the matching bracket.
Else, push PC into stack and then increment it.
(7) ] Pop stack. If current register is zero, increment PC.
If current register is not zero, load value from stack into PC.

Other
Any questions, improvements, comments are welcome 🙂

SejoProyectos: Verano 2011

Thursday, May 19th, 2011

Ahora que empezaron las vacaciones, no hay que desaprovechar la gran oportunidad que se nos está dando para realizar proyectos sin presiones y distracciones de la escuela.

En este post describo varios proyectos que tengo ganas de realizar este verano, los publico porque pienso que estaría muy bien que colaboráramos entre varias personas para desarrollarlos.

Cada proyecto tiene su título, una pequeña descripción, y una lista de actividades generales que el proyecto implica. Cuando dice diseño de hardware digital se refiere a usar VHDL e implementarlo en FPGA. Las actividades que contienen la palabra software están pensadas para ser realizadas principalmente en C o en Python, aunque también se aceptaría Java. Diseño y elaboración de PCBs implica hacer esquemáticos y plantillas de PCBs (Printed Circuit Boards), además de armarlos físicamente.

Si están interesados en trabajar en alguno de ellos o si tienen otras propuestas, no duden en contactarme a través de los comentarios de este post, de Twitter (@SrSejo) o de Facebook.

Redes neuronales en hardware: reconocimiento de imágenes

Aprovechando la flexibilidad y paralelismo de las FPGAs, en este proyecto se implementarán redes neuronales en ellas. La idea es tener una respuesta inmediata al recibir un estímulo nuevo, lo que le permitiría un funcionamiento óptimo en aplicaciones donde se requiere velocidad. Tengo interés en usarlas para reconocimiento de imágenes, especialmente en reconocimiento de caracteres escritos.

Actividades / Temas:

  • Diseño de hardware digital.
  • Software de interfaz PC – hardware.

Analizador lógico de múltiples canales

Un analizador lógico es un dispositivo que presenta los estados de una señal digital en función del tiempo. En el laboratorio usamos osciloscopios con este fin, con la gran desventaja de que solo cuentan con dos canales debido a la naturaleza analógica de sus posibles entradas. Este proyecto consiste en diseñar un módulo de hardware digital que al conectarlo a una computadora cumpla la función de analizador lógico de múltiples canales.

Actividades / Temas:

  • Diseño de hardware digital.
  • Software de despliegue (graficación) de señales / datos.
  • Software de interfaz PC – hardware.
  • Diseño y elaboración de PCBs.

Brainfuck microcomputer

Brainfuck es un lenguaje de programación ‘esotérico’ consistente en solo ocho instrucciones de un caracter de longitud cada una. La idea de este proyecto es diseñar un procesador junto con hardware periférico mínimo (e.g. interfaz serial) para obtener una computadora que funcione a base de Brainfuck compilado.

Actividades / Temas:

  • Diseño de hardware digital.
  • Software ensamblador / compilador de Brainfuck.
  • Software de interfaz PC – hardware.

Ropa con LEDs

Inspirado en tendencias actuales, este proyecto interdisciplinario (ingeniería + diseño) tiene como fin desarrollar prendas de vestir con LEDs que se encienden por acción de un microcontrolador.

Actividades / Temas:

  • Programación de microcontroladores.
  • Diseño de modas / gráfico / industrial.
  • Diseño y elaboración de PCBs, arreglos de LEDs e interconexiones.
  • Software de interfaz PC – hardware.

Experimentación con distintos microcontroladores y microprocesadores

Más que un proyecto, quisiera hacer pruebas con las siguientes plataformas: ATmega16 (el microcontrolador que sustituirá al 8051 en la materia de Microcontroladores), MicroBlaze (soft-processor de Xilinx que se puede implementar en una FPGA), x86 y x86_64 en Linux

Actividades / Temas:

  • Programación en lenguaje ensamblador.

Engineering: making your dreams come true 😛

PCB para Sistema Mínimo del AT89S51

Sunday, February 13th, 2011

La práctica 3 del Laboratorio de Microcontroladores consistió en armar (con cablecitos) y soldar una tarjeta con los componentes indispensables para hacer funcionar al microcontrolador AT89S51. Si bien ya se entregó, quise reforzar mis conocimientos de diseño de PCBs (Ver post anterior), por lo que hice este proyecto en KiCad.

En primer lugar tuve que crear el símbolo del microcontrolador para usarse en EESchema (el programa de KiCad para hacer esquemáticos). Aquí está el archivo de la librería que lo contiene: Librería de Kicad con el AT89S51

Luego ya lo usé para crear el esquemático y después la PCB (vuelvo a recomendar este tutorial)

Les dejo un screenshot del resultado

Ya la mandé a hacer, por lo que este post tampoco ha concluido…

De aquí se pueden bajar los archivos del proyecto: Archivos de Kicad para el Sistema Minimo del AT89S51

Controlador de marquesina en matriz de LEDs usando la serie 7400

Sunday, February 13th, 2011

Hace tiempo, cuando me iba a cambiar de carrera a ITSE, la directora de carrera Katya me dijo que las materias iniciales de Sistemas Digitales eran importantes porque luego la gente se envicia con los microcontroladores y quiere solucionar todo con ellos siendo que habría soluciones más sencillas “usando solo unas compuertas”. No sé por qué se me quedaron tan grabadas esas palabras…

Es sabido que la primera práctica verdadera (es decir, de programación) del Laboratorio de Microcontroladores en el Tec CCM es hacer una marquesina en una matriz de LEDs de 8 (o 7) columnas por 16 (o 15) renglones. Un mapa de bits (¿obligatoriamente son las letras ABCD?) se muestra en la matriz y avanza a través de ella.

Sé que me emocionaré cuando mi programa en lenguaje ensamblador del 8051 logre hacer eso (todavía no llego a la práctica). Como sea, pensé en el proyecto que describo en este post (y lo desarrollé y escribí) solo(1) para probar que la marquesina es algo que se puede hacer desde que se tienen los conocimientos de Sistemas Digitales 1 (o Arquitectura Computacional y Sistemas Digitales en el caso de los ITC), y que tal vez no hay que hacer tanto fuzz por poderlo hacer hasta Microcontroladores. (Sí, sí, qué arrogancia la mía)

(1) también lo escribo para documentar mis actividades extraacadémicas

Empecemos…

El problema:

Presentar una marquesina en el sistema de matriz de LEDs que armamos en la práctica 1 del Laboratorio de Microcontroladores(2) utilizando chips de la familia 7400 de TTL y una EPROM.

(2)El sistema de matriz de LEDs tiene dos buses de entrada: uno de 4 bits donde está codificado el número de columna (de 16 posibles) a activar, y uno de 8 bits que consiste en la combinación de LEDs a encender en la columna activada.

Objetivos de la solución:

  • Controlar los buses del sistema de matriz de LEDs (a partir de ahora lo llamaré solo matriz de LEDs) para que muestren (¡en lucesitas encendidas! jaja) un mapa de bits guardado en una memoria
  • Controlar la posición (movimiento cíclico) del mapa de bits en la matriz de LEDs.

Solución propuesta:

Como la matriz de LEDs solo puede encender una columna a la vez, para mostrar una imagen en ella hay que hacer dos cosas:

  1. Encender (activar) por una fracción de tiempo cada columna, a una frecuencia lo suficientemenet alta para que engañar al ojo humano y hacerlo creer que todas están activas a la vez
  2. Encender los LEDs que corresponden a la imagen de acuerdo a qué columna está  activa.

Para el punto 1 solo hay que usar un contador funcionando a la frecuencia adecuada. El valor del contador se envía a la matriz de LEDs a través del bus de columnas, y ella se encarga de decodificar el valor del contador para activar una columna.

Para el punto 2 hay que decodificar el valor del contador para mostrar un patrón de bits correspondientes. La solución que encuentro más flexible es usar una ROM donde las direcciones se asocian a las columnas, y el dato almacenado es la combinación de bits a mostrar que se manda al bus de renglones de la matriz.

Por otro lado, hay que hacer que el mapa de bits “avance cíclicamente” dentro de la matriz, es decir: si el patrón está en la primera columna pasa a la última, y si está en cualquier otra columna N, pasa a la columna N-1.

Para esto propongo un contador que guarde la dirección en memoria que en un momento dado corresponde al dato de la primera columna, es decir que funcione como apuntador. Haciendo avanzar a una determinada frecuencia a este contador, el dato correspondiente a la primera columna también avanza.

Ahora, ¿cómo usar este apuntador para conocer el dato correspondiente a TODAS las columnas? Fácil: le sumamos el valor del contador de columnas, y el resultado es la dirección del dato a acceder. Por ejemplo, trabajando con 4 bits, si el apuntador vale 0xD, la dirección del dato de la columna 0x0 es 0xD, para 0x1 es 0xE, para 0x2 es 0xF, para 0x3 hay overflow y el resultado es 0x0, pero no es problema (al contrario) porque estamos “regresando” dentro de la imagen (guadada entre 0x0 y 0xF) logrando que avance cíclicamente.

Para hacer funcionar el contador con el apuntador, si bien podríamos usar otra señal de reloj, es preferible utilizar el mismo que se usa para el contador de columnas, pero con una frecuencia dividida usando contadores. La primera división de frecuencia puede ser el mismo contador de columnas: el bit más significativo va a llevar la frecuencia de actualización (¿refrescamiento?) de la matriz completa. Usando este bit como reloj para otro contador podemos obtener frecuencias divididas que luego podemos escoger con un multiplexor controlado con switches.

A continuación un diagrama a bloques del asunto

Aterrizando la idea

Ayudado con la lista en Wikipedia de los chips de la serie 7400, hice la siguiente lista de materiales para este sistema:

  • 2 Dual 4-bit Binary Counter 74393(3). Esto nos da cuatro contadores de 4 bits. Uno lo usamos para las columnas, otro para el apuntador, y los otros como contador de 8 bits para el divisor de frecuencia
  • 1 4-bit Full Adder 7483. Para sumar el apuntador con el valor de columna
  • 1 8-line to 1-line Multiplexer 74151. Para escoger entre las ocho opciones de frecuencia dividida
  • 1 EPROM 2732. Memoria para guardar el mapa de bits.(4)
  • Headers dobles y sencillos. Para las entradas y salidas
  • DIP Switch de 4 bits, 3 resistencias de 1kOhm. Para controlar el multiplexor

(3) Los conseguí en TuProyecto.com, me dijeron que tuvieron que ir hasta quiensabedonde para comprarlos porque no son comunes. Se pueden reemplazar por cuatro 4-bit Binary Counter 7493

(4) Es de 4kx8, lo que es demasiado considerando que solo usaremos 16 de esas 4k direcciones. La escogí solo porque es la que le pidieron a los ITCs de mi generación, pero podría ser cualquier otra mientras tenga al menos 16 localidades de 8 bits. También recomendaría comprar una base para poder quitarla y reprogramarla fácilmente

Esquemático y diseño de PCB

Ya con los materiales, hice el esquemático y diseño del PCB en KiCad, ayudado con este tutorial. Aquí unos screenshots:

De aquí se pueden descargar los archivos del proyecto: MatrizTTLs

Armado del circuito

Aquí hay una foto de los materiales:

La PCB la mandé a hacer en una máquina de control numérico computarizado (CNC) que tienen en el Tec Campus Santa Fe, así que esto todavía no termina…