; ; hello3.step.asm ; step response measurement ; Neil Gershenfeld CBA MIT 10/29/05 ; ; definitions ; .include "tn13def.inc" .equ chargepin = PB1 ; charging pin .equ txpin = PB4 ; serial transmit pin .def bitcnt = R16 ; bit counter .def temp = R17 ; temporary storage .def txbyte = R18 ; data byte .def delaycnt = R19 ; delay counter .def uplo = R20 ; up low byte .def uphi = R21 ; up hi byte ; ; 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 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 putchar2: rcall bitdelay ; one bit delay rcall bitdelay lsr txbyte ; get next bit dec bitcnt ; if not all bits sent brne putchar0 ; send next ret ; else return ; ; serial bit delay routine ; .equ b = 17 ; 9600 bps bitdelay: ldi temp, b bitloop: dec temp brne bitloop ret ; ; routine to wait for sample to settle ; .equ delay = 255 settle: ldi temp, delay settleloop: dec temp brne settleloop ret ; ; main program ; reset: ldi temp, low(RAMEND) ; set stack pointer to top of RAM out SPL, temp ; ; ; init output pins ; sbi PORTB, txpin ; comm sbi DDRB, txpin ; " sbi PORTB, chargepin ; charging sbi DDRB, chargepin ; " ; ; init A/D ; cbi ADMUX, REFS0 ; use Vcc as reference cbi ADMUX, ADLAR ; right-adjust result sbi ADCSRA, ADEN ; enable A/D cbi ADCSRA, ADATE ; disable auto-trigger cbi ADCSRA, ADPS2 ; set prescaler for /2 cbi ADCSRA, ADPS1 ; " cbi ADCSRA, ADPS0 ; " cbi ADMUX, MUX1 ; input on ADC1 sbi ADMUX, MUX0 ; " ; ; infinite main loop ; loop: ; ; loop over delays ; ldi delaycnt, 254 delayloop: ; ; settle sample and start upward step response ; cbi PORTB, chargepin rcall settle mov temp, delaycnt sbi PORTB, chargepin ; ; wait for delay ; addelayup: dec temp brne addelayup ; ; read response ; sbi ADCSRA, ADSC ; start conversion adloopup: sbic ADCSRA, ADSC ; loop until complete rjmp adloopup ; ; save conversion ; in uplo, ADCL ; get low byte in uphi, ADCH ; get high byte ; ; settle sample and start downward step response ; rcall settle mov temp, delaycnt cbi PORTB, chargepin ; ; wait for delay ; addelaydown: dec temp brne addelaydown ; ; read response ; sbi ADCSRA, ADSC ; start conversion adloopdown: sbic ADCSRA, ADSC ; loop until complete rjmp adloopdown ; ; send conversions ; in txbyte, ADCL ; low down byte rcall putchar in txbyte, ADCH ; hi down byte rcall putchar mov txbyte, uplo ; low up byte rcall putchar mov txbyte, uphi ; hi up byte rcall putchar dec delaycnt dec delaycnt brne delayloop ; ; 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 rjmp loop