Continue to Site

Welcome to our site!

Electro Tech is an online community (with over 170,000 members) who enjoy talking about and building electronic circuits, projects and gadgets. To participate you need to register. Registration is free. Click here to register now.

  • Welcome to our site! Electro Tech is an online community (with over 170,000 members) who enjoy talking about and building electronic circuits, projects and gadgets. To participate you need to register. Registration is free. Click here to register now.

ADC pic 16f90

Status
Not open for further replies.
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
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
 
I should also say that the code does the conversion and sends it to another pic where the contents of the two registers are displayed on an LCD. The contents of both register is 0.
 
This is not right
Code:
BSF     STATUS,RP1
MOVLW	H'00'
MOVWF 	ANSEL
MOVLW	B'00000010'		;DIGITAL/ANALOGUE SETS AN9 AS ANANLOGUE 
MOVWF 	ANSELH

You have all your adc pins set to output and are low

BSF ANSEL,0 ;1 = Analog input. Pin is assigned as analog input.

Code:
     MOVLW    b'10100101'
     MOVWF ADCON0 ;
     CALL SampleTime    ;Wait min sample time
     BSF ADCON0,GO      ;Start conversion
     BCF STATUS,RP1     ;
     BTFSC ADCON0,GO  ;Is conversion done?
     GOTO $-1               ;No, test again
     MOVF ADRESH,W   ;Read upper 2 bits
     MOVWF RESULTHI  ;
     BSF STATUS,RP0    ;Bank 1
     MOVF ADRESL,W    ;Read lower 8 bits
     BCF STATUS,RP0    ;Bank 0
     MOVWF RESULTLO
 
Last edited:
I was under the impression that ansel and anselh difined whether the pin was analogue or digital not the direction. Also, i thought by setting anselh bit 1 i was defining AN9 as an anlogue port?
 
It does but you should clear them and then set just the pin your using. And you have bank problems And you need to set the tris register first
 
Sorry, i should have explained that is the pin i'm using. Anyway I'm pretty certain the code is not the problem anymore; I connected the 5v supply to the pin and got an digital voltage from it. I think the problem perhaps is that the op-amp cannot provide enough current. Although i'm only speculating i really have no idea.
 
Status
Not open for further replies.

Latest threads

New Articles From Microcontroller Tips

Back
Top