; main file of the monolyzer project ; ; author: hackbard@hackdaworld.org ; ; device specific definition file .include "../include/tn2313def.inc" ; defines .def zero = r1 .def one = r2 .def tmp1 = r16 .def tmp2 = r17 .def uart_rxtx = r18 .def count = r19 .def state = r20 .def scount = r21 ; ; interrupts ; ; RESET rjmp INIT ; INT0 rjmp INT0_IR ; INT1 reti ; T1 CAPT1 reti ; T1 COMP A reti ; T1 OVF1 rjmp T1_OVF_IR ; T0 OVF0 reti ; UART RX reti ; UART UDRE reti ; UART TX reti ; ANA COMP reti ; PCINT reti ; T1 COMP B reti ; T0 COMP A reti ; T0 COMP B reti ; USI START reti ; USI OVF reti ; EE READY reti ; WDT OVF reti ; ; init and main code ; RESET: INIT: ; gio port init rcall PORT_INIT ; timer1 init rcall TIMER1_INIT ; uart init rcall UART_INIT ; zero and one initialization ldi tmp1,0 mov zero,tmp1 ldi tmp1,1 mov one,tmp1 ; set stackpointer ldi tmp1,low(RAMEND) out SPL,tmp1 ; more init ldi count,0 ldi state,0 ; storage pointer ldi ZL,low(STORAGE) ldi ZH,high(STORAGE) ldi scount,0 ldi tmp1,0x23 INIT_STORAGE: ; init storage st Z+,tmp1 st Z+,tmp1 add scount,one cpi scount,55 brne INIT_STORAGE ; storage pointer again ldi ZL,low(STORAGE) ldi ZH,high(STORAGE) ; signal ready output ldi uart_rxtx,0x72 rcall UART_TX DEBUG_PORT: ;rcall UART_RX ;ldi uart_rxtx,0x30 ;in tmp1,PIND ;sbrc tmp1,2 ;ldi uart_rxtx,0x31 ;rcall UART_TX ;rjmp DEBUG_PORT ; external interrupt enable rcall INT0_IR_CONF_INIT rcall INT0_IR_ENABLE ; global interrupt enable sei MAIN: SAMPLE: ; sample as long as there is storage capacity and signal cpi state,2 brne SAMPLE ; disable interrupts rcall INT0_IR_DISABLE rcall TIMER1_INT_DISABLE ; signal finish ldi uart_rxtx,0x66 rcall UART_TX IDLE: ; wait for commands via uart rcall UART_RX ; decode instruction cpi uart_rxtx,0x52 breq RESET cpi uart_rxtx,0x54 breq TRANSFER rjmp IDLE TRANSFER: ; reset storage pointer ldi ZL,low(STORAGE) ldi ZH,high(STORAGE) ldi scount,1 ; transmit number of sampled words mov uart_rxtx,count rcall UART_TX TRANSFER_LOOP: ; send data and counter ld uart_rxtx,Z+ rcall UART_TX ld uart_rxtx,Z+ rcall UART_TX ; count sent data add scount,one ; check amount of data cpi scount,56 breq IDLE rjmp TRANSFER_LOOP ; include subroutines .include "port.asm" .include "timer.asm" .include "uart.asm" ; ; interrupt routines ; INT0_IR: ; debug output ; cbi PORTD,3 ; get timer value in tmp1,TCNT1L in tmp2,TCNT1H ; check for initial or running state cpi state,0 brne INT0_RUN ; configure interrupt for running state rcall INT0_IR_CONF_RUN ldi state,1 ; reset timer and start ovf interrupt ldi tmp1,0 out TCNT1H,tmp1 out TCNT1L,tmp1 rcall TIMER1_INT_ENABLE rjmp EXIT_IR INT0_RUN: ; write timer value into sram st Z+,tmp2 st Z+,tmp1 ; inc counter add count,one ; reset timer ldi tmp1,0 out TCNT1H,tmp1 out TCNT1L,tmp1 ; check for left capacity cpi count,55 brne EXIT_IR ; indicate end of 'c'apacity ldi uart_rxtx,0x63 rcall UART_TX ; exit sampling ldi state,2 EXIT_IR: ; debug output ; sbi PORTD,3 reti T1_OVF_IR: ; indicate 'o'verflow end ldi uart_rxtx,0x6f rcall UART_TX ; exit sampling ldi state,2 reti ; ; sram ; .dseg STORAGE: .byte 110