mirror of
https://github.com/hsoft/collapseos.git
synced 2024-11-23 19:28:06 +11:00
Improve AVR docs
After many trials and errors in reliably accessing AVR chips through my SPI relay design, I resigned myself to accepting 125kHz communication speed with it. I find the complexity of solutions allowing to keep 250kHz speeds to be excessive.
This commit is contained in:
parent
44bcdd4327
commit
ebafa79795
49
doc/avr.txt
49
doc/avr.txt
@ -11,11 +11,26 @@ tem clock will be too fast for most AVR chips, which are usually
|
|||||||
running at 1MHz. Because the SPI clock needs to be a 4th of
|
running at 1MHz. Because the SPI clock needs to be a 4th of
|
||||||
that, a safe frequency for SPI communication would be 250kHz.
|
that, a safe frequency for SPI communication would be 250kHz.
|
||||||
|
|
||||||
|
# The programmer device
|
||||||
|
|
||||||
The AVR programmer device is really simple: Wire SPI connections
|
The AVR programmer device is really simple: Wire SPI connections
|
||||||
to proper AVR pins as described in the MCU's datasheet. Note
|
to proper AVR pins as described in the MCU's datasheet. Note
|
||||||
that this device will be the same as the one you'll use for any
|
that this device will be the same as the one you'll use for any
|
||||||
modern SPI-based AVR programmer, with RESET replacing SS.
|
modern SPI-based AVR programmer, with RESET replacing SS.
|
||||||
|
|
||||||
|
This device should have an on/off switch that controls the
|
||||||
|
chip's power for a very simple reason: Because we can't control
|
||||||
|
what's on the chip, it could mess up your whole SPI bus when
|
||||||
|
RESET is not held low. This means that as long as it's connected
|
||||||
|
and powered, it is likely to mess up your other devices, such as
|
||||||
|
the SD card.
|
||||||
|
|
||||||
|
You could put the AVR chip behind a buffer to avoid this, but
|
||||||
|
an on/off switch also does the trick and satisfies the low-tech
|
||||||
|
lover in you.
|
||||||
|
|
||||||
|
# Programming software
|
||||||
|
|
||||||
The AVR programming code is at B160.
|
The AVR programming code is at B160.
|
||||||
|
|
||||||
Before you begin programming the chip, the device must be desel-
|
Before you begin programming the chip, the device must be desel-
|
||||||
@ -28,6 +43,40 @@ Each command will verify that it's in sync, that is, that its
|
|||||||
3rd exchange echoes the byte that was sent in the 2nd exchange.
|
3rd exchange echoes the byte that was sent in the 2nd exchange.
|
||||||
If it doesn't, the command aborts with "AVR err".
|
If it doesn't, the command aborts with "AVR err".
|
||||||
|
|
||||||
|
# Ensuring reliability
|
||||||
|
|
||||||
|
The reliability of your communication depends a lot on the
|
||||||
|
soundness of your SPI relay design. If it's good, you will sel-
|
||||||
|
dom see those "AVR err".
|
||||||
|
|
||||||
|
However, there are worse things than "AVR err": wrong data. Sync
|
||||||
|
checks ensure communication reliability at every command, but
|
||||||
|
in the case of commands getting data, you might be out-of-sync
|
||||||
|
when you receive your result without knowing it! To ensure that
|
||||||
|
you're still in sync, you need to issue a command, which might
|
||||||
|
spit "AVR err". If it does, your previous result is unreliable.
|
||||||
|
|
||||||
|
Here's an example word that reliably prints the high fuse value
|
||||||
|
from SPI devid 1:
|
||||||
|
|
||||||
|
: get 1 asp$ asprdy aspfh@ asprdy .x 0 (spie) ;
|
||||||
|
|
||||||
|
Another very important matter is clock speed. As mentioned
|
||||||
|
above, the safe clock speed is 250kHz. If you use the SPI design
|
||||||
|
in rc2014/sdcard recipe, this means that your input clock speed
|
||||||
|
can theoretically be 500kHz because the '161 divides it by 2.
|
||||||
|
|
||||||
|
In practice, however, you can't really do that because depending
|
||||||
|
on the timing of your SPI write, the first "bump" of the SPI
|
||||||
|
clock might end up being nearly 500kHz, which will result in oc-
|
||||||
|
casional communication errors.
|
||||||
|
|
||||||
|
The simplest and safest way to avoid this is to reduce your
|
||||||
|
raw input clock by 2, which will reduce your effective communi-
|
||||||
|
cation speed by 2. There certainly are options allowing you to
|
||||||
|
keep optimal speed, but they're significantly more complex than
|
||||||
|
accepting slower speed.
|
||||||
|
|
||||||
# Access fuses
|
# Access fuses
|
||||||
|
|
||||||
You get/set they values with "aspfx@/aspfx!", x being one of "l"
|
You get/set they values with "aspfx@/aspfx!", x being one of "l"
|
||||||
|
Loading…
Reference in New Issue
Block a user