;  код для квадратурного энкодера
; "Исходник" от Чена http://elm-chan.org/works/smc/report_e.html (исходник smc2 - http://elm-chan.org/works/smc/smc.zip )
; адаптированный под схему с "искл. ИЛИ" (Арисова Андрея) с одним внешним прерыванием.   
;  http://electronix.ru/forum/index.php?s=370bfe50ace4d6660364ceb3beb20be6&showtopic=60502&st=120&p=565035&#entry565035
; и http://www.cnczone.com/forums/showpost.php?p=574303&postcount=28
;  http://roboforum.ru/viewtopic.php?f=2&t=5548&sid=d57224b87e8c653934a0ea8a71a1ea2d&start=15
; 


.def	_PvEnc	= r14 	; предыдущие данные с энкодера
.def	_PvDir		= r13 	; предыдущее направление с энкодера

.def	_PosH		= r12 	; 24-bit счетчик текущего положения 
.def	_PosM		= r11 	;
.def	_PosL		= r10 	;

=================================================== 
; ********* Таблица перехода от прерываний **********
	RJMP 	INT_Encoder		; External Interrupt Request 0

;---------------------------------------------------------------------------------------------------------------------------------
; ************** Настройка прерывания от INT0 *************
	ldi		r16,0b00000001		; INT0 по любому изменению  (Encoder)
	sts		EICRA, r16			; 
	
	ldi		r16,0b00000001		; разрешить прерывания от INT0 (B_Int Encoder)
	out		EIMSK, r16			; 
;-------------------------------------------------------------------------------------------------------------------------------



;===========================================================
; Обработчик прерывания от INT0 - Опрос энкодера
;===========================================================
INT_Encoder:
	cli
	push	r0
	push	zl
	push	zh
	in		r0, SREG

	mov		zl, _PvEnc			; старое состояние zl[1:0]

	clr		zh					; Проверить состояние
	sbic	PINC,3				; входов энкодера (РС3=А, PD2=B_Int)
	sbr		zh,(1<<1)			; и установить соответсвующие
	sbic	PIND,2				; биты (А=1, B_Int=0) в 
	sbr		zh,(1<<0)			; регистре _PvEnc
	mov		_PvEnc,zh			;	

	sub		zl, _PvEnc			; Decode motion (zl = zl - _PvEnc)
	andi	zl, 3				; zl = zl and b11
	breq	enc_ext				; 00 - нет движения
	cpi		zl, 1
	breq	enc_inc				; 01 - движение вправо
	cpi		zl, 3
	breq	enc_dec				; 11 - движение влево
								; 10 - неопределено
	mov		zl, _PvDir
	mov		zh, _PvDir			; Count by 2 for previous direction
	lsl		zl					; zl=zl shl 1, bit0 cleared
	asr		zh					; zh=zh shr 1, bit7=const, bit0 -> carry flag	
	rjmp	enc_add

enc_dec:
	ldi		zl, low(-1)
	ldi		zh, high(-1)
	rjmp	enc_setpvdir

enc_inc:
	ldi		zl, low(1)
	ldi		zh, high(1)
enc_setpvdir:
	mov		_PvDir, zl
enc_add:
	add		_PosL, zl			; новая позиция
	adc		_PosH, zh

enc_ext:
	out		SREG, r0
	pop		zh
	pop		zl
	pop		r0
	sei
	reti





/* 


==============================  

Краткий курс - самоучитель микроконтроллеры AVR ATmega ATtiny для начинающих - www.AVR123.nm.ru


Самые первые шаги. 
http://www.roboforum.ru/viewtopic.php?f=2&t=1070

"Си для МК" именно для МИКРОКОНТРОЛЛЕРОВ !!! а не для ПК как в книгах  - 
    читайте на стр.   avr123.nm.ru/05.htm  
     
писать и компилировать программу советую в компиляторе 
CVAVR 1.25.9 - CodeVisinAVR - как с ним работать и где взять написано на стр.
avr123.nm.ru    и в задачах  avr123.nm.ru/06.htm 

CVAVR  - тоже имеет отличные примеры и хелп.      

; ************************************************************

Отлаживать программу удобно в маленьком симуляторе VMLAB     4.3 Mb всего 
( взять на www.amctools.com - он бесплатный) рассказано там:

avr123.nm.ru/z2.htm
avr123.nm.ru/z3.htm
avr123.nm.ru/z9.htm

дополнительная информация есть в хелпе и в примерах VMLAB

; ************************************************************

Еще посмотрите "супер-пупер" способ отладки устройств 
на МК - он описан там:  avr123.nm.ru/z4.htm

///////////////////////////////////////////////////////////////

// Мощнейший симулятор электроники и МК - PROTEUS  !!! 
// Советую скачать  - http://www.oProteus.narod.ru
     
///////////////////////////////////////////////////////////////


  Рекомендую использовать в работе:

  CVAVR 1.25.9    есть на  avr123.nm.ru     всего 2 Мб
 
  PROTEUS 7.4 sp3 PRO с лекарством версии 1.6.5

  скачать   http://www.roboforum.ru/viewtopic.php?f=2&t=2398

  Можно использовать модели МК из  PROTEUS 7.5 - там скачать
    http://kazus.ru/forum/topic_13350-600.html

==============================

КНИГИ скачать бесплатно по отдельности - библиотека в начале - www.AVR123.nm.ru

Сборка 187 книг  + диски CD c примерами из книг в торент-раздаче - льётся быстро.
   http://torrents.ru/forum/viewtopic.php?t=1652142

==============================

AVR Studio 4.16  build 628. Размер: 127 MB     скачать:
     http://www.efo.ru/ftp/pub/atmel/_AVR_MCUs_8bit/AvrStudio/AVR%20Studio%204.16%20628/AvrStudio416Setup.exe

*/