====== Programador ISP serie ======
**[Por Falcald]** Lo arme para programar específicamente el AT89S8253, pero puede usarse para otros microcontroladores con pequeñas modificaciones.
===== Características =====
* Utiliza el puerto serie RS232
* **No requiere alimentación externa**
* Multiplataforma gracias al avrdude
* __Linux:__
* **No es necesario utilizarlo como //root//**
* No necesita módulos especiales. Es soportado nativamente.
* __Windows:__ //(Completar)//
===== Hardware =====
Está basado en el [[http://www.gybon.cz/~pavkriz/crusader/little-ponyprog/| Little-ponyprog]], pero adaptado para el microcontrolador AT89S8253 específicamente. Debería funcionar con otros microcontroladores de la familia conectando las señales SCK, MOSI, MISO y RESET y reemplazando el cristal por el del nuevo microcontrolador.\\
El software reconocerá esta placa como //ponyser//, que es la definición del [[http://www.lancos.com/prog.html#hardware|SIProg]], en el cuál están basados estos diseños.
Observar la lógica del RESET, algunos tienen la entrada negada y otros, como en este caso, sin negar. Se puede invertir agregando un transistor inversor, como en el Little-ponyprog, o solo cambiando la definición del programador //ponyser// en el avrdude (Negar Tx).
==== Esquemas ====
El esquema está partido en dos para poder adaptar el diseño a varios microcontroladores, al igual que en el //SIprog//. No hace falta seguir esta línea si solo se quiere hacer un programador para un microcontrolador específico.
{{ :materias:66:09:progat89s8253_a.gif?640x400 |Hardware: Parte genérica}}
{{ :materias:66:09:progat89s8253_b.gif |Hardware: Parte específica del AT89S8253}}
El componente más caro es el LM2936Z-5. Habria que investigar si se puede reemplazar.
===== Software =====
El software necesario para programar los microcontroladores en linux es el //**[[http://savannah.nongnu.org/projects/avrdude/|avrdude]]**//. Está hecho para trabajar con la línea AVR de Atmel, sin embargo permite agregar definiciones de microcontroladores. El AT89S8253 no viene definido en su archivo de configuración, por lo que se debe agregar el siguiente código al final de /etc/avrdude.conf((Archivo de configuración general)) o de ~/.avrduderc((Archivo de configuración del usuario, no hace falta ser //root//)):
Cualquier mejora es bienvenida
//Basado en la definición de Benedikt Sauter: http://www.embedded-projects.net/index.php?page_id=241 //
#------------------------------------------------------------
# AT89S8253
#------------------------------------------------------------
part
id = "8253";
desc = "AT89S8253";
# bad hack: AT89S8253 has got only 2 signature bytes
# but 3 must be especified
signature = 0x1e 0x73 0x1e;
chip_erase_delay = 20000;
pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1",
"x x x x x x x x x x x x x x x x";
chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x",
"x x x x x x x x x x x x x x x x";
timeout = 200;
stabdelay = 100;
cmdexedelay = 25;
synchloops = 32;
bytedelay = 0;
pollindex = 3;
pollvalue = 0x53;
predelay = 1;
postdelay = 1;
pollmethod = 0;
memory "flash"
size = 12288;
paged = no; # yes / no
min_write_delay = 4000;
max_write_delay = 9000;
readback_p1 = 0xff;
readback_p2 = 0xff;
read = " 0 0 1 0 0 0 0 0",
" x x a13 a12 a11 a10 a9 a8",
" a7 a6 a5 a4 a3 a2 a1 a0",
" o o o o o o o o";
write = " 0 1 0 0 0 0 0 0",
" x x a13 a12 a11 a10 a9 a8",
" a7 a6 a5 a4 a3 a2 a1 a0",
" i i i i i i i i";
mode = 0x21;
delay = 12;
;
memory "eeprom"
size = 2048;
paged = no; # yes / no
min_write_delay = 3000;
max_write_delay = 9000;
readback_p1 = 0xff;
readback_p2 = 0xff;
read = " 1 0 1 0 0 0 0 0",
" x x x x x a10 a9 a8",
" a7 a6 a5 a4 a3 a2 a1 a0",
" o o o o o o o o";
write = " 1 1 0 0 0 0 0 0",
" x x x x x a10 a9 a8",
" a7 a6 a5 a4 a3 a2 a1 a0",
" i i i i i i i i";
mode = 0x21;
delay = 12;
;
memory "fuses"
size = 1;
paged = no; # yes / no
min_write_delay = 3000;
max_write_delay = 9000;
readback_p1 = 0xff;
readback_p2 = 0xff;
read = " 0 0 1 0 0 0 0 1",
" x x x x x x x x",
" x x x x x x x x",
" x x x x o o o o";
write = " 1 0 1 0 1 1 0 0",
" 0 0 0 1 i i i i",
" x x x x x x x x",
" x x x x x x x x";
mode = 0x21;
delay = 12;
;
memory "lock"
size = 1;
paged = no; # yes / no
min_write_delay = 3000;
max_write_delay = 9000;
readback_p1 = 0xff;
readback_p2 = 0xff;
read = " 0 0 1 0 0 1 0 0",
" x x x x x x x x",
" x x x x x x x x",
" x x x x x o o o";
write = " 1 0 1 0 1 1 0 0",
" 1 1 1 0 0 i i i",
" x x x x x x x x",
" x x x x x x x x";
mode = 0x21;
delay = 12;
;
memory "usgn"
size = 64;
paged = no; # yes / no
min_write_delay = 3000;
max_write_delay = 9000;
readback_p1 = 0xff;
readback_p2 = 0xff;
read = " 0 0 1 0 0 0 1 0",
" x x x x x x x x",
" x x a5 a4 a3 a2 a1 a0",
" o o o o o o o o";
write = " 0 1 0 0 0 0 1 0",
" x x x x x x x x",
" x x a5 a4 a3 a2 a1 a0",
" i i i i i i i i";
mode = 0x21;
delay = 12;
;
memory "signature"
size = 3;
read = " 0 0 1 0 1 0 0 0",
" x x x x x x x x",
" x x 1 1 0 0 0 a0",
" o o o o o o o o";
;
;
Con esta definición se pueden programar las memorias((Ver hoja de datos)): flash, eeprom, fuses, lock y User Sgn. Se programa byte x byte debido a que el modo paginado para este microcontrolador no es soportado por el avrdude. Al parecer, los AVRs tienen un protocolo diferente.
== Ejemplo de invocación: ==
avrdude -p 8253 -P /dev/ttyS0 -c ponyser -U flash:r:main:r
Si se lo llama de esa forma, el avrdude **lee la memoria flash** del **microcontrolador AT89S8253**, a traves del **programador ponyser** que está conectado al **dispositivo ttyS0** y vuelca los datos en el **archivo main** en **modo raw**.
---------
--- //[[falcald@icqmail.com|falcald]] 2008/10/26 23:12//