   .include "D:\Program Files\Atmel\AVR Studio\Appnotes\tn26def.inc"
;Автор - инженер промышленной электроники Кравченко А.В.
;Программа управления шаговым двигателем от МК ATtiny26.

.def	start  	= r10
.def	kay  	= r11
.def	lef  	= r12
.def	for  	= r13	
.def	tmp  	= r16	
.def	tmp2  	= r17	
.def	tmp3  	= r18
.def	tempo	= r19
.def	speed	= r20
.def	pur	= r21
.def	par	= r22
.def	n	= r24
.def	x	= r25
.def	m	= r15
.def	adr	= r0
.def	step	= r23
.def	prg2	= r14


.cseg
.org 0
	rjmp	RESET
	rjmp  EXT_INT0	;прерывание IRQO
	nop		;rjmp  EXT_PIN	прерывание PIN
	nop		;rjmp  TIME1_CMP1A прерывание от таймера 1А
	nop		;rjmp  TIME1_CMP1B прерывание от таймера 1В
	nop		;rjmp  TIME1_OVF0 прерывание от таймера 1 переполн
	nop		;rjmp  TIME0_OVF0 прерывание от таймера 0 переполн
	nop		;rjmp  USI_STRT прерывание от приемо-перед старт
	nop		;rjmp  USI_OVF прерывание от приемо-перед переполн
	nop		;rjmp  EE_RDY прерывание от EEPROM готов
	nop		;rjmp  ANA_COMP	прерывание от аналог компарат
	nop		;rjmp  ADC прерывание от АЦП	

.org 20
;настройка порта В
RESET:	nop
	clr	tmp
	ldi	tmp, RAMEND	;константа верхней ячейки ОЗУ
	out	SP, tmp		;резервирование стека в ОЗУ
	nop
	clr	tmp
	out	DDRA, tmp
	out	PORTA, tmp	;обнулить порт В		
	out	DDRB, tmp
	out	PORTB, tmp	;обнулить порт В
	clr	tmp
	ldi	tmp, $F0	;PA4-PA7-выходы		
	out	DDRA, tmp
	nop
	clr	tmp
	ldi	tmp, $09	;PB0,PB3 -выходы		
	out	DDRB, tmp
	nop
;общее разрешение прерывания
	ldi	tmp, $80
	out	SREG, tmp
;	sei
;Маска прерывания INT0
	ldi	tmp, $40	;прерывание INT0	
	out	GIMSK, tmp
	ldi	tmp, $00	;режим энергопотребления
;Idle, условие прерывания по НИЗКОМУ уровню на INT0 
	out	MCUCR, tmp		
	
;Начало программы 
;сброс всех значений 
	clr	tmp2
	clr	tmp3
	clr	pur
	clr	prg2
	clr	adr
	clr	start	
nStart:	nop		;начало цикла программы
	nop
	rcall	adcn	;чтение данных АЦП
	nop
	sei
	nop
ci:	nop		;проверка режима старт
	mov	tmp, start
	cpi	tmp, $AA ;если равно АА то старт
	brne	ci
	nop
	nop
;измерение времени Шаг		
	rcall	STEP	;проверка шаг-скорость
	nop
;условие режима Шаг-Скорость
	push	tmp
	nop		;проверка режима скорость
	mov	tmp, speed
	cpi	tmp, $99 ;если равно 99 то скорость
	brne	spd
	nop
	pop	tmp
	nop
	rjmp	das
	nop	
spd:	nop
	rcall	zader	;задержка по времени
	nop
das:	nop
	rcall	left	;влево?	
	nop
	rcall	opros	;таблица состояний ШД
	nop
	rcall	strob	;генерация импульса строба
	nop
	rcall	for	;8 шагов?
	nop
	rjmp	nStart
;Подпрограмма чтения данных АЦП
;Настройка АЦП
adcn:	nop
	cli
	nop
	push	tmp
	clr	tmp
awe:	nop
	cpi 	tmp, $04
	brsh 	ass
	clr	tmp3
	ldi	tmp3, $C2	;внутренний источник Uоп, конденсатор на РА3
;вход ADC2, ADLAR=0 - выравнивание по правой стороне
	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, r4
	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
	nop
	pop tmp
	ret
	
;Подпрограмма задержки включения 
zader:	nop
	wdr
	clr	M
	clr	pur
	ldi	pur, $78
	cpi	tmp3, $00
	brne 	goo
	ldi	tempo, $01
	add	tempo, tmp3
	nop
goo:	nop
	mov 	tempo, tmp3
dm:	nop
	cpi	tmp2, $00
	brne 	goq
	ldi	X, $01
	add	X,  tmp2
	nop
goq:	nop
	mov 	X, tmp2
dv:	nop
	wdr
	nop
dx:	dec	pur
	brpl	dx
	cln
	dec	X
	brpl	dv
	cln
	dec	tempo
	brne	dm
	ret

;Подпрограмма опроса состояний ШД 
opros:	nop
	cpi	par, $0B
	breq	prn2
	ldi	ZH,	high(2*prog1)
	ldi	ZL,	Low(2*prog1)
	Add	ZL,	par
	LPM
	mov	prg2, adr
	out	PORTB, prg2
	inc	par
	rjmp	got

prn2:	nop	
	clr	par
	clr	pur
	clr	adr
	clr	prg2
got:	nop
	ret

;подпрограмма проверки шаг-скорость
STEP:	nop
	pop	tmp
kay:	nop
	nop
	nop
	sbis	PORTA, 0	;кнопка нажата?
	rjmp	nakc
	nop
	inc		tmp
	nop
	sbis	PORTA, 0
	rjmp	nakc
	nop
	inc		tmp
	nop
	sbis	PORTA, 0
	rjmp	nakc
	nop
	inc		tmp
	nop	
	sbis	PORTA, 0
	rjmp	nakc
	nop
	inc		tmp
	nop
	sbis	PORTA, 0
	rjmp	nakc
	nop
	inc		tmp
	nop
	cpi		tmp, $04
	brlt	kay
	nop
	clr		pur
	ldi		pur,  $BE	;измерения были	
	rcall	izmer
nakc:	nop
	sbic	PORTA, 0	;кнопка ненажата?
	rjmp	kay
	nop
	sbic	PORTA, 0
	rjmp	kay
	nop
	sbic	PORTA, 0
	rjmp	kay
	nop	
	sbic	PORTA, 0
	rjmp	kay
	nop
	sbic	PORTA, 0
	rjmp	kay
	nop
	cpi		pur, $BE
	breq	der
	nop
	rjmp	uty
	nop
der:	nop		;проверка условия нажатия












	ldi	speed, $99
	nop
uty:	nop
	clr		pur
	push	tmp
	ret

;Подпрограмма определения влево, вправо
left:	nop
	nop
	clr	tempo
wer:	nop
	inc	tempo
	clz
	cpi	tempo, $04
	breq	right
	sbis	PORTA, 1
	rjmp	wer
	sbis	PORTA, 1
	rjmp	wer
	sbis	PORTA, 1
	rjmp	wer	
	sbis	PORTA, 1
	rjmp	wer
	sbis	PORTA, 1
	rjmp	wer
	nop
	push	tmp
	ldi	tmp, $DD	;влево
	mov	lef, tmp
	pop	tmp
	rjmp	fg
right:	nop
	push	tmp
	ldi	tmp, $44	;вправо
	mov	lef, tmp
	pop	tmp
fg:	nop
	ret

;подпрограмма опроса 8 шагов?
for:	nop
	push	tmp		;запомним tmp
	mov	tmp, for	;запишем for
	inc	tmp
	clz
	cpi	tmp, $08	;проверяем 8 шагов?
	breq	rav		;Да 8 шагов.
	nop
	rjmp	nrav
rav:	nop
	clr	tmp
	mov	step, tmp	;сбрасываем R23
nrav:	nop
	mov	for, tmp
	pop	tmp		;восстанавливаем tmp
	ret
;подпрограмма формирования импульса строба
strob:	nop
	sbi	PORTB, 0		;установить имульс строба
	nop
	wdr
	nop
	clr	pur
	ldi	pur, $78
	nop
	cpi	tmp3, $00
	brne 	goo2
	ldi	tempo, $01
	add	tempo, tmp3
	nop
goo2:	nop
	mov 	tempo, tmp3
dm2:	nop
	cpi	tmp2, $00
	brne 	goq2
	ldi	X, $01
	add	X,  tmp2
	nop
goq2:	nop
	mov 	X, tmp2
dv2:	nop
	wdr
	nop
dx2:	dec	pur
	brpl	dx2
	cln
	dec	X
	brpl	dv2
	cln
	dec	tempo
	brne	dm2
	nop
	nop
	cbi	PORTB, 0		;снять импульс строба
	nop
	ret

;Подпрограмма измерения времени нажатия
izmer:	nop
;сохранение переменных	
	push	m
	push	n
	push	x
	push	tmp3
;измерения времени 3 байта 0.m.n.x. 
	nop
	clr	x
	clr	m
	clr	n
	clr	tmp3
	clc

dm1:	nop
	clc
dv1:	nop
	wdr
	nop
	clc
dxx:	nop
	inc	x
	nop
	clc
dd:	nop
	inc	tmp3
	brbc	0, dd
	clr	tmp3
	brbc	0, dxx 
	clc
	nop
	clr	x
nak:	nop
	nop
	sbis	PORTB, 6
	rjmp	vak
	sbis	PORTB, 6
	rjmp	vak
	sbis	PORTB, 6
	rjmp	vak
vak:	nop	
	sbic	PORTB, 6
	rjmp	nak
	sbic	PORTB, 6
	rjmp	nak
	sbic	PORTB, 6
	rjmp	nak
	clc
	inc	n
	brbc	0, dv1
	clr	n
	clc
	adiw	r30, $01
	inc	m
	brbc	0, dm1
	;восстановление переменных
	pop	tmp3
	pop	m
	pop	n
	pop	x 
	;проверка измеренного значения
	cpi	r31, $D3
	brsh	hsd
	rjmp	rt
hsd:	nop
	cpi	r30, $45
	brlt	rt
rt:	nop	
	ret

;подпрограмма обработки режима старт-стоп
EXT_INT0: nop
	push	tmp2		;сохранение tmp2
	in	tmp2, SREG	;сохранение состояния SREG
	cli
	nop	
	nop
;сравнение с предыдущим значением
	push	speed
	mov	speed, start
	cpi	speed, $AA
	brne	fag
	ldi	speed, $AA	;режим старт
	mov	start, speed
	nop
	rjmp	rt
fag:	nop
	ldi	speed, $22	;режим стоп
	mov	start, speed
	nop
	pop	speed
	out	SREG, tmp2	;восстановление SREG
	pop	tmp2		;восстановление tmp2
	nop
	sei
	reti

;Код движения по часовой стрелке
.org $200
prog1:
.DB  $08, $0A, $02, $06, $04, $05, $01, $09

;Код движения против часовой стрелке
.org $220
prog2:
.DB  $09, $01, $05, $04, $06, $02, $0A, $08


.EXIT

 