Tabla de Contenidos

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

Hardware

Está basado en el 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 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.

Hardware: Parte genérica 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 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.conf1) o de ~/.avrduderc2):

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 memorias3): 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 2008/10/26 23:12

1) Archivo de configuración general
2) Archivo de configuración del usuario, no hace falta ser root
3) Ver hoja de datos