16F877 çözemediğim bir hata..

Başlatan solidus, 15 Eylül 2010, 23:55:37

solidus

Arkadaşlar aşağıdaki kodda 3 faz gerilim ölçmeye çalıştım ama ama değerler sürekli değişiyor.
110 voltluk 3 adet gerilimi ölçmem gerek fakat ilk okumada değerler sabit görünüyor ama daha sonra sürekli değişiyor. Sanki adc her denemede eksik değer okuyor. Fakat Test için bağladığım değer 110 VDC.
Gerilim bölücü olarak 1M ve 10K lık dirençler kullanıyorum. Nerede hata yapıyorum ? Kodlar alıntıdır. Saygı...
@ DEVICE pic16F877 
@ DEVICE pic16F877, WDT_ON 
@ DEVICE pic16F877, PWRT_ON 
@ DEVICE pic16F877, PROTECT_OFF 
@ DEVICE pic16F877, XT_OSC

DEFINE OSC 20
Define LCD_DREG     PORTD ' LCD data portunu belirle
Define LCD_DBIT     4 ' 4 bit'lik veri yolu
Define LCD_RSREG    PORTD ' LCD register seçme portunu belirle
Define LCD_RSBIT    2 ' LCD register seçme bitini belirle
Define LCD_EREG     PORTD ' LCD enable portunu belirle
Define LCD_EBIT     3 ' LCD enable bitini belirle
Define LCD_LINES    4 ' LCD'deki satir sayisi

DEFINE ADC_BITS     10  ' Set number of bits in result
DEFINE ADC_CLOCK    3   ' Set clock source (rc = 3)
DEFINE ADC_SAMPLEUS 50' Set sampling time in microseconds

ADCON1 = %10000000
TRISA  = 255
PORTA  = 0

'ADC'den okunan digital verilerin tutulacağı değişkenler
A_in        VAR WORD  
B_in        VAR WORD                    ' 
C_in        VAR WORD
 
'Hesaplama işleminde kullanılacaklar değişkenler                    
A_VOLT      VAR WORD  
B_VOLT      VAR WORD 
C_VOLT      VAR WORD

'MOD alma yani (//) kalan bulma değişkenleri  
ModVoltA    VAR BYTE  
ModVoltB    VAR BYTE 
ModVoltC    VAR BYTE 
'------------------------------------------------------------------------------------------------------- 
k           VAR BYTE

'Örnekleme sayısını fazlalaştırmak için 
Toplam1     VAR WORD   
Toplam2     VAR WORD 
Toplam3     VAR WORD 
'------------------------------------------------------------------------------------------------------- 
LCDOUT $FE,1       'LCD temizle 
PAUSE 200          'LCD yi bekle 

MAIN:        
For k = 1 To 10         
ADCIN 0,A_in       '0 nolu kanaldan Analog değeri oku ve A_in değişkenine aktar.
ADCIN 1,B_in       '1 nolu kanaldan Analog değeri oku ve B_in değişkenine aktar.
ADCIN 3,C_in       '3 nolu kanaldan Analog değeri oku ve C_in değişkenine aktar.
Toplam1 =Toplam1 + A_in
Toplam2 =Toplam2 + B_in
Toplam3 =Toplam3 + C_in

NEXT k
 
A_in = Toplam1/10
B_in = Toplam2/10 
C_in = Toplam3/10        
        
BAK:   
IF ADCON0.2=1 THEN BAK    'Çevirme işlemi tamamlanınca Adcon0.2=0 olacak. 

LCDOUT $FE,1,"FAZ A  FAZ B  FAZ C"         
                                          
A_VOLT = (A_in */ 12500)/10   'A_in ile 12500 yi 32 bit olarak çarp ve 10'a böl        
B_VOLT = (B_in */ 12500)/10   'B_in ile 12500 yi 32 bit olarak çarp ve 10'a böl  
C_VOLT = (C_in */ 12500)/10  'C_in ile 12500 yi 32 bit olarak çarp ve 10'a böl

ModVoltA = A_VOLT // 10       'A_VOLT=A_VOLT  MOD  10        
ModVoltB=B_VOLT // 10         'B_VOLT=B_VOLT  MOD  10
ModVoltC=C_VOLT // 10         'C_VOLT=C_VOLT  MOD  10

A_VOLT = A_VOLT/10              
B_VOLT=B_VOLT/10
C_VOLT=C_VOLT/10

LCDOUT $FE,$C0,#A_VOLT 
LCDOUT $FE,$C7,#B_VOLT 
LCDOUT $FE,$CE,#C_VOLT
       
PAUSE 500       
GOTO MAIN
END
Kimine göre kralım kimine göre yalanım… Herkes rahatına baksın, ben adamına göre adamım..

ErsinErce

aşağıdaki satırlar kodunuzda eksik ;)
Toplam1 = 0
Toplam2 = 0
Toplam3 =0