|
|
@@ -0,0 +1,83 @@ |
|
|
|
# Making an ATmega328P blink |
|
|
|
|
|
|
|
Collapse OS has an AVR assembler and an AVR programmer. If you |
|
|
|
have a SPI relay as described in the SD card recipe, then you |
|
|
|
almost have all it takes to make an ATmega328P blink. |
|
|
|
|
|
|
|
First, read `doc/avr.txt`. You'll see that it tells you how to |
|
|
|
build an AVR programmer that works with your SPI relay. You |
|
|
|
might already have such device. For example, I use the same |
|
|
|
device as the one I connect to my Sparkfun AVR Pocket |
|
|
|
Programmer, but I've added an on/off switch to it. I then use |
|
|
|
a 6-pin ribbon cable to connect it to my SPI relay. |
|
|
|
|
|
|
|
If you have a SD card connected to the same SPI relay, you'll |
|
|
|
face a timing challenge: SD specs specifies that the minimum |
|
|
|
SPI clock is 100kHz, but depending on your setup, you might end |
|
|
|
up with an effective `SCK` below that. My own clock setup looks |
|
|
|
like this: |
|
|
|
|
|
|
|
I have a RC2014 Dual clock which allows me to have easy access |
|
|
|
to many clock speeds, but the slowest option is 300kHz, not |
|
|
|
slow enough. My SPI relay has a pin for input clock override, |
|
|
|
and I built a pluggable 4040 with a switch that selects a |
|
|
|
divisor. I plug that module in my SPI relay, then I plug that |
|
|
|
into my RC2014 Dual clock. When doing SD card stuff, I select |
|
|
|
the "no division" position, and when I communicate with the |
|
|
|
AVR chip, I move the switch to increase the divisor. |
|
|
|
|
|
|
|
Once you've done this, you can test that you can communicate |
|
|
|
with your AVR chip by doing `160 162 LOADR` (turn off your |
|
|
|
programmer or alse it might mess up the SPI bus and prevent you |
|
|
|
from using your SD card) and then running: |
|
|
|
|
|
|
|
1 asp$ aspfl@ .x 0 (spie) |
|
|
|
|
|
|
|
(Replace `1` by your SPI device ID) If everything works fine, |
|
|
|
you'll get the value of the low fuse of the chip. |
|
|
|
|
|
|
|
## Building the blink binary |
|
|
|
|
|
|
|
A blink program for the ATmega328P in Collapse OS would look |
|
|
|
like this: |
|
|
|
|
|
|
|
50 LOAD ( avra ) 65 66 LOADR ( atmega328p ) H@ ORG ! |
|
|
|
DDRB 5 SBI, PORTB 5 CBI, |
|
|
|
R16 TCCR0B IN, R16 0x05 ORI, TCCR0B R16 OUT, |
|
|
|
R1 CLR, |
|
|
|
L1 LBL! ( loop ) |
|
|
|
R16 TIFR0 IN, |
|
|
|
R16 0 ( TOV0 ) SBRS, |
|
|
|
L1 ( loop ) ' RJMP LBL, ( no overflow ) |
|
|
|
R16 0x01 LDI, TIFR0 R16 OUT, |
|
|
|
R1 INC, |
|
|
|
PORTB 5 CBI, |
|
|
|
R1 7 SBRS, |
|
|
|
PORTB 5 SBI, |
|
|
|
L1 ( loop ) ' RJMP LBL, |
|
|
|
|
|
|
|
See `doc/asm.txt` for details. For now, you'll paste this into |
|
|
|
an arbitrary unused block. Let's use `999`. |
|
|
|
|
|
|
|
$ cd recipes/rc2014 |
|
|
|
$ xsel > blk/999 |
|
|
|
$ rm blkfs |
|
|
|
$ make |
|
|
|
$ dd if=blkfs of=/dev/<your-sdcard> bs=1024 |
|
|
|
|
|
|
|
Now, with your updated SD card in your RC2014, let's assemble |
|
|
|
this binary: |
|
|
|
|
|
|
|
999 LOAD |
|
|
|
H@ CREATE end , |
|
|
|
CREATE wordcnt end ORG @ - 2 / , |
|
|
|
: write 1 asp$ asperase wordcnt 0 DO |
|
|
|
ORG @ I 2 * + @ I aspfb! LOOP |
|
|
|
0 aspfp! 0 (spie) ; |
|
|
|
write |
|
|
|
|
|
|
|
The first line assembles a 16 words binary beginning at `ORG @`, |
|
|
|
then the rest of the lines are about writing these 16 words to |
|
|
|
the AVR chip (see `doc/avr.txt` for details). After you've run |
|
|
|
this, if everything went well, that chip if it has a LED |
|
|
|
attached to PB5, will make that LED blink slowly. |