; Zakladni nastaveni procesoru PIC16F84                         (10.7.2003)

;**************************************************************************
;*                       http://www.cmail.cz/doveda                       *
;**************************************************************************
;*                                  PIC16F84                              *
;*                             --------\/--------                         *
;*                            -|RA2          RA1|-                        *
;*                            -|RA3          RA0|-                        *
;*                            -|RA4ck       osc1|-  \ Krystal 4,00MHz     *
;*                       +5V  -|MCLR        osc2|-  /                     *
;*                        0V  -|Vss          Vdd|-  +5V                   *
;*                            -|RB0/INT  PGD/RB7|-                        *
;*                            -|RB1      PGC/RB6|-                        *
;*                            -|RB2          RB5|-                        *
;*                            -|RB3          RB4|-                        *
;*                             ------------------                         *
;*                                              DOVEDA BOYS (c) 1997-2003 *
;**************************************************************************

list	P=16F84, R=DEC
include	"p16f84.inc"

RAM		equ	0Ch	; prvni adresa pameti RAM pro PIC16F84 - 68bajtu (0C-2F)
TMP_W		equ	RAM+1	; temp preruseni
TMP_S		equ	RAM+2	; temp preruseni 

TMP0		equ	RAM+03	; pomocny registr
TMP1		equ	RAM+04	; pomocny registr
TMP2		equ	RAM+05	; pomocny registr

#define	Q_OUT1	PORTA,0		; vystup 1
#define	Q_OUT2	PORTA,1		; vystup 2
#define Q_OUT3	PORTA,2		; vystup 3
#define Q_OUT4	PORTA,3		; vystup 4
#define Q_OUT5	PORTA,4		; vystup 5

	org	0x2007		; adresa nastaveni pojistek pro PIC16F84
	dw _XT_OSC & _PWRTE_OFF & _WDT_OFF & _CP_ON

; typ oscilatoru
;	_LP_OSC                      EQU     H'3FFC'
;	_XT_OSC                      EQU     H'3FFD'
;	_HS_OSC                      EQU     H'3FFE'
;	_RC_OSC                      EQU     H'3FFF'

; Code Protect (ochrana proti precteni)
;	_CP_ON                       EQU     H'000F'
;	_CP_OFF                      EQU     H'3FFF'

; Power Up Timer (casovac pro nabeh napeti 72ms)
;	_PWRTE_ON                    EQU     H'3FF7'
;	_PWRTE_OFF                   EQU     H'3FFF'

; WatchDog (hlidaci pes)
;	_WDT_ON                      EQU     H'3FFF'
;	_WDT_OFF                     EQU     H'3FFB'

;************************ Nastavení dat v EEPROM **************************

	org	0x2100		; tabulka v pameti EEPROM (64 bytu)
	de	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
	de	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
	de	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
	de	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
	de	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
	de	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
	de	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
	de	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF

;************************     Reset procesoru     *************************

	org	0x0000		; zacatek programu
	goto	INIT		; skok na pocatecni inicializaci

	org	0x0004		; vektor preruseni
	goto	PRERUS

;**************************************************************************
;*                      preruseni kazdych 8,192ms (122Hz)                 *
;**************************************************************************

PRERUS	movwf	TMP_W		; (ulozeni hodnot registru W a STATUS)
	movf	STATUS,W	; prohodi nibble STATUS a ulozi do W
	clrf	STATUS		; nastaveni banky 0
	movwf	TMP_S		; ulozit STATUS

	movf	PCLATH,W
	movwf	TMP_PCL
	clrf	PCLATH		; nastaveni banky 0
;       ------------------------
	bcf	INTCON,T0IF	; vynulovat priznak preruseni (pretekl casovac TMR0)
;-------------------------------


;	!!! zde napiste co ma preruseni vykonat !!!


;------------------------------- (obnovení hodnot registru W a STATUS)
INT_END movf	TMP_PCL,W
	movwf	PCLATH		; obnova PCLATH

	movf	TMP_S,W		; prohodi nibble TMP_S a ulozi do W
;	swapf	TMP_S,W		; prohodi nibble TMP_S a ulozi do W
	movwf	STATUS		; obnova STATUS

	swapf	TMP_W,F		; prohodi nibble TMP_W a ulozi do W
	swapf	TMP_W,W		; obnova W
	retfie

;************************ Inicializace procesoru  *************************

INIT	movlw	b'00000'
	movwf	PORTA
	movlw	b'00000000'
	movwf	PORTB
;       ------------------------
;	bcf	STATUS,RP1
	bsf	STATUS,RP0	; banka registru 1
	movlw	b'11111'	; portA 4-0, 5*vstupy
	movwf	TRISA

	movlw	b'11010100'	; PULL-UPy OFF, preddelic=1:32 pripojen k TMR0
	movwf	OPTION_REG	; f:4  :32  :256 = 122,1Hz (8,192ms)
	movlw	b'11111011'	; portB 7-0, 7*vstupy, 1*vystupy
	movwf	TRISB

	bcf	STATUS,RP0	; banka registru 0
;       ------------------------
;	movlw	b'10100000'	; povolena všechna přerušení a od přetečení TMR0
;	movwf	INTCON

;	bsf	INTCON,TOIE	; 1=povoleno přerušení při přetečení TMR0
;	bsf	INTCON,INTE	; 1=povoleno přerušení z portu RB0/INT
;	bsf	INTCON,GIE	; 1=povolena všechna nemaskovaná přerušení

;	!!! zde napiste vynulovani a nastaveni promenych !!!

	goto	MAIN

;************************     Hlavní program      *************************

MAIN	


;	!!! zde napiste vlasni program !!!


	goto	MAIN

;******************************** PIC16F84 ********************************

READ	bsf	STATUS,RP0	; banka 1	!!! nastav EEADR !!!
	bsf	EECON1,RD	; cteni EEPROM
	bcf	STATUS,RP0	; banka 0
	movf	EEDATA,W	; nactena data z pameti EEPROM do registru W
;-------------------------------
	return			;		!!! data v registru W !!!

;******************************** PIC16F84 ********************************

WRITE	movwf	EEDATA		;		!!! W -> EEDATA (nastav EEADR) !!!
;-------------------------------
	bsf	STATUS,RP0	; banka 1
	bsf	EECON1,WREN	; povolit zapis do EEPROM

	bcf	INTCON,GIE	; zakazat vsechna preruseni
;       ------------------------; aktivace zapisu
	movlw	0x55		; odblokovani zapisu (povinna povolovaci sekvence)
	movwf	EECON2
	movlw	0xAA
	movwf	EECON2
	bsf	EECON1,WR	; spustit zapis
;       ------------------------; konec aktivace
	bsf	INTCON,GIE	; povolit vsechna preruseni

	bcf	EECON1,WREN	; zakazat zapis do EEPROM
	btfsc	EECON1,WR	; pockat na konec zapisu
	goto	$-1
	bcf	STATUS,RP0	; banka 0
;-------------------------------
	return

;************************      Konec programu     *************************

	end

