.include "tn26def.inc"

; Микроконтроллер: AVR tiny26
; Тактовая частота: 8 МГц
; Питание: нестабилизированное 3,8 В
.list
.def tmp  = r16
.def tmp2 = r17
.def tmp3 = r18
.def tempo = r19
.def pir = r22
.def pur = r23
.def par = r20
.def Xa = r21
.def adr = r0
.def prg1 = r24
.def prg2 = r25


.cseg
.org 0x00
	rjmp RESET
	rjmp EXT_INT0;прерывание по входному сигналу
	rjmp EXT_PIN ;прерывание не используется
	rjmp TIME_CMPA ;прерывание от таймера
	rjmp TIME_CMPB ;прерывание от таймера
	rjmp TIME_OVF1 ;прерывание от таймера
	rjmp TIME_OVF0 ;прерывание от таймера
	rjmp USI_STRT ;прерывание от USI
	rjmp USI_OVR ;прерывание от USI
	rjmp EE_RDY ;прерывание от таймера
	rjmp ANA_COMP ;прерывание от компаратора
	rjmp ADC_ ;прерывание от АЦП

	;"Заглушки" обработчиков неиспользуемых прерываний
    	EXT_INT0:;прерывание по входному сигналу
	EXT_PIN: ;прерывание не используется
	TIME_CMPA: ;прерывание от таймера
	TIME_CMPB: ;прерывание от таймера
	TIME_OVF1: ;прерывание от таймера
	TIME_OVF0: ;прерывание от таймера
	USI_STRT: ;прерывание от USI
	USI_OVR: ;прерывание от USI
	EE_RDY: ;прерывание от таймера
	ANA_COMP: ;прерывание от компаратора
	ADC_: ; ADC Conversion Handler
	reti

.org 20
; настройка портов

RESET:  
    	ldi tmp,RAMEND
	out SP,tmp
	clr  tmp
	out DDRA, tmp
	out PORTA, tmp ; обнулить порт А
	clr tmp
	ldi tmp, $FC       ; РА0, РА1, - входы
	out DDRA, tmp
	clr tmp
	out DDRB, tmp
	out PORTB, tmp ; обнулить порт В
	clr tmp
	ldi tmp, $BF ; РВ6-вход
	out DDRB, tmp
;Начало программы
nStart:	nop
;сброс всех значений
	clr	pir
	clr	pur
	clr	prg1
	clr	prg2
	clr	adr
;вход в подпрограмму опроса АЦП1
	nop
	ldi	tmp3, $80	;источник питания, ADC2, ADMUX
	ldi	tmp2, $C6	; одиночное, запуск, 1/64, ADCSR
; опрос уровня заряда конденсатора
	rcall	adcn
	mov	r30, tmp2		;загрузка младшего разряда
	mov	r31, tmp3		;загрузка старшего разряда
	nop
	ldi	tmp2, $B5	;значение младшего разряда порога
	ldi	tmp3, $01	;значение старшего разряда порога
;вычитание значения АЦП и порога
	sub	r30, tmp2
;проверка на ноль старшего байта
	clr	tmp
	rol	tmp
	sub	r31, tmp3		;вычитание старшего байта с заемом
	sub	r31, tmp		;вычитание заема
loki:	nop
	brmi	nStart		;переход, если результат < 0
	nop
;опрос DIP1
DIP:	nop
	in	tmp, PORTA
	nop
	sbis 	PINA, 1		;пропустить если не нажат DIP1.1
	rjmp qq0
s1:	nop
	sbis	PINB, 6		;пропустить если не нажат DIP1.2
	rjmp	qq1
	nop
	rjmp qq2
; DIP1.1
qq0:	nop
	sbis	PINB,6		;пропустить если не нажат DIP1.2		
	rjmp qq3
	nop
	rjmp nStart
qq3:	nop
	clr pir
cvb:	nop
	inc	pir
	rcall	zader
	nop
	rcall	opros
	nop
	cls
	cpi	pir, $0B
	brlt	cvb
	nop
	rjmp	nStart
; DIP1.2
qq1:	nop
	sbis	PINB, 1		;пропустить если не нажат DIP1.1
	rjmp	qq4
	nop
	rjmp	nStart
qq4:	nop
	clr	pir
cvbn:	nop
	inc	pir
	rcall	zader
	nop
	rcall	opron
	nop
	cls
	cpi	pir, $0B
	brlt	cvbn
	nop
	rjmp	nStart
; DIP1
qq2:	nop
	nop
cvbm:	nop
	inc	pir
	rcall	zader
	nop
	rcall	oprom
	nop
	cls
	cpi	pir, $14
	brlt	cvbn
	nop
	rjmp	nStart

;Настройка АЦП
adcn:	nop
	nop
	nop
	nop
	nop
	nop
	nop
	clr	tmp
awe:	nop
	cpi	tmp, $04
	brsh	ass
	clr	tmp3
	ldi	tmp3, $83		;внутренний источник, вход ADC3
	out	ADMUX, tmp3		;коммутация входов АЦП
	clr	tmp2
	clr	tmp3
	ldi	tmp2, $C4		;одиночное, запуск, 1/16
	out	ADCSR, tmp2		;запуск АЦП на преобразование
;Сохранение данных АЦП
	in	tmp2, ADCL
	in	tmp3, ADCH
	mov	r2, tmp2
	mov	r3, tmp3
	mov	r4, r2
	mov	r5, r3
	mov	r6, r4
	mov	r7, r5
	inc	tmp
	rjmp	awe
;среднее арифметическое действие
ass:	nop
	clr	r8
	clc
	add	tmp2, r2
	adc	r9, r8
	add	tmp2, r6
	adc	r9, r8
	add	tmp2, r6
	adc	r9, r8
	clc
	lsr	r9
	ror	tmp2
	lsr	r9
	ror	tmp2
	clr	r9
	clc
	add	tmp3, r3
	adc	r9, r8
	add	tmp3, r5
	adc	r9, r8
	add	tmp3, r7
	adc	r9, r8
	clc
	lsr	r9
	ror	tmp3
	lsr	r9
	ror	tmp3
	lsr	r9
	ror	tmp3
	nop
	ret

; Подпрограмма задержки включения светодиодов
zader:	nop
	wdr
	clr	r26
	clr	r29
	ldi	r29, $AF
	cpi	tmp3, $00
	brne	goo
	ldi	r26, $01
	add	r26, tmp3
	nop
goo:	nop
	mov	r26, tmp3
dm:	nop
	cpi	tmp2, $00
	brne	goq
	ldi	Xa, $01
	add	Xa, tmp2
	nop
goq:	nop
	mov	Xa, tmp2
dv:	nop
	wdr
	nop
dx:	dec	r29
	brpl	dx
	cln
	dec	Xa
	brpl	dv
	cln
	dec	r26
	brne	dm
	ret

;Подпрограмма опроса светодиодов программа1
opros:	nop
	ldi	ZH, high(2*prog1A)
	ldi	ZL, Low(2*prog1A)
	Add	ZL, pir
	LPM
	mov	prg1, adr
	out	PORTB, prg1
	nop
	ldi	ZH, high(2*prog1B)
	ldi	ZL, Low(2*prog1B)
	Add	ZL, pir
	LPM
	mov	prg2, adr
	out	PORTB, prg2
	ret
;Подпрограмма опроса светодиодов программа2
opron:	nop
	ldi	ZH, high(2*prog2A)
	ldi	ZL, Low(2*prog2A)
	Add	ZL, pir
	LPM
	mov	prg1, adr
	out	PORTB, prg1
	nop
	ldi	ZH, high(2*prog2B)
	ldi	ZL, Low(2*prog2B)
	Add	ZL, pir
	LPM
	mov	prg2, adr
	out	PORTB, prg2
	ret
;Подпрограмма опроса светодиодов программа3
oprom:	nop
	ldi	ZH, high(2*prog3A)
	ldi	ZL, Low(2*prog3A)
	Add	ZL, pir
	LPM
	mov	prg1, adr
	out	PORTB, prg1
	nop
	ldi	ZH, high(2*prog3B)
	ldi	ZL, Low(2*prog3B)
	Add	ZL, pir
	LPM
	mov	prg2, adr
	out	PORTB, prg2
	ret

.org $200

prog1A:
.DB $00, $00, $00, $00, $80, $40, $20, $10
.DB $08, $04
prog1B:
.DB $08, $04, $02, $01, $00, $00, $00, $00
.DB $00, $00

prog2A:
.DB $00, $00, $00, $00, $80, $C0, $E0, $F0
.DB $F8, $FC

prog2B:
.DB $08, $0C, $0E, $0F, $0F, $0F, $0F, $0F
.DB $0F, $0F

prog3A:
.DB $0C, $18, $30, $60, $C0, $80, $00, $00
.DB $0C, $08

prog3B:
.DB $00, $00, $00, $00, $00, $01, $03, $06
.DB $0C, $08

.EXIT
