; efe.charge.asm ; (c) Neil Gershenfeld CBA MIT 8/29/04 ; ; definitions ; .include "tn13def.inc" .equ ledpin = PB3; LED pin .equ rxpin = PB4; receive pin .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 bit_delay ; 0.5 bit delay getchar2: rcall bit_delay ; 1 bit delay rcall bit_delay ; 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 ; ; bit delay ; .equ b = 17 ; 9600 bps bit_delay: 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 ; ; 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, PB0 ; output on PB0 sbi DDRB, PB0 cbi ADMUX, MUX1 ; " sbi ADMUX, MUX0 ; " ; ; init pwm ; ldi temp, (1<