; ; hello.light.44.asm ; turns on and off leds relative to light levels ; jonathan ward ; .include "tn44def.inc" ; ; definitions ; ;.equ tx_pin = PB2; transmit pin .equ led1 = PA1; led pin .equ led2 = PA2; led pin .equ led3 = PA6; led pin .equ led4 = PA7; led pin .equ low_level = 1000 .equ lowmid_level = 750 .equ mid_level = 500 .equ high_level = 250 ; ; registers ; .def bit_count = R16; bit counter .def temp = R17; temporary storage .def temp1 = R18; temporary storage .def txbyte = R19; data byte .def ad_high = R20; data byte .def mid = R21; data byte ; ; code segment ; .cseg .org 0 rjmp reset delay: ldi temp, 1 delay_loop: ldi temp1, 150 delay_loop1: dec temp1 brne delay_loop1 dec temp brne 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 led cbi PORTA, led1 sbi DDRA, led1 cbi PORTA, led2 sbi DDRA, led2 cbi PORTA, led3 sbi DDRA, led3 cbi PORTA, led4 sbi DDRA, led4 ; ; init A/D ; ; use Vcc as reference cbi ADMUX, REFS1 ; cbi ADMUX, REFS0 ; cbi ADMUX, ADLAR ; right-adjust result cbi ADMUX, MUX5 ; set MUX to ADC0 (PA0) cbi ADMUX, MUX4 ; " cbi ADMUX, MUX3 ; " cbi ADMUX, MUX2 ; " cbi ADMUX, MUX1 ; " cbi 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: rcall four_leds_off sbi ADCSRA, ADSC ; start conversion AD_loop: sbic ADCSRA, ADSC ; loop until complete rjmp AD_loop ;rcall leds_on ;rcall leds_off rcall light rjmp main_loop light: ;turn on leds on relative to light levels in ad_high, ADCL in ad_high, ADCH ldi temp, high(low_level) cpc temp, ad_high brlo main_loop rcall one_led_on ldi temp, high(lowmid_level) cpc temp, ad_high brlo main_loop rcall two_leds_on ldi temp, high(mid_level) cpc temp, ad_high brlo main_loop rcall three_leds_on ldi temp, high(high_level) cpc temp, ad_high brlo main_loop rcall four_leds_on ret one_led_on: sbi PORTA, led1 rcall delay ret one_led_off: cbi PORTA, led1 ret two_leds_on: sbi PORTA, led1 sbi PORTA, led2 rcall delay ret two_leds_off: cbi PORTA, led1 cbi PORTA, led2 ret three_leds_on: sbi PORTA, led1 sbi PORTA, led2 sbi PORTA, led3 rcall delay ret three_leds_off: cbi PORTA, led1 cbi PORTA, led2 cbi PORTA, led3 ret four_leds_on: sbi PORTA, led1 sbi PORTA, led2 sbi PORTA, led3 sbi PORTA, led4 rcall delay ret four_leds_off: cbi PORTA, led1 cbi PORTA, led2 cbi PORTA, led3 cbi PORTA, led4 ret