;////////////////////////////////////////////////////////////////////////
;//
;// Контрольная работа 
;// Функциональный генератор сигналов с ручным управлением
;// 
;// email:jin_jin@mail.ru
;//


	PROCESSOR PIC 16F877
	#include<P16F877.inc>
;	__CONFIG _CP_OFF & _XT_OSC & _PWRTE_ON  & _WDT_ON
 

	errorlevel-302      ;установка протокола вывода сообщений об ошибках

;////////////////////////////////////////////////////////////////
Fout		equ	.100 	; Частота на выходе ШИМ
T0		equ	0x29
Fclk		equ	.4000000				; Тактовая частота Пика (Гц)
TblSise		equ	.128					; Размер таблицы
T0Clock		equ	Fout*TblSise				; Частота прерываний таймера T0 (Гц)
T0Prescaler	equ	.1					; Предделитель таймера T0
T00		equ	-Fclk/(.4*T0Prescaler*T0Clock)+.3 	; Константа для перезагрузки таймера T0


fCOUNTER 	equ 	0x20 
fCOUNTER2 	equ 	0x21
BaseAddress	equ	0x31
w_temp		equ	BaseAddress + 0x00	;// Временный регистр для регистра W.	;// 'Прозрачно' отображается в вершине банков 1-3.
status_temp	equ	BaseAddress + 0x01	;// Временный регистр для регистра STATUS
FSR_temp	equ	BaseAddress + 0x02	;// Временный регистр для регистра FSR
psin		equ	BaseAddress + 0x03	;// Указатель на таблицу sin

cnt0 		equ 	0x22 ; счетчики для программируемой задержки
cnt1		equ 	0x23 
cnt2		equ 	0x24 
cnt10		equ 	0x25
H_byte		equ 	0x28	;старший байт AD преобразования  

	
;// PORTC
CCP2		equ	.1
CCP1		equ	.2

;// PORTA
RA1		equ	0X01
RA2		equ	0X02
RA3		equ	0X03
RA4		equ	0X04

;////////////////////////////////////////////////////////////////
;************ Макросы***************
BANK0    MACRO  
		 BCF      STATUS,RP1  
		 BCF      STATUS,RP0  
		 ENDM
		;
BANK1    MACRO  
		 BCF      STATUS,RP1  
		 BSF      STATUS,RP0  
		 ENDM
		;
BANK2    MACRO  
		 BSF      STATUS,RP1  
		 BCF      STATUS,RP0  
		 ENDM
		;
BANK3    MACRO  
		 BSF      STATUS,RP1  
		 BSF      STATUS,RP0  
		 ENDM
;////////////////////////////////////////////////////////////////

	org	0x00
	clrf	INTCON
	clrf	STATUS

	goto	main

	org	0x04
	movwf	w_temp
	movfw	STATUS
	clrf	STATUS
	movwf	status_temp
	movfw	FSR
	movwf	FSR_temp

	btfsc	INTCON,T0IF
	goto	InterruptT0

	goto	InterruptERROR			; Ошибка в прерываниях!


;////////////////////////////////////////////////////////////////
;//
;// Обработчик прерываний таймера T0
;// T0 работает с частотой T0Clock (смотри main.h)
;//
InterruptT0:
	movlw	T0
	addwf	TMR0,f

	call	tblsin
	movwf	CCPR2L

	incf	psin,f
	movlw	TblSise
	subwf	psin,w
	skpc
	goto	InterruptT0_10
	clrf	psin

InterruptT0_10:
	bcf	INTCON,T0IF
	
;////////////////////////////////////////////////////////////////
;//
;// Выход из обработчика прерываний
;// 
Interrupt_exit:
	clrwdt
	movfw	FSR_temp
	movwf	FSR
	movfw	status_temp
	movwf	STATUS
	swapf	w_temp,f
	swapf	w_temp,w
	retfie

;////////////////////////////////////////////////////////////////
;//
;// Обработчик ошибок в прерываниях
;//
InterruptERROR:
	goto	Interrupt_exit

tblsin:
;// Размер 128 отсчётов
	movfw	psin
	andlw	0x7f			; побитное И константы и W
	addwf	PCL,f			; сложить W и f
	retlw	.128			; возврат из подпрограммы с загрузкой константы в W
	retlw	.134
	retlw	.140
	retlw	.146
	retlw	.152
	retlw	.158
	retlw	.165
	retlw	.170
	retlw	.176
	retlw	.182
	retlw	.188
	retlw	.193
	retlw	.198
	retlw	.203
	retlw	.208
	retlw	.213
	retlw	.218
	retlw	.222
	retlw	.226
	retlw	.230
	retlw	.234
	retlw	.237
	retlw	.240
	retlw	.243
	retlw	.245
	retlw	.248
	retlw	.250
	retlw	.251
	retlw	.253
	retlw	.254
	retlw	.254
	retlw	.255
	retlw	.255
	retlw	.255
	retlw	.254
	retlw	.254
	retlw	.253
	retlw	.251
	retlw	.250
	retlw	.248
	retlw	.245
	retlw	.243
	retlw	.240
	retlw	.237
	retlw	.234
	retlw	.230
	retlw	.226
	retlw	.222
	retlw	.218
	retlw	.213
	retlw	.208
	retlw	.203
	retlw	.198
	retlw	.193
	retlw	.188
	retlw	.182
	retlw	.176
	retlw	.170
	retlw	.165
	retlw	.158
	retlw	.152
	retlw	.146
	retlw	.140
	retlw	.134
	retlw	.128
	retlw	.121
	retlw	.115
	retlw	.109
	retlw	.103
	retlw	.97
	retlw	.90
	retlw	.85
	retlw	.79
	retlw	.73
	retlw	.67
	retlw	.62
	retlw	.57
	retlw	.52
	retlw	.47
	retlw	.42
	retlw	.37
	retlw	.33
	retlw	.29
	retlw	.25
	retlw	.21
	retlw	.18
	retlw	.15
	retlw	.12
	retlw	.10
	retlw	.7
	retlw	.5
	retlw	.4
	retlw	.2
	retlw	.1
	retlw	.1
	retlw	.0
	retlw	.0
	retlw	.0
	retlw	.1
	retlw	.1
	retlw	.2
	retlw	.4
	retlw	.5
	retlw	.7
	retlw	.10
	retlw	.12
	retlw	.15
	retlw	.18
	retlw	.21
	retlw	.25
	retlw	.29
	retlw	.33
	retlw	.37
	retlw	.42
	retlw	.47
	retlw	.52
	retlw	.57
	retlw	.62
	retlw	.67
	retlw	.73
	retlw	.79
	retlw	.85
	retlw	.90
	retlw	.97
	retlw	.103
	retlw	.109
	retlw	.115
	retlw	.121


;////////////////////////////////////////////////////////////////
; З А Д Е Р Ж К А !!!!!
delay
		movwf cnt0
delay1	movlw .12
		movwf cnt1
delay3	movlw .207
		movwf cnt2
delay2	
		decfsz cnt2,f
		goto delay2
		decfsz cnt1,f
		goto delay3
		decfsz cnt0,f
		goto delay1
		return 

;////////////////////////////////////////////////////////////////
CCP
	movlw	T00
	movwf	T0	
	
return
;////////////////////////////////////////////////////////////////
SIN
	BANK0
	movlw	((1<<CCP2M3)|(1<<CCP2M2)|(1<<CCP2X)|(1<<CCP2Y))
	movwf	CCP2CON
	movlw	(1<<GIE)|(1<<T0IE)
	movwf	INTCON
	return
;////////////////////////////////////////////////////////////////
PILA
	BANK0
	movlw	((1<<CCP2M3)|(1<<CCP2M2)|(1<<CCP2X)|(1<<CCP2Y))
	movwf	CCP2CON
	movlw	(0<<GIE)|(0<<T0IE)
	movwf	INTCON

	return
;////////////////////////////////////////////////////////////////
opros	

	bsf	  ADCON0,2	;пуск A/D преобразования
        nop
	nop      
        nop
	nop
 	nop
	nop      
        nop
	nop
 	nop
	nop      
        nop
	nop
 	nop
	nop      
        nop
	nop
 	nop
	nop      
        nop
	nop
	nop
	movfw	ADRESH			;получить результат преобразования
	movwf	  H_byte

return
;////////////////////////////////////////////////////////////////
;//
;// Начало основной программы
;//

main


	movlw	T00
	movwf 	T0

	BANK1

	movlw b'00001111' 
	movwf OPTION_REG			; МАКСИМАЛЬНОЕ ВРЕМЯ ДЛЯ wdt
	
	movlw	0x06				; Конфигурируем все контакты как аналоговые входы выходы  .0
	movwf	ADCON1	
	movlw	0xCF
	movwf	TRISA				; КООНФИГУРИРУЕМ  PORTA КАК ВХОДЫ   RA1(1) RA2(2) RA3(3) RA4(+) 1e
	movlw	0x00
	movwf	TRISD			 

	BANK0
	clrf	PORTD
	movlw	0xff
	movwf	PORTA
	movlw	.249				; включаем ацп
	movwf	ADCON0				 
	nop
	nop
	bcf	  ADCON0,2

	BANK1
	movlw	(1<<NOT_RBPU)|(0<<T0CS)|(1<<PSA)|(1<<PS2)|(1<<PS1)|(1<<PS0)
	movwf	OPTION_REG
	movlw	.255
	movwf	PR2
	movlw	~((1<<CCP2)|(0<<CCP1))
	movwf	TRISC

	BANK0
	movlw	(1<<TMR2ON)|(0<<T2CKPS1)|(0<<T2CKPS0)
	movwf	T2CON
	clrf	psin
	CALL	CCP



	goto MainLoop

;////////////////////////////////////////////////////////////////

;//
;// Основной цикл
;//

MainLoop


;	call opros				; опрос АЦП
;	bcf	  ADCON0,2
;	movf	H_byte,0
;	movwf	PORTD



	BTFSS PORTA,RA1
	CALL KEY_RA1

	BTFSS PORTA,RA2
	CALL KEY_RA2

	BTFSS PORTA,RA3
	CALL KEY_RA3

	BTFSS PORTA,RA4
	CALL KEY_RA4




	goto	MainLoop

;////////////////////////////////////////////////////////////////

KEY_RA1	;  
	CALL	SIN

	RETURN

;////////////////////////////////////////////////////////////////

KEY_RA2	; 
	CALL	PILA

	RETURN


;////////////////////////////////////////////////////////////////
	END
