# ¿Cómo configurar los Fuses del AVR?



## zefepb (Jun 2, 2009)

Que tal comunidad.

Espero algien me pueda ayudar. Empece a programar el ATmega8535, utilizando los valores por default de los Fuses, osea configurados para el Oscilador interno. Ahora quiero utilizar un oscilador externo de 12MHz tanto para el ATmega8535, como para el ATmega8, pero no tengo idea de como configurar los Fuses, o como calcularlos.

Agradeceria mucho me pudieran explicar como calcularlos, de antemano gracias.


----------



## Chico3001 (Jun 3, 2009)

El ATMEGA8535 solo puede funcionar hasta a 8MHz con el oscilador interno... para llegar a 12MHz tienes que colocar un cristal externo, un oscilador o algun RC

Lo mismo va para el ATMEGA8....


----------



## Eclip-se (Jun 3, 2009)

Ten cuidado al cambiar los fuses, si estas usando un "programador serial", si lo configuras para usarlo con un cristal externo, perderas la sincronizacion y el micro ya no te respondera y deberas usar un programador paralelo para resetear la configuracion.


----------



## zefepb (Jun 3, 2009)

Gracias por sus consejos pero el programador que estoy utilizando, es USB,  para ser mas especifico es del proyecto de *"USBAsp", *y utiliza para programar al *"AVRdude"*, dentro de las especificaiones que tengo que escribir me pide un LFuse, HFuse, y EFuse, (Low, Heigh, Extra, Fuses), donde se supone debo poner el valor del los Fuses para utilizar el oscilador externo, y no se que valores escribir  o como calcular esos valores.

De cualquier forma agradesco su tiempo, y espero alguien mas me pueda ayudar.


----------



## Chico3001 (Jun 4, 2009)

Para un cristal externo de 12MHz los fusibles deben quedar de la siguiente manera:

CKOPT       = 0
SUT1..0     =  01
CKSEL3...1= 101 o 110 o 111 (cualquiera de estos valores)
CKSEL0     = 1


----------



## cristian_elect (Jun 5, 2009)

Usa una interfas grafica para el avrdude como el AVR8 Burn-O-Mat o el Sinaprog esos programitas ayudan bastante en el uso del avrdude.


----------



## zefepb (Jun 5, 2009)

Muchas Gracias por la ayuda, ya entendi como obtener los valores de los fusibles, de la hoja de datos, como los que muestra "Chico3001", desgraciadamente me di cuenta ya muy tarde, y como andaba investigando por otros foros, puse algunos valores de fuses que me suguirieron, y ahora no puedo leer el micro, ni escribir ni nada. Compre otro y este si lo configure bien, pero no se si el primero se pueda recuperar o ya lo perdi.


----------



## Chico3001 (Jun 5, 2009)

Un micro no se echa a perder por configurar mal los bits de programacion, solo dale un borrado total y deberias poder leerlo de nuevo

Si no puedes leerlo casi con seguridad algo mas lo echo a perder (exceso de voltaje, estatica, o algo mal conectado)


----------



## EME_JuanAndrade (Ago 23, 2010)

Con perdon de Chico3001, si estas usando el USBASP y cambias el fusible de SPI si vas a terminar con un chip inutil, al menos para ti, hasta que consiguieras un programador hv.

En Esta Pagina puedes elegir las opciones de los fusibles y te genera una linea de comando que puedes agregar a la del avrdude.

Por ejemplo para un Atmega8535 configurado para un cristal de 12mhz externo y el programador usbasp nos da algo asi:

-U lfuse:w:0xcf:m -U hfuse:w:0xd9:m


La linea de comando seria:


avrdude -p m8535 -c usbasp -U lfuse:w:0xcf:m -U hfuse:w:0xd9:m


----------



## invic (Abr 19, 2011)

use atmega8  para programar con un puerto serial quizé cambiar la configuracion de los fusibles, pero me equivoque, y a la hora de escribir la configuracion, marco error, y ahora ya ni si quiera puedo leer los fusibles, como puedo recuperar la configuracion, con que programador??


----------



## foxil (Abr 19, 2011)

hola lo recuperas con el programa que hay en el enlace de abajo:
https://sites.google.com/site/proyectosymicros/


----------



## invic (Abr 19, 2011)

va gracias por  contestar tan rápido, lo voy a checar


----------



## frankdf (May 18, 2011)

Que tal Eclip-se, oye estoy muy apenado con molestarte por este medio pero espero agradecidamente me puedas ayudar en este problema. Te cuento, tuve un problema al configurar los fuses de un atmega8515 y por ello arme el circuito que propones, llamado resux, y bueno, no me funciona. Te cuento a mas detalles lo que me pasa:

- Al conectar el usb a la pc no reconoce el dispositivo, windows manda un error diciendo que ese disposito ha tenido un mal funcionamiento por lo que windows no lo reconoce.

- Al arrancar el programa, doy clic en Read pero me sale un mensaje de error mencionando que no se detecta el hardware. supongo que es por dos posibles razones, una que el programa del pic esta mal, lo cual no creo probable y en segunda que la conexion del conector USB la tengo mal. En este ultimo caso, la conexion del USB es como la pones en el esquematico?.

- Medi los voltajes en el nodo "RESET" y en "VCC" pero esos son cero, cabe señalar que en el nodo que esta entre el diodo 1n4148 y la resistencia de 2.2kohms tengo 10v y pasando de esta tengo 0v, como veo el transistor esta funcionando como conmutador no?, una vez que reciba una señal negativa en la base el transistor, este conducira a "RESET" el voltaje de 13 volts que limita el diodo zener.

Esto es lo que note, no se que me podrias recomendar porque ya he revisado todo y no me hace nada de nada.

Espero puedas ayudarme, te lo agradecieria de mil maneras. Gracias


----------



## invic (Oct 8, 2011)

hola a todos, tuve "error de dedo" ja y volvi a configurar mal los fusibles del atmega 8, lo queria de forma de oscilador interno pero la configuracion quedo asi: CKSEL=1111 SUT=01    al revisal la hoja de datos Tabla 5 dice que es  "Crystal Oscillator, BOD enable " y " 16K CK "
saben a que se refiere ?? que es "16 k" y "CK"  , que debo de hacer en el oscilador para poder reconocerlo de nuevo?


----------



## invic (Oct 12, 2011)

Ahora ya se en que estoy mal, solo lo configure con oscilador externo, pero es mas bien una señal de reloj, todo esto lo dice la hoja de tados, teoricamente debe de funcionar asi, ja lo que tengo duda es que en la tabla 12  hay una parte que dice: Start-up Times for the External Clock Selection
Start-up Time from Power-down and Power-save 6 CK.  no se como  interpretar eso que significa 6 ck etc.....


----------



## R-Mario (Oct 12, 2011)

ese 6k ck es la cantidad de ciclos de reloj que el perrito matiene en reset al micro cuando este arranca, y esta en funcion del oscilador seleccionado, por ejemplo para un 1 Mhz serian aprox 65 mS. Checate bien la pagina http://www.engbedded.com/fusecalc para que no cometas errores


----------



## invic (Oct 13, 2011)

Sale muchas gracias "Dseda86" ahora lo entiendo mejor, y si estoy de acuerdo en que todo la informacion esta en la hoja de datos, y te ayuda un buen la pagina recomendada
Ahora se mas a detalle como funciona y me doy cuenta que hay que saber leer.
Pude recuperar 3 atmega8 que parece ser que ya no funcionaba por una mala configuracion de fusibles, pero ahora se que con una programacion SPI solo no tienes qeu desactivara este para que pueda seguir funcionando, lo cual casi todos lo programas por esta forma no te perimiten modificarlo.
Solo tuve que meter una señal de reloj a una frecuencia de 1MH y con eso lo reconcio, y posteriormente conforme a las tablas lo configure con oscilador interno y ahora puedo programarlo sin problemas   .
Siempre crei qeu forzosamente podia recuperar eso micros con una prgrmacion paralela lo cual no es necesario.     saludos a todos!!


----------



## R-Mario (Oct 13, 2011)

Efectivamente, yo tambien recupere un atmega8, porque le configure cristal externo, solo que como yo no tengo un generador de frecuencias me hize un astable con 555 a 100Khz luego en ponyprog seleccione la velocidad mas baja y wuala revivio mi atmega8, y efectivamente eso que dices del bit SPI ningun programador serial te permite modificarlos seria tonto jejejeje, si te das cuanta muchos cometen ese error al pensar que el micro ya no sirve por modificar el SPI cuando en realidad solo es la sincronia, en fin que yo no se que esperan los de ATMEL para corregir esto porque es una verdadera lata


----------



## rproto (Feb 7, 2017)

Eclip-se dijo:


> Ten cuidado al cambiar los fuses, si estas usando un "programador serial", si lo configuras para usarlo con un cristal externo, perderas la sincronizacion y el micro ya no te respondera y deberas usar un programador paralelo para resetear la configuracion.




hola,me ha pasado este problema que comentas pero te refieres a un programador por puerto paralelo para resetearlo?
¿hay alguna otra manera de poder solucionarlo sin otro programador?,gracias


----------



## Saint_ (Feb 7, 2017)

Hola rproto, inicialmente casi todo el mundo que utiliza AVRs tiene o se consigue un grabador serial (no se refiere a un grabador por puerto serie sino al modo en el grabador graba los datos en el AVR) como por ejemplo el famosos USBasp.
Es sabido que los AVR (ATmega32) vienen configurados de fabrica con oscilador interno de 1MHz. Si por algún motivo configuraste los fuses para usar un cristal externo, tienes que usar ese mismo cristal externo para la siguiente vez que lo quieras grabar, de otro modo no podrás regrabar al AVR...
Si por mala suerte cambiaste la configuración del bit *SPIEN* y lo deshabilitaste entonces estas perdido ya no podrás regrabar ese AVR a menos que uses un grabador paralelo.
en este link un poco de información sobre como grabar un AVR
Aquí un poco de información sobre grabar AVRs.
http://electronicamcu.blogspot.com/2017/02/grabando-avrs.html


----------



## locodelafonola (Mar 1, 2017)

Hola. Y desde ya, gracias a cualquiera que apote, insulte, agreda o simplemente se sonría.​ Como verán y algunos saben, he aprendido solo.​ Aunque el "patadón inicial", me lo dio cosmefulanito04, que primero me hizo perder el miedo a los micros.​ Luego me hizo los primeros programas, explicándome algunas funciones con mucha paciencia, (incluido unos cuantos "cachetázos por la nuca por burro") Perdón cosme.    ​ ¡Muchas gracias querido amigo, por todo eso!
​ Bueno, para ir directo  al problema, la cuestión es...
Me doy cuenta que lo que leo y deduzco de las hojas de datos, razonamiento y aplicación.​ ¡Lo hago todo mal!​ Y entonces, el asunto no es que le encuentre la vuelta o lo solucione, sino que alguien me explique, o mejor me enseñe a razonar esto de forma correcta y el por qué.
​ Podría ir a el foro AVRFREAKS (soy miembro)​ Pero las explicaciones de cómo o por qué, no las entiendo mucho (casi nada), aunque segurísimo que la solución la tengo, pero no me sirve, porque no entiendo bien cómo se llego a ello.
Yo recurro a una Herramienta muy útil y gratuita, según muchísimos que la recomiendan, pero a mi me confunde, y es la página  http://www.engbedded.com/fusecalc/


Una vez allí, empiezan mis problemas.
Por ejemplo: elijo el ATmega328P y me aparece esto.​ Ver el archivo adjunto 153919 Hasta ahí si lo veo y entiendo bien, porque es la configuración de los fuses de fábrica (virgen)​ Lo que sigue es la representación, según los tipos de programadores que se usen.
​ Ver el archivo adjunto 153920 Si lo comparo con la captura de la lectura que me manda mi programador (serial si-prog), es parecida pero no igual.
​ Ver el archivo adjunto 153921​ 
Si prestan atención, ya hay diferencia en las casillas de BOOTSZ1, BOOTSZ0 y BOOTSRST​ Acá la primera duda de si está bien lo que yo entiendo, que eso de fábrica no viene.​ Por lo que entiendo, es la configuración  del espacio para el programa (inicio)​ La parte que sigue es para la configuración de programadores por hexadecimal, y aquí a veces le pego, otras veces no.
​ Porque si por ejemplo, tomo un programa de la WEB y declaran los fuses así, esta página da la posibilidad , de que los traspase al otro formato anterior.
​ Ver el archivo adjunto 153922 
Pero por distintas pruebas, programas (me paso con los polacos)
Varios usaban hexadecimal, yo y otro ruso, el programador serial, pero nos daba diferente configuración, que  de esa página. Aún no sé por qué.
​ El otro ejemplo que tengo problemas, es con el ATmega128A
​ Ver el archivo adjunto 153924 
Otra duda que se me genera, es que por defecto, la página manda la configuración de la primera línea, como se ve en la imagen, que es del oscilador.​ Si bien entendí,  tendría que ser por  "default value", como se ve en la imagen siguiente.
​ Ver el archivo adjunto 153929 
Por lo tanto, la parte siguiente es distinta o diferente.
​ Ver el archivo adjunto 153925 
Y hay diferencias que no entiendo, de cómo me manda mi programador en la lectura de fábrica.
​ Ver el archivo adjunto 153926 
También hay diferencia en hexadecimal.
​ Ver el archivo adjunto 153930 
Por consejo de cosmefulanito04, fabriqué la placa como se indica en el foro de PONYPROG
​Ver el archivo adjunto 153931 
En la imagen hay una reforma con el original, porque al pin de reset le puse un puente, porque pienso usar el Watch Dog de Reset, entonces queda libre la resistencia al +VCC
​ Bueno, espero que me puedan enseñar y aprender bien cómo configurar el cristal externo a 16 MHz.

Muchas gracias a todos.​ PD: Hoja de datos atmega328p Ver el archivo adjunto 153886


----------



## Desmond (Sep 13, 2017)

Estube leyendo todo el tema,soy principiante en AVRy tengo dudas con los fuses.

Existe un codigo en C, donde pueda configurarlso, por ejemplo el FUSE HIGH = D9h, FUSE LOW = 62h y el FUSE EXT= FFh.
no tengo la posibilidad de utilizar el AVRdude ya que mi programador no lo admite.

se puede configurar los 'fuses' solo con un codigo en C que le agregue a mi programa principal?


----------



## D@rkbytes (Sep 14, 2017)

Desmond dijo:


> Estuve leyendo todo el tema, soy principiante en AVR y tengo dudas con los fuses.


Yo también las tuve, pero leyendo la hoja de datos aclaré mis dudas.


Desmond dijo:


> No tengo la posibilidad de utilizar el AVRdude, ya que mi programador no lo admite.


¿Qué programador tienes?
Te recomiendo el USBasp, con ese podrás usar la interface o GUI, AVRDUDESS.


Desmond dijo:


> ¿Existe un codigo en C donde pueda configurarlo?
> Por ejemplo: el FUSE HIGH = D9h, FUSE LOW = 62h y el FUSE EXT= FFh.
> ¿Se pueden configurar los 'fuses' sólo con un código en C que le agregue a mi programa principal?


Que yo sepa no se puede, los fuses los configuro con AVRDUDESS.
Existen otras interfaces que usan avrdude.exe, pero a mi me pareció muy buena la GUI AVRDUDESS.


----------



## locodelafonola (Sep 14, 2017)

Hola





Desmond dijo:


> Estube leyendo todo el tema,soy principiante en AVRy tengo dudas con los fuses.
> 
> Existe un codigo en C, donde pueda configurarlso, por ejemplo el FUSE HIGH = D9h, FUSE LOW = 62h y el FUSE EXT= FFh.
> no tengo la posibilidad de utilizar el AVRdude ya que mi programador no lo admite.
> ...


La configuracion de los fusebit en atmega (atmel) ., es totalmente distinta a los (PIC) ., microchip​ muchos se confunden ., porque en los pic ., los fuses ., se establecen en la compilacion​ En cambio en los atmega ., los fusebit establecen los parametros de funcionamiento ., independientemente  a la compilacion ( se graban de manera separada .,  y no es un lenguaje como por ej:C ., ASM o C++ )​ Hay muchisimos parametros mas ., en una configuracion de los fusebit​ Estan los conocidos (y otros no tanto) ., programas para configuracion de los FUSEBIT.,  ej: fusecalac http://eleccelerator.com/fusecalc/fusecalc.php?chip=atmega328p&LOW=62&HIGH=DD&LOCKBIT=FC​ O este otro http://www.engbedded.com/fusecalc/ ., el cual hasta el dia de hoy no los entiendo ., porque hay muchisimos mas parametros de los que uno toma en cuenta​ He leido guias al respecto y algunos tutoriales ., pero sinceramente no entendi nada ., y se que son importanticimas ., ejemplo : el tiempo de arranque ( hay diferentes tienpos en cada MCU ) y son distintos entre los modelos​ Quise habrir un post ., para aprender sobre eso  ., pero no se entendio​ Las herramientas de compilacion (compiladores) ., no dicen ni hacen nada de eso ., o sea (arreglatelas solito) ., si va mal ¡¡ se bloquea el micro !!​ Y eso no permite grabarlo de nuevo ., no se rompe ni se quema ., pero para volverlo a dejar en condiciones de uso ., hace falta una herramienta ., como el fusebitdoctor ., para desbloquearlo​ Espero que se alla entendido lo que explique en el mensaje​


----------



## xavi6 (Oct 27, 2021)

Hola*.
N*ecesito ayuda para saber que tipo de fuse settings poner en mi circuito.
*M*i circuito esta formado por un Atmega328p con su respectivo circuito y un oscilador de 16KHz  crystal modelo CRYTALHC49S package HC49/S.
*M*i idea es quemar el bootloader con arduino NANO en el Atmega 328p y depues con un adaptador TTL cargar mi programa.
*P*ero necesito saber que fuse settings poner.
*G*racias


----------



## D@rkbytes (Oct 27, 2021)

xavi6 dijo:


> *N*ecesito ayuda para saber que tipo de fuse settings poner en mi circuito.





D@rkbytes dijo:


> Yo también las tuve, pero leyendo la hoja de datos aclaré mis dudas.


Así que eso haría, leer la hoja de datos.
Si le quiero hacer al vago, lo consultaría aquí: *AVR Fuse Calculator*


----------



## D@rkbytes (Ene 25, 2022)

Saludos. Tengo una duda acerca de usar un ATmega88PA con la tarjeta Arduino Uno.
Como sabrán, esta tarjeta usa un ATmega328P y sus variantes, con su respectivo Bootloader.
La diferencia es solo lo correspondiente a la memoria, porque tienen los mismos registros y pinout.
Así que me dí a la tarea de instalar el *MiniCore* el cual contiene varios Bootloaders.
Usando el programador USBAsp le grabé el "optiboot_flash_atmega88p_UART0_115200_16000000L_B5.hex"
Ya que la tarjeta Arduino Uno usa un cristal de 16 MHz.
Según la información, dice lo siguiente: "Hit *Burn Bootloader*. If an LED is connected to pin PB5 (Arduino pin 13), it should flash twice every second."
O sea que cuando está grabado el Bootloader el LED por defecto (pin13) debe destellar dos veces por segundo.
Y esto lo hace después de grabar el Bootloader estableciendo los fuses que, según yo son los correctos.
 

Estos fuses vienen siendo para Full Swing según la hoja de datos:

Y ahí se menciona que esta configuración sirve para resonadores cerámicos o cristales de cuarzo desde 0.4 MHz hasta 20 MHz.
Así que opté por grabar estos fuses para usar este chip con la tarjeta Arduino Uno pero con un ATmega88PA
Nota: No es relevante para mí establecer cualquier otro tipo de fuses, los llamados dañinos para un programador ISP como el USBAsp, ya que tengo un programador paralelo de alto voltaje y también un recuperador de fuses para varios ATmega.
Así que por este lado no tengo problema con probar varias configuraciones de fuses, el problema que tengo es que no logro establecer comunicación de Arduino IDE o B4R con la tarjeta.

Me aparece lo siguiente:

A veces llega a "programar" pero el LED del PB5 o pin 13, no hace nada y solo queda encendido.
Cuando eso se llega a dar, se muestra así:

Y bueno, el asunto es que no sé ya por dónde está el problema, yo pienso que en el Bootloader, ya que no sé qué tenga que ver un ATmega88 con un m88P/m88PA o m88PB, pero el MiniCore solo tiene estos:


Aunque también pueden ser los fuses, pero confío en que por ahí no va la cosa si es que la hoja de datos no miente.


Esta es la configuración que uso en el IDE Arduino:

Espero que alguien me pueda asesorar con esto, ya que yo no lo he logrado. 
Gracias.

Como nota adicional:
Si solo compilo el programa y luego lo grabo directamente al ATmega88PA con el USBAsp, sí que funciona y hasta he programado el ATmega88PA con la librería LiquidCrystalI2C sin inconvenientes.
El propósito es que pueda usar la tarjeta Arduino Uno con el Bootloader.
Es algo a lo que le quiero encontrar el problema, y si alguien lo encuentra me voy a desasnar bastante.


----------



## unmonje (Ene 25, 2022)

Disculpe mi ignorancia....
Nunca trabaje con Arduino, pero he llorado con otros.
Cuando todo me falla hacia adelante, camino para atras y suelo resolverlo ....
*Usaria un Xtal de la menor frecuencia posible al menos para empezar .
* Cables cortos en la comunicación..
* Leería el ripple de las fuentes del PIC con osciloscopio. Sobre todo la de grabación, que es mejor que sea exacta.
* El hecho que de vez en cuando grabe algo, me suena a falta  de estabilidad en algún asunto.
* Casi siempre me resulto ser así, pero si es un tema de versiones , ahí  ya no le puedo sugerir nada  DOC...
Seguiré leyendo a ver si le encuentra el orificio al sesto. Saludos


----------



## Dr. Zoidberg (Ene 25, 2022)

Yo he cambiado los bootloader de los arduino nano siguiendo las indicaciones de esta página:








						Cambiar bootloader de Arduino Nano y quemar sketches con otro arduino por ISP
					

Blog donde encontrar Inventos caseros, cosas ingeniosas, huerto urbano en macetas, granja urbana en la terraza y electrónica con y sin arduino




					ingeniocasero.blogspot.com


----------



## switchxxi (Ene 25, 2022)

Según la configuración que aparece ahí para tu microcontrolador indica esto:

_# Upload port select
88.menu.bootloader.uart0.bootloader.extended__*fuses=0xfc*

Selecciona un tamaño de bootloader de 256 *palabras* (512bytes). Acá dice que compilado es de 460 bytes.

De todas formas tu lo tienes en 1024 palabras (2KB), ahí ya veo un problema.


También, mas adelante:

_# Clock frequencies
88.menu.clock.16MHz_external=External 16 MHz
88.menu.clock.16MHz_external.bootloader.low_fuses=*0b1111*{bootloader.cksel_bits}_

Osea que desde CKSEL3-0 van todos a 1. (Cristal externo entre 8 y 16MHZ).

Obviamente instalando el bootloader para 16MHZ y 115200 baudios (Al menos el que yo creo que es el correcto).





*Agrego:*

También, no me acuerdo como se hacia pero es posible, compilaría  un programa simple cualquiera y chequearía el .hex para ver en que dirección empieza, así sabría si hay una soperposición entre el bootloader y el programa.
Hay que buscar en los archivos fuente a donde salta el bootloader para confirmar que está todo bien.


----------



## D@rkbytes (Ene 25, 2022)

unmonje dijo:


> *Usaria un Xtal de la menor frecuencia posible al menos para empezar .
> * Cables cortos en la comunicación..
> * Leería el ripple de las fuentes del PIC con osciloscopio. Sobre todo la de grabación, que es mejor que sea exacta.


Estoy usando una tarjeta original con su cable USB por defecto que no debe superar los 40 cms.
Cambiar el cristal no es viable pues la tarjeta tiene uno muy pequeño SMD y funciona perfectamente con el chip original (ATmega328P)
Repito, la intención es hacer funcionar esta tarjeta con un ATmega88PA


Dr. Zoidberg dijo:


> Yo he cambiado los bootloader de los arduino nano siguiendo las indicaciones de esta página:


Gracias por la información. Lo intentaré de esa forma, aunque creo que con el USBAsp lo estoy haciendo bien.
Al menos en lo que se refiere a grabar el Boootloader.

Edit.
El Optiboot no tiene Bootloader para el ATmega88 


switchxxi dijo:


> Según la configuración que aparece ahí para tu microcontrolador indica esto:
> 
> _# Upload port select
> 88.menu.bootloader.uart0.bootloader.extended__*fuses=0xfc*
> ...


Sí, creo que algo debo tener mal configurado, aunque ya lo he intentado con varias configuraciones de fuses y no va.


switchxxi dijo:


> También, no me acuerdo como se hacia pero es posible, compilaría un programa simple cualquiera y chequearía el .hex para ver en que dirección empieza, así sabría si hay una soperposición entre el bootloader y el programa.
> Hay que buscar en los archivos fuente a donde salta el bootloader para confirmar que está todo bien.


Eso sería leyendo la Flash del micro, pero el problema es que no puedo cargar ningún programa usando el Bootloader.


----------



## switchxxi (Ene 25, 2022)

D@rkbytes dijo:


> Eso sería leyendo la Flash del micro, pero el problema es que no puedo cargar ningún programa usando el Bootloader.


Me refería a revisar el .hex que general el compilador (En arduino se que había que toquetear en algún lado para que generara el hex sino se limita a compilar y subir), en teoría debería empezar después del sector de boteo.

Si el bootloader salta, por ejemplo, a 400H y el .hex compilado empieza en 100H va a haber problemas.

Al menos ya se descarta un problema.


----------



## D@rkbytes (Ene 25, 2022)

Ok, sí, cuando no hay errores se logra compilar y siempre se generan dos archivos .hex
Uno básico y el otro para usar con Bootloader.
En realidad no sabría cómo saber en un ATmega el inicio del programa después del Bootloader, lo cual sí sé ver en un PIC. 😕

Adjunto los archivos que se generan.


----------



## Dr. Zoidberg (Ene 25, 2022)

D@rkbytes dijo:


> Edit.
> El Optiboot no tiene Bootloader para el ATmega88


😳 😳 😳 😳 😳 
Pero no habías indicado cuales eran los archivos que estaban disponibles??
En la web del MiniCore habla de que soporta un bootloader para el 88 
El Optiboot tuneado que usa el minicore dice que permite escribir en Flash desde la misma aplicación, pero no sé será muy diferente del Optiboot normal.
En la web del Optiboot dice que minicore incluye el optiboot adecuado para las CPUs de 28 pines, así que cargando minicore debería incluir el bootloader. Y si el 88 es taaan parecido al 328 tal vez ese mismo funcione con muy pequeños cambios...


----------



## D@rkbytes (Ene 25, 2022)

Dr. Zoidberg dijo:


> Pero no habías indicado cuales eran los archivos que estaban disponibles?


Así es, pero me refiero al que sugieren en la página que mencionaste, pensé que ahí habría otro que me pudiera servir, pero es muy limitado.


Dr. Zoidberg dijo:


> En la web del MiniCore habla de que soporta un bootloader para el 88
> El Optiboot tuneado que usa el minicore dice que permite escribir en Flash desde la misma aplicación, pero no sé será muy diferente del Optiboot normal.
> En la web del Optiboot dice que minicore incluye el optiboot adecuado para las CPUs de 28 pines, así que cargando minicore debería incluir el bootloader. Y si el 88 es taaan parecido al 328 tal vez ese mismo funcione con muy pequeños cambios


Sí, y ya probé con esos Bootloaders a varias frecuencias, pero no he logrado que funcione ninguno.
Obviamente cambiando los fuses para cada uno, pero algo no va bien.
Sigo investigando.


----------



## switchxxi (Ene 25, 2022)

Después de borrar un 328P con el minipro e intentar los pasos llego al mismo lado: No se puede.

Lo único que veo es que la placa Uno (el micro que esta dentro a modo de programador) trata de comunicarse con el micro a programar mediante RS232 y no por SPI. Según el datasheet las únicas formas que hay para programar -a menos que tenga el bootloader ya instalado- es por SPI o paralelo.

Yo me acuerdo que hace unos años compre unos 328 sin bootloader y para grabarlo tuve que grabar en un 328 que ya tenia el bootloader un programa para "convertir" los datos seriales RS232 en SPI y tirar cables para programar el 328 virgen.
Para no tener que cablear siempre cree esta placa:



Ahora a buscar porque dicen que se puede colocar directamente en la placa del Uno y cargar el bootloader así.




*Actualización:*

Pues si, hay pasos que se saltaron. Así es como lo hice y funcionó:

Usando un Uno con el 328 con el bootloader subirle el sketch que aparece en: Archivos/ejemplos/ArduinoISP.
Cablear como sigue: (Yo hice la placa como aparece arriba)



A partir de aca seguir los pasos que aparecen en Github del minicore.

Por cierto, estos son los fuses que tenia el 328 con el bootloader grabado. Yo grabé lo mismo salvo que la parte de los lock bit las deje sin chequear (BLB12 y 11). Y si, si ponía los CKSEL a 1 no lo reconocía.


----------



## unmonje (Ene 25, 2022)

D@rkbytes dijo:


> Estoy usando una tarjeta original con su cable USB por defecto que no debe superar los 40 cms.
> Cambiar el cristal no es viable pues la tarjeta tiene uno muy pequeño SMD y funciona perfectamente con el chip original (ATmega328P)
> Repito, la intención es hacer funcionar esta tarjeta con un ATmega88PA
> 
> ...



¿ Es   posible bajar la velocidad de comunicación del USB ?  Una vez me paso, que era muy rápida


----------



## D@rkbytes (Ene 25, 2022)

Por fin lo logré.
Usé el método que se menciona aquí: *Bootloading an ATmega88 for Arduino*
Es a la antigua pero funciona. 
Ya me estaba desanimando pero de casualidad dí con esa página.
Se trata de modificar el archivo "boards.txt" con lo siguiente:

```
atmega88.name=ATmega88
atmega88.upload.protocol=arduino
atmega88.upload.maximum_size=7168
atmega88.upload.speed=19200
atmega88.bootloader.low_fuses=0xe2
atmega88.bootloader.high_fuses=0xdf
atmega88.bootloader.extended_fuses=0x00
atmega88.bootloader.path=atmega88
atmega88.bootloader.file=ATmegaBOOT_88_m88.hex
atmega88.bootloader.unlock_bits=0x3F
atmega88.bootloader.lock_bits=0x0F
atmega88.build.mcu=atmega88
atmega88.build.f_cpu=8000000L
atmega88.build.core=arduino
atmega88.build.variant=standard
```
Añadido eso ya me aparece la tarjeta "ATmega88" pero al compilar existió un problema...
Falta el parámetro de "upload tool"
Así que esa parte la copié del mismo archivo pero para otra tarjeta.
Esa parte faltante debe quedar así: atmega88.upload.tool=avrdude

El Bootloader recomendado no se ve nada optimizado, pero al menos ya anda el ATmega88PA en una tarjeta Arduino Uno.
Sin embargo, hay algo curioso que tengo duda y ya no lo comprobé por la emoción.
Y es que este Bootloader está programado para una frecuencia de reloj de 8 MHz, pero debe ser con oscilador interno.
No creo que se esté usando el cristal del Arduino Uno a 16 MHz, ya que el blink con el delay en 1000 ms va justo.
Recomiendan estos fuses:

```
EFUSE = 0x00
LFUSE = 0xE2
HFUSE = 0xDF
```
El AVRDUDESS me dio error con el Extended Fuse (EFUSE) que no podía estar en 0x00
Lo dejé como estaba en 0xF8 y creo que eso está bien. (Ese fuse nunca lo he tocado)

Aquí cabe aclarar lo siguiente:
En la parte: atmega88.bootloader.extended_fuses=0x00
Debería quedar con 0xF8
En la parte: atmega88.bootloader.path=atmega88
Esa será la carpeta donde se debe alojar el archivo .hex del Bootloader. (Yo la dejé así)
Dicha carpeta yo la creé en: C:\Program Files (x86)\Arduino\hardware\arduino\avr\bootloaders
En la parte: atmega88.bootloader.file=ATmegaBOOT_88_m88.hex
Ahí se debe escribir el nombre del archivo .hex
En mi caso tras compilar, fue: ATmegaBOOT_88.hex

Me hubiera gustado que el Bootloader para 16 MHz funcionara, aunque seguiré investigando sobre las causas del fallo en los Bootloaders del Optiboot.

Adjunto el archivo del Bootloader y el código fuente con todo y página, por eso de que luego los sitios desaparecen.
Gracias a todos por su valiosa cooperación.


----------



## D@rkbytes (Ene 26, 2022)

Les proporciono esta información que supongo será de utilidad para grabar los ATmega8/48/88/128 sin Bootloader.
Esto nos deja un poco más de espacio en la memoria Flash y no prescindimos de la tarjeta Arduino, que es lo que comúnmente hago.

Para esto se necesita de lo siguiente:
Por fácilidad y pronto desarrollo, una tarjeta así:

Este tipo de tarjetas se consiguen por Internet con el nombre de: Placa de desarrollo ATmega8
Son muy baratas, unos 2.5 dólares con todo y envío, en mi caso a México desde China.

Un programador ISP USBAsp

Cables Dupont para puentes, que depende del caso pueden ser macho/hembra hembra/hembra


Para esto sí debemos instalar el *MiniCore* en Arduino, ya que necesitaremos establecer el tipo de programador.
Por lo general el USBAsp requiere del controlador "libusb0", en el caso de usar AVRDUDESS como programador,
pero el MiniCore con Arduino requiere otro controlador, el "WinUSB"
Así que por fácilidad en cuestión del cambio de controladores, uso *Zadig*
Por lo tanto, en Zadig debemos establecer lo siguiente:
Seleccionar en el menú "Options" "List All Devices" y seleccionar "USBasp"
Nos mostrará esto: (Depende del caso de ya haber instalado previamente el controlador "libusb0")
De cualquier forma podremos instalar el controlador "WinUSB" sea cual fuere el caso...

Ahí debemos seleccionar el controlador WinUSB como en la imagen y presionar el botón "Replace Driver"
Tras eso, Zadig reemplazará el controlador libusb0 por el WinUSB y listo.
Cabe decir que siempre podremos revertir los controladores de una forma muy sencilla con este programa.

Sucede qué... Aunque sepamos que el USBAsp que tenemos (Original) tenga los VID y PID corrrectos (0x16C0 y 0x05DC),
El MiniCore con AVRDUDE nos dirá que no se encuentra el dispositivo.
Por eso es que debemos cambiar los controladores.
Entonces tenemos que recordar qué... Si queremos usar AVRDUDESS debemos usar el controlador libusb0 y si queremos usar Arduino con el MiniCore, debemos usar el controlador WinUSB

Ahora, la configuración en el IDE Arduino debe quedar así (Obviamente cambiará el tipo de oscilador y microcrontrolador):

Aquí hay algo importante, y la vez muy mal, ya sea para el IDE Arduino como para el IDE B4R...
Sucede que forzosamente te piden un puerto serial, siendo que se está estableciendo un programador por USB. 😕
Bueno, que no panda el cúnico, 😅 con instalar un puerto serie virtual se resuelve ese problema.
En mi caso, la PC que uso tiene un puerto serial "COM1" que no sabía que estaba ahí. 😄
Es que lo tiene la tarjeta pero no tenía conector externo, hasta que le puse uno que quedó colgando por fuera y que ahora uso con el *WinPIC* (No confundir con el *WinPIC800*) y el hardware del JDM para programar o recuperar algunos PIC de gama baja o para reprogramar EEPROMS I2C
Cosas que descubres cuando entras al Administrador de dispositivos. 😄

En fin, ya con estas indicaciones podrán programar sin tarjetas Arduino ni Bootloaders, los microcrontroladores mencionados.
Y sobre todo, con costos obviamente más baratos, aparte de los beneficios de poder establecer tus propios fuses conforme a velocidad y reducción de consumo.

Les recuerdo que, tocar los fuses teniendo un programador ISP y modificar sin saber, se corre el riesgo de que ya no se reconozca el microcontrolador.
Así que mucho cuidado con eso, no es de espantarse, no le pasa nada al micro, ya que se puede recuperar, pero ya no por ISP.
Aunque hay trucos inyectando ciertas frecuencias por XTAl1, pero eso ya es otra historia.


----------



## Scooter (Ene 26, 2022)

Yo los arduinos que he resucitado ha sido desde el propio IDE del arduino, usando otro arduino o con un USB asp .
Flasheé una controladora de impresora 3D con la herramienta de atmel pero las demás con el propio arduino ide


----------



## D@rkbytes (Ene 26, 2022)

Sí se puede, siempre y cuando la programación sea en modo paralelo y aplicando alto voltaje (+12V) al pin de reset.
Mientras los fuses se mantengan dentro de las frecuencias que son soportadas por ISP, claro que se puede revivirlos.
Pero el problema viene cuando se deshabilita el pin de reset, fuse (RSTDISBL = 0) o se colocan los fuses CKSEL3 <> CKSEL0 en 0
Que en el caso de los ATmega un 0 es activar, y un 1 es desactivar.
Si eso llega a pasar, el USBasp o cualquier programador ISP ya no los podrá reconocer.
Pero bueno, también existe la posibilidad de hacer un *programador HV con Arduino* y de esa forma sí se pueden recuperar.
Existen otras formas, como en mi caso que uso otro ATmega programado y lo hago en protoboard, porque la flojera no me ha dejado hacer el circuito impreso.
Con el *AVR-Doper* también se puede, ya que emula al programador STK500


----------



## D@rkbytes (Ene 28, 2022)

Ya pude resolver el problema con el Bootloader del Optiboot para el ATmega88PA
Efectivamente el problema eran los fuses.
Me puse a estudiar bien la hoja de datos en este aspecto y logré dar con los fuses adecuados.
Principalmente, esto me llamó la atención:

Y el fuse CKDIV8 yo lo tenía activado, o sea, en 0
Lo establecí en 1 (Desactivado) y usando el archivo "optiboot_flash_atmega88pb_UART0_115200_16000000L_B5.hex" Arduino IDE ya pudo subir el Sketch sin ningún problema.

A todo esto quiero agregar que las hojas de datos para eso están y que son bastante útiles.
Por quererle hacer al vago y usar *AVR FuseCalculator*, más no poner mucha atención a la hoja de datos, solo perdí tiempo en algo que siempre estuvo ahí diciendo "Léeme bien que yo tengo la respuesta."

Finalmente los fuses para el ATmega88PA quedaron así:

El LFUSE es el importante con respecto al oscilador, el HFUSE lo dejé así porque quería un BOD a 2.7V.

Nótese que usé el bootloader para un mega88PB, porque no viene para el PA, pero con ese va bien.
Y ojo con esto, pues si no lo seleccionamos en las propiedades de la placa, habrá un error y no se podrá subir el Sketch.


----------



## D@rkbytes (Feb 21, 2022)

Saludos.
¿Alguien sabe de algún programa para usar el programador STK500 HV que no sea con ATMEL Studio?
Tengo el TX_STK500(Ver6.4)
O sea, busco algo independiente como el programa AVRDUDE, pero que no sea este.
Ya he probado con AVRDUDESS (Interface) pero no logra comunicarse.
También probé con el SinaProg pero no detecta la tarjeta, de hecho, ni el puerto porque solo llega hasta el puerto 4 (COM4).
Y aunque le cambié las propiedades al PL2303 del STK500 de COM7 (Me queda así por defecto, obvimente por orden de dispositivos instalados) a COM4 en propiedades del puerto, tampoco detecta la tarjeta del programador.

Por ahora solo lo he podido hacer funcionar con el ATMEL Studio 7 que es el que tengo instalado, pero me gustaría saber si hay otra aplicación más ligera, solo para usarlo como programador sin tener que ejecutar todo un IDE.

Con ATMEL Studio 7 sí que va...


Y la tarjeta del programador es esta:


Ojalá y alguien más metido en esto de los ATmega me pueda ayudar a solventar esto.
Gracias.


----------



## DJ T3 (Feb 22, 2022)

Y si te armas un ".bat" con los comandos para el AVRDUDE, y solo arrastras el archivo ".hex" o modificas el registro para enviarlo con clic derecho?

Si me decis los comandos y opciones, veo de armar una mini configuracion en linea de comandos


----------



## D@rkbytes (Feb 22, 2022)

Es buena opción, pero suelo reemplazar los .bat por aplicaciones.
Son configurables y de todos modos hacen lo mismo, invocan parámetros hacia archivos ejecutables.
Pienso que tendré que conformarme con lo que hay o seguir buscando los parámetros requeridos por AVRDUDE.
Tengo unos cuantos pero ya los he invocado sin resultado, solo se cuelga sin respuesta.


----------



## DJ T3 (Feb 22, 2022)

Dejame ver si leo la documentacion de AVRDUDE y hago una aplicacion bajo wincho..
O para quien tenga Linux con QT5.9 instalado puedo pasarle los archivos para compilarlo en ese S.O....

Algo en especifico que necesites?


----------



## D@rkbytes (Feb 22, 2022)

DJ T3 dijo:


> Algo en especifico que necesites?


Gracias. Principalmente argumentos para avrdude.exe
Son como algo encríptado para mí.
Sé cómo responder a ciertos argumentos, otros la verdad es que no logro dar en el clavo.
Unos se me hacen simples de comprender y otros de plano no les entiendo, por más vueltas y vueltas que leo.
Me gustaría saber sobre todo, leer y establecer los fuses.
Sé que eso está en la hoja de datos, y no habla de programadores.
Lo que quiero es crear una aplicación sencilla que lo haga sin cargar un IDE.


----------



## DJ T3 (Feb 22, 2022)

Osea, basicamente un programado.
Hay algun motivo por el que no quieras usar otras alternativas, a parte de que no te reconocen (que es raro igualmente)?

No recuerdo cual era, pero me habia bajado uno que era liviano, si lo veo te aviso


----------



## D@rkbytes (Feb 22, 2022)

DJ T3 dijo:


> Hay algún motivo por el que no quieras usar otras alternativas, a parte de que no te reconocen (que es raro igualmente)?


Sí, el motivo es simple, no veo necesario ejecutar el IDE, es algo pesado como para nada más recuperar o reprogramar los fuses.
Y bien, esto de los fuses como bien sabrán, en los ATmega es algo de cuidado si se usa ISP, ya que una vez establecido el fuse RSTDISBL no hay marcha atrás y por ISP jamás podrás volver a leer ese chip. Es el grave defecto del ISP.
¿Sabes? Soy una persona a la que le gustan los desafíos, y leyendo esto de los fuses de los ATmega, me dispuse a comprobarlo.
Resultado... Cierto. Lo que decían era verdad, por ISP hay que tener mucho cuidado con esto.
Y me dije, ok, ya lo descompuse pero... no debe pasar nada grave, esto no debe dañar al microcontrolador, debe existir una forma de recuperarlo.
Así que me dí a la tarea de buscar información y por suerte la encontré.
Tuve que armar en protoboard algunos cables, muchos, programar un ATmega8 con el respectivo programa para recuperar un ATmega328P
Bueno, eso fue porque lo quería verificar, y sí, ya sabrás que lo que hice fue armar un programador de alto voltaje pararelo pero específico para un chip.
Si se quiere "desbloquear" otro, pues se carga otro programa.
Y cabe decir que no tenía ejecutables, solo el programa, pero el autor comentó lo que se debía hacer con cada chip.
Compilado esto y armado el circuito, solo restaba presionar un botón y en segundos ya te dejaba el ATmega dañado con los fuses por defecto.
Esto me sorprendió tanto que le envié felicitaciones al creador de este programa.
Pero bueno, ahí no paró el asunto, el autor realizó una tarjeta de doble cara para usar su programa, cosa que yo jamás hice.
Ya lo tenía funcionando en un protoboard, así que la tarjeta quedó en el olvido.
Pero, ¡upps! Un día se me ocurre usar ese protoboard y lo desmantelé 
Quité todas sus conexiones y llegó el día que por experimentar con los bootloaders, me eché unos cuatro ATmega y nuevos. 
Gran arrepentimiento, pues ese sistema ya lo había quitado.
En fin, son tantos cables de punto a punto que me dije... no, compra un programador HV y olvídate de tarjetas y montajes en protoboards.
Lo hice, lo compré, pero resulta que no es un STK500HV original, tal vez lo emule, pienso que sí, y de forma maravillosa.
Desde el IDE de ATMEL Studio puedo hasta configurar los LOCK Bits
Y esto es genial cuando quieres vender algo y que no se pueda clonar. 

En fin, la idea es poder crear una aplicación stand-alone (independiente) que pueda realizar este tipo de programación.
Como lo dije antes, principalmente los fuses.
Si va por comandos usando avrdude.exe, me resultaría genial saber cómo se hace.


----------



## DJ T3 (Feb 22, 2022)

Semejante anecdota, y excelente aprendisaje.

Entonces seria basicamente intentar enviar a la placa, las ordenes correspondientes, a traves del AVRDUDE o similar.

Vamos a ver qué sale....

Ando bastaaante complicado con el trabajo, al punto de que casi ni duermo, pero bue. Apenas me de un tiempito leo sobre todo eso.


----------



## D@rkbytes (Abr 26, 2022)

D@rkbytes dijo:


> ¿Alguien sabe de algún programa para usar el programador STK500 HV que no sea con ATMEL Studio?
> Tengo el TX_STK500(Ver6.4)
> O sea, busco algo independiente como el programa AVRDUDE, pero que no sea este.
> Ya he probado con AVRDUDESS (Interface) pero no logra comunicarse.


Me olvidé comentar que ya he resuelto el problema de comunicación del AVRDUDESS con el STK500
No había probado la opción "Atmel STK500 V2 in parallel programming mode" 

Problema resuelto.


----------

