# 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/ 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.