/*
 * _147.asm
 *
 *  Created: 24.08.2012 00:12:55
 *   Author: UWRTEY
 */ 

 ;.include "d:\avr\avrasm\appnotes\attyny2313def.inc"


	.def	Temp=R16
	.def	Temp1=R17
	.def	Temp2=R18
	.def	Temp3=R19
	.def	Temp4=R20
	.def	Temp5=R21
	.def	Temp6=R22
	.def	Temp7=R23
	.def	Temp8=R24
	.def	Temp9=R25


.dseg		;оперативка

key_buff: .byte 5	; зарезервируем 5 байт в ОЗУ


;******************************************************************************
;******************************************************************************

.cseg
.org 0



rjmp RESET	; External Pin, Power-on Reset, Brown-out Reset, and Watchdog Reset
rjmp INT0	; External Interrupt Request 0
rjmp INT1	; External Interrupt Request 1
rjmp TIMER1	; CAPT Timer/Counter1 Capture Event
rjmp TIMER1	; COMPA Timer/Counter1 Compare Match A
rjmp TIMER1	; OVF Timer/Counter1 Overflow
rjmp TIMER0	; OVF Timer/Counter0 Overflow
rjmp USART0	; RX USART0, Rx Complete
rjmp USART0	; UDRE USART0 Data Register Empty
rjmp USART0	; TX USART0, Tx Complete
rjmp ANALOG	; COMP Analog Comparator
rjmp PCINT	; Pin Change Interrupt
rjmp TIMER1	; COMPB Timer/Counter1 Compare Match B
rjmp TIMER0	; COMPA Timer/Counter0 Compare Match A
rjmp TIMER0	; COMPB Timer/Counter0 Compare Match B
rjmp USI	; START USI Start Condition
rjmp USI	; OVERFLOW USI Overflow
rjmp EE		; READY EEPROM Ready
rjmp WDT	; OVERFLOW Watchdog Timer Overflow




;RESET:		; External Pin, Power-on Reset, Brown-out Reset, and Watchdog Reset//// 
INT0:		; External Interrupt Request 0
INT1:		; External Interrupt Request 1
TIMER1:		; CAPT Timer/Counter1 Capture Event
;TIMER1:	; COMPA Timer/Counter1 Compare Match A/////////////////////////////////
TIMER1:		; OVF Timer/Counter1 Overflow
TIMER0:		; OVF Timer/Counter0 Overflow
USART0:		; RX USART0, Rx Complete
USART0:		; UDRE USART0 Data Register Empty
USART0:		; TX USART0, Tx Complete
ANALOG:		; COMP Analog Comparator
PCINT:		; Pin Change Interrupt
TIMER1:		; COMPB Timer/Counter1 Compare Match B
TIMER0:		; COMPA Timer/Counter0 Compare Match A
TIMER0:		; COMPB Timer/Counter0 Compare Match B
USI:		; START USI Start Condition
USI:		; OVERFLOW USI Overflow
EE:		; READY EEPROM Ready
WDT:		; OVERFLOW Watchdog Timer Overflow

reti		; выход из обраьотчика прерываний

;******************************************************************************





;******************************************************************************
;инициализация стека
;******************************************************************************

reset:			;включение микроконтроллера


ldi Temp,0b01000000	;разрешить прерывание компаратора
out TIMSK,Temp


ldi Temp,0b00000001	;тактовый сигнал = CK (1:1)
out TCCR1B,Temp

			; инициализация компаратора
ldi Temp,0xC		; 3кГц,  1/3000=0,00033сек=330мкс,   330/2=165мкс длительность импульса или паузы
out OCR1AH,Temp		; 0,05мкс*65535=3276,75    3276,75>165 --- по этому не будем делить тактовую частоту (СК)
ldi Temp,0xE4		; 165мкс/0,05мкс=3300 тиков таймера  3300=CE4(hex)   
out OCR1AL,Temp		;


ldi Temp,0		;обнуление таймера при включении
out TCNT1H,Temp
out TCNT1L,Temp



ldi Temp,RamEnd		;еще один вариант записи	ldi temp, low(Ramend)
out SPL,Temp		;инициализации стека		out SPL, temp


cei			;глобальное разрешение прерываний
        
;******************************************************************************





;*******************************************************************************
;настройка портов
;*******************************************************************************

ldi Temp,0b11110000
out DDRB,Temp           ;настроили порт "В" 
			;х0000000 - вывод на передатчик
			;00Х00000 - ДЛЯ ГЕНЕРАЦИИ (НЕ ЗНАЮ ЧТО ДЕЛАТЬ - ВЫХОД ИЛИ ВХОД)
			;0000хххх - для чтения клавиатуры



ldi Temp,0b01111111
out DDRD,Temp 		;настраиваем порт "D" на вывод(запись)(0-ввод, 1-вывод)
			;но не весь, а только шесть млажших бит (PD0-PD5)
			;к которым прицеплены четыре столбца клавиатуры
			;и остальные настроил на вывод, для того что бы 
			;при их чтении получит не чёрте-че, а четкий ноль
			;*только самый старши бит настроен на ВВОД (потому что в порте "D" отсутсвует эта нога)



;*******************************************************************************
; Чтение клавы и запись данных в ОЗУ
;*******************************************************************************

keyboardreed:				;метка - опрос клавиатуры

          
	ldi Temp,5			; количество столбцов клавы = пять
         
	ldi Temp1,0b00000001		; первый столбец

          				; загружаем адрес метки (key_buff) находящейся в ОЗУ в регистровую пару X
	ldi XL,low(key_buff)		; младший байт адреса
	ldi XH,high(key_buff)		; старший байт адреса

keyboardread_loop:			; цикл опроса

	out PortD,Temp1			; выводим в порт "Д" значение "Temp1" для выбора столбца клавиатуры
	in Temp2,PinB			; прочитали состояние столбца
         
	st X+,Temp2			; сохраним в ОЗУ состояние столбца клавы, 
 					; адрес в регстровой паре "X" автоматом увеличится на 1

	lsl Temp1			; сдвинули единичку выбора столбца клавиатуры на 1
 					; позицию влево

	dec temp			; уменьшим счетчик
	brne keyboardread_loop		; если не все просканировали, то циклимся

       


	rjamp keyboardreed		; зациклились бесконечно опрашивать клаву и перезаписывать данные




;*********************************************************************************
;ОБРАБОТКА ПРЕРЫВАНИЯ////////
;*********************************************************************************

TIMER1:

	ldi Temp,0			;обнуление таймера
	out TCNT1H,Temp
	out TCNT1L,Temp


	.......

reti


