;****************************************************************************** ; This file is a basic code template for code generation on the * ; PIC16F1827. This file contains the basic code building blocks to build * ; upon. * ; * ; Refer to the MPASM User's Guide for additional information on * ; features of the assembler. * ; * ; Refer to the respective data sheet for additional * ; information on the instruction set. * ; * ;****************************************************************************** ; * ; Filename: interrupt1.asm * ; Date: 25.02.2013 * ; File Version: 1.0 * ; * ; Author: Vladimir Pavkovic * ; Company: ES * ; * ; * ;****************************************************************************** ; * ; Files Required: P16F1827.INC * ; * ;****************************************************************************** ; * ; Notes: * ; * ;****************************************************************************** ; * ; Revision History: * ; * ;****************************************************************************** list p=16f1827 ; list directive to define processor #include ; processor specific variable definitions ;------------------------------------------------------------------------------ ; ; CONFIGURATION WORD SETUP ; ; The 'CONFIG' directive is used to embed the configuration word within the ; .asm file. The lables following the directive are located in the respective ; .inc file. See the data sheet for additional information on configuration ; word settings. ; ;------------------------------------------------------------------------------ __CONFIG _CONFIG1, _FOSC_INTOSC & _WDTE_OFF & _PWRTE_OFF & _MCLRE_ON & _CP_OFF & _CPD_OFF & _BOREN_OFF & _CLKOUTEN_OFF & _IESO_OFF & _FCMEN_OFF __CONFIG _CONFIG2, _WRT_OFF & _PLLEN_OFF & _STVREN_OFF & _BORV_19 & _LVP_OFF ; !!! Za razliku od defaulta imamo samo _CLKOUTEN_OFF umesto _CLKOUTEN_ON ; !!! da bi nam OUTCLK pin bio slobodan za I/O operacije ;------------------------------------------------------------------------------ ; VARIABLE DEFINITIONS ; ; Available Data Memory divided into Bank 0-15. Each Bank may contain ; Special Function Registers, General Purpose Registers, and Access RAM ; ;------------------------------------------------------------------------------ CBLOCK 0x20 ; Define GPR variable register locations TIMERS ; TIMERS flags CNT_1 ; CNT_10 ; CNT_100 ; CNT_1s ; CNT_1m ; CNT_1h ; CNT_1d ; ENDC ;TIMERS flags definition T_01ms EQU 0 T_1ms EQU 1 T_10ms EQU 2 T_100ms EQU 3 T_1s EQU 4 T_1m EQU 5 T_1h EQU 6 T_1d EQU 7 ;RELOAD value for counters C1ms EQU d'10' C10ms EQU d'10' C100ms EQU d'10' C1s EQU d'10' C1m EQU d'60' C1h EQU d'60' C1d EQU d'24' SAMPLE1 EQU 0x7D ; Sample user registers SAMPLE2 EQU 0x7E ; SAMPLE3 EQU 0x7F ; ;------------------------------------------------------------------------------ ; RESET VECTOR ;------------------------------------------------------------------------------ ORG 0x0000 ; processor reset vector PAGESEL START GOTO START ; When using debug header, first inst. ; may be passed over by ICD2. ;------------------------------------------------------------------------------ ; INTERRUPT SERVICE ROUTINE ;------------------------------------------------------------------------------ ORG 0x0004 ;------------------------------------------------------------------------------ ; USER INTERRUPT SERVICE ROUTINE GOES HERE ;------------------------------------------------------------------------------ ; Note the 16F1827 family automatically handles context restoration for ; W, STATUS, BSR, FSR, and PCLATH where previous templates for 16F families ; required manual restoration. Shadow registers store these SFR values, and ; shadow registers may be modified since they are readable and writable for ; modification to the context restoration. ;****************************************************************************** ;TIMER2 INTERRUPT SERVICE btfss PIR1,TMR2IF ;if interrupt T2 service event bra ENDINT ; bcf PIR1,TMR2IF ;clear interrupt flag from timer2 module bsf TIMERS,T_01ms ;set flag 100uS decfsz CNT_1,F ; bra ENDINT ; movlw C1ms ; movwf CNT_1 ;1mS counter bsf TIMERS,T_1ms ;set flag decfsz CNT_10,F ; bra ENDINT ; movlw C10ms ; movwf CNT_10 ;10mS counter bsf TIMERS,T_10ms ;set flag decfsz CNT_100,F ; bra ENDINT ; movlw C100ms ; movwf CNT_100 ;100mS counter bsf TIMERS,T_100ms ;set flag decfsz CNT_1s,F ; bra ENDINT ; movlw C1s ; movwf CNT_1s ;1Sec counter bsf TIMERS,T_1s ;set flag decfsz CNT_1m,F ; bra ENDINT ; movlw C1m ; movwf CNT_1m ;1min counter bsf TIMERS,T_1m ;set flag decfsz CNT_1h,F ; bra ENDINT ; movlw C1h ; movwf CNT_1h ;1hour counter bsf TIMERS,T_1h ;set flag decfsz CNT_1d,F ; bra ENDINT ; movlw C1d ; movwf CNT_1d ;1min counter bsf TIMERS,T_1d ;set flag ENDINT: RETFIE ; return from interrupt ;------------------------------------------------------------------------------ ; MAIN PROGRAM ;------------------------------------------------------------------------------ START ; !!! posto nakon reseta mcu clock je na 500kHz moramo prebaciti clock na ; !!! zeljeni radni takt (uzet je 4Mhz da bi imali 1uS vreme izvrsenja instrukcije) movlw b'01101000' ; bi7 PLL off ; bit 6-3 intrnal osc on 4Mhz ; bit 2 = 0 ; bit 1-0 sistem clock select in config1 word BANKSEL OSCCON ; selektovati BANK od OSCCON registra ;BANKSEL je direktiva ASM-u da generise kod za pristup naznacenoj banci SFR ERRORLEVEL -302 ; iskljuciti upozorenje ASM-a movwf OSCCON ; od ovog momenta krece MCU na 4Mhz ERRORLEVEL +302 ; ponovo ukljuciti upozorenje ASM-a ; ERRORLEVEL je direktiva ASM-u da iskljuci/ukljuci upozorenje ; 302 je broj upozorenja ASM-a da se pristupa SFR u drugoj BANCI a ne u BANK0 BANKSEL TRISB ; potrebna nam je banka TRISB da odredimo I/O pinove ERRORLEVEL -302 movlw b'00000000' ; svi pinovi u OUTPUT jer palimo LED-ovke movwf TRISB ; postavi pinove PORT-a B ERRORLEVEL +302 ; BANKSEL LATB ; OUTPUT LATCH ERRORLEVEL -302 ; clrf LATB ; all .0. ERRORLEVEL +302 ; BANKSEL TIMERS ; selektujemo BANK gde su nase varijable clrf TIMERS ; reset all flags movlw C1ms ; reload za 1mS movwf CNT_1 ; u 1mS counter movlw C10ms ; reload za 10mS movwf CNT_10 ; u 10mS counter movlw C100ms ; reload za 100mS movwf CNT_100 ; u 100mS counter movlw C1s ; reload za 1Sec movwf CNT_1s ; u 1Sec counter movlw C1m ; reload za 1min movwf CNT_1m ; u 1min counter movlw C1h ; reload za 1hour movwf CNT_1h ; u 1h counter movlw C1d ; reload za 1day movwf CNT_1d ; u 1 day counter movlw b'00000000' ; prescaler 1:1, postscaler 1:1 movwf T2CON ; timer2 movlw D'99' ; 100 x 1uS - latency movwf PR2 ; compare value bsf T2CON,TMR2ON ; start timer 2 BANKSEL PIE1 ; ERRORLEVEL -302 ; bsf PIE1,TMR2IE ; enable interrupt from TMR2 ERRORLEVEL +302 ; BANKSEL INTCON ; bsf INTCON,PEIE ; enable peripheral interrupts bsf INTCON,GIE ; enable all interrupts MAINLOOP: movfw TIMERS ; btfsc STATUS,Z ; cekamo da neko vreme istekne goto MAINLOOP ; ;***********************************; ; obrada po isteku vremena movfw TIMERS BANKSEL LATB ; OUTPUT LATCH ERRORLEVEL -302 ; xorwf LATB,F ; ERRORLEVEL +302 ; BANKSEL TIMERS ; ;***********************************; clrf TIMERS ; obrisi sve flagove goto MAINLOOP ; kraj obrade END