/*
 * proba_attiny10_sirenka.asm
 *
 *  Created: 03.11.2012 19:55:11
 *   Author: Jurkin
 *   Пробная версия сиренки с мырганьем светодиода
 *   Пьезик через 100ом на РВ1, светодиод через 470 на РВ0
 *   RESET(PB3) через 10к на + 
 *   ФУЗЫ по умолчанию    
 */ 
 .device ATtiny10
 .def temp  = R16  ;регистры для промежуточных вычислений
 .def temp2 = R17
 .def BocrL = R18  ;вычесленное записываемое время 
 .def BocrH = R19  ;следующего прерывания по В 
 .def xINT  = R20  ;счётчик к-ва прошедших прерываний
 .def nINT  = R21  ;константа для сравнения к-ва прерываний
 .def Ftmin = R22  ;к-во тиков для установленной частоты
 .def Ftmax = R23

; RAM ========================================================
.DSEG
; FLASH ======================================================
.CSEG
.org 0
;Interrupt vector table 
  rjmp reset ; All Resets  
  reti ; External Interrupt Request 0 
  reti ; Pin Change Interrupt Request 0 
  reti ; Timer/Counter0 Input Capture
  reti ; Timer/Counter0 Overflow
  reti ; Timer/Counter0 Compare Match A
  rjmp t0compB ;reti ; Timer/Counter0 Compare Match B
  reti ; Analog Comparator
  reti ; Watchdog Time-out
  reti ; VCC Voltage Level Monitor
  reti ; ADC Conversion Complete

; Interrupts ==========================================================

t0compB:
PUSH temp           ;на всякий случай сохраняем в стеке R16
IN temp, SREG       ;и SREG
PUSH temp
	INC xINT
	CP nINT,xINT
	BRNE prod
	DEC Ftmin
	CLR xINT
	CP Ftmin,Ftmax
	BRNE prod
	LDI Ftmin,0x46
prod:
	CLR temp
	ADD BocrL,Ftmin
	ADC BocrH,temp
	OUT OCR0BH,BocrH
	OUT OCR0BL,BocrL

POP temp            ;Вытаскиваю и востанавливаю R16 и SREG
OUT SREG, temp
POP temp
RETI                ;сваливаем из приревания

; End Interrupts ======================================================

;***********************************************************************
;*********************** RESET *****************************************
;***********************************************************************
reset:
; Set Stack Pointer (SP)
  LDI R16,Low(RAMEND)	;Инициализация стека
  OUT SPL,R16			;Обязательно!!!
  LDI R16,High(RAMEND)
  OUT SPH,R16

;**********************************************************************
;*********************  MAIN  *****************************************
;**********************************************************************

CLR xINT
CLR BocrL
CLR BocrH
LDI nINT,0x4B        ;константа - FFFF/14(к-во шагов смены f)=4681/62,5(среднее t между INT)
                     ;=75(4B)(к-во INT между сменой f)
LDI Ftmin,0x46          ;начальная частота 70тиков(полпериода)примерно 892Hz
LDI Ftmax,0x38
LDI temp,0b00001010  ;инициализирую таймер - режим СТС, делитель на 8,
OUT TCCR0B,temp      ;для TOP в этом режиме используетрся OCR0AH,L
SER temp
OUT OCR0AH,temp      ;в регистр совпадения А заносим TOP=FFFF
OUT OCR0AL,temp
CLR temp
OUT OCR0BH,temp      ;регистр совпаления В обнуляю
OUT OCR0BL,temp
LDI temp,0b01010000
OUT TCCR0A,temp      ;подключаю выходы таймера к пинам OC0A-PB0, OC0B-PB1
LDI temp,0b00000100    ;разрешаю прерывания по OCR0B
OUT TIMSK0,temp
SBI DDRB,0           ;порта PB0 и PB1 конфигурирую на выход
SBI DDRB,1
SEI


wait:
  ;sleep
  nop
  nop
  nop
  rjmp wait

; End Main ======================================================