After all those "getting to know the lay of the land", I am ready to write for final product. I did this a few hours after the last class. It, too, was not without a "stupid" mistake.
Like the C code, we first put something on the 8x16 display. This runs on the simulator.
;;; "PONG" in AVR assembly
; V0.1 - turn on something on the LED array
; - requires sending two SPI bytes (four to get to the 2nd half)
#define __SFR_OFFSET 0 // makes "PORTB" etc fit the IN/OUT Port, instead of the memory equivalent
#include <avr/io.h> // Get the "basic" symbolic names for registers
.global main ; Interface to the Arduino/C startup
; (therefore?) stackpointer and vector table initialized
CSS = PB2 ; Arduino pin 10 (portB, pin 2) is the CSS line
;====== MAIN, START HERE ====
main:
cli ; we live without interrupts
; ---- Setup SPI mode
ldi r16,0B00101100 ; bit 2, 3 and 5 for Arduino pins 10, 11 and 13 as OUTPUT
out DDRB,r16 ; the rest as INPUT
ldi r16,0B00000100 ; Bit 2/pin 10
out PORTB,r16 ; HIGH
ldi r16,0B01010001 ; Bit 0 enable SPI, bit 5 to ?, bit 7 to ?
out SPCR,r16 ; Set these on the SPI control register
; ---- Push two bytes to SPI, bracket by LOW pin 10
cbi PORTB,CSS ; Trigger a "new transaction" on MAX7219 (pin 10 LOW)
ldi r17,5 ; 5th row
out SPDR,r17 ; send the first byte - put it in SPI data register
1: in r18,SPSR ; Read SPI status register
sbrs r18,SPIF ; was the done bit set ?
rjmp 1b ; nope, keep waiting
ldi r17,0B10101010 ; LED pattern
out SPDR,r17 ; ditto 2nd byte
1: in r18,SPSR ; Read SPI status register
sbrs r18,SPIF ; was the done bit set ?
rjmp 1b ; nope, keep waiting
sbi PORTB,CSS ; pin 10 HIGH again
loop:
; ==== Loop ====
nop
rjmp loop ; We do nothing, really fast :-)
I got lost in the address mode (memorymapped vs Port#) and symbolic names, as I did want to use plain numbers for everything. For a long while everything was right but nothing came up on the display. I took a hint by reading the disassembly from the working C code, and discovered I had forgotten to toggle the pin10/CSS line.
I have this sinking feeling that debugging in assembly is going to be hard. Actually, I used to earn my living doing assembly programming between '77 and '82 (yeah, I am not that young) so I am simply rediscovering old skills.
Onwards to doing the bouncing ball
Discussions
Become a Hackaday.io Member
Create an account to leave a comment. Already have an account? Log In.