mirror of
https://github.com/hsoft/collapseos.git
synced 2024-09-07 15:28:45 +10:00
also, verify all 3 first bytes of SPI commands. I'm not sure why I wasn't doing that, probably because I was getting a lot of AVR err and thought that only 2 bytes of the cmd were echoed. But now, with a reliable SPI setup, verifying 3 bytes seems to work.
84 lines
2.9 KiB
Markdown
84 lines
2.9 KiB
Markdown
# 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 163 LOADR` (turn off your
|
|
programmer or else 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.
|