;************* ОСНОВНА ИНФОРМАЦИЯ ЗА ПРОГРАМАТА ********************
; Този файл може да се използва като "шаблон" при съставянето на 
; програмите за микроконтролерите PIC18FXX2. 
;
; Повече информация относно използването на шаблонния файл ще намерите
; в книгата "PIC микроконтроелри" - Част II, Глава 5
;
; Издателство "Млад Конструктор" (www.mladkonstruktor.bg)
; Всички права запазени. Съдържанието на този файл (или части от него) 
; не може да бъде публикувано без писменото съгласие на издателя. 
;
; Коректността на съдържанието на файла се гарантира само ако той е 
; изтеглен от Интернет адрес: www.mladkonstruktor.bg
;*******************************************************************
;                                                                             
; 	Име на файла:	PIC18FXX2temp.asm                                                      
; 	Дата:	 	dd.mm.yyyy.							
;    	Версия:		xx.x	                                                       
;    	Фирма: 		Млад Конструктор (www.mladkonstruktor.bg)
;                                                                              
;*******************************************************************

	LIST P=18F242		; Задаване типа на микроконтролера
				; Алтернативи за PIC18FXX2:
				; 18F242, 18F252, 18F442, 18F452

;**** Включване на заглавен файл с дефинициите на SFR-регистрите ***

	IFDEF __18F242		; Ако микроконтролерът е PIC18F242
	  #include <P18F242.INC>; Използвай файл "P18F242.INC"
	ENDIF

	IFDEF __18F252		; Ако микроконтролерът е PIC18F252
	  #include <P18F252.INC>; Използвай файл "P18F252.INC"
	ENDIF

	IFDEF __18F442		; Ако микроконтролерът е PIC18F442
	  #include <P18F442.INC>; Използвай файл "P18F442.INC"
	ENDIF

	IFDEF __18F452		; Ако микроконтролерът е PIC18F452
	  #include <P18F452.INC>; Използвай файл "P18F452.INC"
	ENDIF	

;******* Конфигуриращи битове **************************************

	__CONFIG _CONFIG1H, _OSCS_OFF_1H & _HS_OSC_1H
	__CONFIG _CONFIG2L, _BOR_OFF_2L & _PWRT_ON_2L
	__CONFIG _CONFIG2H, _WDT_OFF_2H
	__CONFIG _CONFIG3H, _CCP2MX_OFF_3H
	__CONFIG _CONFIG4L, _STVR_OFF_4L & _LVP_OFF_4L & _DEBUG_OFF_4L
	__CONFIG _CONFIG5L, _CP0_OFF_5L & _CP1_OFF_5L & _CP2_OFF_5L & _CP3_OFF_5L 
	__CONFIG _CONFIG5H, _CPB_OFF_5H & _CPD_OFF_5H
	__CONFIG _CONFIG6L, _WRT0_OFF_6L & _WRT1_OFF_6L & _WRT2_OFF_6L & _WRT3_OFF_6L 
	__CONFIG _CONFIG6H, _WRTC_OFF_6H & _WRTB_OFF_6H & _WRTD_OFF_6H
	__CONFIG _CONFIG7L, _EBTR0_OFF_7L & _EBTR1_OFF_7L & _EBTR2_OFF_7L & _EBTR3_OFF_7L
	__CONFIG _CONFIG7H, _EBTRB_OFF_7H

;******* Константи, използвани в програмата ************************

;------- Тактова честота на микроконтролера Fosc, [Hz] -------------
Fosc	EQU	D'10000000'	; 10 MHz

;******* Дефиниране на променливите, използвани в програмата *******

;------- Банка за бърз достъп (Access Bank) ------------------------
	CBLOCK	H'000'	; Начален адрес на Access Bank
	WREG_TEMP	; Променливи, използвани за съхранение на
	STATUS_TEMP	; съдържанието на регистри WREG, STATUS и BSR
	BSR_TEMP	; при обслужване на прекъсване с нисък приоритет
	Flag_register_0	; Регистър за потребителски флагове


	LAST_REG	; Адрес на последния регистър от Access Bank,
			; използван в програмата
	ENDC

; Дефиниране на начален адрес за променливите, използвани в макросите
; от заглавните файлове <..._macros.inc>
Macros_vars	SET	LAST_REG

;------- Банка 0 ---------------------------------------------------
	CBLOCK	H'080'	; Начален адрес на Банка 0

	ENDC

;------- Банка 1 ---------------------------------------------------
	CBLOCK	H'100'	; Начален адрес на Банка 1

	LAST_REG_1	; Адрес на последния регистър от Банка 1,
			; използван в програмата
	ENDC

; Дефиниране на начален адрес за променливите, използвани в подпрограмите 
; от заглавните файлове <..._config.inc> и <..._prog.inc>.
Header_vars	SET	LAST_REG_1
	
;------- Банка 2 ---------------------------------------------------
	CBLOCK	H'200'	; Начален адрес на Банка 2

	ENDC

;------- Банка 3 (Само за PIC18F252 и PIC18F452) -------------------
	CBLOCK	H'300'	; Начален адрес на Банка 3

	ENDC

;------- Банка 4 (Само за PIC18F252 и PIC18F452) -------------------
	CBLOCK	H'400'	; Начален адрес на Банка 4

	ENDC

;------- Банка 5 (Само за PIC18F252 и PIC18F452) -------------------
	CBLOCK	H'500'	; Начален адрес на Банка 5	

	ENDC
;-------------------------------------------------------------------

;******* Дефиниране на данни за запис в EEPROM паметта *************

	;	ORG	0xf00000
	;	DE	"Test Data",0,1,2,3,4,5	; Примерни данни

;******* Дефиниране на входно-изходните изводи *********************
 #define IN PORTB,0 

;******* Дефиниране на потребителски флагове ***********************
#define	My_flag_1	Flag_register_0,0

;*******************************************************************
;**Използвани заглавни файлове с предварително дефинирани макроси***
;	#include	<add_sub_macros.inc>
;	#include	<mul_div_macros.inc>
;	#include	<BCD_macros.inc>
;*******************************************************************

;*******************************************************************
;	Потребителска програма
;*******************************************************************

	ORG	0x0000	; Вектор на НУ 
	goto	Start	; Преход към началото на програмата

	ORG	0x0008	; Вектор на прекъсване с висок приоритет
	goto	ISR_HI 	; Преход към обслужващата програма

	ORG	0x0018	; Вектор на прекъсване с нисък приоритет
	goto	ISR_LO	; Преход към обслужващата програма

;*******************************************************************
;	Начало на програмата (инициализация на микроконтролера)
;*******************************************************************
Start	movlb	H'01'		; Избор на Банка 1
	bsf	RCON,IPEN	; Използване на приоритетни прекъсвания
	clrf	Flag_register_0	; Нулиране на потребителските 		
    ; Потребителски код за инициализация
	banksel PORTB
    clrf PORTB
    movlw B'00000111'
    movwf TRISB
	call Init
    goto Main  
	; Преход към главната програма

;*******************************************************************
;	Използвани подпрограми
;*******************************************************************
    ORG H'0200'
hex_table DB H'68',H'48',H'58',H'50',H'D0',H'90',H'B0',H'A0',H'A8',H'28'
Byte_counter EQU H'000'
    movlw UPPER(hex_table)
    movwf TBLPTRU  
    movlw HIGH (hex_table)
    movwf TBLPTRH  
    movlw LOW  (hex_table)
    movwf TBLPTRL
    movlw D'10'
    movwf Byte_counter
	return
next_byte  
    tblrd*+
    movff TABLAT,PORTB
  	return
Prv_byte
	tblrd*-
    movff TABLAT,PORTB
  	return

 
;------- Програма за обслужване на прекъсвания с висок приоритет ---

ISR_HI	btfsc	INTCON,TMR0IF	; Прекъсване от Таймер 0? 
	bra	serv_TIMER	; Да, обслужване
	bra	next_int	; Не, провери следващия1 източник
serv_TIMER			; Обслужване на прекъсването от Таймер 0,
	call	Update_TIMER	; чрез който се обезпечава работата на 
	bcf	INTCON,TMR0IF	; системния таймер
next_int
    btfss INTCON,INT0IF
    goto next_byte
    goto END_HI
;	*** Код за обслужване на прекъсванията с висок приоритет ***

END_HI
	banksel INTCON
	bcf INTCON,INT0IF
	btfss PORTC,3
	goto prv
	goto next

prv
	call Prv_byte
	incfsz Byte_counter,f
	movff Byte_counter,WREG
	xorlw H'0B'
	btfss STATUS,Z	
	retfie
	movlw D'0'
   	movwf Byte_counter
	retfie	FAST	

next
	call next_byte
	decfsz Byte_counter,f
	retfie
    goto Byte_counter
   	movwf Byte_counter
	retfie	FAST	; Връщане от ISR и възстановяване на регистри 
 			; WREG, STATUS и BSR


;------- Програма за обслужване на прекъсвания с нисък приоритет ---
	
ISR_LO	movff	STATUS,STATUS_TEMP	; Съхраняване съдържанието
	movff	WREG,WREG_TEMP		; на регистри STATUS, WREG
	movff	BSR,BSR_TEMP		; и BSR

;	*** Код за обслужване на прекъсванията с нисък приоритет ***

END_LO	movff	BSR_TEMP,BSR		; Възстановяване съдържанието
	movff	WREG_TEMP,WREG		; на регистри STATUS, WREG
	movff	STATUS_TEMP,STATUS	; и BSR	retfie 

;*******************************************************************
;	Главна програма
;*******************************************************************
Init
	call hex_table
	banksel INTCON
	bsf INTCON,INT0IE
	retfie
Main
    sleep
     goto Main

;	*** Код на главната програма ***

	bra	$		; Безкраен цикъл	
	END			; Край на програмата
