CrossRoads:
This part here changes the CKSEL bits? lfuse:w:0xe0:m
Why does the upper bit of 0xff get changed as well?
That's it. Zero = programmed, so the default lfuse value of 0x62 enables the clock divider and results in a 1MHz clock. Interestingly the clock prescaler can be overridden in software by writing to CLKPR. Handy for testing code on a 5V 16MHz board before building a project based on a lower-frequency board. It can also be used for power saving without the bother of entering and exiting sleep mode, although I haven't tried this myself.
One protocol I have been very happy with is EasyTransfer by Bill Porter. Available as a I2C as well as Serial library. Makes communications between two Arduinos a snap. Used it for 2 328's, a 328 and a 1284p, etc. Highly recommended.
@tim7, You are right - I was flipping the wrong bit of the nibble. 0xe0 it is.
@Constantin, Hadn't got that far yet. Still working on getting 2 uCs running of 1 crystal so I can some boards ordered. I think I have enough jumpers/headers on the board so any of those kinds of comm's can be set up.
See the schematic in Reply #9 of this thread. Have to tweak the crystal connections a little - xtal2 of chip1 will feed xtal1 of chip2. chip2 will have fuses set to allow external clock.
Think I'll do the connections with solder jumper pads so the two can be isolated if needed.
No worries. Just thought I'd chime in re: using the I2C bus for the communications. Pretty easy to implement and requires few traces and components on the board. Maybe give a choice using a shunt jumper or a cutable pad for SDA and SCL?
@Constantin - Check the schematic - I added internal headers so the two uC could talk to each other with user installed jumpers, while also keeping header pins free for offboard connections.
@BlueJakester - I'll order some boards once I verify the fuses & clock connections. Maybe tonight.
Ok, how do I run that?
Win Vista
Opened Command Prompt,
worked my way down to
C:\Arduino1.0\hardware\tools\avr\bin>
typed in this:
avrdude -c stk500v1 -p atmega328p -P com6 -b 19200 -u -U lfuse:w:0xe0:m -U hfuse:w:0xde:m -U efuse:w:0xfd:m
Get a couple of errors back:
avrdude: can't open config file "": Invalid argument
avrdude: error reading system wide configuration file ""
Be aware that the -U commands may trigger an automatic erase of the flash memory. You can try adding the -D option to disable this, although I'm not sure whether it's actually possible to change the fuses without a flash-erase. The normal procedure for loading Optiboot and setting the fuses (adapted for external clock and AVR ISP mkII) goes like this:
BTW, I found it convenient to have WinAVR installed for this kind of thing. Amongst other things this installs a bunch of handy utilities and sets the windows path to find them. The upshot is that you can run avrdude from whichever directory is convenient, without worrying about setting the full path. It's a minor thing, but one I found handy.
Ok, the design is gonna add 30 cents and go with 2 crystals.
Getting the fuses set for anything other than what the IDE does while installing a bootloader is to complex.
I would also consider going for a single set of pull-ups for the I2C bus @ 2.2K or two sets of 4.7k units instead of 10K. Better chance of square waveforms in high speed mode.
Ah, reset diodes. Good catch. When I started this way back, those hadn't been in use.
10Ks on I2c were arbitrary, I'll change to 4.7K.
User can install one or the other, or both if each uC will have its own I2C devices.
Ok, reset diodes have been added, artwork cleaned up, passes all design rule checks.
Boards are ordered.
Bare boards will be $5 mailed to US locations.