;**********************************************************************
;		Filename:		Primer10.asm
;		Date:			November 19, 2007
;		File Version:	1.00
;		Author:			Nemanja Vukasinovic
;
;**********************************************************************
;		Opis: proba rada mikrokontrolera
;**********************************************************************

	list	p=16f887		; procesor
	#include	<p16f887.inc>	; Definicija SFR registara 
								; mikrokontrolera PIC16F887

	errorlevel	-302	; Zabranjuje se pojava poruke "Register
						; in operand not in bank 0. Ensure that
						; bank bits are correct."
;**********************************************************************

	__CONFIG	_CONFIG1, _HS_OSC & _WDT_OFF & _PWRTE_ON & _MCLRE_ON & _CP_OFF & _CPD_OFF & _BOR_ON & _IESO_ON & _FCMEN_ON & _LVP_OFF & _DEBUG_OFF

	__CONFIG	_CONFIG2, _BOR40V & _WRT_OFF
	
;*************    DEFINISANJE PROMENLJIVIH   **************************		
				
	cblock	0x20	; Pocetak blika promenljivih na adresi 20h.
	w_temp			; Promenljiva na adresi 20h.
	pclath_temp		; Promenljiva na adresi 21h.
	status_temp		; Promenljiva na adresi 22h.
	endc

	#define	TAMNO	PORTB,0	; Taster "TAMNO" je povezan sa pinom PORTB,0
	#define SVETLO	PORTB,1	; Taster "SVETLO" je povezan sa pinom PORTB,1
	
;************************   POCETAK PROGRAMA   ************************

	org		0x0000	; Adresa prve instrukcije u programu.
	goto	main	; Skoci na labelu "main".

;************************   INTERAPT RUTINA   *************************	
	
	org		0x0004	; Interapt vektor.
	
	movwf	w_temp	; Sacuvaj vrednost registra W.
	
	movf	STATUS	; Sacuvaj vrednost registra STATUS.
	movwf	status_temp
	
	movf	PCLATH	; Sacuvaj vrednost registra PCLATH.
	movwf	pclath_temp
	
	banksel	CCPR1L	
	btfss	TAMNO	; Ispitivanje tastera "TAMNO".
	decf	CCPR1L	; Taster je pritisnut - CCP1L umanji za 1.
	btfss	SVETLO	; Ispitivanje tastera "SVETLO".
	incf	CCPR1L	; Taster je pritisnut - CCP1L uvecaj za 1.
	
	movf	pclath_temp,w	; Vracanje originalnog sadrzaja u PCLATH.
	movwf	PCLATH
	movf	status_temp,w	; Vracanje originalnog sadrzaja u STATUS.
	movwf	STATUS
	swapf	w_temp,f		; Vracanje originalnog sadrzaja u W.
	swapf	w_temp,w
	
	banksel	PIR1			; Selektovanje banke u kojoj je PIR1.
	bcf		PIR1,TMR1IF		; Brise se interapt fleg TMR1IF.
	
	bsf		TMR1H,7			; Ubrzava se odbrojavanje tajmera TMR0.
	bsf		TMR1H,6			;

	bsf		INTCON,GIE		; Omogucen je globalni interapt.
	retfie					; Povratak iz interapt rutine.
	
;************************   GLAVNI PROGRAM   **************************	
	
main				; Pocetak glavnog programa.

	banksel	ANSEL	; Odabira se banka u kojoj je registar ANSEL.
	clrf	ANSEL	; Brise se sadrzaj registara ANSEL i ANSELH.
	clrf	ANSELH	; Svi pinovi su digitalni.
	
	banksel	OPTION_REG	; Odabira se banka u kojoj je registar ANSEL.
	bcf	OPTION_REG,7	; Omoguceno je postavljanje pull-up otpornika.
	bsf	WPUB,0			; Pull-up otpornici se postavljaju samo na 
	bsf	WPUB,1			; pinove 0 i 1 porta B.
	
	banksel	TRISC	; Odabira se banka u kojoj je registar TRISC.
	clrf	TRISC	; Svi izvodi porta C su izlazi.
	
	banksel	T1CON			; Odabira se banka u kojoj je registar T1CON.
	bcf		T1CON,TMR1CS	; TMR1 broji impulse iz internog oscilatora.
	bcf		T1CON,T1CKPS0	; Faktor deljenja preskalera je 1:8.
	bcf		T1CON,T1CKPS1
	bsf		T1CON,TMR1ON	; Ukljucuje se tajmer TMR1.
	
	banksel	PIE1		; Odabira se banka u kojoj je registar PIE1.
	bsf		PIE1,TMR1IE	; Omogucen je interapt pri prekoracenju TMR1.
	bsf		INTCON,PEIE	; Omogucena pojava interapta koji poticu od 
						; "periferijskih" modula mikrokontrolera.
	bsf		INTCON,GIE	; Globalna dozvola interapta.
	
	movlw	B'11111101'	; Faktor deljenja preskalera TMR2 = 1:4.
	banksel	T2CON
	movwf	T2CON
	movlw	B'11111111'	; Vrednost koja se upisuje u registar PR2.
	banksel	PR2
	movwf	PR2
	
	banksel	CCP1CON		; Konfigurisanje CCP1 modula.
	movlw	B'00001100'	
	movwf	CCP1CON
	
loop
	goto	loop	; Ostani ovde.
	
	end				; Kraj programa.