edofbrighton
Member
hello,
I'm trying to convert an analogue voltage to a digital volatge usiing the pic16f690. The voltage being converted comes from a wheatstone bridge. The output from the bridge is connected to two voltage follower op-amps used as buffers; The outputs of the buffers are connected to a differential op-amp circuit used to obtain the difference in their voltages; The output from differntial op-amp is then connected to an RC low-pass filter which acts an anti-aliasing filter; Finally the output of the filter is connected to another voltage follower (buffer) and connected to the pic. When the output from the citcuit is not connected to the pic it is as desired around 2V, but when it is connected to the PIC it falls to about 0.6V. The voltage does not change when it is supposed to if it is connected to the PIC.
I tried ADC reguardless, because i thought this may be normal, but it did not work.
Does anybody know what is going wrong? Here is my code:
pin C7-AN9 used for ADC
I'm trying to convert an analogue voltage to a digital volatge usiing the pic16f690. The voltage being converted comes from a wheatstone bridge. The output from the bridge is connected to two voltage follower op-amps used as buffers; The outputs of the buffers are connected to a differential op-amp circuit used to obtain the difference in their voltages; The output from differntial op-amp is then connected to an RC low-pass filter which acts an anti-aliasing filter; Finally the output of the filter is connected to another voltage follower (buffer) and connected to the pic. When the output from the citcuit is not connected to the pic it is as desired around 2V, but when it is connected to the PIC it falls to about 0.6V. The voltage does not change when it is supposed to if it is connected to the PIC.
I tried ADC reguardless, because i thought this may be normal, but it did not work.
Does anybody know what is going wrong? Here is my code:
pin C7-AN9 used for ADC
Code:
#include <p16F690.inc>
__config (_XT_OSC & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _BOR_OFF & _IESO_OFF & _FCMEN_OFF)
;----------------------------------------
; DELAY EQUATES
ONES EQU 0X25 ;ADDRESS FOR COUNTER
TENS EQU 0X26 ;ADDRESS FOR COUNTER2
HUNDEREDS EQU 0X27 ;ADDRESS FOR COUNTER3
CNT4 EQU 0X28 ;ADDRESS FOR COUNTER4
BREATH_ADC0 EQU 0X29 ;ADDRESS FOR RECEIVED BIT
BREATH_ADC1 EQU 0X2A
NUMBER_OF_BREATHS EQU 0X2B
CNT5 EQU 0X2C
BINARY EQU 0X2D
t1 EQU 0X2E
w2 EQU 0X2F
COUNTER EQU 0X30
TEMP EQU 0X31
D1 EQU 0X32
D0 EQU 0X33
SAMPLEREG EQU 0X34
D2 EQU 0X35
D3 EQU 0X36
SAMPLEOLD EQU 0X37
SAMPLENEW EQU 0X38
D4 EQU 0X39
D5 EQU 0X3A
D6 EQU 0X3B
SAMPLEOLDLOW EQU 0X3C
SAMPLEOLDHIGH EQU 0X3D
SAMPLENEWLOW EQU 0X3E
SAMPLENEWHIGH EQU 0X3F
W_Save EQU 0X40
STATUS_Save EQU 0X41
TOTALBREATHS EQU 0X42
SAMPLE1 EQU 0X43
SAMPLE2 EQU 0X44
SAMPLE3 EQU 0X45
SAMPLE4 EQU 0X46
SAMPLE5 EQU 0X47
SAMPLE6 EQU 0X48
SAMPLE7 EQU 0X49
SAMPLE8 EQU 0X50
SAMPLE9 EQU 0X51
SAMPLE10 EQU 0X52
SAMPLE11 EQU 0X53
SAMPLE12 EQU 0X54
TIMERCOUNTER EQU 0X55
TOTALNOB EQU 0X56
D7 EQU 0X57
; LCD EQUATES AND DEFINES
#DEFINE DDRE TRISB,7 ;DATA DIRECTION
#DEFINE DDRRS TRISB,4 ;DATA DIRECTION
#DEFINE E PORTA,2 ;ENABLE LINE ON LCD
#DEFINE RS PORTB,4 ;INSTRUCTION/DATA SELECT
#DEFINE RW PORTB,6
TEMP_LCD EQU 0X3A ;STORAGE FOR LCD
LCD EQU PORTC ;LCD DATA PORT
CLRSCR EQU B'00000001' ;COMMAND FOR CLRSCR
HOME EQU B'00000010' ;SENDS CURSOR TO HOME
ON EQU B'00001100' ;TURNS ON THE DISPLAY
OFF EQU B'00001000' ;TURNS THE DISPLAY OFF
LEFT EQU B'00011000' ;LEFT SHIFT
RIGHT EQU B'00011100' ;RIGHT SHIFT
LIN2 EQU B'11000000' ;SETS TO LINE 2
TIMERCOMP EQU D'4'
;----------------------------------------
; VECTOR FOR NORMAL START UP.
ORG 0
GOTO START
;-----------------------------------------------
; MAIN PROGRAM STARTS HERE:
;----------------------------------------------
START:
CLRW ; CLEAR W.
MOVWF PORTA ; ENSURE PORTA IS ZERO BEFORE WE ENABLE IT.
MOVWF PORTB ; ENSURE PORTB IS ZERO BEFORE WE ENABLE IT.
MOVWF PORTC
BSF STATUS,RP1
MOVLW H'00'
MOVWF ANSEL
MOVLW B'00000010' ;DIGITAL/ANALOGUE SETS AN9 AS ANANLOGUE
MOVWF ANSELH
BCF STATUS,RP1
BSF STATUS,RP0 ; SELECT BANK 1
MOVLW B'0000100' ; SETS CLOCK TO BE RUN FROM EXTERNAL OSC. DEFINED IN CONFIG BITS. PAY ATENTION TO BITS 0 AND 3 FOR REPORT
MOVWF OSCCON
MOVLW H'00' ; ALL PORTA OUTPUTS
MOVWF TRISA ; SET TRISA REGISTER.
MOVLW B'00100000' ; SET B5 RX PIN AS INPUT
MOVWF TRISB ; SET TRISB REGISTER.
MOVLW H'10000000' ;ALL OF PORTC OUTPUTS EXCEPT C7 INPUT FOR A2D
MOVWF TRISC
MOVLW 0x10 ; A2D Clock Fosc/8 4MHz CLOCK COVERSION TIME 2US
MOVWF ADCON1
BCF STATUS,RP0 ; RESELECT BANK 0.
MOVLW B'10100101' ; ADCON0 . ADCON 0 BIT 7=0 LJ. BIT 6=0 VDD REF. BITS 5-2 1011 SEL AN11. BIT 1 GO/DONE BIT. BIT0=1 ENABLE IT.
MOVWF ADCON0
CALL UART_SETUP
DISPLAYADC0EDIT1:
MOVLW D'255' ;MOVES 255 TO OLD SAMPLE LOW AND HIGH BYTES
MOVWF SAMPLEOLDLOW
MOVWF SAMPLEOLDHIGH
CLRF NUMBER_OF_BREATHS ;CLEARS NUMBER OF BREATHS
CLRF TOTALNOB ;CLEARS TOTAL NUMBER OF BREATHS
DISPLAYADCEDIT1:
BSF ADCON0,GO ; STARTS ADC CONVERSION
BTFSS ADCON0,GO ; POLLING WHEN TO SEE WHEN ADC HAS BEEN COMPLETE
GOTO $-1
MOVFW ADRESH ;MOVES HIGH BYTE OF ADC TO SAMPLE HIGH
MOVWF SAMPLENEWHIGH
MOVFW ADRESL ;MOVES LOW BYTE OF ADC TO SAMPLE LOW
MOVWF SAMPLENEWLOW
;CALL LARGECOMPAREOLDGTNEW ;COMPARES THE LAST ADC SAMPLE TO NEW ADC SAMPLE. IF THE NEW IS GREATER THAN THE OLD SAMPLEREG BIT 0 IS SET.
;BTFSC SAMPLEREG,0
;INCF NUMBER_OF_BREATHS
MOVLW 'B'
CALL SEND
;MOVFW NUMBER_OF_BREATHS
MOVFW SAMPLENEWHIGH
CALL GETHNDS
CALL LOOKUP_TABLE
MOVWF SAMPLE1
CALL SEND
;MOVFW NUMBER_OF_BREATHS
MOVFW SAMPLENEWHIGH
CALL GETTENS
CALL LOOKUP_TABLE
MOVWF SAMPLE2
CALL SEND
;MOVFW NUMBER_OF_BREATHS
MOVFW SAMPLENEWHIGH
CALL GETONES
CALL LOOKUP_TABLE
MOVWF SAMPLE3
CALL SEND
;MOVFW NUMBER_OF_BREATHS
MOVFW SAMPLENEWLOW
CALL GETHNDS
CALL LOOKUP_TABLE
MOVWF SAMPLE1
CALL SEND
;MOVFW NUMBER_OF_BREATHS
MOVFW SAMPLENEWLOW
CALL GETTENS
CALL LOOKUP_TABLE
MOVWF SAMPLE2
CALL SEND
;MOVFW NUMBER_OF_BREATHS
MOVFW SAMPLENEWLOW
CALL GETONES
CALL LOOKUP_TABLE
MOVWF SAMPLE3
CALL SEND
GOTO DISPLAYADCEDIT1
CALL INTERRUPTSETUP
CALL DISPLAYADC0EDIT
ROWANISGAY:
MOVLW 'H'
CALL SEND
MOVLW 'E'
CALL SEND
MOVLW 'L'
CALL SEND
MOVLW 'L'
CALL SEND
MOVLW 'O'
CALL SEND
CALL TENSECONDS
GOTO ROWANISGAY
;---------------------------------------------------
;DISPLAYS BREATHING RATE
;---------------------------------------------------
DISPLAYBREATHINGRATE:
MOVLW CLRSCR
CALL COMMAND
MOVFW NUMBER_OF_BREATHS
ADDWF TOTALNOB
MOVFW TOTALNOB
CALL DISPLAYBCD
MOVLW 'B'
CALL DISPLAY
MOVLW 'R'
CALL DISPLAY
MOVLW ':'
CALL DISPLAY
CLRF TIMERCOUNTER
CLRF TOTALBREATHS
MOVFW SAMPLE11
MOVWF SAMPLE12
ADDWF TOTALBREATHS
MOVFW SAMPLE10
MOVWF SAMPLE11
ADDWF TOTALBREATHS
MOVFW SAMPLE9
MOVWF SAMPLE10
ADDWF TOTALBREATHS
MOVFW SAMPLE8
MOVWF SAMPLE9
ADDWF TOTALBREATHS
MOVFW SAMPLE7
MOVWF SAMPLE8
ADDWF TOTALBREATHS
MOVFW SAMPLE6
MOVWF SAMPLE7
ADDWF TOTALBREATHS
MOVFW SAMPLE5
MOVWF SAMPLE6
ADDWF TOTALBREATHS
MOVFW SAMPLE4
MOVWF SAMPLE5
ADDWF TOTALBREATHS
MOVFW SAMPLE3
MOVWF SAMPLE4
ADDWF TOTALBREATHS
MOVFW SAMPLE2
MOVWF SAMPLE3
ADDWF TOTALBREATHS
MOVFW SAMPLE1
MOVWF SAMPLE2
ADDWF TOTALBREATHS
MOVFW NUMBER_OF_BREATHS
MOVWF SAMPLE1
ADDWF TOTALBREATHS
CLRF NUMBER_OF_BREATHS
MOVFW TOTALBREATHS
CALL DISPLAYBCD
MOVLW ' '
CALL DISPLAY
MOVLW 'b'
CALL DISPLAY
MOVLW 'p'
CALL DISPLAY
MOVLW 'm'
CALL DISPLAY
RETURN
;----------------------------------------------------
;FINDS ASCII EQUIVILENT FOR VAULE IN W
;----------------------------------------------------
LOOKUP_TABLE:
ANDLW B'00001111' ;STOP VALUE GOING BEYOND TABLE RANGE
ADDWF PCL
RETLW '0'
RETLW '1'
RETLW '2'
RETLW '3'
RETLW '4'
RETLW '5'
RETLW '6'
RETLW '7'
RETLW '8'
RETLW '9'
;---------------------------------------------------
;SEND BREATHING RATE
;---------------------------------------------------
SENDBREATHINGRATE:
MOVLW '$'
MOVLW 'B'
CALL DISPLAY
MOVLW 'R'
CALL DISPLAY
MOVLW ':'
CALL DISPLAY
CLRF TIMERCOUNTER
CLRF TOTALBREATHS
MOVFW SAMPLE11 ;SHIFTS EACH SAMPLE UP ONE AND DISGUARDS SAMPLE12. EACH SAMPLE IS ADDED TO THE TOTAL NUMBER OF BREATHS.
MOVWF SAMPLE12
ADDWF TOTALBREATHS
MOVFW SAMPLE10
MOVWF SAMPLE11
ADDWF TOTALBREATHS
MOVFW SAMPLE9
MOVWF SAMPLE10
ADDWF TOTALBREATHS
MOVFW SAMPLE8
MOVWF SAMPLE9
ADDWF TOTALBREATHS
MOVFW SAMPLE7
MOVWF SAMPLE8
ADDWF TOTALBREATHS
MOVFW SAMPLE6
MOVWF SAMPLE7
ADDWF TOTALBREATHS
MOVFW SAMPLE5
MOVWF SAMPLE6
ADDWF TOTALBREATHS
MOVFW SAMPLE4
MOVWF SAMPLE5
ADDWF TOTALBREATHS
MOVFW SAMPLE3
MOVWF SAMPLE4
ADDWF TOTALBREATHS
MOVFW SAMPLE2
MOVWF SAMPLE3
ADDWF TOTALBREATHS
MOVFW SAMPLE1
MOVWF SAMPLE2
ADDWF TOTALBREATHS
MOVFW NUMBER_OF_BREATHS ;MOVES NEW SAMPLE TO SAMPLE 1
MOVWF SAMPLE1
ADDWF TOTALBREATHS
CLRF NUMBER_OF_BREATHS ; CLEARS NUMBER OF BREATHS READY FOR NEXT 5 SECOND COUNT
MOVLW 'B' ;SENDS CHARACTERS FOR MESSAGE
CALL SEND
MOVLW 'R'
CALL SEND
MOVLW ':'
CALL SEND
MOVFW TOTALBREATHS ;CONVERTS TOTAL NUMBER OF BREATHS TO BCD AND SENDS IT
CALL GETHNDS
CALL LOOKUP_TABLE
MOVWF HUNDEREDS
CALL SEND
MOVFW TOTALBREATHS
CALL GETTENS
CALL LOOKUP_TABLE
MOVWF TENS
CALL SEND
MOVFW TOTALBREATHS
CALL GETONES
CALL LOOKUP_TABLE
MOVWF ONES
CALL SEND
MOVLW 'b' ;SENDS MORE CHARACTERS FOR MESSAGE
CALL SEND
MOVLW 'p'
CALL SEND
MOVLW 'm'
CALL SEND
RETURN
;----------------------------------------------------------------------------------------------
;-INCREAMENTS NUMBER OF BREATHS IF CHANGE OF DIRECTION IN VOLTAGE HAS OCCURRED. CHECK WHICH WAY
;-----------------------------------------------------------------------------------------------
INCFNOB:
BTFSC SAMPLEREG,1 ;SKIPS IF BIT 1 OF SAMPLE REG IS SET. IF IT IS NOT NOB IS INCREMENTED
INCF NUMBER_OF_BREATHS
BSF SAMPLEREG,1 ;SETS BIT 1 OF SAMPLE REG.
RETURN
;----------------------------------------------------------------------------------------------
;8-BIT COMPARE FOR ADC SAMPLES
;---------------------------------------------------------------------------------------------
SAMPLEOLD_GT_SAMPLENEW:
BTFSC SAMPLEREG,1 ;IF THIS BIT IS SET MEANS THAT THERE HAS BEEN A CHANGE IN VOLTAGE DIRECTION
GOTO INCFNOB
MOVFW ADRESH
INCF W ;NEEDS TO BE INCREMENTED SO CARRY FLAG DOESN'T SET WHEN THEY ARE EQUAL
MOVFW SAMPLENEW
SUBWF SAMPLEOLD
BTFSS STATUS,C
BCF SAMPLEREG,0 ;IF NEW SAMPLE IS GREATER THAN OLD THIS WILL BE CLEAR
MOVFW SAMPLENEW
MOVWF SAMPLEOLD
RETURN
DISPLAYADC0:
MOVLW D'255'
MOVWF SAMPLEOLDLOW
MOVWF SAMPLEOLDHIGH
CLRF NUMBER_OF_BREATHS
DISPLAYADC:
BSF ADCON0,GO ; start conversion
BTFSS ADCON0,GO ; this bit will change to zero when the conversion is complete
GOTO $-1
MOVFW ADRESH
MOVWF SAMPLENEWHIGH
MOVFW ADRESL
MOVWF SAMPLENEWLOW
CALL LARGECOMPAREOLDGTNEW
BTFSC SAMPLEREG,0
CALL INCFNOB
MOVFW NUMBER_OF_BREATHS
CALL DISPLAYBCD
;CALL TENTH_SEC_DELAY
MOVLW CLRSCR ; Clear the screen
CALL COMMAND
MOVFW SAMPLENEWHIGH
MOVWF SAMPLEOLDHIGH
MOVFW SAMPLENEWLOW
MOVWF SAMPLEOLDLOW
GOTO DISPLAYADC
;-------------------------------------------------------------------------------------------------------
;COUNTS THE NUMBER OF BREATHS TAKEN UNTIL IT IS INTERRUPTED. TIMER1 INTERRUPTS PROGRAM EVERY 0.5 SECONDS
;-------------------------------------------------------------------------------------------------------
DISPLAYADC0EDIT:
MOVLW D'255' ;MOVES 255 TO OLD SAMPLE LOW AND HIGH BYTES
MOVWF SAMPLEOLDLOW
MOVWF SAMPLEOLDHIGH
CLRF NUMBER_OF_BREATHS ;CLEARS NUMBER OF BREATHS
CLRF TOTALNOB ;CLEARS TOTAL NUMBER OF BREATHS
DISPLAYADCEDIT:
BSF ADCON0,GO ; STARTS ADC CONVERSION
BTFSS ADCON0,GO ; POLLING WHEN TO SEE WHEN ADC HAS BEEN COMPLETE
GOTO $-1
MOVFW ADRESH ;MOVES HIGH BYTE OF ADC TO SAMPLE HIGH
MOVWF SAMPLENEWHIGH
MOVFW ADRESL ;MOVES LOW BYTE OF ADC TO SAMPLE LOW
MOVWF SAMPLENEWLOW
CALL LARGECOMPAREOLDGTNEW ;COMPARES THE LAST ADC SAMPLE TO NEW ADC SAMPLE. IF THE NEW IS GREATER THAN THE OLD SAMPLEREG BIT 0 IS SET.
BTFSC SAMPLEREG,0 ;IF NEW WAS GREATER INCFNOB IS CALLED. INCFNOB WILL INCREMENT NOB ONLY IF THE RESULT OF THE LAST
CALL INCFNOB
MOVFW SAMPLENEWHIGH ;MOVES NEW SAMPLE TO OLD SAMPLE FOR NEXT LOOP
MOVWF SAMPLEOLDHIGH
MOVFW SAMPLENEWLOW
MOVWF SAMPLEOLDLOW
GOTO DISPLAYADCEDIT ;RETURNS TO GET NEW ADC
RETURN
ADCTRIAL
BSF ADCON0,GO ; start conversion
BTFSS ADCON0,GO ; this bit will change to zero when the conversion is complete
GOTO $-1
MOVFW ADRESH
MOVWF SAMPLENEW
;CALL SAMPLENEW_GT_SAMPLEOLD
BTFSS SAMPLEREG,0
INCF NUMBER_OF_BREATHS
MOVLW CLRSCR ; Clear the screen
MOVFW NUMBER_OF_BREATHS
CALL COMMAND
CALL DISPLAYBCD
;CALL TENTH_SEC_DELAY
GOTO ADCTRIAL
RETURN
;--------------------------------------------------
;DISPLAYS BCD FOR VALUE CONTAINED IN W
;--------------------------------------------------
DISPLAYBCD:
MOVWF BINARY
CALL GETHNDS
CALL LOOKUP_TABLE
CALL DISPLAY
MOVFW BINARY
CALL GETTENS
CALL LOOKUP_TABLE
CALL DISPLAY
MOVFW BINARY
CALL GETONES
CALL LOOKUP_TABLE
CALL DISPLAY
RETURN
; -------------------------------------------
; RECEIVES BYTES
; -------------------------------------------
; This routine does not return until a character is received.
;
RECEIVE:
btfss PIR1,RCIF ; (5) check for received data
goto RECEIVE
movf RCREG,W ; save received data in W
BTFSC STATUS,Z
GOTO RECEIVE
BCF RCSTA,CREN
BSF RCSTA,CREN
return
; -------------------------------------------------------------
; SENDS BYTES
; -------------------------------------------------------------
;
SEND:
movwf TXREG ; send data in W
BCF PIR1,RCIF
BSF STATUS,RP0
WtHere
btfss TXSTA,TRMT ; (1) transmission is complete if hi
goto WtHere
BCF STATUS,RP0
return
;--------------------------------------------------------------
;INITIALISES UART
;--------------------------------------------------------------
UART_SETUP: ;This should give a Baud Rate of just over 1500.
bsf STATUS,RP0
movlw D'207' ;207 GIVES 300BPS NO ERROR AT THIS BAUD RATE
movwf SPBRG
movlw b'00100000' ; brgh = low (2)
movwf TXSTA ; enable Async Transmission, set brgh
bcf STATUS,RP0 ; RAM PAGE 0
movlw b'10010000' ; enable Async Reception
movwf RCSTA
return
;-------------------------------------------------------------
;INTIALISES UART FOR BAUD RATE OF 4800?
;-------------------------------------------------------------
GPSUART_SETUP:
bsf STATUS,RP0
movlw D'191' ; 0x19=9600 bps (0x0C=19200 bps)
movwf SPBRG
movlw b'00100100' ; brgh = high (2)
movwf TXSTA ; enable Async Transmission, set brgh
bcf STATUS,RP0 ; RAM PAGE 0
movlw b'10010000' ; enable Async Reception
movwf RCSTA
return
;------------------------------------------------------------
; INTILAISES LCD
;------------------------------------------------------------
INIT_LCD:
CALL MILLISEC30
MOVLW B'00111000' ;tell display its two line0
CALL COMMAND
MOVLW B'00001110'
CALL COMMAND
CALL CLEARSCREEN
MOVLW B'00000110'
CALL COMMAND
RETURN
;------------------------------------------------------------
; MOVES DDRAM TO BEGININNING OF SECOND LINE
;------------------------------------------------------------
SECOND_LINE:
MOVLW LIN2 ;set to line 2
CALL COMMAND ;output to the screen
RETURN
;------------------------------------------------------------
; EXECUTES COMMANDS IN W FOR LCD
;-----------------------------------------------------------
COMMAND:
BCF RS
BCF RW ;command coming
MOVWF LCD ;PUT OUT ONTO PORT
BSF E ;make sure the enable line is up
CALL MICROSEC50 ;WAIT
BCF E ;clock the data in
BSF RS
RETURN
;************************************************************
; DISPLAYS CONTENTS OF W ON LCD
;************************************************************
DISPLAY: ;make sure it will accept data
BSF RS
BCF RW
MOVWF LCD ;send data to lcd
BSF E ;make sure the enable line is up
CALL MICROSEC50
BCF E
CALL MICROSEC50 ;clock the data in
BSF RS
RETURN
;------------------------------------------------------------
;CLEARS SCREEN OF LCD
;------------------------------------------------------------
CLEARSCREEN:
BCF RS
BCF RW
MOVLW D'1'
MOVWF LCD
BSF E
CALL MILLISEC2
BCF E
CALL MILLISEC2
RETURN
;---------------------------------------------
;RETURNS NUMBER OF HUNDERS FOR VALUE IN W
;---------------------------------------------
GETHNDS
movwf t1
clrf w2
gethnds_loop
movlw .100
incf w2,f
subwf t1,f
btfsc STATUS,C
goto gethnds_loop
decf w2,w
return
;--------------------------------------------
;RETURNS NUMBER OF TENS FOR VALUE IN W
;--------------------------------------------
GETTENS
movwf t1
clrf w2
gettens_loop movlw .10
incf w2,f
subwf t1,f
btfsc STATUS,C
goto gettens_loop
decf w2,w
goto GETONES
;----------------------------------------------
;RETURNS NUMBER OF ONES FOR VALUE STORED IN W
;-------------------------------------------------
GETONES movwf w2
movlw .10
deltens_loop subwf w2,f
btfsc STATUS,C
goto deltens_loop
addwf w2,w
return
;--------------------------------------------------------------------------------------
;COMPARES 16-BIT NUMBER
;SETS BIT 0 OF SAMPLEREG IF NEW SAMPLE WAS GREATER THAN THE OLD
;--------------------------------------------------------------------------------------
LARGECOMPAREOLDGTNEW:
MOVFW SAMPLEOLDLOW ;MOVES LOW BYTE OF OLD SAMPLE TO W
SUBWF SAMPLENEWLOW,w ;SUBTRACTS LOW BYTE OF OLD SAMPLE FROM NEW SAMPLE
MOVFW SAMPLEOLDHIGH ;MOVES HIGH BYTE OF OLD SAMPLE TO W
SKPC ;IF THE CARRY FLAG IS SET SAMPLENEW-SAMPLEOLD WAS POS OR 0 AND NEXT INSTRUCTION WILL BE SKIPPED
INCFSZ SAMPLEOLDHIGH,w ;INCREMENTS OLD SAMPLE. IF IT ZERO GOES TO NEXT INSTRUCTION.
SUBWF SAMPLENEWHIGH,w ;SUBTRACTS HIGH BYTE OF OLD SAMPLE FROM NEW.
SKPNC ;IF OLD WAS GREATER THAN NEW BIT ZERO OF SAMPLEREG IS CLEARED
BCF SAMPLEREG,0
SKPC ;IF NEW WAS GREATER THAN OLD BIT 0 OF SAMPLEREG IS SET
BSF SAMPLEREG,0
RETURN
END