Howto recover wrong fuses settings on a AVR

Yesterday, I ran into a issue with an ATMega32. In fact, I wanted to disable the Jtag support on the chips because I need to use the pins used by the Jtag (PC2-PC5). To disable the Jtag, you simply need to change some fuses. I changed the fuses with the help of the Avr Fuse Calculator, but I messed my ATMega with the wrong clock source. I don’t know how, but I choose the low freq clock. So my ATMega was totally frozen, as the clock settings was wrong, I was unable to reflash it, and worst, unable to change the fuses.

After a little googling, I found there is 3 ways to fixe this kind of issue:

  • Use a Jtag (as it doesn’t need a clocked micro)
  • Use a high voltage programmer (you can erase the fuse, with a programmer that do a parallel programming with RESET plug to a 12v PSU). This kind of programmer aren’t really easy to find. The only one I know right now is the STK500
  • Use an external clock (This is what I used, and describe here)

As, I don’t have any Jtag, or STK500, the only way to fix that is to use an external clock. In fact, I decided to ask on the #avr channel on freenode. And a really kool guy (”rue_mohr”) give me this tips. On every AVR micro, you can use a external clock if you messed the fuses settings. Simply plug a external clock on the clock pin (XTAL1 on the Mega32), and changes the fuses by this way.

Of course, you need a external clock at something like 1Mhz. Of course I don’t have this kind generator at home, but this can be easily done with another AVR micro this something like this:

void main()
{
DDRA = 0xFF;
while (1)
{
PORTA = ~PINA;
nop();  // added some nop, to slow the clock a bit
nop();
}
}

Related posts :

admin April 15th, 2007


24 Responses to “Howto recover wrong fuses settings on a AVR”

  1. madeon 26 Jul 2007 at 5:05 am

    How about my problem?
    i have the same problem but i use atmega8535, assembly.
    thank’s.

  2. Jkxon 09 Jan 2008 at 7:40 pm

    Moses just me this link on his weblog, but due to baysien filters, the url have been filtered. This post fix that issue.

    Evil Mad Scientist

    Thanks Mose

  3. kalandaon 01 Feb 2008 at 12:44 am

    This really works, Thanks. I tried with an attiny13 and this code to simulate 1Mhz clock. Only i needs to set the ISP Freq. on the programmer to lowest rate (51.1hz) that is more slower but works.

    // Library includes
    #include 
    #include 
    int main()
    {
    
      DDRB = 0xFF;
      while (1)
      {
    
       PORTB = ~PINB;
       asm volatile("nop");
       asm volatile("nop");
      // _delay_ms(1000); // Uncomment this line to probe if something is live :)
      }
    return 0;
    }
    

  4. nmcon 22 May 2008 at 4:24 am

    Thanks a lot for the tip. It really helped!

  5. Santiagoon 09 Jul 2008 at 2:55 am

    i’d like to know if I need only set the external clock and the default values back, or I need make anything else

  6. adminon 09 Jul 2008 at 9:14 am

    Santiago, you need to set the right fuse (clock, reset flag etc ..)

  7. Danielon 23 Aug 2008 at 3:26 am

    I was wondering.. can I use a similar method if I can only get a 32hz instead of 1mhz input? I have 3 atmega168 AVR that are unusable due to some fuse setting.. We switched tabs between fuse writes & now we can’t program/erase the chips any more.

  8. Danielon 23 Aug 2008 at 3:27 am

    I meant 32khz not 32hz..

  9. adminon 23 Aug 2008 at 1:11 pm

    I don’t know .. You should give it a try.

  10. Natureon 31 Aug 2008 at 7:32 pm

    What do you mean?

    You only have to feed EXTCLK on X1 & that’s it or you has to do so when you gonna program it?

  11. pragon 07 Oct 2008 at 7:13 am

    i am using atmega 1281 with stk500/501.

    Kindly clear me, how to configure fuse bits.
    i am not able to download my program onto the chip, as i have changed some fuse settings..

    Thanks.

  12. adminon 07 Oct 2008 at 10:05 pm

    prag, re-read this howto perhaps :)

  13. Gabrison 20 Nov 2008 at 1:35 am

    It’s possible to have this code (down) in assebly?????

    // Library includes
    #include
    #include
    int main()
    {

    DDRB = 0xFF;
    while (1)
    {

    PORTB = ~PINB;
    asm volatile(”nop”);
    asm volatile(”nop”);
    // _delay_ms(1000); // Uncomment this line to probe if something is live :)
    }
    return 0;
    }

    thanks

  14. saraon 02 Mar 2009 at 12:45 pm

    hi thanks for your greatfull website; i want to khnow how can i access to the program of locked ic(atmega8l) &my programmer is universal2000. thanks

  15. jXP3on 12 Mar 2009 at 2:47 pm

    For me it worked perfectly just using CKOUT of another microcontroller(attiny2313).

  16. jejenon 13 Apr 2009 at 10:51 am

    I do not have any other microcontroller, what if using the LPT printer port? please give this code to generate clock using LPT parallel port … thanks

  17. ckeayson 30 May 2009 at 2:55 am

    I found a website that sells a programmer to fix any avr. It only cost $29 and I fixed all of my locked atmega’s!

    http://www.microcontrollerprog.com

  18. Dolphinon 14 Jul 2009 at 11:31 am

    I had used this way to recover wrong fuses settings on my AVR (ATmega8, ATtiny13) and it had worked perfectly. After then, I set wrong fuses again, I used this way to recover but it didn’t worked. I don’t know why, could you help me?

  19. arimarjulon 21 Jul 2009 at 1:48 pm

    HI!
    I have a worst problem. I work with a atmega 8/16/32 and use a AVRISPmkII to program them.
    But the problem occurs when some uC has the SPIEN fuse in ‘1′.(serial programming disabled).
    What can I do to fix this problem? I have a great amount of this uC.
    Please help me!!!

  20. adminon 21 Jul 2009 at 11:06 pm

    Dolphin : Perhaps you need to explain, what you screw up ..

    Arimarjul : You have to use a parallel programming mode .. this can be done with a STK500, or a JTAG if you don’t break the Jtag enable fuse ..

    The parallel flash is the ultimate one, but this require to have a special programmer like the STK500..

  21. Dolphinon 22 Jul 2009 at 11:32 am

    I mean that I can’t use this way to recover my AVR which has been recovered before (more clearly, I can use this way only one time). This is my programmer : http://www.lancos.com/prog.html . So, this is my problem.
    Thanks.

  22. VidProon 21 Oct 2009 at 9:12 pm

    I had bricked 2 Atmega8’s and used the external clock method with this code running on another atmega8:

    #define F_CPU 1000000UL /* 1 MHz CPU clock */

    #include

    int
    main (void)
    {
    DDRC = _BV (PC0); /* PC0 is digital output */

    while (1) /* loop forever */
    {
    /* set PC0 on PORTC (digital high) */
    PORTC &= ~_BV(PC0);

    }

    return (0);
    }

    I then connected pin 23 if the working avr to pin 9 of the bricked avr and then restored the fuses. Worked for me on the 2 I screwed up… maybe it will help others

    used AVR studio to compile.

  23. VidProon 21 Oct 2009 at 9:15 pm

    The #include should be &lt avr/io.h &gt

  24. Ben Ryveson 26 Oct 2009 at 1:21 am

    Thank you for posting this! Rather than program another microcontroller, you can use a standard crystal oscillator circuit, such as one of these – http://z80.info/uexosc.htm – to coax the AVR back to life.

Comments RSS

Leave a Reply