; ; mic11.mic.asm ; ; send single-channel A/D samples ; ; Neil Gershenfeld CBA MIT 5/7/07 ; (c) Massachusetts Institute of Technology 2007 ; Permission granted for experimental and personal use; ; license for commercial use available from MIT ; .include "tn44def.inc" .equ click_pin = PA3 ; i0 click pin .equ led_sink_pin = PA1 ; LED sink pin .equ led_source_pin = PA2 ; LED source pin .equ delay_count = 2 ; loop count to wait between clicks .equ settle_count = 1 ; loop count to wait for click to settle .equ nloop = 200 ; number of samples between framing .def temp = R16 ; temporary register .def temp1 = R17 ; temporary register .def txbyte = R18 ; byte to transit .def bit_count = R19 ; bit counter .def loop_count = R20 ; loop counter .cseg .org 0 rjmp reset ; ; click_duration ; click_duration: ret ; ; click_delay ; click_delay: ldi temp, delay_count click_delay_loop: dec temp brne click_delay_loop ret ; ; putclick ; send char in txbyte clicks ; putclick: ldi bit_count, 8 sec; set start bit ; ; set click pin to output ; sbi DDRA, click_pin ; ; send start clicks ; cbi PORTA, click_pin rcall click_duration sbi PORTA, click_pin rcall click_delay cbi PORTA, click_pin rcall click_duration sbi PORTA, click_pin rcall click_delay ; ; send data clicks ; putclick0: lsr txbyte; get next bit brcc putclick1 ; if carry set, send a 1 click cbi PORTA, click_pin rcall click_duration sbi PORTA, click_pin rcall click_delay sbi PORTA, click_pin rcall click_duration sbi PORTA, click_pin rcall click_delay rjmp putclick2; otherwise ... putclick1: sbi PORTA, click_pin ; ... send a 0 click rcall click_duration sbi PORTA, click_pin rcall click_delay cbi PORTA, click_pin rcall click_duration sbi PORTA, click_pin rcall click_delay putclick2: dec bit_count; if not all bits sent brne putclick0; send next bit ; ; send stop clicks ; cbi PORTA, click_pin rcall click_duration sbi PORTA, click_pin rcall click_delay cbi PORTA, click_pin rcall click_duration sbi PORTA, click_pin rcall click_delay ; ; set click pin to input with pull-up ; cbi DDRA, click_pin ; ; return ; ret ; ; char_delay ; delay between characters ; .equ char_delay_count = 15 char_delay: ldi temp1, char_delay_count char_delay_1: ldi temp, char_delay_count char_delay_0: dec temp brne char_delay_0 dec temp1 brne char_delay_1 ret ; ; main program ; reset: ; ; set fuse low byte to 0x7E for 20 MHz resonator ; ; set clock divider to /1 ; ldi temp, (1 << CLKPCE) ldi temp1, (0 << CLKPS3) | (0 << CLKPS2) | (0 << CLKPS1) | (0 << CLKPS0) out CLKPR, temp out CLKPR, temp1 ; ; set stack pointer to top of RAM ; ldi temp, high(RAMEND) out SPH, temp ldi temp, low(RAMEND) out SPL, temp ; ; init click pin for input with pull-up ; sbi PORTA, click_pin cbi DDRA, click_pin ; ; init LED pins ; cbi PORTA, led_source_pin sbi DDRA, led_source_pin cbi PORTA, led_sink_pin sbi DDRA, led_sink_pin ; ; set up A/D ; sbi ADMUX, REFS1 ; use 1.1V reference cbi ADMUX, REFS0 ; " cbi ADMUX, ADLAR ; right-adjust result cbi ADMUX, MUX5 ; single-ended input on PA7 cbi ADMUX, MUX4 ; cbi ADMUX, MUX3 ; sbi ADMUX, MUX2 ; sbi ADMUX, MUX1 ; sbi ADMUX, MUX0 ; sbi ADCSRA, ADEN ; enable A/D cbi ADCSRA, ADATE ; disable auto-trigger sbi ADCSRA, ADPS2 ; set prescaler for /128 sbi ADCSRA, ADPS1 ; " sbi ADCSRA, ADPS0 ; " ; ; main loop ; main_loop: ; ; send framing ; ldi txbyte, 1 rcall putclick rcall char_delay ldi txbyte, 2 rcall putclick rcall char_delay ldi txbyte, 3 rcall putclick rcall char_delay ldi txbyte, 4 rcall putclick rcall char_delay ; ; sample loop ; ldi loop_count, nloop sample_loop: ; ; read A/D ; sbi ADCSRA, ADSC ; start conversion adloopup: sbic ADCSRA, ADSC ; loop until complete rjmp adloopup ; ; send conversion ; in txbyte, ADCL ; low byte rcall putclick rcall char_delay in txbyte, ADCH ; hi byte rcall putclick rcall char_delay ; ; loop ; dec loop_count brne sample_loop rjmp main_loop