; CC5X Version 3.4, Copyright (c) B Knudsen Data ; C compiler for the PICmicro family ; ************ 24. Jun 2009 9:07 ************* processor 16C84 radix DEC TMR0 EQU 0x01 STATUS EQU 0x03 PORTA EQU 0x05 TRISA EQU 0x85 PORTB EQU 0x06 RP0 EQU 5 RBIF EQU 0 INTF EQU 1 T0IF EQU 2 T0IE EQU 5 GIE EQU 7 OPTION_REG EQU 0x81 pin1 EQU 1 pin2 EQU 2 svrWREG EQU 0x0C svrSTATUS EQU 0x0D GOTO main ; FILE test\int16xx.c ;/* ; USING INTERRUPTS ; ================ ;*/ ; ;#pragma bit pin1 @ PORTA.1 ;#pragma bit pin2 @ PORTA.2 ; ;#include "int16CXX.H" ; ;#pragma origin 4 ORG 0x0004 ; ;interrupt int_server( void) ;{ int_server ; int_save_registers // W, STATUS (and PCLATH) MOVWF svrWREG SWAPF STATUS,W MOVWF svrSTATUS ; ; if (T0IF) { BCF 0x03,RP0 BTFSS 0x0B,T0IF GOTO m003 ; /* TMR0 overflow interrupt */ ; TMR0 = -45; MOVLW 211 MOVWF TMR0 ; if (pin1 == 1) BTFSS 0x05,pin1 GOTO m001 ; pin1 = 0; BCF 0x05,pin1 ; else GOTO m002 ; pin1 = 1; m001 BSF 0x05,pin1 ; T0IF = 0; /* reset flag */ m002 BCF 0x0B,T0IF ; } ; ; if (INTF) { m003 BTFSC 0x0B,INTF ; /* INT interrupt */ ; INTF = 0; /* reset flag */ BCF 0x0B,INTF ; } ; ; if (RBIF) { BTFSS 0x0B,RBIF GOTO m004 ; /* RB port change interrupt */ ; W = PORTB; /* clear mismatch */ MOVF PORTB,W ; RBIF = 0; /* reset flag */ BCF 0x0B,RBIF ; } ; ; /* ; NOTE: GIE is AUTOMATICALLY cleared on interrupt entry and set ; to 1 on exit (by RETFIE). Setting GIE to 1 inside the ; interrupt service routine will cause nested interrupts ; if an interrupt is pending. Too deep nesting may crash ; the program ! ; */ ; ; int_restore_registers // W, STATUS (and PCLATH) m004 SWAPF svrSTATUS,W MOVWF STATUS SWAPF svrWREG,1 SWAPF svrWREG,W ;} RETFIE ; ; ; ;void main( void) ;{ main ; #ifdef _16C71 ; ADCON1 = bin(11); // PORT A is digital ; #endif ; #if defined _16F873 || defined _16F874 || defined _16F876 || defined _16F877 ; ADCON1 = 0b0110; // PORT A is digital ; #endif ; PORTA = 0; //76543210 BCF 0x03,RP0 CLRF PORTA ; TRISA = 0b11111001; MOVLW 249 BSF 0x03,RP0 MOVWF TRISA ; ; OPTION = 0; /* prescaler divide by 2 */ CLRF OPTION_REG ; TMR0 = -45; /* 45 * 2 = 90 periods */ MOVLW 211 BCF 0x03,RP0 MOVWF TMR0 ; T0IE = 1; /* enable TMR0 interrupt */ BSF 0x0B,T0IE ; GIE = 1; /* interrupts allowed */ BSF 0x0B,GIE ; ; ; while (1) { /* infinite loop */ ; pin2 = 0; m005 BCF 0x05,pin2 ; nop(); NOP ; nop(); NOP ; pin2 = 1; BSF 0x05,pin2 ; } GOTO m005 END ; *** KEY INFO *** ; 0x0004 25 word(s) 2 % : int_server ; 0x001D 16 word(s) 1 % : main ; RAM usage: 2 bytes (2 local), 34 bytes free ; Maximum call level: 0 (+1 for interrupt) ; Total of 42 code words (4 %)