Software Engineering You are a WebApp designer for FutureLea
Software Engineering
You are a WebApp designer for FutureLearning Corporation, a distance learning company. You intend to implement an Internet-based “learning engine” that will enable you to deliver course content to a student. The learning engines provides the basic infrastructure for delivering learning content on any subject (content designers will prepare appropriate content). Develop a prototype interface design for the learning engine.
Solution
.INCLUDE <m328pdef.inc>
 .CSEG
 .ORG 0x0000
 RST_VECT:
 rjmp Reset // jump over the IVT, tables and include file(s)
 .ORG 0x0100 // bypass IVT
; SPI interface registers
 .DEF spiLEDS=r8
 .DEF spi7SEG=r7
; Switches
 .DEF switch=r6
; Temporary storage of AVR Status REGister Flag bits
 .DEF reg_F=r15
; 7-segment display
 .EQU seg_a=0
 .EQU seg_b=1
 .EQU seg_c=2
 .EQU seg_d=3
 .EQU seq_e=4
 .EQU seg_f=5
 .EQU seg_g=6
 .EQU seg_dp=7
InitShield:
 ; Disable interrupts and configure stack pointer for 328P
    cli
; Initialize Switches with Pull-up resistors and Test LEDs
    in       r16,DDRC       // input Port C Data Direction Register (0x07) for switches 5 to 0
    cbr       r16,0b00111111   // define bits 5 to 0 as input (clear bit register)
    out       DDRC,r16       // output
   in       r16,PORTC       // input Port C Register (0x08) for switches 5 to 0
    sbr       r16,0b00111111   // add pull-up resistors (PUR)
    out       PORTC,r16       // output
   in       r16,DDRD       // input Port D Data Direction Register (0x0A) for switches 7 to 6
    cbr       r16,0b11000000   // define bits 7 to 6 as input (clear)
    out       DDRD,r16       // output
   in       r16,PORTD       // input Port D Register (0x0B) for switches 7 to 6
    sbr       r16,0b11000000   // add pull-up resistors (PUR)
    out       PORTD,r16       // output
; Initialize SPI Port
    in       r16,DDRB       // Input from Port B Data Direction Register (DDRB) at i/o address 0x04
    sbr    r16,0b00101111   // Set PB5, PB3, PB2 (SCK, MOSI, SS) and PB1, PB0 (TEST LEDs) as outputs
    out    DDRB,r16       // Output to Port B Data Direction Register (DDRB) at i/o address 0x04
   ldi       r16,0b01010001   // Set SPCR Enable (SPE) bit 6, Master (MSTR) bit 4, clock rate fck/16 (SPR1 = 0,SPR0 = 1)
    out    SPCR,r16       // Output to SPI Control Register (SPCR) at i/o address 0x2c
   cbi       PORTB,2           // Clear I/O Port B bit 2 (SS) at i/o address 0x05
    cbi       PORTB,1           // Clear I/O Port B bit 1 (TEST LED1)
    cbi       PORTB,0           // Clear I/O Port B bit 0 (TEST LED0)
    ret
ReadSwitches:
 ; SPI Software Wires
 push r17
 push r16
in r17, PINC // input port C pins (0x06) into register r17
 in r16, PIND // input port D pins (0x09) into register r16
cbr r17, 0b11000000 // clear non-switch bits 7 and 6
 cbr r16, 0b00111111 // clear non-switch bits 5 to 0
or r16, r17 // concatenate switches SW7 - SW6 : SW5 - SW0
 mov r6, r16 // move to standardized switch register
pop r16
 pop r17
 ret
WriteDisplay:
 ; Save SREG
 push reg_F
 in reg_F, SREG
 ; Start transmission of data
    out    SPDR,spiLEDS
    rcall   spiTxWait
    out       SPDR,spi7SEG
    rcall   spiTxWait
    sbi       PORTB,PB2       // strobe latches
    cbi       PORTB,PB2
 ; Restore SREG
    out SREG, reg_F
    pop reg_F
    ret
SpiTxWait:
    push   r16
 ; Wait for transmission complete
 spiPolling:
    in       r16,SPSR
    bst       r16,SPIF
    brtc    spiPolling
    pop       r16
    ret
; --------------------------
 reset:
 ldi r16, high (RAMEND) // IO[0x3e] = 0x08
 out SPH, r16
 ldi r16, low(RAMEND) // IO[0x3d] = 0xff
 out SPL, r16
 call InitShield
 loop:
 call ReadSwitches // read switches into r6
 mov r7, r6 // wire switches to the 7 segment display
 mov r8, r7 // wire switches to the 8 discrete LEDs
 call WriteDisplay // write r7 to the 7 segment display and r8 to 8 discrete LEDs
 rjmp loop



