Wednesday, December 14, 2011

Sanguinololu 1.3a - Part 2: Trouble in Paradise

See Also:
Part 1 - Build
Part 3 - Not Out of the Woods Yet

Part 2 of my RepRap build. As noted in part 1 I had some trouble right off the bat.

NOTE: Part 3 include additional information concerning the bootloader and fuse settings. I highly recommend you read it before burning your bootloader


FTDI 
 According to the Sanguinololu wiki page, you should test the FTDI chip after installing the USB port and related components. all you have to do is:

1. Plug the board into your computer.
2. Install the driver software.
3. Connect to the COM port with something like Putty
4. Short the RX0 and TX0 pins together (use a piece of wire or something, it needs to work for about 1 second, don't worry about soldering it or anything.)
5. Type stuff on your keyboard, it should show up when the pins are shorted, and stop when disconnected.
6. If this worked your FTDI chip is operating properly.



 Of course this did not happen for me. The first board my brain wasn't fully engaged and I forgot to add flux, then tried to solder it with an iron, even though I had a hot air reflow station just sitting there. Stupid! I managed to bend a couple pins slightly up, just enough that they wouldn't connect.

 So after a half hour of fixing it all looked good, but the computer didn't recognize anything attached. I went over the pins one at a time with a soldering iron with a really fine tip, just putting a little down pressure on each one. Now the computer recognized it, loaded up putty and the loopback worked fine. 


The second board I did with the hot air and a good dose of flux. It looked beautiful compared to my first attempt, like a factory placed chip. It was immediately recognized by the computer, but the loopback didn't work. I took it off, ran a blob of solder across the pads to wet them, removed the excess, and replaced the chip on the board. Then it worked fine.

 Bootloader


 The wiki said the ATMEGA1284p was a drop in replacement for the 644p. I checked the specs, for a dollar or so more I'd go for the 1284p. Now, I'm not quite sure what they mean by "drop in compatible", it does indeed fit in the slot and it does indeed work with the board. After 5 hours of hacking. The first problem was the bootloader. I downloaded the 0023 version from here (the options were 0018, which doesn't support the 1284p and 0023 which does). I had arduino version 0022 and that didn't work. I downloaded 1.0, that seemed to. I burned the bootloader with the Arduino ISP as noted in the wiki. At some point I changed the last 3 line of hardware /  Sanguino / boards.txt to:


atmega1284.build.mcu=atmega1284p
atmega1284.build.f_cpu=16000000L
atmega1284.build.core=arduino


It seemed to burn fine, no errors.

 Using an Arduino to Flash the bootloader onto a 1284p

I put the chip in the Sanguinololu plugged it in and loaded the Sprinter firmware into arduino 1.0 (despite it claiming to not work with 1.0) Surprise! it errored out on the compile, couldn't find "arduino.h". Also wouldn't compile with 0022 (don't remember the exact error), but claimed to be compatible with 0018, so I downloaded that.

UPDATE: The "arduino.h" error can be corrected by creating "INSTALL_LOCATION/Arduino-1.0/hardware/Sanguino/cores/arduino/Arduino.h" and putting "<#include WProgram.h>" in it. I didn't figure this out, but I lost the reference. (Semi off-topic note: replace "Sanguino" with "Arduino" for other boards - uno, duemilanove, etc.)

It compiled fine with 0018, I copied the Sanguino files from the hardware folder of 1.0 over and tryed to upload it to the board. Nope, 0018 has no idea what a 1284p is. I finally managed to get the following fron 1.0's hardware/tools/avr/etc/avrdude.conf:


#------------------------------------------------------------
# ATmega1284P
#------------------------------------------------------------

# similar to ATmega164p

part
    id               = "m1284p";
    desc             = "ATMEGA1284P";
    has_jtag         = yes;
    stk500_devcode   = 0x82; # no STK500v1 support, use the ATmega16 one
    avr910_devcode   = 0x74;
    signature        = 0x1e 0x97 0x05;
    pagel            = 0xd7;
    bs2              = 0xa0;
    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, 0x02;
    hventerstabdelay    = 100;
    progmodedelay       = 0;
    latchcycles         = 6;
    togglevtg           = 1;
    poweroffdelay       = 15;
    resetdelayms        = 1;
    resetdelayus        = 0;
    hvleavestabdelay    = 15;
    chiperasepulsewidth = 0;
    chiperasepolltimeout = 10;
    programfusepulsewidth = 0;
    programfusepolltimeout = 5;
    programlockpulsewidth = 0;
    programlockpolltimeout = 5;

    idr                 = 0x31;
    spmcr               = 0x57;
    allowfullpagebitstream = no;

    memory "eeprom"
        paged           = no; /* leave this "no" */
        page_size       = 8;  /* for parallel programming */
        size            = 4096;
        min_write_delay = 9000;
        max_write_delay = 9000;
        readback_p1     = 0xff;
        readback_p2     = 0xff;
    read            = "  1   0   1   0      0   0   0   0",
                          "  0   0   x   x    a11 a10  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   x   x    a11 a10  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  a2  a1  a0",
              "  i   i   i   i      i   i   i   i";

    writepage    = "  1   1   0   0      0   0   1   0",
              "  0   0   x   x    a11 a10  a9  a8",
              " a7  a6  a5  a4     a3   0   0   0",
              "  x   x   x   x      x   x   x   x";

    mode        = 0x41;
    delay        = 10;
    blocksize    = 128;
    readsize    = 256;
      ;

    memory "flash"
        paged           = yes;
        size            = 131072;
        page_size       = 256;
        num_pages       = 512;
        min_write_delay = 4500;
        max_write_delay = 4500;
        readback_p1     = 0xff;
        readback_p2     = 0xff;
        read_lo         = "  0   0   1   0      0   0   0   0",
                          "a15 a14 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",
                          "a15 a14 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   x   x      x   x   x   x",
                          "  x  a6  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   x   x      x   x   x   x",
                          "  x  a6  a5  a4     a3  a2  a1  a0",
                          "  i   i   i   i      i   i   i   i";

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

    mode        = 0x41;
    delay        = 10;
    blocksize    = 256;
    readsize    = 256;
      ;

    memory "lock"
        size            = 1;
        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";
        min_write_delay = 9000;
        max_write_delay = 9000;
      ;

    memory "lfuse"
        size            = 1;
        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";
        min_write_delay = 9000;
        max_write_delay = 9000;
      ;

    memory "hfuse"
        size            = 1;
        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";
        min_write_delay = 9000;
        max_write_delay = 9000;
      ;

    memory "efuse"
        size            = 1;

        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";

        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  1 1 1 1  1 i i i";
        min_write_delay = 9000;
        max_write_delay = 9000;
      ;

    memory "signature"
        size            = 3;
        read            = "0  0  1  1   0  0  0  0   x  x  x  x   x  x  x  x",
                          "x  x  x  x   x  x a1 a0   o  o  o  o   o  o  o  o";
      ;

    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";
        ;
  ;

It goes right above:
#------------------------------------------------------------
# ATmega162
#------------------------------------------------------------
Now I get a
avrdude: stk500_getsync(): not in sync: resp=0x00 avrdude: stk500_disable(): protocol error, expect=0x14, resp=0x51
Which basically means "something is wrong". It can't connect to the chip at all. I fought with this for a while, and it just wouldn't connect. Even 1.0 refused, not even the "blink" sample code.

I reburned the bootloader with the 8mhz and 16mhz options (the 644p option errored as not the right chip, so the arduino isp was communicating), neither worked, I changed the
"atmega1284.build.f_cpu=16000000L" to "atmega1284.build.f_cpu=8000000L" (as it was 
originally), commented the last 3 lines out (as they were originally), nothing worked.

Finally, when I was thinking I had bricked the chip I found a different bootloader for the 1284, the Mighty 1284p. I burned the bootloader, popped the chip back in the Sanguinololu, and uploaded the blink code.  It Worked! I had a square wave on the scope and everything!

Unfortunately Mighty 1284p is only compatible with arduino 1.0. Using the Sanguino 1284p 16mhz setting in 0018 couldn't upload sprinter. I changed the settings in the Sanguinololu boards.txt to match the Mighty 1284p and Sprinter uploaded fine.

I don't know if the Sanguino bootloader would have worked with 0023, I'm assuming it's something with my setup. The 644p is compatible with 0018, as is Sprinter, if I had known the trouble it would be to get Sprinter on the 1284p I'd have bought 644p's. But it's done, and I'm happy.
Steve


UPDATE
I decided I hadn't given the Sanguino bootloader a fair chance, it was for 0023 and I didn't use that.

I downloaded Arduino 0023, decompressed the Sanguino files into the hardware directory. Same thing, had to do both of the above hacks to get it to write the bootloader, which it again completed successfully. Exactly the same problem too, unable to upload Sprinter (or blink) to it.

I put the Mighty 1284p bootloader back on and uploaded Sprinter fine. Is something different about my chips? My ISP? Who knows? I sure don't.
Steve

6 comments:

  1. Hi,
    thanks for the article! I'm recently going thru the same issues with mega1284p, but I got there due to another problem.

    I burned successfully the bootloader, but when I try to upload a program for testing the serial line, it says "Expected signature for ATMEGA1284P is 1E 97 05".
    In short ISP gets the right signature, serial programming (with Arduino v1.0) gets a wrong signature. ISP programming works flawlessly for me.

    Overriding the signature test for serial programming seems to damage the bootloader.

    ReplyDelete
    Replies
    1. Hi,
      My story doesn't end here, I think your problems may be related to the other problems I had. Check out

      Part 3:
      http://stevesfixitshop.blogspot.com/2011/12/sanguinololu-13a-part-3not-out-of-woods.html

      and a semi-related post:
      http://stevesfixitshop.blogspot.com/2012/01/fixed-dead-1284p.html
      Steve

      Delete
    2. The 1284p's seem way more sensitive to the oscillator setting than the 644p. If the other page doesn't help let me know. If you could check the following I'd appreciate it:
      1. What the device signature it is actually getting.
      2. Which bootloader you're using. I haven't got the Sanguino one to work.
      3. Any other settings / output / symptoms you can think of.
      Hope you figure it out,
      Steve

      Delete
    3. Hi again,
      thanks for the impulses.
      The first thing that got me on tracks was the verbose mode in the Arduino IDE. Things it showed:
      1. The signature was "1E 97 03".
      2. IDE sets the fuses once and lock bits several times, when you click the "Burn Bootloader".

      Well, most of my problems were established thru mistakes made while burning the BL _outside_ the IDE. I absolutely omitted setting the lock bits plus I might have burned a wrong .hex file first.

      The Mighty1284p bootloader and instructions from http://maniacbug.wordpress.com/2011/11/27/arduino-on-atmega1284p-4/ led to a working instance of Sanguinololu.

      I'll see if it comes on setting the fuses according to your second article.
      Thanks again,
      K.

      Delete
    4. I think 1E 97 03 is the 1280, why it returned that I don't know.

      By all means try it with now that it's working.

      If you're using a crystal you should be good to go, If you're using a ceramic resonator and start having serial errors, random resets, and general random problems it's probably the fuse bits.

      Take it from me: try this before de-soldering your ftdi chip, I really thought it was causing my serial errors, ended up ruining one.

      You can plug the fuse bits into a calculator and see what they mean. I just changed it to the full swing oscillator / ceramic resonator setting and my serial problems and random resets disappeared. I haven't tested them as extensively as I'd like yet as I haven't built my reprap. I'm still deciding on a design, I really want to do pcb routing, not sure the Mendel's frame / belt drive system will handle that.
      Steve

      Delete
  2. Hi Steve! This article really helped me! I bought the Sanguinololu v1.3b from reprap.me a while ago and it was written there "bootloader programmed". I tried to upload marlin but i kept getting the error avrdude: stk500_getsync(): not in sync: resp=0x00. I then chanced upon your article showing how you managed to get it working by changing the bootloader. I tried, and crossed my fingers... and it worked!! Im now able to successfully connect to pronterface, after desperately struggling for 2 weeks. Thanks!

    ReplyDelete