;
; hello.temp.45.asm
;
; read and send temperature
;
; Neil Gershenfeld
; CBA MIT 10/25/07
;
; (c) Massachusetts Institute of Technology 2007
; Permission granted for experimental and personal use;
; license for commercial sale available from MIT.
;

.include "tn44def.inc"

;
; pins
;
.equ led1_a=PA3
.equ led1_c=PA2
.equ led2_a=PA3
.equ led2_c=PA0
.equ led3_a=PA2
.equ led3_c=PA3
.equ led4_a=PA2
.equ led4_c=PA0
.equ led5_a=PA0
.equ led5_c=PA3
.equ led6_a=PA0
.equ led6_c=PA2
;
; registers
;
.def bit_count = R16; bit counter
.def temp = R17; temporary storage
.def temp1 = R18; temporary storage
.def input = R19; data byte
;
;definitions-- the 44 takes in the voltage and compares it to Vcc 
; by the following equation: (Vref*1024)/Vcc-- the accel. defines
; the voltages output by going up or down in the datasheet
;
.equ still= 512
;
; 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
;

blink_delay:
   ldi temp, 150
   blink_delay_loop:
      ldi temp1, 150
      blink_delay_loop1:
         dec temp1
         brne blink_delay_loop1
      dec temp
      brne blink_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, PA0
   sbi DDRA, PA0

   cbi PORTA, PA2
   sbi DDRA, PA2

   cbi PORTA, PA3
   sbi DDRA, PA3

   cbi PORTA, PA4
   sbi DDRA, PA4
   
   cbi PORTA, PA5
   sbi DDRA, PA5

   cbi PORTA, PA6
   sbi DDRA, PA6

   cbi PORTA, PA7
   sbi DDRA, PA7

   cbi PORTB, PB2
   sbi DDRB, PB2

   cbi PORTB, PB1
   sbi DDRB, PB1

   cbi PORTB, PB0
   sbi DDRB, PB0

   ;
   ; init A/D--see register description at 
   ; end of ADC Conversion chapter in Datasheet for explanation 
   ; of bit number codes
   ; 
   cbi ADMUX, REFS1 ; use Vcc as reference
   cbi ADMUX, REFS0 ; "
   cbi ADMUX, ADLAR ; right-adjust result
   ;
   ; set MUX to ADC1 (PA1) by settings bits to 000001
   ;
   cbi ADMUX, MUX5 
   cbi ADMUX, MUX4 
   cbi ADMUX, MUX3 
   cbi ADMUX, MUX2 
   cbi 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:
    
	sbi ADCSRA, ADSC ; start conversion
      AD_loop:
         sbic ADCSRA, ADSC ; loop until complete
	 rjmp AD_loop
	 
	 rcall check

     rjmp main_loop

   check: 
	 in input, ADCL ; low byte
     in input, ADCH ; hi byte
	 ldi temp, high(still)
	 cp input, temp
     brsh main_loop

     ;inner circle
	 sbi PORTA, PA0
	 sbi PORTB, PB0
	 
	 rcall blink_delay
	 rcall blink_delay
	 	
	 ;2nd circle
	 cbi PORTA, PA0
	 cbi PORTB, PB0

	 sbi PORTA, PA2
	 sbi PORTB, PB1

	 rcall blink_delay
	 rcall blink_delay

	 ;3rd circle
	 cbi PORTA, PA2
	 cbi PORTB, PB1

	 sbi PORTA, PA3
	 sbi PORTB, PB2

	 rcall blink_delay
	 rcall blink_delay

	 ;4th circle
	 cbi PORTA, PA3
	 cbi PORTB, PB2

	 sbi PORTA, PA4
	 sbi PORTA, PA7

	 rcall blink_delay
	 rcall blink_delay

	 ;5th circle
	 cbi PORTA, PA4
	 cbi PORTA, PA7

	 sbi PORTA, PA5
	 sbi PORTA, PA6
     
	 ;back
     rcall blink_delay
	 rcall blink_delay

     ;4th circle

	 cbi PORTA, PA5
	 cbi PORTA, PA6

     sbi PORTA, PA4
	 sbi PORTA, PA7

     rcall blink_delay
	 rcall blink_delay
	 	
	 ; 3rd circle

     cbi PORTA, PA4
	 cbi PORTA, PA7
	 
	 sbi PORTA, PA3
	 sbi PORTB, PB2

	 rcall blink_delay
	 rcall blink_delay

	 ; 2nd circle

	 cbi PORTA, PA3
	 cbi PORTB, PB2
	 
	 sbi PORTA, PA2
	 sbi PORTB, PB1

	 ; 1st circle
	 rcall blink_delay
	 rcall blink_delay

	 cbi PORTA, PA2
	 cbi PORTB, PB1
	 
	 sbi PORTA, PA0
	 sbi PORTB, PB0

	 rcall blink_delay
	 rcall blink_delay
	 
	 cbi PORTA, PA0
	 cbi PORTB, PB0

	 ret

;no vertical movement=.5*1024= 512 
;down (1g)= (1.75/5)*1024= 358.4
;up (1g)  = (3.25/5)*1024= 656.6
