7bit Content-Disposition: attachment; filename="bargraph.asm" ;*********************************************** ; BarGragh Meter (A/D TEST ) ;*********************************************** list p=16c74A #include c:\mplab\p16c74A.inc ERRORLEVEL -302 ORG 0x20 ;*********************** ; RAM REGISTERS ;*********************** CBLOCK 0x21 COUNT1 COUNT2 BITS ENDC ;***************************** ; MACROS ;***************************** BANK0 MACRO BCF STATUS,RP0 BCF STATUS,RP1 ENDM BANK1 MACRO BSF STATUS,RP0 BCF STATUS,RP1 ENDM MOVLF MACRO VAL,DES MOVLW VAL MOVWF DES ENDM ;********************************************************************** ; ;********************************************************************** W_TEMP EQU 0X20 ; VARIABLE USED FOR CONTEXT SAVING STATUS_TEMP EQU 0X21 ; VARIABLE USED FOR CONTEXT SAVING TEST EQU 0x22 ;****************************************** ; ;************************************************* ORG 0X000 ; PROCESSOR RESET VECTOR GOTO START ORG 0X004 ; INTERRUPT VECTOR LOCATION GOTO ADSERVICE ;*********************************************** ; ;************************************************* START CALL PORTINIT CALL ADINIT UPDATE: BCF ADIF,6 ; RESET SOFTWARE A/D FLAG CALL DELAY ; 10 uS DELAY BCF ADCON0,ADIF ; RESET A/D INIT FLAG (ADIF) BSF ADCON0,GO ; START NEW CONVERSION BSF INTCON,GIE ; ENABLE GLOBAL INTERRUPT LOOP BTFSC ADCON0,ADIF ; A/D OVER ? GOTO UPDATE ; YES START NEW CONV. GOTO LOOP ; NO THEN KEEP CHECKING ;********************************************** ; ;************************************************* PUSH: MOVWF W_TEMP ; SAVE OFF CURRENT W REGISTER CONTENTS MOVF STATUS,W ; MOVE STATUS REGISTER INTO W REGISTER BCF STATUS,RP0 ; ENSURE FILE REGISTER BANK SET TO 0 MOVWF STATUS_TEMP ; SAVE OFF CONTENTS OF STATUS REGISTER ;************************************************************* ; ;************************************************************* ADSERVICE: BTFSS ADCON0,ADIF ; A/D INTERUUPT RETFIE ; NO THEN IGNORE MOVF ADRES,W ; GET A/D VALUE CALL TABLE ;************************************************ ; ;********************************************** PULL: BCF STATUS,RP0 ; ENSURE FILE REGISTER BANK SET TO 0 MOVF STATUS_TEMP,W ; RETRIEVE COPY OF STATUS REGISTER MOVWF STATUS ; RESTORE PRE-ISR STATUS REGISTER CONTENTS SWAPF W_TEMP,F SWAPF W_TEMP,W ; RESTORE PRE-ISR W REGISTER CONTENTS RETFIE ; RETURN FROM INTERRUPT ;************************** ; PORT SETTINGS ;************************** PORTINIT CLRF PORTB CLRF PORTD CLRF PORTE BANK1 ; SELECT BANK1 MOVLF B'00000000',TRISB MOVLF B'00000000',TRISD ; PORTD IS OUTPUT MOVLF B'00000000',TRISE ; PORTE IS OUTPUT MOVLF B'10000001',OPTION_REG ; SETUP TIMER0 PRESCALER TO 256 MOVLF B'00000010',ADCON1 ; ALL DIGITAL BANK0 RETURN ;********************************************** ; A/D INIT ;********************************************** ADINIT BSF STATUS,RP0 ; SELECT BANK1 MOVLF B'00000000',ADCON1 ; SELECT CH0 BCF STATUS,RP0 ; SELECT BANK0 CLRF INTCON ; CLEAR ALL INTERRUPTS BSF INTCON,ADIE ; ENABLE A/D INIT MOVLF B'11000001',ADCON0 ; COVERSION CLOCK RC CLRF ADRES BSF PIE1,ADIE ; ENABLE ADC INTERRUPT BSF INTCON,PEIE ; ENABLE PERIPHERAL INTERRUPT RETURN ;******************************************** ; TABLE ;******************************************** TABLE ADDWF PCL,F RETLW B'00000000' RETLW B'00000001' RETLW B'00000011' RETLW B'00000111' RETLW B'00001111' RETLW B'00011111' RETLW B'00111111' RETLW B'01111111' RETLW B'11111111' RETLW 0 ;************************* ;* DELAY ;************************* DELAY CLRF TMR0 MOVF TMR0,W XORLW .10 BTFSS STATUS,Z GOTO $ - 3 RETURN END