pic18LF4553 ve 12bit ADC sorunsalı

Başlatan kantirici, 04 Kasım 2012, 12:40:54

kantirici

Merhaba arkadaşlar.Elimde pic18lf4553 ve expkits deneme kartı var.Bu kartta bulunan pot ve ldr ile analog girişi okudugumda saçma değerler alıyorum.Kartta pic yokken mesela ldryi aktif yaptıgımda an0 girişine aydınlıkta 1.5V geliyor.Pici takıp an0'ı okudugumda aynı koşulda 8 mV okuyorum.Potu an0 girişine bağladıgımda da benzer durum oluyor.Mesela girişe 2.45V giriyorum fakat adc den ham değer 1 okuyorum.Direk 5V girşe uyguladığımda ise değer çok değişiyor.Portta yaklaşık 4.95V gelirken pic ile okudugum değer 4.9XX ve bu XXler aşırı derece oynuyor.12bitde bu kadar değişim normalmidi? Pot ve ldr de neden böyle bir durum oluyor?
ADC'yi okumak için yazdığım kod aşağıda.Yardımlarınız için teşekkürler.

#include <18LF4553.h>
#device ADC=12

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES WDT128                   //Watch Dog Timer uses 1:128 Postscale
#FUSES HS                       //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOPROTECT
#FUSES NOLVP

#use delay(crystal=20000000) //,  clock=5000000
#include <flex_lcd.c>
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,stop=1) 
void main(){
set_tris_a(0xFF);
set_tris_b(0x00);
output_b(0x00);  
output_a(0x00);

   setup_adc(adc_clock_internal);   // ADC clock frekansı  
   setup_adc_ports(AN0_TO_AN1);   //AN0 ve AN1 analog giriş...
   setup_timer_3(T3_DISABLED | T3_DIV_BY_1);//T2 off
   setup_psp(PSP_DISABLED);        // PSP birimi devre dışı
   setup_spi(SPI_SS_DISABLED);     // SPI birimi devre dışı
   setup_timer_1(T1_DISABLED);     // T1 zamanlayıcısı devre dışı
   setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı
   setup_CCP1(CCP_OFF);            // CCP1 birimi devre dışı
   setup_CCP2(CCP_OFF);            // CCP2 birimi devre dışı
unsigned long int adc_ham;
float voltaj;
  lcd_init();
set_adc_channel(0); //AN0 seç
for(;;){ 
 
   adc_ham=read_adc();
   voltaj=adc_ham*(5.0/4095);  
   direnc=voltaj*10.0;
   printf(lcd_putc,"\fham=%lu  ", adc_ham/10); 
   lcd_gotoxy(1,2);
   printf(lcd_putc,"V=%0.3f  ", voltaj);
  delay_ms(100);

}
}

Ersin

SWDIP8 de Port A-E açık ise kapat
SWDIP7 de A0 ve A1 açık ise kapat
SWDIP6 da LDR açık olacak birde öyle dene
( Kullanmadığın yerler SWDIP lerde kapalı olsun )

sadogan

#2
Deneme kartin Dc besleme si 3.3 voltmu ?

mesaj birleştirme:: 04 Kasım 2012, 14:06:41

Alıntı yapılan: kantirici - 04 Kasım 2012, 12:40:54
Merhaba arkadaşlar.Elimde pic18lf4553 ve expkits deneme kartı var.Bu kartta bulunan pot ve ldr ile analog girişi okudugumda saçma değerler alıyorum.Kartta pic yokken mesela ldryi aktif yaptıgımda an0 girişine aydınlıkta 1.5V geliyor.Pici takıp an0'ı okudugumda aynı koşulda 8 mV okuyorum.Potu an0 girişine bağladıgımda da benzer durum oluyor.Mesela girişe 2.45V giriyorum fakat adc den ham değer 1 okuyorum.Direk 5V girşe uyguladığımda ise değer çok değişiyor.Portta yaklaşık 4.95V gelirken pic ile okudugum değer 4.9XX ve bu XXler aşırı derece oynuyor.12bitde bu kadar değişim normalmidi? Pot ve ldr de neden böyle bir durum oluyor?
ADC'yi okumak için yazdığım kod aşağıda.Yardımlarınız için teşekkürler.

#include <18LF4553.h>
#device ADC=12

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES WDT128                   //Watch Dog Timer uses 1:128 Postscale
#FUSES HS                       //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOPROTECT
#FUSES NOLVP

#use delay(crystal=20000000) //,  clock=5000000
#include <flex_lcd.c>
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,stop=1) 

set_tris_a(0xFF);
set_tris_b(0x00);
output_b(0x00);  
output_a(0x00);

   setup_adc(adc_clock_internal);   // ADC clock frekansı  
   setup_adc_ports(AN0_TO_AN1);   //AN0 ve AN1 analog giriş...
   setup_timer_3(T3_DISABLED | T3_DIV_BY_1);//T2 off
   setup_psp(PSP_DISABLED);        // PSP birimi devre dışı
   setup_spi(SPI_SS_DISABLED);     // SPI birimi devre dışı
   setup_timer_1(T1_DISABLED);     // T1 zamanlayıcısı devre dışı
   setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı
   setup_CCP1(CCP_OFF);            // CCP1 birimi devre dışı
   setup_CCP2(CCP_OFF);            // CCP2 birimi devre dışı
unsigned long int adc_ham;
float voltaj;
  lcd_init();
set_adc_channel(0); //AN0 seç
for(;;){ 
 
   adc_ham=read_adc();
   voltaj=adc_ham*(5.0/4095);  
   direnc=voltaj*10.0;
   printf(lcd_putc,"\fham=%lu  ", adc_ham/10); 
   lcd_gotoxy(1,2);
   printf(lcd_putc,"V=%0.3f  ", voltaj);
  delay_ms(100);

}

Main fonksiyonun nerde bulamadim ?

kantirici

@Ersin, hocam onlar kapalı.LDR yada pot geçişlerinde dip anahtarları ayarlıyorum.
@sadogan hocam, hayır 5V ama LF serisi  5vda çalışıyor. main fomksiyonunu foruma kopyalamamışm, kullandığım programnda var yani.

Ersin

Hardware ayrların tamam ise yazılımında sorun var yada compiler ın eski olabilir son versiyonu kur.
Daha önce 18f452 ile LDR örneği yapmıştım herhangi bır sıkıntı yok.ADC örneği var 877 veya 452 ye  göre onda dene ve bak bakalım herşey normal mı.

kantirici

Ersih hocam evet donanımsal bir sorun yok.Elimdeki 877a ile ldr ve pot'u sağlıklı bir şekilde okuyorum.Fakat işin içine 18LF4553 girince pic sapıtıyor.Acaba özel bir konfigirasyon veya adc için ayar felanmı gerek, datasheetden de pek birşey anlayamadım. Birde compilerin 4.137si nete düşmüş, birde onunla deneyeyim.

Ersin

Kodun eksik olduğu için bir yorum yapamayacağım.Şunu ekleyim 4553 4550 nin daha gelişmiş bir modeli olmalı , olayı 4550 gibi düşünürsek usb/vreg cap ı vardır onu switchlerden aç ( SWDIP9 en sağda ) , aşağıda 4550 usb  ile kullandığım header ayarları var ( kristal 20mhz ) bir incele

#include <18F4550.h>
#device ADC=8
 #fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN
 #use delay(clock=48000000)


Örneğinde, tanımlamalarda bir sürü gereksiz satır var onlar default olarak o şekilde zaten.