;EE 476 ;MIDI Sequencer ;Tareq Aryne ;Andy Pierson ; ******* WARNING!!! EVERYTHING IS ACTIVE LOW!!! ************ .nolist .include "8535def.inc" .list .def save =r1 ; SREG temp reg .def temp =r16 ; crack is bad for your health .def memRead =r17 ; last value read from memory for the sequencer .def input =r18 ; Debounced input from Timer 0 ISR .def output =r19 ; Output to the Synthesizer processor .def itemp =r20 ; i temp, you jane .def state =r21 ; "memory" for the RX ISR, the MAGIC ISR .def button =r22 ; push button input .def mode =r23 ; operation mode (Play or Record) .def beatnum =r24 ; Measure number (1 - 8) .def beatL =r28 ; duration (in ticks) of a beat .def beatH =r29 ; (double precision) ; Set the baud rate in precompile time ;.equ clock = 8000000 .equ clock = 4000000 .equ baud = 31250 ;.equ baud = ((clock/31250)-16)/16 .equ rate = clock/(16*baud) - 1 .equ RAMSTART=0x60 .equ RAMSTOP=RAMSTART + 127 ;***** Initialization .cseg .org $0000 rjmp RESET ; RESET reti ; INT0 reti ; INT1 reti ; TIMER2_COMP reti ; TIMER2_OVF reti ; TIMER1_CAPT rjmp T1CompA ; TIMER1_COMPA reti ; TIMER1_COMPB reti ; TIMER1_OVF reti ; TIMER0_OVF reti ; SPI_STC reti ; UART_RX reti ; UART_UDRE reti ; UART_TX reti ; ADC reti ; EE_RDY reti ; ANA_COMP RESET: ;setup stack pointer ldi temp, LOW(RAMEND) out SPL, temp ldi temp, HIGH(RAMEND) out SPH, temp ;**** Port setup ;set PortA for output to LCD and clear it ser temp out DDRA, temp clr temp out PortA, temp ;set PortB for output to LED's and turn them off ser temp out DDRB, temp out PortB, temp ;Set Port C for output to produce audio beat ldi temp,0b11011111 out DDRC, temp clr temp out PortC, temp ;Set PortD to be all inputs with pullups for push buttons clr temp out DDRD, temp ser temp out PORTD,temp ;****** Setup Timer 1 for interrupt and reset on compare match A at Clk/64 ldi temp, 0b00001011 out TCCR1B, temp ;beat ticks every ldi temp, high(10000) mov beatL,temp ldi temp, low(10000) mov beatH, temp mov temp, beatH out OCR1AH, temp mov temp, beatL out OCR1AL, temp ldi temp,0b00010000 out TIMSK,temp ;***** Initialize the RAM clr ZH ldi ZL, RAMSTART clear: ldi temp,0xff st Z+,temp cpi ZL,low(RAMSTOP) brne clear cpi ZH,high(RAMSTOP) brne clear ldi ZH,high(RAMSTART) ldi ZL, low(RAMSTART) ;Start in Play mode ldi mode,0b10000000 ;Start in Beat 1 ldi beatnum,1 ;Start with no buttons pushed and no input ser state ser input sei ;***** Main Loop HandShake: sbis PinC,5 rjmp HandShake mov output,memread com output andi output,0b11011111 out PortC,output rjmp Handshake ;***** Timer 1 Compare Match A handler T1CompA: in save, SREG push temp in itemp,PIND mov temp,itemp mov input,itemp com input and input,state com input mov state,itemp ;update the state mov button,input ; in button,PIND ;PD 7 means go to play sbrs button, 7 ldi mode, 0b10000000 ;PD 6 means go to Record sbrs button, 6 ldi mode, 0b01000000 sbrc button, 5 rjmp BeatUp ldi itemp,1 add beatH,itemp out OCR1AH,beatH out OCR1AL,beatL rjmp BeatDone BeatUp: sbrc button,4 rjmp BeatDone sbci beatH,1 out OCR1AH,beatH out OCR1AL,beatL BeatDone: ld memRead,Z ;Disable the upper nible because we only have four sounds ori button,0xF0 ;Combine the input with the memory value and memRead,button out PortB,memRead mov temp,ZL andi temp,0b00001111 cpi temp,0b00001000 brne NextLB cpi beatnum,1 brne chk2 inc beatnum ldi temp,0b10010001 rjmp Print chk2: cpi beatnum,2 brne chk3 inc beatnum ldi temp,0b01101011 rjmp Print chk3: cpi beatnum,3 brne chk4 inc beatnum ldi temp,0b00111011 rjmp Print chk4: cpi beatnum,4 brne chk5 inc beatnum ldi temp,0b00011101 rjmp Print chk5: cpi beatnum,5 brne chk6 inc beatnum ldi temp,0b00111110 rjmp Print chk6: cpi beatnum,6 brne chk7 inc beatnum ldi temp,0b01111110 rjmp Print chk7: cpi beatnum,7 brne chk8 inc beatnum ldi temp,0b00010011 rjmp Print chk8: cpi beatnum,8 brne Print ldi beatnum,1 ldi temp,0b01111111 Print: out PortA,temp NextLB: ;toggle beat LED beat number display ldi temp,0b00001000 and temp,ZL breq NextLED sbi PortA,7 cbi PortB,4 NextLED: sbrc mode,7 adiw ZL,1 sbrc mode,7 cbi PortB, 7 sbrc mode,6 st Z+,memRead sbrc mode,6 cbi PortB, 6 rcall CheckZ pop temp out SREG, save reti ;back to backgound tasks CheckZ: ;check if we have overflown the RAM cpi ZL,low(RAMSTOP) brne CheckEnd cpi ZH,high(RAMSTOP) brne CheckEnd ldi ZH,high(RAMSTART) ldi ZL,low(RAMSTART) CheckEnd: ret