MICROCONTROLADOR COMPATIBLE CON AVR, INTERFAZ DE DEPURACIO´ N Y BUS WISHBONE
Salvador E. Tropea, David M. Caruso
Electro´nica e Informa´tica Instituto Nacional de Tecnolog´ıa Industrial
Buenos Aires, Argentina email: salvador@inti.gob.ar
ABSTRACT
En este trabajo presentamos un microcontrolador compatible con la l´ınea AVR de Atmel. Esta implementacio´n puede ser configurada para ser compatible con los AVR de segunda (ej. ATtiny22), tercera (ej. ATmega103) y cuarta (ej. ATmega8) generacio´n.
Este desarrollo incluye los siguientes perife´ricos compatibles: controlador de interrupciones, puertos de entrada y salida, temporizadores y contadores, UART y watchdog.
Para adaptarlo a distintas necesidades se incluyo´ una interfaz de expansio´n que utiliza el esta´ndar de interconexio´n WISHBONE.
A los fines de facilitar el desarrollo de aplicaciones sobre esta plataforma se lo doto´ de una unidad de depuracio´n y se adapto´ el software necesario para poder realizar depuracio´n de alto nivel con una interfaz de usuario simple e intuitiva.
El disen˜o fue verificado usando simuladores y FPGAs de Xilinx (Spartan II y 3A).
1. INTRODUCCIO´ N
Nuestro laboratorio realiza aplicaciones con microcontroladores embebidos de manera frecuente. Es por esta razo´n que al abordar la tecnolog´ıa FPGA se deseo´ implementar microcontroladores compatibles con los usados en dichos desarrollos. De esta manera personas del equipo que no se dedicaran a esta nueva tecnolog´ıa podr´ıan participar en desarrollos con FPGAs.
Con esta finalidad se encaro´ el desarrollo de un microcontrolador compatible con el PIC 16C84 [1] y posteriormente se an˜adio´ una interfaz de depuracio´n para el mismo [2]. Este microcontrolador mostro´ ser u´til y fue transferido a la industria aero-espacial [3]. Sin embargo su arquitectura no es buena para la programacio´n en lenguaje C. En los u´ltimos an˜os nuestro laboratorio se volco´ al uso de la l´ınea AVR de Atmel, que si fue disen˜ada para ser programada en
lenguaje C. Por lo que se decidio´ encarar el desarrollo de un equivalente para FPGAs.
En este trabajo presentamos las caracter´ısticas del microcontrolador desarrollado y de una interfaz de depuracio´n que permite depurar programas escritos en lenguaje C desde una PC y utilizando un software simple e intuitivo.
2. MICROCONTROLADOR
2.1. Arquitectura
El AVR es un microcontrolador del tipo RISC de 8 bits con dos espacios de memoria completamente independientes: memoria de programa y memoria de datos.
En la memoria de programas se encuentra el co´digo a ejecutar. Es una memoria de 16 bits y la mayor parte de las instrucciones son de este taman˜o. Algunas instrucciones necesitan dos posiciones de memoria (32 bits).
La memoria de datos es de 8 bits y se divide en tres secciones. Existen instrucciones espec´ıficas para acceder a cada una de estas secciones de memoria, pero tambie´n hay instrucciones que pueden acceder a todo el espacio de memoria indistintamente. La parte ma´s baja de esta memoria alberga 32 registros de 8 bits, seis de los cuales pueden agruparse de a pares para formar tres registros de 16 bits, usualmente usados como punteros. A continuacio´n se encuentra el espacio de entrada/salida, con un total de 64 posiciones de 8 bits. El resto de la memoria es RAM.
A partir de la segunda generacio´n la l´ınea AVR implementa un stack pointer. El mismo es decrementado cada vez que se guarda algo en la pila, usualmente se lo inicializa con la direccio´n ma´s alta de memoria RAM. Este recurso facilita el compilado de aplicaciones en lenguaje C.
La mayor parte de las instrucciones se ejecutan en un ciclo de reloj, pero algunas pueden tomar hasta cuatro ciclos, como en el caso del CALL.
El stack pointer y el registro de estados se encuentran mapeados en el espacio de memoria de entrada y salida.
La ALU implementa las operaciones ba´sicas de suma,
resta y desplazamiento. A partir de la cuarta generacio´n se introduce la multiplicacio´n de enteros con o sin signo y en formato de punto fijo (1.7).
2.2. Implementacio´n
Las herramientas de desarrollo utilizadas fueron las recomendadas por el proyecto FPGALibre [4] [5]. Para este desarrollo se utilizaron estaciones de trabajo que corren Debian [6] GNU [7] /Linux. Siendo el lenguaje de descripcio´n de hardware utilizado el VHDL.
A los fines de simplificar la tarea y comenzar por una base de co´digo funcional se decidio´ basar el desarrollo en el proyecto AVR Core [8] de OpenCores.org. Primeramente se adapto´ el co´digo a los lineamientos del proyecto FPGALibre. El co´digo VHDL original se encuentra escrito a muy bajo nivel, sin explotar toda la expresividad del lenguaje, por lo que se decidio´ reescribirlo para lograr un co´digo ma´s compacto y fa´cil de mantener. Tambie´n se unificaron mo´dulos que estaban separados, como la ALU y el procesador de operaciones orientadas a bits.
El proyecto original so´lo implementa la tercer generacio´n de AVR, en particular trata de modelar el ATmega103. Para lograr mayor flexibilidad se decidio´ hacer parametrizable a la CPU permitiendo seleccionar entre tres posibles generaciones. De esta manera es posible aprovechar mejor el a´rea de FPGA seleccionando entre tres versiones diferentes de acuerdo a la complejidad del proyecto en cuestio´n.
Las principales diferencias entre la segunda y la tercera generacio´n son el taman˜o del stack pointer (8 bits en la segunda y 16 en las posteriores) y la falta de las instrucciones de salto absoluto (JMP y CALL). La cuarta generacio´n agrega multiplicacio´n, movimiento entre pares de registros (16 bits) y mejora la instruccio´n LPM (acceso a la memoria de programa).
2.3. Perife´ricos
A los fines de facilitar el uso de aplicaciones ya existentes para la l´ınea AVR se decidio´ implementar algunos de los perife´ricos ma´s comunes.
Controlador de interrupciones: el mismo permite configurar, enmascarar, etc. las interrupciones externas. Se realizaron dos implementaciones diferentes, una compatible con las l´ıneas modernas (ej. ATtiny22 y ATmega8) y otro con las anteriores (ej. ATmega103).
Puertos de entrada y salida: permiten configurar pines como entrada o salida. Se realizo´ una implementacio´n nueva y flexible que pudiera modelar todos los casos posibles.
Temporizador y contadores: se adapto´ la implementacio´n del proyecto original. La misma implementa los Timers 0 y 2 del ATmega103. Se modifico´ el co´digo para permitir un mayor reuso ya que ambos timers son muy similares. Estos timers son de 8 bits y permiten su uso como contadores
o generadores de PWM. USART: se adapto´ la implementacio´n del proyecto ori-
ginal. La misma es muy flexible y permite la seleccio´n de distintas tasas de transmisio´n y largo de datos.
Watchdog: este perife´rico no se encontraba en la implementacio´n original y debido a que se encuentra relacionado con una instruccio´n de la CPU se decidio´ implementarlo.
2.4. Bus de Expansio´n
En un microcontrolador los perife´ricos disponibles son fijos, pero en el caso de una implementacio´n en una FPGA es deseable que los mismos puedan agregarse y/o quitarse fa´cilmente. Por esta razo´n se decidio´ implementar un bus de expansio´ n.
Siguiendo los mismos criterios adoptados en el pasado [1] se selecciono´ el esta´ndar de interconexio´n WISHBONE [9]. El mismo posee las siguientes ventajas:
Para casos simples (un maestro y uno o ma´s esclavos) se reduce a poca o ninguna lo´gica adicional.
Fue pensado para casos ma´s complejos (ma´s de un maestro, reintento, notificacio´n de error, etc.).
No posee royalties y puede ser usado sin costo alguno. La especificacio´n completa se encuentra disponible en internet.
Para acceder al bus WISHBONE se implementaron dos registros en el espacio de entrada y salida. Debido a que nuestra implementacio´n dejo´ de lado la memoria EEPROM de los AVR dispon´ıamos de las direcciones 0x1C a 0x1F. Se decidio´ utilizar las direcciones 0x1E y 0x1F. El registro 0x1F se usa para indicar la direccio´n del perife´rico que deseamos utilizar en el bus WISHBONE. Posteriormente cualquier operacio´n sobre el registro 0x1E se transfiere a trave´s del bus WISHBONE. Esto permite acceder a hasta 256 registros de 8 bits en el bus WISHBONE.
El bus WISHBONE contempla la conexio´n de perife´ricos lentos por lo que si un perife´rico necesita ma´s de un ciclo de reloj para realizar la operacio´n puede detener al microcontrolador hasta que la misma haya concluido.
2.5. Configuraciones Equivalentes
A los fines de proveer al usuario final de configuraciones que sean similares a microcontroladores ya existentes se implementaron tres microcontroladores, uno por cada generacio´n implementada:
ATtiny22: de segunda generacio´n, un u´nico puerto de entrada y salida de 5 bits, un timer de 8 bits, bus WISHBONE, stack pointer de 8 bits, watchdog, una fuente de interrupcio´n externa, 128 bytes de memoria RAM, 1024 words de memoria de programa.
ATmega103: de tercera generacio´n, 6 puertos de entrada y salida, UART, bus WISHBONE, dos timers de 8 bits, stack pointer de 16 bits, watchdog, ocho fuentes de interrupcio´n externa, 4096 bytes de memoria RAM, hasta 65536 words de memoria de programa.
ATmega8: de cuarta generacio´n, 3 puertos de entrada y salida, UART, bus WISHBONE, dos timers de 8 bits, stack pointer de 16 bits, watchdog, dos fuentes de interrupcio´n externa, 1024 bytes de memoria RAM, hasta 65536 words de memoria de programa.
Todas las configuraciones son parametrizables, pudie´ndose eliminar los perife´ricos no utilizados.
3. HERRAMIENTAS DE DESARROLLO
Debido a que esta implementacio´n incluye todo el set de instrucciones del procesador original, y a que se implementaron tres configuraciones equivalentes a microcontroladores existentes, es posible utilizar la mayor parte de las herramientas disponibles para la l´ınea AVR.
Existen herramientas de software libre de muy buena calidad disponibles para la l´ınea AVR y que pueden utilizarse con nuestro microcontrolador.
3.1. Ensamblador
Para compilar fuentes en assembler escritos para el ensamblador de Atmel (avrasm) es posible utilizar avra [10]. Se distribuye bajo licencia GPL y se puede compilar para las plataformas ma´s populares. Adema´s de ser compatible con el ensamblador de Atmel ofrece un soporte de macros mejorado y ensamblado condicional.
3.2. Compilador de C/C++
A pesar de tratarse de una plataforma de 8 bits es posible obtener una versio´n del compilador de C del proyecto GNU [11] capaz de generar co´digo para el AVR. A esta versio´n del gcc se la conoce como gcc-avr y es capaz de generar co´digo altamente optimizado para AVRs de segunda a quinta generacio´ n.
3.3. Biblioteca Esta´ndar de C
Una implementacio´n muy completa de la biblioteca esta´ndar de C especialmente disen˜ada para los AVR se encuentra disponible en el proyecto avr-libc [12]. Esta implementacio´n se encuentra especialmente optimizada para los AVRs y permite realizar aplicaciones flexibles y compactas.
Uno de los detalles interesantes de esta biblioteca es que es posible redireccionar la entrada y salida esta´ndar (stdin y stdout) a cualquier dispositivo, por ejemplo el puerto serie.
3.4. Depurador
El depurador del proyecto GNU, gdb [13], puede compilarse con soporte para AVR. A esta versio´n del gdb se la conoce como avr-gdb. El mismo es capaz de depurar programas escritos para los AVR. Debido a que gdb es una aplicacio´n enorme la misma corre en una PC comunica´ndose con un simulador de AVR o bien con el microcontrolador.
GDB es una aplicacio´n de l´ınea de comandos, pero existen varias interfaces de usuario disponibles para hacer ma´s simple su uso.
3.5. Simulador
Un simulador capaz de simular el comportamiento de un AVR es el simulavr [14]. El mismo corre en una PC y es posible utilizarlo desde el avr-gdb para realizar una depuracio´n del co´digo simulado sin necesidad de disponer de un AVR real.
4. INTERFAZ DE DEPURACIO´ N
4.1. Introduccio´n
El desarrollo de sistemas electro´nicos basados en sistemas embebidos presenta un desaf´ıo a la hora de eliminar errores de implementacio´n. Esto se debe a que los microcontroladores utilizados para estas tareas suelen ser pequen˜os y no es posible que ejecuten las complejas tareas involucradas en la depuracio´n de errores. La tarea se dificulta au´n ma´s cuando dichos dispositivos no poseen una interfaz de usuario amistosa, sin salida de v´ıdeo donde conectar un monitor ni entradas de teclado o similares para ingresar datos.
Para solucionar estos problemas se suele incluir funcionalidad en el microcontrolador que permite realizar las tareas de depuracio´n en forma remota utilizando una computadora personal, donde se encuentran disponibles los recursos antes mencionados.
4.2. Seleccio´n de la Arquitectura
Los dispositivos modernos de la l´ınea AVR poseen facilidad de depuracio´n a trave´s de un puerto JTAG (Joint Test Action Group). Una posible solucio´n a este problema hubiera sido implementar una interfaz compatible. La ventaja de esta solucio´n es que se podr´ıa haber utilizado cualquier software ya disponible, sin modificaciones. La desventaja es que las PCs no poseen interfaz JTAG, esto implica un cable especial. Este no es el u´nico problema, en la pra´ctica lo que soportan los programas no es el manejo directo de JTAG sino un protocolo especial que normalmente se implementa utilizando un microcontrolador. As´ı, estos cables en realidad implican el uso de un microcontrolador que es el que realmente se comunica por JTAG con el microcontrolador
que deseamos depurar. Una solucio´n posible era implementar esta segunda CPU en la misma FPGA.
Por otro lado era necesario implementar una unidad de depuracio´n compatible con la del AVR y someterse a sus limitaciones. Nuestro equipo ya pose´ıa experiencia en el desarrollo de una unidad de depuracio´n [2], ma´s flexible que la de los AVR. Por lo que se decidio´ adaptar nuestra unidad de depuracio´n y evitar la necesidad de un segundo microcontrolador. La desventaja de este mecanismo es que es necesario adaptar el software para que funcione con nuestro microcontrolador.
4.3. Comunicacio´n con la PC
Nuestra unidad de depuracio´n original es un perife´rico que soporta el esta´ndar de interconexio´n WISHBONE. Para controlar este tipo de perife´ricos es necesario poder acceder al bus WISHBONE, que se encuentra dentro de la FPGA. Una forma de lograr este acceso es utilizando algu´n tipo de puente. En nuestro trabajo anterior usamos un puente de puerto paralelo en modo EPP a WISHBONE [15], desarrollado por nuestro equipo. En este caso y debido a que el puerto paralelo ha sido reemplazado casi por completo por el USB optamos por utilizar un puente de USB a WISHBONE [16] [17], tambie´n desarrollado por nuestro equipo.
4.4. Caracter´ısticas
Nuestra unidad de depuracio´n permite:
Detener/Reanudar la ejecucio´n del microcontrolador en cualquier momento.
Ejecutar su programa paso a paso.
Detener la ejecucio´n cuando se alcanzo´ una posicio´n de memoria determinada, punto de parada o breakpoint. La cantidad de breakpoints es configurable entre 1 y 256.
Reinicializar el microcontrolador.
Acceder a todos los registros, incluyendo el contador de programa.
Acceder al espacio de entrada y salida.
Inspeccionar la pila de llamadas (calling stack).
Detener la ejecucio´n cuando se accede a una posicio´n de memoria de datos, watchpoint. Los accesos pueden seleccionarse para detenerse por lectura, escritura o ambos. El nu´mero de watchpoints es configurable entre 1 y 256.
Alterar la memoria de programa.
Detectar desbordes en la pila y detener la ejecucio´n cuando esto sucede.
4.5. Software complementario
Para poder depurar programas corriendo en microcontroladores AVR es posible utilizar el avr-gdb, pero este programa necesita comunicarse con otro programa que es el que realmente controla al microcontrolador. Un programa muy usado es el AVaRICE [18] y al ser software libre fue posible modificarlo. Se agrego´ soporte al AVaRICE para controlar nuestra unidad de depuracio´n utilizando el puerto USB.
Como interfaz de usuario para controlar al avr-gdb se selecciono´ el programa SETEdit [19]. El mismo es el entorno de trabajo recomendado por el proyecto FPGALibre. SETEdit implementa el protocolo GDB/MI para la depuracio´n de programas en C/C++ y assembler por lo que no fueron necesarios cambios importantes para lograr que el mismo se adaptara a la depuracio´n de programas escritos en lenguaje C o assembler corriendo en dicho microcontrolador.
4.6. Hardware complementario
El microcontrolador en cuestio´n no implementa la funcionalidad de reprogramacio´n incluida en el original. Esto no es un problema importante debido a que las FPGAs son reconfigurables y por lo tanto basta con volver a sintetizar el disen˜o para modificar el programa ejecutado por el microcontrolador. Es comu´n que los depuradores remotos puedan modificar el programa ejecutado por el sistema embebido, por lo que para complementar este desarrollo se disen˜o´ un perife´rico WISHBONE capaz de acceder a la memoria de programa del microcontrolador. Esto permitio´ reconfigurar dicha memoria sin necesidad de reconfigurar toda la FPGA.
La Fig. 1 ilustra la interconexio´n entre los distintos componentes de hardware antes mencionados, los bloques ilustrados con relleno so´lido corresponden a los desarrollos descriptos en este trabajo. En la Fig. 2 se muestra el flujo de datos dentro de la computadora, los datos ingresan a trave´s del puerto USB, son tomados por el sistema operativo (Linux) utilizando operaciones ba´sicas de entrada/salida y enviados al espacio de usuario a trave´s de la biblioteca libusb, estos datos son procesados por AVaRICE y traducidos al protocolo remoto de gdb y finalmente el depurador (avr-gdb) los env´ıa a la interfaz de usuario (SETEdit) utilizando el protocolo GDB/MI.
5. RESULTADOS
La Fig. 3 muestra una sesio´n de depuracio´n utilizando SETEdit. En la misma se observa el co´digo fuente del programa, el co´digo desensamblado y una ventana utilizada para monitorizar el valor de una variable.
Este desarrollo fue verificado utilizando FPGAs Spartan II y Spartan 3A de Xilinx. Para la s´ıntesis se utilizo´ el programa XST 10.1.02 K.37.
Fig. 1. Diagrama de conexiones de los bloques de hardware.
Fig. 2. Flujo de datos dentro de la computadora.
El a´rea ocupada depende de varios para´metros, a continuacio´n se describen algunos ejemplos.
Configuracio´n ATmega103 con memoria de programa de 1024x16, sin perife´ricos internos y so´lo una UART pequen˜a en el bus WISHBONE: 644 slices (245 FFs y 1124 LUTs) 3 BRAMs.
Configuracio´n ATmega8 con memoria de programa de 1024x16, sin perife´ricos internos y so´lo una UART pequen˜a en el bus WISHBONE: 707 slices (275 FFs y 1224 LUTs) 2 BRAMs y un multiplicador.
Configuracio´n ATtiny22 con memoria de programa de 1024x16, sin perife´ricos internos y so´lo una UART pequen˜a en el bus WISHBONE: 606 slices (237 FFs y 1053 LUTs) 2 BRAMs.
Configuracio´n ATmega8 con memoria de programa de 1024x16, puerto B habilitado, una UART pequen˜a en el bus WISHBONE, interfaz de depuracio´n con 3 breakpoints y 3 watchpoints (USB): 1548 slices (902 FFs y 2477 LUTs) 4 BRAMs y un multiplicador. Aproximadamente 500 de los slices son necesarios para la implementacio´n del puente de USB a WISHBONE.
So´lo en el u´ltimo caso se le pidio´ a la herramienta que buscara cumplir con una frecuencia de trabajo fijada de 24 MHz para todo el circuito, salvo para el PHY de USB que deb´ıa correr a 48 MHz. En el resto de los casos no se pidio´ ningu´n requisito en particular y la herramienta reporto frecuencias de trabajo de entre 30 y 37 MHz para una Spartan 3A grado 4.
5.1. Control de Motores de DC
Con la finalidad de verificar el correcto funcionamiento del microcontrolador y la capacidad de la unidad de depuracio´n, se encaro´ el desarrollo de un control de posicio´n para motores de corriente continua. Para dicho control se decidio´ implementar un PID. Dicho desarrollo utiliza los siguientes perife´ricos conectados al bus WISHBONE:
Modulador PWM de 15 bits de resolucio´n.
Decodificador de encoder relativo con 16 bits de resolucio´ n.
UART pequen˜a trabajando a 115200 baudios.
La configuracio´n usada es compatible con el ATmega8 con una memoria de programa de 4096x16 y la unidad de depuracio´n habilitada. De los perife´ricos internos so´lo el puerto B se encuentra habilitado. Dicha configuracio´n insumio´ 1732 slices (1009 FFs y 2786 LUTs) 7 BRAMs y un multiplicador (Spartan 3A).
Habie´ndose ya obtenido los primeros resultados exitosos queda por refinar el mecanismo de determinacio´n de las constantes del PID.
6. CONCLUSIONES
La eleccio´n de la arquitectura AVR permitio´ contar con una amplia gama de herramientas y bibliotecas. Al mismo tiempo se comprobo´ que programar este dispositivo es tan fa´cil como programar un AVR comercial.
La unidad de depuracio´n obtenida es poderosa, capaz de realizar la mayor parte de las operaciones realizadas por depuradores utilizados en computadoras personales, y que es de gran ayuda a la hora de buscar errores en sistemas funcionando en tiempo real.
El uso de FPGAs posee como ventaja el hecho de que la unidad de depuracio´n puede removerse en la versio´n definitiva del disen˜o con lo que el mismo no ocupa recursos en el dispositivo final. En el caso en que el disen˜o ocupe pra´cticamente el total de la FPGA basta con usar una FPGA ma´s grande durante la etapa de desarrollo, a los fines de incluir unidades de depuracio´n como esta.
La seleccio´n del esta´ndar de interconexio´n WISHBONE permitio´ el reuso de un puente de puerto USB y abre la posibilidad a la implementacio´n de otro tipo de mecanismos de comunicacio´n, como podr´ıan ser RS-232 o Ethernet.
La eleccio´n de modificar un programa como AVaRICE permitio´ acelerar notablemente el desarrollo y reusar interfaces de usuario ya existentes y con las cuales nuestro equipo ya se encontraba familiarizado.
La utilizacio´n de las herramientas propuestas por el proyecto FPGALibre mostro´ ser adecuada para este desarrollo.
Fig. 3. Sesio´n de depuracio´n.
7. REFERENCIAS
[1] S. E. Tropea and J. P. D. Borgna, “Microcontrolador compatible con PIC16C84, bus WISHBONE y video,” in FPGA Based Systems. Mar del Plata: Surlabs Project, II SPL, 2006, pp. 117–122.
[2] S. E. Tropea, “Interfaz de depuracio´n para microcontrolador,” in 2008 4th Southern Conference on Programmable Logic Designer Forum Proceedings, Bariloche, 2008, pp. 105–108.
[3] R. M. Cibils, A. Busto, J. L. Gonella, R. Martinez, A. J. Chielens, J. M. Otero, M.N˜ un˜ez, and S. E. Tropea, “Wide range neutron flux measuring channel for aerospace application,” in Space Technology and Applications International ForumSTAIF 2008 Proceedings, vol. 969, New Me´xico, 2008, pp. 316–325.
[4] S. E. Tropea, D. J. Brengi, and J. P. D. Borgna, “FPGAlibre: Herramientas de software libre para disen˜o con FPGAs,” in FPGA Based Systems. Mar del Plata: Surlabs Project, II SPL, 2006, pp. 173–180.
[5] INTI Electro´nica e Informa´tica et al., “Proyecto FPGA Libre,” http://fpgalibre.sourceforge.net/.
[6] Debian, “Sistema operativo Debian GNU/Linux,” http://www.debian.org.
[7] “GNU project,” http://www.gnu.org/.
[8] R. Lepetenok. (2009, Nov.) AVR Core. OpenCores.org. [Online]. Available: http://www.opencores.org/project,avr core
[9] Silicore and OpenCores.Org, “WISHBONE System-on-Chip (SoC) interconnection architecture for portable IP cores,”
http://prdownloads.sf.net/fpgalibre/wbspec b3-2.pdf?download.
[10] (2009, Nov.) Avr assembler (avra). [Online]. Available: http://avra.sourceforge.net/
[11] (2009, Nov.) GCC, the GNU compiler collection. [Online]. Available: http://gcc.gnu.org/
[12] M. Michalkiewicz, J. Wunsch et al. (2009, Nov.) AVR C runtime library. [Online]. Available: http://www.nongnu.org/avr-libc/
[13] (2009, Nov.) GDB: The GNU project debugger. [Online]. Available: http://www.gnu.org/software/gdb/
[14] T. A. Roth et al. (2009, Nov.) Simulavr: an AVR simulator. [Online]. Available: http://savannah.nongnu.org/projects/simulavr/
[15] A. Trapanotto, D. J. Brengi, and S. E. Tropea, “Puente IEEE 1284 en modo EPP a bus WISHBONE,” in FPGA Based Systems. Mar del Plata: Surlabs Project, II SPL, 2006, pp. 257– 264.
[16] R. A. Melo and S. E. Tropea, “IP core puente USB a WISHBONE,” in XV Workshop Iberchip, vol. 2, Buenos Aires, 2009, pp. 531–533.
[17] S. E. Tropea and R. A. Melo, “USB framework - IP core and related software,” in XV Workshop Iberchip, vol. 1, Buenos Aires, 2009, pp. 309–313.
[18] S. Finneran. (2009, Nov.) AVR in circuit emulator. [Online]. Available: http://avarice.sourceforge.net/
[19] Salvador E. Tropea et al., “SETEdit, un editor de texto amigable,” http://setedit.sourceforge.net.
Ver+/-