
;; Airplane - Copyright 2009 by Michael Kohn
;; Email: mike to mikekohn.net
;;   Web: http://www.mikekohn.net/
;;
;; Control 2 LED's and a motor with input from a PIR

;.include "tn13def.inc"
.device ATtiny13

;  cycles  sample rate   @128 KHz:
;    256 

; PB0 = Motor
; PB1 = red LED
; PB2 = PIR input
; PB3 = NC
; PB4 = green LED

; r0  = 0
; r1  = 1
; r15 = 255
; r14 = temp
; r17 = temp
; r20 = counter
; r21 = LED settings
;

; note: CLKSEL 10

.cseg

.org 0x000
  rjmp start
.org 0x003
  reti
.org 0x006
  rjmp service_interrupt
  ;ijmp         ; might as well ijmp, IJMP!

;; FIXME - erase this padding.. it's dumb
.org 0x020

start:
  ;; I'm busy.  Don't interrupt me!
  cli

  ;; Set up stack ptr
  ;ldi r17, RAMEND>>8
  ;out SPH, r17
  ldi r17, RAMEND&255
  out SPL, r17

  ;; r0 = 0, r1 = 1, r15 = 255
  eor r0, r0
  eor r1, r1
  inc r1
  ldi r17, 0xff
  mov r15, r17

  ldi r20, 255              ; Counter
  ldi r21, 0                ; LED's
  ldi r22, 0                ; motor counter

  ;; Set up PORTB
  ldi r17, 1|2|16
  out DDRB, r17             ; entire port B is output
  out PORTB, r21            ; set port B

  ;; Set up TIMER1
  ;lds r17, PRR
  ;andi r17, 255 ^ (1<<PRTIM1)
  ;sts PRR, r17                   ; turn of power management bit on TIM1

  ldi r17,  255                   ; interrupt every 256 cycles
  out OCR0A, r17

  ldi r17, (1<<OCIE0A)
  out TIMSK0, r17                ; enable interrupt compare A 
  ldi r17, (1<<WGM01)
  out TCCR0A, r17                ; normal counting (0xffff is top, count up)
  ldi r17, (1<<CS00)             ; CTC OCR0A  Clear Timer on Compare
  out TCCR0B, r17                ; prescale = 1 from clock source

  ; Fine, I can be interrupted now
  sei

main:
  rjmp main               ; main() { while(1); }

;; The Great Interrupt Routine!
service_interrupt:
  dec r20
  breq toggle
  reti

toggle:
  sbis PINB, 2
  rjmp clear_lights
  cpi r22, 3
  brne inc_motor_count
  ldi r17, 19
  out PORTB, r17
  reti

inc_motor_count:
  ;ldi r17, 18
  ;out PORTB, r17
  sbi PORTB, PB1
  sbi PORTB, PB4
  inc r22
  reti

clear_lights:
  cpi r22, 0
  breq stop_motor
  dec r22
  rjmp dont_stop_motor

stop_motor:
  cbi PORTB, PB0

dont_stop_motor:
  ;ldi r22, 0
  ;ldi r17, 0
  ;out PORTB, r17
  cbi PORTB, PB1
  cbi PORTB, PB4
  ;out PORTB, r0
  reti

signature:
.db "Airplane - Copyright 2009 - Michael Kohn - Version 0.02",0


