collapseos/recipes/rc2014/avr.md

84 lines
2.9 KiB
Markdown
Raw Normal View History

2020-10-05 18:46:22 -04:00
# 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.