martes, 12 de junio de 2012

Formas de bloquear y desbloquear un ATmega8

Bloquear un ATmega es algo muy común cuando se inicia con estos micros. En mi primera semana con los ATmega8 llegue a bloquear hasta 4, pero felizmente logre desbloquearlos.

Aquí presento algunos consejos que son obtenidos en base a la experiencia, espero esto ayude a algunos.
Un problema no tan común, pero que les podría ocurrir (por desconocimiento) es deshabilitar el reset. Esto puede ocurrir programando el fuse "Reset Disable(Enable PC6 as i/o pin);"RSTDISBL=0". Este fuse se encuentre el High Fuse.

Hacer esto cuando se programa mediante SPI bloqueara el uC. Luego de esto no se podrá realizar ninguna operación con un programador SPI. La literatura indica usar un PPHV (Programador Paralelo de Alto Voltaje) para habilitar nuevamente el Reset. Personalmente nunca cometí este error.

Ahora el problema mas común, bloquearlo por no escoger el oscilador correcto. Todos estos fuses los encontramos en Low Fuse.

Tener presente que Low Fuse esta compuesto por.

LF

Donde…
BODLEVEL : Permite seleccionar el nivel del BOD.
BODEN: Permite habilitar el BOD.


SUT: Permite escoger un retardo (en ms) para el inicio del programa, esto después de haber energizado.
CKSEL: Permite escoger entre los diferentes tipos de fuentes de reloj.


- Si programamos Ext. Clock [CKSEL=0000]:Aplicando una señal de [4MHz-6MHz] al pin XTAL1 deberíamos poder trabajar sin problemas.



- Si programamos Int. RC Osc [CKSEL=0001 hasta CKSEL=0100] : Con este oscilador no deberían tener problemas, solamente tener en cuenta que la frecuencia de programación ISP debe ser menor a 1/4 la frecuencia RC. Es decir que si escogemos RC=2MHz nuestra frecuencia ISP debe ser menor a 500KHz.



- Si programamos Ext. RC Osc[CKSEL=0101 hasta CKSEL=1000]: Aplicando una señal de [4MHz-6MHz] al pin XTAL1 deberíamos poder trabajar sin problemas, o al menos poder cambiar a otro tipo de oscilador.




- Si programamos Ext. Low-Freq. Crystal [CKSEL=1001] : En teoría deberíamos poner un cristal de 32768Hz, pero generando una señal de similar frecuencia y aplicándola a XTAL1 es suficiente. Recordar que la frecuencia ISP debe ser menor a 1/4. Si aplicamos 32.768KHz la frecuencia ISP debe ser menos a 8KHz.



- Si programamos Ext. Crystal/Resonator[CKSEL=1010 hasta CKSEL=1111]: Aplicando una señal de [4MHz-6MHz] al pin XTAL1 deberíamos poder trabajar sin problemas.






Consideraciones:


-  Todas las pruebas fueron hechas usando un ATmega8, un programador USBasp y el programa SinaProg 2.
-  Las frecuencia de 32.768KHz y 6MHz fueron generadas por otro uC y aplicadas al pin XTAL1 del uC que se quería programar. Las frecuencia fueron generadas usando el Timer1 en modo CTC.
Configuración del Timer1:


0x0000 Para generar 6MHz con F_CPU=12MHz y N=1.
Formula para Calcular OCR1A :


Bueno, espero esto les sea util
Saludos…!!!

16 comentarios:

  1. de cualquiera de las dos formas, simepre se debe desbloquear con el modo HVPP ?

    ya he bloqueado dos ATtiny84 cuando escojo ext. low cristal; start - up time PWMRDN/reset

    como puedo desbloquearlo??

    ResponderEliminar
    Respuestas
    1. No he usado ATtiny, pero debería ser suficiente poner un cristal de 32.768KHz y en el programador seleccionar una frecuencia menor a 8KHz.

      Eliminar
  2. muy bueno.. lo tamaremos en cuenta para desbloquer el atmega48

    ResponderEliminar
  3. Hola Jonathan, soy inexperto en esto y tuve el problema de bloquear un atmega8, no se si sea posible desbloquearlo con el USBASP?, ya que no entendí del todo en el video y de lo que explicar por lo cual no cuento con el hardware para hacer el desbloqueo, como lo dice el video. Saludos

    ResponderEliminar
    Respuestas
    1. Estimado.
      El video es el caso de deshabilitar en pin de reset.
      Si no hiciste eso (solamente cambiaste los Low Fuse) el problema se soluciona de manera muy facil... solamente debes seguir los pasos de este post !.
      Saludos.

      Eliminar
  4. Excelente tutorial viejo, cada vez que bloqueaba un ATmega164p tenía que llevarlo a la U a que lo desbloqueen con el PPHV... Justo este fin de semana lo bloquee accidentalmente, tendría que esperar hasta el lunes para ir a la U, pero por suerte encontré este grandioso blog, segui los pasos y mediante otro ATmega164p viejo que tenía generé 4MHz con el TIMER0 (modo CTC) y los envié a XTAL1 del micro que tenía bloqueado, seleccionando Ext. Crystal/Resonator[CKSEL=1010] me ha ido perfecto y logré desbloquear el micro. Ahh y lo hice utilizando otro programa, llamado ProgISP, así que pon a la lista que también funciona con:

    -ATmega164p, programador USBasp, y programa ProgISP... jejeje

    Gracias por el blog loco. Saludos

    ResponderEliminar
  5. Viejo no se como agradecerte, estuve mirando, y debido a que no cuento con un programador paralelo, y a que en este momento no tenia la posibilidad de adquirir otro atmega328 (necesario para el proyecto que estoy haciendo) debido al tiempo que demora en llegarme el envio , estuve probando lo que decias, como no sabia exactamente a que se debia el bloqueo de los fusibles, probe las opciones que hay en el post, unas usando otro micro (atmega16) para generar la señal de 6Mhz, pero no funciono, por ultimo gracias a la coincidencia que en el proyecto con el que estaba trabajando tengo un crystal de 32.768KHz, configure el ISP CLOCK en 8khz y usando el AVR DRAGON, logre desbloquear el microcontrolador.

    ResponderEliminar
  6. Amigo, ayúdame a desbloquear un ATtiny2313, porque no encuentro la forma de hacerlos. Gracias...
    Desbloqueé uno sin ni siquiera topar los fuses y no esta ni quemado. ¿Que le pudo ocuriri al avr?

    ResponderEliminar
    Respuestas
    1. Supongo que ya hiciste todo lo que se indica en el post. o no ?

      Eliminar
  7. Hola, Cuando trato de leer o grabar un atmega328p me sale la siguiente información

    avrdude -C avrdude.conf -c usbasp -p m328p -U signature:r:sign.tmp:r -U lock:r:lock.tmp:r -U calibration:r:calib.tmp:r -U hfuse:r:hfuse.tmp:r -U lfuse:r:lfuse.tmp:r -U efuse:r:efuse.tmp:r -q
    avrdude: error: programm enable: target doesn't answer. 1
    avrdude: initialization failed, rc=-1
    Double check connections and try again, or use -F to override
    this check.
    A que puede deberse que me salga SIGNATURE=0x000000. Esta bloqueado?
    Agradecería alguna información.

    ResponderEliminar
    Respuestas
    1. Es nuevo?.. si es nuevo no puede estar "bloqueado" ya que viene configurado con su RC. Quizá hay una mala conexión.
      Prueba un ATmega que nuevo para y verifica que tus conexiones estan bien.
      SIGNATURE=0x000000 te dice que no esta leyendo nada.

      Eliminar
    2. Hola Jonathan, gracias por responder, te comento que no es nuevo, esta puesto en un promini de Arduino.
      Funcionaba perfectamente hasta que, en una de las tantas veces que lo grababa, no funciono mas.
      El oscilador funciona a 16Mhz ya que tiene un cristal de ese valor, lo veo con el osciloscopio.

      Eliminar
    3. Cada vez que lo programabas modificabas los fuses?, No deberían haber cambiado los fuses con solo programar la flash.
      Si ya chequeaste que el programador esta funcionando bien (con un atmega que funcione bien), aplica algunas frecuencias al pin XTAL1 para tratar de desbloquear.

      Eliminar
    4. No, los fuses nunca los cambie.
      OK, voy a tratar de aplicar algunas frecuencias al pin del cristal
      y te cuento, tratare de hacerlo el fin de semana.
      Gracias y felicitaciones por el tutorial, me vino muy bien.

      Eliminar
    5. Si no los cambiaste no hay razón para que se hayan modificado. Que tarea realizaba el uC ?.. Si tenia algún programa y no lo borraste debería aun funcionar, en caso contrario el uC ya no sirve.

      Eliminar
  8. Perdon por tardar en contestar estuve con gripe. He hecho varias pruebas con distintas frecuencias y no funciono creo que ya no va a funcionar mas.
    Trabajaba en una red RS585 junto con 5 uC mas, cada uno mede una temperatura y se la envia al maestro, bastante simple, todo venia bien hasta que este dejo de andar.

    ResponderEliminar