Skip to content
Ariel Burman edited this page May 7, 2017 · 4 revisions

Programador del Club de Robótica

Este programador es una versión adaptada del usbtinyisp, y es compatible con él. Por lo tanto todos los programas que soportan usbtinyisp también van a soportar esta versión.

Hacemos disponibles bajo licencias libres tanto el esquemático como el diseño del PCB para que cada uno pueda fabricar su placa, o modificarla a gusto.

programador_partes programador_partes

¿Cómo armar el programador?

Para que puedas armar un programador, dispones del esquemático y el diseño del PCB en document#36. Si preferís mandar a fabricar el PCB, acá hay una lista de fabricantes. La versión 1.8 se puede conseguir en Ernesto Mayer bajo la referencia A42775. Además de estos diseños vas a necesitar una cantidad de materiales, que depende de la versión en particular que utilices.

Versión 1.8

La versión 1.8 es igual a la 1.7, con algunos cambios en el diseño para que sea más fácil de soldar. La lista de materiales es igual a la 1.6.

Versión 1.7

La versión 1.7 arregla el error de diseño de la 1.6, manteniendo la lista de materiales igual.

Versión 1.6

Esta versión tiene un error en el diseño del PCB. El conector USB está dado vuelta, por lo que para que el circuito funcione hay que soldarlo desde la parte de abajo de la placa, o sea, poner el conector en la capa de Copper, no Component. Para que no quede la placa dada vuelta, se pueden soldar el conector con cables a la placa. Se recomienda usar cable alambre y cubrir las soldaduras son termocontraible para mayor robustez.

Si se utiliza un cable USB cortando el cable por la mitad, la conexión debe ser la siguiente. Colocando el programador de forma tal de que la leyendo Club de Robótica se lea correctamente, los hilos del cable USB se conectan en el siguiente orden, desde arriba hacia abajo:

  • Negro
  • Verde
  • Azul
  • Rojo

Lista de Materiales

Versión 1.6 a 1.8:

Lista de materiales a soldar

Referencia Componente
C1 100n
C2 100u, 16V o 25V(si es de más tensión es grande y no entra)
C3 22p
C4 22p
C5 100n
D1 3.6V (zener 1/2 W)
D2 3.6V (zener 1/2 W)
D3 LED_VERDE (3mm)
D4 LED_ROJO (3mm)
JP1 conector 2x1 (pines) VCC
P5 USB_A (macho, para circuito impreso)
P6 conector 3x2 (pines) ISP
P7 conector 3x2 (pines) Targ.
R1 1.5K
R2 Reemplazar con un puente
R3 Reemplazar con un puente
R4 1.5K
R5 1.5K
R6 10K
R7 27
R8 27
R9 470k
U1 74HC125N
U2 ATTINY2313DIP/SO
zocalo 10x2
zocalo 7x2
X1 12MHz (mini)

Lista de materiales para comprar

componente cantidad comentarios
R 1.5 kohm 3 1/4 Watt
R 10 kohm 1 1/4 Watt
R 27 ohm 2 1/4 Watt
R 470 kohm 1 1/4 Watt
C 100 nF 2 ceramicos
C 100 uF 1 electrolíticos 16V o 25V(si es de más tensión es grande y no entra)
C 22 pF 2 poliester o cerámicos
D 3.6 V 2 zener 1/2 W
Led Verde 3mm 1
Led Rojo 3mm 1
cristal 12MHz 1 (mini)
74HC125N 1
ATTINY4313DIP 1
zocalo 7x2 1
zocalo 10x2 1
usb A p/impreso 1 (macho, para circuito impreso)
Jumper 1
conector para cable plano 3x2 2
cable plano 6 cables 60 cm si se compra en cantidad, conviene comprar cable de 48 hilos que sirve para 8 programadores cada 60 cm
pines simples 2x1 1 una tira de 1x40 alcanza para 20 programadores
pines dobles 3x2 2 una tira de 2x40 alcanza para 6,5 programadores

Para la versión 1.6 se necesita un cable USB ($1).

Versión 1.5 o anteriores

Lista de materiales:

| U1         ATTINY2313DIP
| Zócalo     10x2
| C1         100n        
| C2         100u 25V (si es de más tensión es grande y no entra)       
| C3         22p         
| C4         22p         
| D1         3.6V        
| D2         3.6V        
| D3         LED rojo         
| D4         LED verde        
| JP1        JUMPER      
| JP2        JUMPER      
| JP3        JUMPER      
| P1         CONN_5X2 (se puede usar una fila de pines dobles para estos dos conectores de 5x2)   
| P4         CONN_5X2    
| P5         CONN_USB_A_MACHO
| R1         1.5K        
| R2         1.5K        
| R3         1.5K        
| R4         1.5K        
| R5         1.5K        
| R6         10K         
| R7         270          
| R8         270          
| U1         74HC125N    
| Zócalo     7x2
| X1         12MHz
| Cable plano de 10 hilos y 2 fichas para cable de 5x2       

¿Qué firmware debe llevar mi programador?

Si el programador posee un micro ATtinny4313 se debe grabar este Firmware main.hex v0.3.0 que permite grabar microcontroladores de la familia 8051 y AVR.

Programar el microcontrolador del programador.

Una vez que tenés la placa armada, tenés que programar el ATtiny4313 (o ATtiny2313 usando una versión anterior) que usa el programador. Para grabar el firmware seleccionado en el paso anterior, vas a necesitar otro programador que ya esté funcionando. Si no es uno igual, se puede usar por ejemplo un stk200 (acá tenés un ejemplo). Si usas avrdude, los comandos son los siguientes.

Para subir el firmware:

$ avrdude -c usbtiny -p t4313 -U flash:w:main.hex:i

Para ajustar los fuses para que use cristal externo:

$ avrdude -c usbtiny -p t4313 -U hfuse:w:0xdf:m -U lfuse:w:0xef:m

Si el micro es un ATtiny2313 reemplaza t4313 por t2313

$ avrdude -c usbtiny -p t4313 -U flash:w:main.hex:i
$ avrdude -c usbtiny -p t4313 -U hfuse:w:0xdf:m -U lfuse:w:0xef:m

¿Cómo armar el conector para programar tu microcontrolador?

Una vez que tenés tu programador funcionando, en tu proyecto debes incluir un zócalo (o tira de pines) para poder conectar el programador al microcontrolador (uC). A partir de la versión 1.5 del programador, usamos el conector de 3x2 oficial de Atmel, con el siguiente pinout:

Pin del conector Pin del uC Nro Pin uC (*)
1 MISO 18
2 VCC 7
3 SCK 19
4 MOSI 17
5 RESET 1
6 GND 8

En las versiones anteriores, se usaba el siguiente conector de 5x2:

Pin del conector Pin del uC Nro Pin uC (*)
1 MOSI 17
2 VCC 7
3 NC -
4 GND 8,22
5 RST 1
6 GND
7 SCK 19
8 GND
9 MISO 18
10 GND

(*) Se indica el nro de pin del ATmega8/88

Configuración. Solución a problemas comunes

No tengo permisos para acceder al dispositivo (Linux)

Es probable que en Ubuntu se deba anteceder el comando sudo a avrdude para poder utilizar el puerto USB. Para evitar esto, se debe crear el archivo 70-usbtiny.rules

$ sudo gedit /etc/udev/rules.d/70-usbtiny.rules

con el siguiente contenido

SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", SYSFS{idVendor}=="1781", SYSFS{idProduct}=="0c9f", GROUP="plugdev", MODE="0660"

De esta forma ya no deberemos volver a utilizar sudo para programar.

Para versiones mas modernas de udev es necesario modificar levemente esta regla, quedando de la siguiente forma

SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTRS{idVendor}=="1781", ATTRS{idProduct}=="0c9f", GROUP="plugdev", MODE="0660"

Luego de guardar el archivo, ejecutar la siguiente línea para reiniciar los servicios y que tome efecto la nueva regla:

$ sudo service udev restart

Microcontrolador no reconocido.

Si avrdude no reconoce el micro puede ser necesario modificar el archivo de configuración:

sudo gedit /etc/avrdude.conf

Agregar debajo de la sección PART DEFINITIONS lo siguiente:

Para el ATtiny4313

#------------------------------------------------------------
# ATtiny4313
#------------------------------------------------------------

part
     id            = "t4313";
     desc          = "ATtiny4313";
     has_debugwire = yes;
     flash_instr   = 0xB2, 0x0F, 0x1F;
     eeprom_instr  = 0xBB, 0xFE, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D,
                 0xBA, 0x0F, 0xB2, 0x0F, 0xBA, 0x0D, 0xBB, 0xBC,
                 0x99, 0xE1, 0xBB, 0xAC;
     stk500_devcode   = 0x23;
##   Use the ATtiny26 devcode:
     avr910_devcode   = 0x5e;
     signature        = 0x1e 0x92 0x0d;
     pagel            = 0xD4;
     bs2              = 0xD6;
     reset            = io;
     chip_erase_delay = 9000;

     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      = 1;

    pp_controlstack     =
        0x0E, 0x1E, 0x0E, 0x1E, 0x2E, 0x3E, 0x2E, 0x3E,
        0x4E, 0x5E, 0x4E, 0x5E, 0x6E, 0x7E, 0x6E, 0x7E,
        0x26, 0x36, 0x66, 0x76, 0x2A, 0x3A, 0x6A, 0x7A,
        0x2E, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00;
    hventerstabdelay    = 100;
    progmodedelay       = 0;
    latchcycles         = 5;
    togglevtg           = 1;
    poweroffdelay       = 15;
    resetdelayms        = 1;
    resetdelayus        = 0;
    hvleavestabdelay    = 15;
    chiperasepulsewidth = 0;
    chiperasepolltimeout = 10;
    programfusepulsewidth = 0;
    programfusepolltimeout = 5;
    programlockpulsewidth = 0;
    programlockpolltimeout = 5;

     memory "eeprom"
         size            = 128;
        paged           = no;
        page_size       = 4;
         min_write_delay = 4000;
         max_write_delay = 4500;
         readback_p1     = 0xff;
         readback_p2     = 0xff;
         read            = "1  0  1  0   0  0  0  0   0 0 0 x  x x x x",
                           "x a6 a5 a4  a3 a2 a1 a0   o o o o  o o o o";

         write           = "1  1  0  0   0  0  0  0   0 0 0 x  x x x x",
                           "x a6 a5 a4  a3 a2 a1 a0   i i i i  i i i i";

    loadpage_lo = "  1   1   0   0      0   0   0   1",
              "  0   0   0   0      0   0   0   0",
              "  0   0   0   0      0   0  a1  a0",
              "  i   i   i   i      i   i   i   i";

    writepage   = "  1   1   0   0      0   0   1   0",
              "  0   0   x   x      x   x   x   x",
              "  x  a6  a5  a4     a3  a2   0   0",
              "  x   x   x   x      x   x   x   x";

    mode        = 0x41;
    delay       = 6;
    blocksize   = 4;
    readsize    = 256;
       ;
     memory "flash"
         paged           = yes;
         size            = 4096;
         page_size       = 32;
         num_pages       = 128;
         min_write_delay = 4500;
         max_write_delay = 4500;
         readback_p1     = 0xff;
         readback_p2     = 0xff;
         read_lo         = "  0   0   1   0    0   0   0   0",
                           "  0   0   0   0    0   0  a9  a8",
                           " a7  a6  a5  a4   a3  a2  a1  a0",
                           "  o   o   o   o    o   o   o   o";

         read_hi         = "  0   0   1   0    1   0   0   0",
                           "  0   0   0   0    0   0  a9  a8",
                           " a7  a6  a5  a4   a3  a2  a1  a0",
                           "  o   o   o   o    o   o   o   o";

# The information in the data sheet of April/2004 is wrong, this works:
         loadpage_lo     = "  0   1   0   0    0   0   0   0",
                           "  0   0   0   x    x   x   x   x",
                           "  x   x   x   x   a3  a2  a1  a0",
                           "  i   i   i   i    i   i   i   i";

# The information in the data sheet of April/2004 is wrong, this works:
         loadpage_hi     = "  0   1   0   0    1   0   0   0",
                           "  0   0   0   x    x   x   x   x",
                           "  x   x   x   x   a3  a2  a1  a0",
                           "  i   i   i   i    i   i   i   i";

# The information in the data sheet of April/2004 is wrong, this works:
         writepage       = "  0  1  0  0   1  1  0  0",
                           "  0  0  0  0   0  0 a9 a8",
                           " a7 a6 a5 a4   x  x  x  x",
                           "  x  x  x  x   x  x  x  x";

    mode        = 0x41;
    delay       = 6;
    blocksize   = 32;
    readsize    = 256;
       ;
#   ATtiny2313 has Signature Bytes: 0x1E 0x91 0x0A.
     memory "signature"
         size            = 3;
         read            = "0  0  1  1   0  0  0  0   0  0  0  x   x  x  x  x",
                           "x  x  x  x   x  x a1 a0   o  o  o  o   o  o  o  o";
       ;
     memory "lock"
         size            = 1;
         write           = "1 0 1 0  1 1 0 0  1 1 1 x  x x x x",
                           "x x x x  x x x x  1 1 i i  i i i i";
         read           = "0 1 0 1  1 0 0 0  0 0 0 0  0 0 0 0",
                          "x x x x  x x x x  x x o o  o o o o";
        min_write_delay = 9000;
        max_write_delay = 9000;
       ;

     memory "lfuse"
         size            = 1;
         write           = "1 0 1 0  1 1 0 0  1 0 1 0  0 0 0 0",
                           "x x x x  x x x x  i i i i  i i i i";

         read            = "0 1 0 1  0 0 0 0  0 0 0 0  0 0 0 0",
                           "x x x x  x x x x  o o o o  o o o o";
        min_write_delay = 9000;
        max_write_delay = 9000;
       ;

     memory "hfuse"
         size            = 1;
         write           = "1 0 1 0  1 1 0 0  1 0 1 0  1 0 0 0",
                           "x x x x  x x x x  i i i i  i i i i";

         read            = "0 1 0 1  1 0 0 0  0 0 0 0  1 0 0 0",
                           "x x x x  x x x x  o o o o  o o o o";
        min_write_delay = 9000;
        max_write_delay = 9000;
       ;

     memory "efuse"
         size            = 1;
         write           = "1 0 1 0  1 1 0 0  1 0 1 0  0 1 0 0",
                           "x x x x  x x x x  x x x x  x x x i";

         read            = "0 1 0 1  0 0 0 0  0 0 0 0  1 0 0 0",
                           "x x x x  x x x x  o o o o  o o o o";
        min_write_delay = 9000;
        max_write_delay = 9000;
     ;
# The Tiny2313 has calibration data for both 4 MHz and 8 MHz.
# The information in the data sheet of April/2004 is wrong, this works:

     memory "calibration"
         size            = 2;
         read            = "0  0  1  1   1  0  0  0    0 0 0 x  x x x x",
                           "0  0  0  0   0  0  0  a0   o o o o  o o o o";
     ;
  ;

Para el ATmega88PA que adquirimos recientemente

#------------------------------------------------------------
# ATmega88PA
#------------------------------------------------------------

part
    id               = "m88pA";
    desc             = "ATMEGA88PA";
     has_debugwire = yes;
     flash_instr   = 0xB6, 0x01, 0x11;
     eeprom_instr  = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00,
                 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF,
                 0x99, 0xF9, 0xBB, 0xAF;
    stk500_devcode   = 0x73;
#    avr910_devcode   = 0x;
    signature        = 0x1e 0x93 0x0f;
    pagel            = 0xd7;
    bs2              = 0xc2;
    chip_erase_delay = 9000;
    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      = 1;

    pp_controlstack     =
    0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F,
    0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F,
    0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B,
    0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00;
    hventerstabdelay    = 100;
    progmodedelay       = 0;
    latchcycles         = 5;
    togglevtg           = 1;
    poweroffdelay       = 15;
    resetdelayms        = 1;
    resetdelayus        = 0;
    hvleavestabdelay    = 15;
    resetdelay          = 15;
    chiperasepulsewidth = 0;
    chiperasepolltimeout = 10;
    programfusepulsewidth = 0;
    programfusepolltimeout = 5;
    programlockpulsewidth = 0;
    programlockpolltimeout = 5;

    memory "eeprom"
        paged           = no;
        page_size       = 4;
        size            = 512;
        min_write_delay = 3600;
        max_write_delay = 3600;
        readback_p1     = 0xff;
        readback_p2     = 0xff;
    read            = "  1   0   1   0      0   0   0   0",
                          "  0   0   0   x      x   x   x  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",
                          "  0   0   0   x      x   x   x  a8",
                          " a7  a6  a5  a4     a3  a2  a1  a0",
                          "  i   i   i   i      i   i   i   i";

    loadpage_lo = "  1   1   0   0      0   0   0   1",
              "  0   0   0   0      0   0   0   0",
              "  0   0   0   0      0   0  a1  a0",
              "  i   i   i   i      i   i   i   i";

    writepage   = "  1   1   0   0      0   0   1   0",
              "  0   0   x   x      x   x   x  a8",
              " a7  a6  a5  a4     a3  a2   0   0",
              "  x   x   x   x      x   x   x   x";

    mode        = 0x41;
    delay       = 5;
    blocksize   = 4;
    readsize    = 256;
      ;
    memory "flash"
        paged           = yes;
        size            = 8192;
        page_size       = 64;
        num_pages       = 128;
        min_write_delay = 4500;
        max_write_delay = 4500;
        readback_p1     = 0xff;
        readback_p2     = 0xff;
        read_lo         = "  0   0   1   0    0   0   0   0",
                          "  0   0   0   0  a11 a10  a9  a8",
                          " a7  a6  a5  a4   a3  a2  a1  a0",
                          "  o   o   o   o    o   o   o   o";

        read_hi         = "  0   0   1   0    1   0   0   0",
                          "  0   0   0   0  a11 a10  a9  a8",
                          " a7  a6  a5  a4   a3  a2  a1  a0",
                          "  o   o   o   o    o   o   o   o";

        loadpage_lo     = "  0   1   0   0      0   0   0   0",
                          "  0   0   0   x      x   x   x   x",
                          "  x   x   x  a4     a3  a2  a1  a0",
                          "  i   i   i   i      i   i   i   i";

        loadpage_hi     = "  0   1   0   0      1   0   0   0",
                          "  0   0   0   x      x   x   x   x",
                          "  x   x   x  a4     a3  a2  a1  a0",
                          "  i   i   i   i      i   i   i   i";

        writepage       = "  0   1   0   0      1   1   0   0",
                          "  0   0   0   0    a11 a10  a9  a8",
                          " a7  a6  a5   x      x   x   x   x",
                          "  x   x   x   x      x   x   x   x";

    mode        = 0x41;
    delay       = 6;
    blocksize   = 64;
    readsize    = 256;
      ;

    memory "lfuse"
        size            = 1;
        min_write_delay = 4500;
        max_write_delay = 4500;
        read            = "0 1 0 1  0 0 0 0   0 0 0 0  0 0 0 0",
                          "x x x x  x x x x   o o o o  o o o o";

        write           = "1 0 1 0  1 1 0 0   1 0 1 0  0 0 0 0",
                          "x x x x  x x x x   i i i i  i i i i";
      ;

    memory "hfuse"
        size            = 1;
        min_write_delay = 4500;
        max_write_delay = 4500;
        read            = "0 1 0 1  1 0 0 0   0 0 0 0  1 0 0 0",
                          "x x x x  x x x x   o o o o  o o o o";

        write           = "1 0 1 0  1 1 0 0   1 0 1 0  1 0 0 0",
                          "x x x x  x x x x   i i i i  i i i i";
      ;

    memory "efuse"
        size            = 1;
        min_write_delay = 4500;
        max_write_delay = 4500;
        read            = "0 1 0 1  0 0 0 0   0 0 0 0  1 0 0 0",
                          "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 0 1 0  0 1 0 0",
                          "x x x x  x x x x   x x x x  x i i i";
      ;

    memory "lock"
        size            = 1;
        min_write_delay = 4500;
        max_write_delay = 4500;
        read            = "0 1 0 1  1 0 0 0   0 0 0 0  0 0 0 0",
                          "x x x x  x x x x   x x o o  o o o o";

        write           = "1 0 1 0  1 1 0 0   1 1 1 x  x x x x",
                          "x x x x  x x x x   1 1 i i  i i i i";
      ;

    memory "calibration"
        size            = 1;
        read            = "0  0  1  1   1  0  0  0   0  0  0  x   x  x  x  x",
                          "0  0  0  0   0  0  0  0   o  o  o  o   o  o  o  o";
      ;

    memory "signature"
        size            = 3;
        read            = "0  0  1  1   0  0  0  0   0  0  0  x   x  x  x  x",
                          "x  x  x  x   x  x a1 a0   o  o  o  o   o  o  o  o";
      ;
  ;

Windows necesita un driver

Acceder a https://learn.adafruit.com/usbtinyisp/download y descargar la versión firmada de los drivers.

Licencias

El hardware original del usbtinyisp son distribuidos bajo la licencia CC 2.5 Attrib./Share-alike.

Nuestra versión del hardware: Copyright © 2008 Joaquín de Andrés, distribuida bajo la CC 2.5 Attrib./Share-alike license.

El firmware del USBtinyISP: Copyright © 2006 Dick Streefland as GNU General Public License, version 2 of the License, or your option) any later version.

Hojas de datos

Archivos de fabricación