Transfer a project to ATMega164PA

I have a project which needs more pins than are available on the standard Arduino, so I built in on a Mega board (ATMega1280).
Looking about I chose an ATMega164PA because it does have more than enough pins, and also has more than enough Flash ( 11k is all I need).

I have managed to get the sketch to compile without errors by adding a new board in the boards section based on the maniacbug-mighty-1284P.

I have found the hex file, and thought that I could get that file onto the 164PA by using an arduino board as an ISP. Alas, I don't have the know how to get this to work, nor do I know whether it is something I should even be trying to do. I set up the arduino with the ArduinoISP , connected up the 164PA on a board and connected up the SPI, reset and power pins as directed, but I cannot get the sketch to upload on the 164PA.

Can anyone advise whether this is possible, if there is a step by step guide to get it to work or whether I should just get another programmer ( and if I do, will it be any easier ) ?

I downloaded from http://gammon.com.au/Arduino/Atmega_Board_Programmer.zip and ran it using the serial port monitor. It reports that it can see the ATMega164PA and that it does not support a bootloader ( which is fine by me as long as I can run my sketch ).

Extract from the boards file:

##############################################################

arduino_164p.name=ATmega164P via Arduino

arduino_164p.upload.protocol=stk500
arduino_164p.upload.using=arduino:arduinoisp
arduino_164p.upload.speed=115200
arduino_164p.upload.maximum_size=14336

arduino_164p.bootloader.low_fuses=0xFF
arduino_164p.bootloader.high_fuses=0xD2
arduino_164p.bootloader.extended_fuses=0x07
arduino_164p.bootloader.path=optiboot
arduino_164p.bootloader.file=optiboot_atmega1284p.hex
arduino_164p.bootloader.unlock_bits=0xFF
arduino_164p.bootloader.lock_bits=0xEF

arduino_164p.build.mcu=atmega164p
arduino_164p.build.f_cpu=16000000L
arduino_164p.build.core=standard
arduino_164p.build.variant=standard

##############################################################

I have searched high up and low down, but cannot find anything which helps me.. Hoping someone here has done something with the 164 and can point me in the right direction..

If you have an SD card lying around (and an adapter preferably) you can use my "hex uploader" sketch:

I set up the arduino with the ArduinoISP , connected up the 164PA on a board and connected up the SPI, reset and power pins as directed, but I cannot get the sketch to upload on the 164PA.

What pins did you connect to what, exactly? And then what happened?

I connected the Arduino Duemilanove

GND to pins 11 and 31 on the 164PA
+5 to pins 10 and 30
Pin 13 to pin 8 (SCK)
Pin 12 to pin 7 (MISO)
Pin 11 to pin 6 (MOSI)
Pin 10 to pin 9 (RESET)

+5 is also connected through a 10k to RESET
XTAL1 and XTAL2 are connected to a 16MHz crystal ( and onto two 22pF capacitors to GND).

When I try to upload the HEX file I get the wonderful:
avrdude: stk500_getsync(): not in sync: resp=0x00

[ Thanks for the response so far ]

That wiring looks OK, but it's possible you don't have a clock, depending on the fuses.

Try running my "board detector" sketch described here:

You should be able to leave the wiring as-is. (Scroll down to the part about wiring for the Sanguino and similar).

Report what results it gives you.

Downloaded the sketch you recommended. What a fantastic utility !

The full output is below ( including all the FFs in the bootloader space.. I think it looks good that the output shows the correct ATMega, correct Flash size etc. At least something is communicating with the MCU. Again thanks for the suggestion. I'm new to this and would not have found that sketch of yours !

Atmega chip detector.
Entered programming mode OK.
Signature = 1E 94 0A
Processor = ATmega164P
Flash memory size = 16384
LFuse = 62
HFuse = 99
EFuse = FF
Lock byte = FF
Clock calibration = 87
Bootloader in use: No
EEPROM preserved through erase: No
Watchdog timer always on: No
Bootloader is 2048 bytes starting at 3800

Bootloader:

3800: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3810: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3820: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3830: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3840: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3850: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3860: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3870: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3880: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3890: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
38A0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
38B0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
38C0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
38D0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
38E0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
38F0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3900: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3910: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3920: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3930: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3940: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3950: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3960: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3970: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3980: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3990: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
39A0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
39B0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
39C0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
39D0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
39E0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
39F0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3A00: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3A10: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3A20: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3A30: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3A40: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3A50: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3A60: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3A70: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3A80: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3A90: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3AA0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3AB0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3AC0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3AD0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3AE0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3AF0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3B00: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3B10: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3B20: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3B30: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3B40: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3B50: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3B60: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3B70: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3B80: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3B90: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3BA0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3BB0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3BC0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3BD0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3BE0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3BF0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3C00: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3C10: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3C20: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3C30: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3C40: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3C50: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3C60: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3C70: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3C80: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3C90: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3CA0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3CB0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3CC0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3CD0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3CE0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3CF0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3D00: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3D10: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3D20: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3D30: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3D40: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3D50: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3D60: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3D70: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3D80: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3D90: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3DA0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3DB0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3DC0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3DD0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3DE0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3DF0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3E00: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3E10: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3E20: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3E30: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3E40: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3E50: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3E60: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3E70: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3E80: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3E90: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3EA0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3EB0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3EC0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3ED0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3EE0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3EF0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3F00: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3F10: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3F20: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3F30: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3F40: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3F50: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3F60: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3F70: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3F80: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3F90: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3FA0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3FB0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3FC0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3FD0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3FE0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3FF0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF

MD5 sum of bootloader = E0 DE EB D3 C3 F5 60 21 2A F1 7C 68 B9 34 4B AE

First 256 bytes of program memory:

0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
10: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
20: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
30: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
40: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
50: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
60: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
70: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
80: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
90: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
A0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
B0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
C0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
D0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
E0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
F0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF

So I've had a look at the defaults for the ATMega164P, on http://www.frank-zhao.com/fusecalc/fusecalc.php?chip=atmega164pa and tried to validate against the datasheet, and it seems to me that the ATMega I have has the LFUSE set to 0x62 versus 0x42 which is the default.
The difference is SUT1. I will check what the significance of that fuse is. However, in order to select an external clock I think I need to have CLKSEL3, CLKSEL2, CLKSEL1 and CLKSEL0 all set (i.e. zero). The default setting has CLKSEL1 unset (i.e. one).

If I set all the CLKSEL fuses and leave the SUT1,0 as they are, I think this selects an external clock source, slow rising power...

Of course, in order to set the fuse I need to be able to use avrdude... Pretty sure that the correct command would be:
avrdude -c avrisp -p m164p -P com6 -U lfuse:w:0x60:m

Also pretty sure that I'll get exactly the same error as I've started with..

LFuse = 62
HFuse = 99
EFuse = FF

http://www.engbedded.com/fusecalc

Looks like you have the 8 MHz internal oscillator with divide by 8 set, so it is running at 1 MHz.

This may be affecting attempts to program it.

See if you can get my "hex uploader" sketch to work:

Thanks for all you help so far Nick. Do you never sleep ?

I don't have an SD shield so will try to include the hex file as a block and have the arduino read it and write it. I will start with the blink program. It'll take a few hours for me to get back to it because the 'day job' is calling for my attention at the moment.

My project didn't use a shield, just a small interface board.

Ah yes, I sleep, but I'm probably in a different time zone. :slight_smile:

Got this working this evening. In desperation I reinstalled WinAVR to get that avrdude and then decided to lower baudrate. Lowered to 19200 and would you believe it, it worked. Tried again using the Arduino programmer, and it continues to fail.

The moral of the story is WinAVR has a better avrdude that the one which is packaged with the Arduino project.

Sincere thanks to you Nick.. Once I had communication proven to the MCU, I knew that it should work.. :slight_smile: