; ; efe.charge.asm ; (c) Neil Gershenfeld CBA MIT 8/29/04 ; ; definitions ; .include "tn13def.inc" .equ txpin = PB2; transmit pin .equ ledpin1 = PB3; LED pin 1 .equ ledpin2 = PB4; LEP pin 2 .equ rxpin = PB0; recieve pin .def bitcnt = R16 ; bit counter .def temp = R17 ; temporary storage .def temp1 = R18 ; temporary storage .def txbyte = R19 ; data byte .def low_up = R20 ; low byte step up .def high_up = R21 ; high byte step up .def complow = R22 ; LED lowstate .def comphigh = R23 ; LED highstate .def txbytec = R24 ; state compare byte .def txbyteb = R25; temporary storge .def byte = R26; delay count ;.def temp2 = R27; ; start of code ; .cseg .org 0 rjmp reset ; jump to reset routine ; ; 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 putchar0: brcc putchar1 ; if carry set sbi PORTB, txpin ; send a '0' rjmp putchar2 ; else putchar1: cbi PORTB, txpin ; send a '1' nop putchar2: rcall bitdelay ; one bit delay rcall bitdelay lsr txbytec ; get next bit dec bitcnt ; if not all bits sent brne putchar0 ; send next ret ; else return ; ; 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 ; ; serial bit delay routine ; .equ b = 17 ; OSCCAL 0xff, 5V 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 ; ; print delay ; .equ delay = 200 print_delay: ldi temp1, delay delay_loop1: ldi temp, delay delay_loop: ;ldi temp2, count ;delay_loop2: ;dec temp2 ;brne delay_loop2 dec temp brne delay_loop dec temp1 brne delay_loop1 ret ; ; main program ; reset: ldi temp, low(RAMEND) ; maximum RC clock out SPL, temp sbi PORTB, txpin; init comm pin sbi DDRB, txpin sbi PORTB, ledpin1; init LED pin sbi DDRB, ledpin1 sbi PORTB, ledpin2; init LED pin sbi DDRB, ledpin2 ; ; init A/D ; ;cbi ADMUX, REFS1 ; use Vcc as reference ;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, PB1 ; output on PB1 ;sbi DDRB, PB1 ;cbi ADMUX, MUX2 ; input on ADC1 ;cbi ADMUX, MUX1 ; " ;sbi ADMUX, MUX0 ; " ; ; infinite main loop ; loop: ; ;clr txbyte ;clr txbytec ;clr txbyteb ; ; settle sample and start upward step response ; ;cbi PORTB, PB1 ;rcall settle ;sbi PORTB, PB1 ; ; wait for delay ; ;nop ; ; read response ; ;sbi ADCSRA, ADSC ; start conversion ;adloop1up: ;sbic ADCSRA, ADSC ; loop until complete ;rjmp adloop1up ; ; save conversion ; ;in low_up, ADCL ; save low byte ;in high_up, ADCH ; save high byte ; ; start downward step response ; ;cbi PORTB, PB1 ; ; wait for delay ; ;nop ; ; read response ; ;sbi ADCSRA, ADSC ; start conversion ;adloop1down: ;sbic ADCSRA, ADSC ; loop until complete ;rjmp adloop1down ; ; send downward conversion ; ;in txbyte, ADCL ; send low byte ;clr txbyte ;rcall putchar ;in txbyte,ADCH ; send high byte ;clr txbyte ;rcall putchar ; ; send upward conversion ; ;mov txbyteb, low_up ;rcall putchar ;mov txbytec, high_up ;rcall putchar ; ; 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 ; ; print delay ; ;ldi comphigh,0 ;cp comphigh, txbytec ;breq low_loop ;rcall putchar ;rjmp loop ;low_loop: rcall getchar ldi txbyte, 4 cp byte, txbyte brne loop ;brne left_loop cbi PORTB, ledpin1 cbi PORTB, ledpin2 ldi txbytec, 4 rcall putchar rcall print_delay sbi PORTB, ledpin1 sbi PORTB, ledpin2 rcall print_delay ldi txbytec, 4 rcall putchar rjmp loop ;left_loop: ; cbi PORTB, ledpin2 ; ldi txbytec, 3 ; rcall putchar ;rcall print_delay ;sbi PORTB, ledpin2 ;rcall print_delay ;rjmp loop