; ; hello.light.45.asm ; ; read and send light level ; ; Neil Gershenfeld ; CBA MIT 10/24/07 ; ; (c) Massachusetts Institute of Technology 2007 ; Permission granted for experimental and personal use; ; license for commercial sale available from MIT. ; .include "tn45def.inc" ; ; definitions ; .equ tx_pin = PB2; transmit pin ; ; registers ; .def bit_count = R16; bit counter .def temp = R17; temporary storage .def temp1 = R18; temporary storage .def txbyte = R19; data byte ; ; code segment ; .cseg .org 0 rjmp reset ; ; bit delay ; serial bit delay ; .equ b = 13 ; 9600 baud (clock /8) ;.equ b = 8 ; 115200 baud (clock /1) bit_delay: ldi temp, b bitloop: dec temp brne bitloop ret ; ; putchar ; assumes no line driver (doesn't invert bits) ; .equ sb = 1; number of stop bits putchar: ldi bit_count, 9+sb; 1+8+sb com txbyte; invert everything sec; set start bit putchar0: brcc putchar1; if carry set sbi PORTB, tx_pin; send a '0' rjmp putchar2; else putchar1: cbi PORTB, tx_pin ; send a '1' nop ; even out timing putchar2: rcall bit_delay; one bit delay rcall bit_delay lsr txbyte; get next bit dec bit_count; if not all bits sent brne putchar0; send next bit ret; ; ; char_delay ; delay between characters ; char_delay: ldi temp, 255 char_delay_loop: ldi temp1, 10 char_delay_loop1: dec temp1 brne char_delay_loop1 dec temp brne char_delay_loop ret ; ; main program ; reset: ; ; set stack pointer to top of RAM ; ldi temp, high(RAMEND) out SPH, temp ldi temp, low(RAMEND) out SPL, temp ; ; init comm pin for output ; sbi PORTB, tx_pin sbi DDRB, tx_pin ; ; 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 ; set MUX to ADC3 cbi ADMUX, MUX2 ; " sbi ADMUX, MUX1 ; " sbi ADMUX, MUX0 ; " sbi ADCSRA, ADEN ; enable A/D cbi ADCSRA, ADPS2 ; set prescaler to /2 cbi ADCSRA, ADPS1 ; " cbi ADCSRA, ADPS0 ; " ; ; start main loop ; main_loop: ldi txbyte,1 rcall putchar ldi txbyte,2 rcall putchar ldi txbyte,3 rcall putchar ldi txbyte,4 rcall putchar rcall char_delay sbi ADCSRA, ADSC ; start conversion AD_loop: sbic ADCSRA, ADSC ; loop until complete rjmp AD_loop in txbyte, ADCL ; low byte rcall putchar in txbyte, ADCH ; hi byte rcall putchar rcall char_delay rjmp main_loop