; efe.charge.asm ; (c) Neil Gershenfeld CBA MIT 8/29/04 ; ; definitions ; .include "tn13def.inc" ;.equ rxpin = PB0; driving pin .equ ledpin = PB4; .equ txpin = PB3; turning pin .equ micpin = PB1 .def temp = R16; temporary storage .def temp1 = R17 ; temporary storage .def bitcnt = R18 ; temporary storage .def txbyte = R19 ; data byte .def c_count = R20 ; low byte step up .def high_up = R21 ; high byte step up .def comphigh = R22 ; LED highstate .def txbytec = R23 ; state compare byte .def count = R24; delay count.def temp = R16 .def sample_count = R25 ; sample counter .def sample_delay = R26 ; delay between samples .def delay_count = R27 ; delay loop counter .def cycle_count = R28 ; cycle counter .def byte = R29 ; note counter ;.def note_lo = R30 ; reserved for OCR0B .def note_hi = R31 ; note high byte ; start of code ; .cseg .org 0 rjmp reset ; jump to reset routine ; ; waveform ; first byte = number of samples ; ;wave: ; .db 99,191,195,199,203,207,211,215,218,222 ; .db 225,229,232,235,238,240,243,245,247,249 ; .db 250,252,253,254,254,254,254,254,254,253 ; .db 252,251,250,248,246,244,242,239,236,233 ; .db 230,227,224,220,216,213,209,205,201,197 ; .db 193,189,185,181,177,173,169,166,162,158 ; .db 155,152,149,146,143,140,138,136,134,132 ; .db 131,130,129,128,128,128,128,128,128,129 ; .db 130,132,133,135,137,139,142,144,147,150 ; .db 153,157,160,164,167,171,175,179,183,187 ; ; getchar ; assumes no line driver (doesn't invert bits) ; ;getchar: ; ldi bitcnt,9 ; 8 data bit + 1 stop bit ; getchar1: ; sbis PINB, rxpin ; wait for start bit ; rjmp getchar1 ;rcall bitdelay ; 0.5 bit delay ;getchar2: ; rcall bitdelay ; 1 bit delay ; rcall bitdelay ; ; clc ; clear carry ; sbis PINB, rxpin ; if RX pin high skip ; sec ; otherwise set carry ; dec bitcnt ; breq getchar3 ; return if all bits read ; ror byte ; otherwise shift bit into receive byte ; rjmp getchar2 ; go get next bit ;getchar3: ; ret ; ; putchar routine ; assumes no line driver (doesn't invert bits) ; .equ sb = 1 ; number of stop bits putchar: ldi bitcnt, 9+sb ; 1+8+sb com txbytec ; invert everything sec ; set start bit putchar0t: brcc putchar1t ; if carry set sbi PORTB, txpin ; send a '0' rjmp putchar2t ; else putchar1t: cbi PORTB, txpin ; send a '1' nop putchar2t: rcall bitdelay ; one bit delay rcall bitdelay lsr txbytec ; get next bit dec bitcnt ; if not all bits sent brne putchar0t ; send next ret ; else return ; ; bit delay ; .equ b = 17 ; 9600 bps bitdelay: ldi temp, b bitloop: dec temp brne bitloop ret ; ; routine to wait for sample to settle ; .equ delay = 10 settle: ldi temp1, delay sloop1: ldi temp, delay sloop0: dec temp brne sloop0 dec temp1 brne sloop1 ret ; ; LED delay ; ;.equ count = 100 print_delay: mov temp1, count delay_loop1: mov temp, count delay_loop: dec temp brne delay_loop dec temp1 brne delay_loop1 ret ; long_print_delay ; delay between printed lines ; ;.equ delay2 = 100 ;long_print_delay: ;ldi temp2, delay2 ;charloop2: ;ldi temp1, delay2 ;charloop1: ;ldi temp, delay2 ;charloop0: ;dec temp ;brne charloop0 ;dec temp1 ;brne charloop1 ;dec temp2 ;brne charloop2 ;ret ; main program ; reset: ldi temp, low(RAMEND) ; maximum RC clock out SPL, temp sbi PORTB, ledpin; init LED pin sbi DDRB, ledpin ; sbi PORTB, txpind; init txpin pin ;sbi DDRB, txpind sbi PORTB, txpin; init txpin pin sbi DDRB, txpin ; ; init A/D ; cbi ADMUX, REFS0 ; " cbi ADMUX, ADLAR ; right-adjust result sbi ADCSRA, ADEN ; enable A/D cbi ADCSRA, ADATE ; set for single-shot cbi ADCSRA, ADIE ; disable A/D interrupt cbi ADCSRA, ADPS2 ; set prescaler cbi ADCSRA, ADPS1 ; " cbi ADCSRA, ADPS0 ; " sbi PORTB, micpin ; output on PB1 sbi DDRB, micpin cbi ADMUX, MUX1 ; " sbi ADMUX, MUX0 ; " ; ; init pwm ; ; ldi temp, (1<