;Eric Melin and Brian Glassmeyer ;;*************************************** ;;*** Final Project Test Code - ;;*** Test counter and Ram ;;*************************************** ;Port A used for LEDs ;Port B are buttons for stepping ;Port B Pins B2 and B3 used for compare match of phone pickup ; pins B5, B6 are used to control ram ;Port C 3 pins interface to counter, ; 0 - CLR ; 1 - CLK ; 2 - Q12 ;outbit Highest bit ; 5 pins are upper 5 bits to RAM ;Port D 8 Bit output data while storing ; Buttons are 4-7 ; LEDS may be 0-3 .include "8535def.inc" .device AT90S8535 .def AnaLo =r16 ;the lower byte of captured voltage .def AnaHi =r17 ;the upper byte of captured voltage .def temp =r18 ;temporary register .def savSREG =r20 ;save the status register .def cnt_bit12 =r21 ;counter bit to determine if overflow .def highCount =r22 ;upper 5 bits of counter .def AnaCaptoggle =r23 .def temp = r24 .def savSREG =r1 ;************************************** .dseg ;define variable strings to be tranmitted from RAM outstr: .byte 5 ;a four digit number + a zero terminate ;************************************** .cseg .org $0000 rjmp RESET ;reset entry vector reti reti reti reti rjmp timer1cap ;reti reti reti reti reti ; rjmp t0int reti reti reti reti reti reti reti RESET: ldi temp, LOW(RAMEND) ;setup stack pointer out SPL, temp ldi temp, HIGH(RAMEND) out SPH, temp ;establish inputs and outputs ser temp out DDRA, temp ; LED outs out DDRD, temp ; data line ldi temp, 0xF0 out DDRB, temp ; pin 4 for ram R/W - 2/3 for ana comp ldi temp, 0b11011111 out DDRC, temp ; load timer1 capture interrupt ldi temp, exp2(TICIE1) out TIMSK, temp ldi AnaCaptoggle, 0 ; Handle RAM control - Write ldi temp, 0x00 out PORTB, temp ;set up timer1 capture event sei ;init counter INIT_CNT: ; ldi temp, 0x80 ;clr counter ;out portC,temp rcall Clear ;spin2: rjmp spin2 ldi cnt_bit12, 0 ldi highCount, 0 ;High level 4calls to putBytes ;change to input ;call to getBytes (every time input capture fires) ; ldi AnaLo, 0b00000001 rcall putBytes ldi AnaLo, 0b00000011 rcall putBytes ldi AnaLo, 0b00000111 rcall putBytes ldi AnaLo, 0b00001111 rcall putBytes ldi AnaLo, 0b00011111 rcall putBytes ldi AnaLo, 0b00111111 rcall putBytes ldi AnaLo, 0b01111111 rcall putBytes ldi AnaLo, 0xFF rcall putBytes ldi AnaLo, 0x80 rcall putBytes ldi AnaLo, 0x44 rcall putBytes ; sbi PORTC, 1 ; nop ; nop ; sbi PORTC, 0 rcall Clear ;set up input from RAM ldi temp, 0x10 out PORTB, temp ;Read data back at every external interupt ldi temp, 0x00 out DDRD, temp ; set up data line to input nop nop nop rcall getBytes ldi temp, 0b00001111 ; enable Timer1 Capture interupt out ACSR, temp SPIN: rjmp SPIN putBytes: rcall INC_CNT out PORTD, AnaLo sbi PORTB, 4 cbi PORTB, 4 com AnaLo out PORTA, AnaLo ret getBytes: rcall INC_CNT in AnaLo, PIND com AnaLo out PORTA, AnaLo ret ;;Increment 12 bit counter and handle overflow for INC_CNT: sbi PORTC, 1 ; increment counter cbi PORTC, 1 sbic PORTC, 2 rjmp IN_HIGH ;input is low cpi cnt_bit12, 0 breq DONE_CNT ;OVERFLOW has occured ldi cnt_bit12, 0 inc highCount cpi highCount, 32 breq OUT_OF_RANGE mov temp, highCount ;NOTE - highCount == 000xxxxx out PORTC, highCount IN_HIGH: ldi cnt_bit12, 1 DONE_CNT: ret OUT_OF_RANGE: ret Clear: sbi PORTC,0 nop nop nop nop nop cbi PORTC,0 ret timer1cap: in savSREG, SREG clr temp out ACSR, temp ;disable capture interupt rcall getBytes cpi AnaCaptoggle, 0 brne setHighComp ldi AnaCaptoggle, 1 ldi temp, 0b00001110 ; enable Timer1 Capture interupt out ACSR, temp reti setHighComp: ldi AnaCaptoggle, 0 ldi temp, 0b00001111 ; enable Timer1 Capture interupt out ACSR, temp out SREG, savSREG reti