;****************************************************************************** ; 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: ioctrl1.asm * ; Date: 21.04.2013 * ; File Version: 1.0 * ; * ; Author: Vladimir Pavkovic * ; Company: Elektrostudio * ; * ; * ;****************************************************************************** ; * ; 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_NSLEEP & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _CPD_OFF & _BOREN_OFF & _CLKOUTEN_OFF & _IESO_OFF & _FCMEN_OFF __CONFIG _CONFIG2, _WRT_OFF & _PLLEN_OFF & _STVREN_ON & _BORV_19 & _LVP_OFF ; !!! Za razliku od defaulta imamo ukljucen WDT izuzev ako je u sleep modu - SIGURNOST!!! ; !!! _CLKOUTEN_OFF umesto _CLKOUTEN_ON ; !!! da bi nam OUTCLK pin bio slobodan za I/O operacije i MCRL pin je sobodan za I/O ; !!! takodje je ukljucen reset ako STACK izadje van granica ;------------------------------------------------------------------------------ ; 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 ; INPUT ; input image INPUTOLD; OUTPUT ; output image OUTPUTOLD; 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' ;INPUT FLAGS definition SW3_2 EQU 7 SW3_1 EQU 6 TA2 EQU 5 TA1 EQU 4 CAPSENS EQU 1 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 (dizemo na 16Mhz sto je najvise bez PLL-a) movlw b'01111000' ; bi7 PLL off ; bit 6-3 internal osc on 16Mhz ; 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 ANSELA ; ERRORLEVEL -302 ; movlw b'00000001' ; porta.0 analog input !!! movwf ANSELA ; BANKSEL OPTION_REG ; bcf OPTION_REG,NOT_WPUEN; BANKSEL WPUA ; bsf WPUA,WPUA5 ; enable pullup on input pin 5 BANKSEL LATA ; clrf LATA ; clear output latch BANKSEL TRISA ; movlw b'11111111' ; movwf TRISA ; all pin as input 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'00000001' ; prescaler 1:4 posto smo na 16Mhz, 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 ;***********************************; clrf INPUT ; clear INPUT image clrf INPUTOLD ; clrf OUTPUT ; clrf OUTPUTOLD ; ;***********************************; ;glavna petlja ; MAINLOOP: ; movfw TIMERS ; btfsc STATUS,Z ; cekamo da istekne 100uS goto MAINLOOP ; ;***********************************; call GETINPUTS ; call get INPUT STATE ;-----------------------------------; movfw INPUT movwf OUTPUT ;-----------------------------------; call PUTOUTPUT ; call put output ;***********************************; BANKSEL TIMERS ; clrf TIMERS ; obrisi sve flagove movfw INPUT ; novo pristigla stanja movwf INPUTOLD ; su sad stara stanja movfw OUTPUT ; nova stanja movwf OUTPUTOLD ; su sad stara stanja clrwdt ; reset WDT timer-a goto MAINLOOP ; kraj obrade ;***********************************; ;get input state ; GETINPUTS: ; BANKSEL PORTA ; movfw PORTA ; xorlw b'11110000' ; mask for inverting INPUT movwf INPUT ; return ; ;***********************************; ;put outputs ; PUTOUTPUT ; BANKSEL OUTPUT ; movfw OUTPUT ; BANKSEL LATB ; OUTPUT LATCH ERRORLEVEL -302 ; movwf LATB ; ERRORLEVEL +302 ; return ; ;***********************************; END