-
Notifications
You must be signed in to change notification settings - Fork 5
Home
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.
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.
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.
La versión 1.7 arregla el error de diseño de la 1.6, manteniendo la lista de materiales igual.
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
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) |
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).
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
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.
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
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
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
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:
#------------------------------------------------------------
# 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";
;
;
#------------------------------------------------------------
# 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";
;
;
Acceder a https://learn.adafruit.com/usbtinyisp/download y descargar la versión firmada de los drivers.
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.