Computer pr0n

Burning Arduino bootrom on an ATmega328-PU, part 2

by on Apr.08, 2012, under Arduino, Hardware

loclhst

A recent comment on Burning Arduino bootrom on an ATmega328-PU had asked for some specific stuff, so instead of updating the existing post, I figured I would make a new one to expand on the data. cialis 20 mg effetti

First off, the guide I was using is located at http://arduino.cc/en/Tutorial/ArduinoToBreadboard.  The pinout of the ATmega328-PU chip (as all is the same for the ATmega168, and ATmega328P-PU and similar chips) is as follows:

Atmega 168 Pin Map

So to answer the question, VCC is on AT Pin 20, and/or AT Pin7. the arduino writeup shows both VCC lines and both GND lines being connected, so I did both as well. comprare cialis 5 mg line

Between the breadboard and the solderboard design, I did make a small change.  Mainly I added the resister, caps, and external crystal for external clocking, instead of using the internal clock.

  viagra coupon

Again I had made some config changes in my boards.txt files, mainly splitting them up, but this is my config as it stands. cialis coupon

Avrdude.conf:  (<a title="avrdude.conf" href="http://files.loclhst.com/arduino/avrdude more helpful hints.conf” target=”_blank”>download full file here)

#------------------------------------------------------------
# ATmega328 (non-picopower)
#------------------------------------------------------------

part
    id            = "m328";
    desc        = "ATMEGA328";
    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    = 0x86;
    # avr910_devcode    = 0x;
    signature        = 0x1e 0x95 0x14;
    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        = 1024;
    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 a9 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 a9 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 a9 a8",
            " a7 a6 a5 a4 a3 a2 0 0",
            " x x x x x x x x";

    mode        = 0x41;
    delay        = 20;
    blocksize    = 4;
    readsize    = 256;
    ;

    memory "flash"
    paged        = yes;
    size        = 32768;
    page_size    = 128;
    num_pages    = 256;
    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 a13 a12 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 a13 a12 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 a5 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 a5 a4 a3 a2 a1 a0",
              " i i i i i i i i";

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

    mode        = 0x41;
    delay        = 6;
    blocksize    = 128;
    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";
    ;
;

boards.txt: (download files for breadboard and custom 328-PU Uno/Duemilanove)

# this snip is only of my custom changes for the uno/duemilanove, check the files for both breadboard data and custom full files.

###  Duemilanove atmega328-pu (non-picopower)
atmega328npp.name=[loclhst] Arduino Duemilanove w/ ATmega328-PU (non-picopower)

atmega328npp.upload.protocol=arduino
atmega328npp.upload.maximum_size=30720
atmega328npp.upload.speed=57600

atmega328npp.bootloader.low_fuses=0xFF
atmega328npp.bootloader.high_fuses=0xDA
atmega328npp.bootloader.extended_fuses=0x05
atmega328npp.bootloader.path=atmega
atmega328npp.bootloader.file=ATmegaBOOT_168_atmega328.hex
atmega328npp.bootloader.unlock_bits=0x3F
atmega328npp.bootloader.lock_bits=0x0F

atmega328npp.build.mcu=atmega328
atmega328npp.build.f_cpu=16000000L
atmega328npp.build.core=arduino
atmega328npp.build.variant=standard

### Uno atmega238-PU (non-picopower)
unonpp.name=[loclhst] Arduino Uno (non-picopower)
unonpp.upload.protocol=arduino
unonpp.upload.maximum_size=32256
unonpp.upload.speed=115200
unonpp.bootloader.low_fuses=0xff
unonpp.bootloader.high_fuses=0xde
unonpp.bootloader.extended_fuses=0x05
unonpp.bootloader.path=optiboot
unonpp.bootloader.file=optiboot_atmega328.hex
unonpp.bootloader.unlock_bits=0x3F
unonpp.bootloader.lock_bits=0x0F
unonpp.build.mcu=atmega328
unonpp.build.f_cpu=16000000L
unonpp.build.core=arduino
unonpp.build.variant=standard

Also in my testing, I found I needed to copy the bootloaders (arduino-1.0\hardware\arduino\bootloaders) folder to my custom folder for the ROMs I was burning.

I am also using a adafruit FTDI Friend for my arduino to PC communications with the Arduino 1.0 software.

With the above data, I have been able to successfully burn the Uno and Duemilanove ROMs with an external crystal, as well as the Duemilanove ROM on breadboard with the internal 8mHz crystal. can you buy viagra from a chemist

:, , , , ,

4 Comments for this entry

  • EvilEmuOfDoom

    First of all, thank you so much for these two posts. This is the only readable all-in-one thread I could find on the subject 😉

    My question is, did you run into any issues loading sketches? I was able to upload a bootrom just fine even using my Uno with a ISP shield from EvilMadScience.com. However, when I go to upload a sketch via FTDI cable I get the error “MCI ‘atmega328’ supported for assembler only”.

    It’s possible I missed or screwed up a step since I made multiple changes during the process, I’ll have to go back through both posts and check…

    Thanks again!

  • EvilEmuOfDoom

    Follow-up to my last question. I didn’t fix the error but was able to successfully upload the sketch by just changing the “board” setting to normal Uno. If it makes a difference, I’m using a Sippino board although I bought just the PCB and used my own parts including an ATmega328-PU from Mouser.

    • loclhst
      loclhst

      The board should be set to whatever you programmed it with. If you programmed it with the Duemilanove atmega328-pu (non-picopower), then any Duemilanove 168/328 settings should work when programming. It sounds like you either made a Uno 328-P (non-picopower) avrdude option, or you did in fact program it with the uno.
      If not, then I am not sure what that is offhand, as I have never experianced it.

  • Paulo Jericoh

    I bought two ATmega328P-PU ‘s to replace the original ATmega328-PU in my UNO Rev3 and Rev1. They came with a pre-loaded bootloader and also with a default sketch that blinks a led. When I uploaded a new sketch, both run pretty good.

    But, when I turn the UNO OFF and ON again, the sketch that runs is the default one (the one that blinks a led) instead of my new code.

    I looked forward directions, including parameters for changing the chips behavior, with no success. Someone told me to re-burn the bootloader in both chips.

    I am afraid to do this because I just have two Arduinos but no programmer. I am looking for any parameter that makes the chip to change the entry point after and OFF and ON to run the right code.

    Any advice ?

    Thx in advance.

Leave a Reply

 

Looking for something?

Use the form below to search the site:

Still not finding what you're looking for? Drop a comment on a post or contact us so we can take care of it!