; ; hello4.ad.asm ; Neil Gershenfeld CBA MIT 10/29/06 ; read and send A/D ; .include "tn45def.inc" .equ npts = 100; number to points to sample .equ RAMSTART = 0x60 ; beginning of SRAM .equ txpin = PB1; transmit pin .def bitcnt = R16; bit counter .def temp = R17; temporary storage .def temp1 = R18; temporary storage .def txbyte = R19; data byte .def count = R20; point counter ; R26 used for xl ; R27 used for xh .cseg .org 0 rjmp reset ; ; putchar ; assumes no line driver (doesn't invert bits) ; .equ sb = 1; number of stop bits putchar: ldi bitcnt, 9+sb; 1+8+sb com txbyte; invert everything sec; set start bit putchar0: brcc putchar1; if carry set sbi PORTB, txpin; send a '0' rjmp putchar2; else putchar1: cbi PORTB, txpin ; send a '1' nop ; even out timing putchar2: rcall bitdelay; one bit delay rcall bitdelay lsr txbyte; get next bit dec bitcnt; if not all bits sent brne putchar0; send next bit ret; ; ; bit delay ; ;.equ b = 13 ; 9600 baud (clock /8) .equ b = 8 ; 115200 baud (clock /1) bitdelay: ldi temp, b bitloop: dec temp brne bitloop ret ; ; print_delay ; delay between printed lines ; .equ delay = 200 print_delay: ldi temp1, delay charloop1: ldi temp, delay charloop0: dec temp brne charloop0 dec temp1 brne charloop1 ret ; ; main program ; reset: ; ; set clock divider ; ldi temp, (1 << CLKPCE) ldi temp1, (0 << CLKPS3) | (0 << CLKPS2) | (0 << CLKPS1) | (0 << CLKPS0) ; /1 ;ldi temp1, (0 << CLKPS3) | (0 << CLKPS2) | (0 << CLKPS1) | (1 << CLKPS0) ; /2 ;ldi temp1, (0 << CLKPS3) | (0 << CLKPS2) | (1 << CLKPS1) | (0 << CLKPS0) ; /4 out CLKPR, temp out CLKPR, temp1 ; ; set stack pointer to top of RAM ; ldi temp, low(RAMEND) out SPL, temp ; ; init comm ; sbi PORTB, txpin sbi DDRB, txpin ; ; init A/D ; cbi ADMUX, REFS2 ; use Vcc as reference cbi ADMUX, REFS1 ; " cbi ADMUX, REFS0 ; " cbi ADMUX, ADLAR ; right-adjust result cbi ADMUX, MUX3 ; input on ADC3 cbi 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 ; " ; ; start main loop ; loop: ; ; store data ; ldi count, npts ldi xl, low(RAMSTART) ldi xh, high(RAMSTART) read_loop: ; ; read A/D ; sbi ADCSRA, ADSC ; start conversion adloopup: sbic ADCSRA, ADSC ; loop until complete rjmp adloopup ; ; write to SRAM ; in temp, ADCL ; low byte st x+, temp in temp, ADCH ; hi byte st x+, temp ; ; decrement point count and loop ; dec count brne read_loop ; ; send points ; ldi count, npts ldi xl, low(RAMSTART) ldi xh, high(RAMSTART) write_loop: ; ; read from SRAM and send ; ld txbyte, x+ rcall putchar ld txbyte, x+ rcall putchar ; ; decrement point count and loop ; dec count brne write_loop ; ; send 1 2 3 4 for framing ; ldi txbyte, 1 rcall putchar ldi txbyte, 2 rcall putchar ldi txbyte, 3 rcall putchar ldi txbyte, 4 rcall putchar ; ; return to main loop ; rjmp loop