
;; Fish Tank Pump Control - Copyright 2011 by Michael Kohn
;; Email: mike to mikekohn.net
;;   Web: http://www.mikekohn.net/
;;
;; A float sensor is hooked up to PB4.  If it connects then a relay
;; on PB3 turns on so 120VAC can turn on a pump and heater.
;; PB2 is a debug LED which will blink in idle mode and stay on
;; when the relay is on.

;.include "tn13def.inc"
.device ATtiny13

;  cycles  sample rate   @128 KHz:
;    256 

; r0  = 0
; r1  = 1
; r7  = status reg save in interrupt
; r15 = 255
; r14 = temp
; r17 = temp
; r20 = counter
; r21 = LED settings
; r23 = state (0 = relay off, 1 = relay on)
; r24 = on counter (if on counter goes high enough then flip relay on)
;

; note: CLKSEL 11

.cseg

.org 0x000
  rjmp start
  reti
  reti
  rjmp service_interrupt

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
  eor r15, r15
  dec r15

  eor r20, r20              ; counter
  eor r21, r21              ; LED
  eor r23, r23              ; state
  eor r24, r24              ; counter how long the sensor is on

  ;; Set up PORTB
  ldi r17, (1<<PB3)|(1<<PB2)
  out DDRB, r17
  ldi r17, (1<<PB4)|(1<<PB2)
  out PORTB, r17

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

  ldi r17, (1<<TOIE0)
  out TIMSK0, r17                ; enable interrupt compare A 
  ;ldi r17, (1<<WGM01)
  out TCCR0A, r0                 ; normal counting (0xff is top, count up)
  ;ldi r17, (1<<CS02)|(1<<CS00)   ;
  ldi r17, (1<<CS01)
  out TCCR0B, r17                ; prescale = 1024 from clock source

  ; Fine, I can be interrupted now
  sei

main:
  tst r23             ; while (state == 0);  // relay is off
  breq main

  sbis PINB, PB4      ; check if we turned off
  rjmp main

  ldi r23, 0          ; state = 0
  cbi PORTB, PB3      ; relay is off
  rjmp main


;; The Great Interrupt Routine!
service_interrupt:
  in r7, SREG

  sbic PINB, PB4           ; if (sensor is off) r24 = 0
  eor r24, r24

  inc r20                  ; r20++
  cpi r20, 35              ; if (r20 != 35) exit interrupt;
  brne exit_interrupt

  clr r20                  ; r20 = 0

  inc r24

  cpi r23, 1               ; if (state == 0 and r24 == 20) // 10 seconds
  breq sensor_not_stable   ; {
  cpi r24, 20
  brne sensor_not_stable
  ; Turn relay on
  ;sbic PINB, PB4           ; if (sensor is on)
  ;rjmp sensor_not_stable

  ldi r23, 1               ; { state = 1
  sbi PORTB, PB3           ;   relay is on }

sensor_not_stable:         ; }
  sbrs r23, 0              ; if (state == 0) toggle_led()
  rcall toggle_led
  sbrc r23, 0              ; else turn led on
  sbi PORTB, PB2

exit_interrupt:
  out SREG, r7             ; restore status
  reti

toggle_led:
  eor r21, r1
  sbrc r21, 0
  sbi PORTB, PB2
  sbrs r21, 0
  cbi PORTB, PB2
  ret

signature:
.db "Fish Tank Pump Control - Copyright 2011 - Michael Kohn - Version 0.02",0



