PIC18F4550 ADC algılayamama sorunu

Başlatan aaroniero, 24 Ağustos 2017, 18:07:02

aaroniero

Merhaba arkadaşlar, 18f4550 kullandığım bir projemde amacım LMT87-Q1 ile sıcaklığı ölçüp bilgisayara yazdırmak (serial port ekranı aracılığı ile, ben Termite 3.3 kullanıyorum.). Kodumda bir sorun var herhalde ki ekranda hiçbir şey çıkmıyor. Kodum şöyle

#include 18f4550.h
#device adc=10
#fuses NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD
#fuses INTRC_IO
#use delay(clock=7000000)
#use fast_io(a)
#use RS232(baud =9600, bits =8, parity = N, xmit = PIN_C6, rcv = PIN_C7)

long int bilgi;
float voltaj;
int sicaklik;

void main(){
  set_tris_a(0x02);
  setup_adc(ADC_CLOCK_INTERNAL);
  setup_adc_ports(sAN1);
  delay_ms(1);
  
  while(1){
    
    set_adc_channel(1);
    delay_us(20);
    bilgi=read_adc();
    voltaj=0.0048828125*bilgi;
    sicaklik=voltaj*-0.0136;
    printf("%d", sicaklik);
    delay_ms(1000);
    }
}


Önce pic'in çalışmadığını düşündüm fakat ekrana 1 saniye aralıklarla isim yazdırma ya da yanıp sönen led yapma gibi kolay kodlar işe yarıyor. Asıl sorun serial port ekranında hiçbir şeyin çıkmaması, yani saçma sapan yazılar çıksa anlarım ama direk algılamıyor herhalde.
Not: yanıp sönen led yapma işlemini yaparken XT, HS, INTRC_IO gibi fuse'ların yanıp sönme süresini çok uzattığını farkettim (#XT, #INTRC_IO, #use delay(clock=4000000) ayarlarında delay_ms(1000) komutunu uyguladığımda 1 saniye yerine 4 saniye yanık kalıyordu.). Test edince 1 saniyeye en yakın sonuç veren ayarın #use delay(clock=7000000) olduğunu farkettim, o yüzden bu kodda da öyle yaptım. INTRC_IO yu da kullanmayacaktım ama setup_adc(ADC_CLOCK_INTERNAL) yazdığım için kullanmak zorunda olduğumu düşündüm. Bunun sebebini de bilen, bilgilendirmek isteyen varsa beklerim.

Yardımcı olan kişilere şimdiden teşekkür ederim.

mehmet

İç osilatörü 8Mhz. olarak ayarlayıp yeniden deneyin...
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

dumansiz

Alıntı yapılan: aaroniero - 24 Ağustos 2017, 18:07:02


ekrana 1 saniye aralıklarla isim yazdırma ya da yanıp sönen led yapma gibi kolay kodlar işe yarıyor.

Ekrana derken, LCD ekrana mı?
Şunu merak ediyorum. Seriporttan isim vs. yazdırabiliyorsun da; sadece sıcaklığı mı yazdıramıyorsun?

aaroniero

Alıntı yapılan: mehmet - 25 Ağustos 2017, 18:03:30
İç osilatörü 8Mhz. olarak ayarlayıp yeniden deneyin...


her türlü kombinasyonu denedim fakat olmadı maalesef,  clock değeriyle alakası yok gibi duruyor sorun. işin ilginç kısmı CCS de clock böyle yaparken MPLAB XC8'de HS ve 20MHz(external) yapıyorum değerleri, tam istediğim gibi çalışıyor.

Alıntı yapılan: dumansiz - 26 Ağustos 2017, 16:30:27
Ekrana derken, LCD ekrana mı?
Şunu merak ediyorum. Seriporttan isim vs. yazdırabiliyorsun da; sadece sıcaklığı mı yazdıramıyorsun?

LCD kullanmıyorum, bilgiyi bilgisayardaki seri port ekranında görmek istiyorum (arduino, termite, putty gibi programlarda bulunan). Evet basit bir while döngüsü içinde printf komutu kullanıp pickit ile pic'e yerleştirdiğimde ismimi gayet sonsuz kez yazıyor, seri port ekranında görebiliyorum. Fakat attığım koddaki gibi bir analog devresi yaptığımda hiçbir şey yazmıyor ekranda, en azından saçma sapan sayılar çıkmasını beklerim belli aralıklarla fakat o da olmuyor.

aliveli


demekki printf den önce yada printf esnasında program kilitleniyordevren sağlam olmak şartıyla tabiki


bu  arada kombinasyon denemekle program olmaz donanım nasılsa yazılımda söylemen gerekir


INTRC_IO mikrodenetleyicinin çalışması için gerekli sinyali entegrenin kendi ürettiği durumlar için kullanılır nasıl kullanacağın kılavuz dosyalarında yazar keyfine göre 7000000 yazamazsın.




devre şeması nerde?
harici kristal bağlımı?
niye 4550?



aaroniero

İlginç bir şekilde devreyi çalıştırmayı başardım, herhalde eskiden kullandığım pickit 2 sorun yaratıyordu, zaten onu bilgisayara bağlarken de çok sıkıntı yaşıyordum. Pickit 3'e geçip biraz düzeltince çalışmaya başladı.

#include <18f4550.h>
#device adc=10
#include <math.h>
#fuses NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD
#use delay(clock=7000000)
#use fast_io(a)
#use RS232(baud =9600, bits =8, parity = N, xmit = PIN_C6, rcv = PIN_C7)

int32 bilgi;
float voltaj;
float sicaklik;
float var1=13.582;
float var2=0.00433;

void main(){

setup_psp(PSP_DISABLED); // PSP 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ışı
 
 
  set_tris_a(0x01);
  
  setup_adc(ADC_CLOCK_INTERNAL);
  setup_adc_ports(AN0);
  delay_ms(1);
  
  while(1){
    
    set_adc_channel(0);
    delay_us(20);
    bilgi=read_adc();
    voltaj=0.0048828125*bilgi;
    sicaklik=((var1-sqrt(var1*var1 + 4*var2*(2230.8-voltaj*1000)))/(-1*2*var2))+30 ;  //datasheet'teki formül
    printf("%f    %f\n", voltaj, sicaklik);
    delay_ms(2000);
    }
}


Alıntı yapılan: aliveli - 28 Ağustos 2017, 16:18:09
demekki printf den önce yada printf esnasında program kilitleniyordevren sağlam olmak şartıyla tabiki
bu  arada kombinasyon denemekle program olmaz donanım nasılsa yazılımda söylemen gerekir
INTRC_IO mikrodenetleyicinin çalışması için gerekli sinyali entegrenin kendi ürettiği durumlar için kullanılır nasıl kullanacağın kılavuz dosyalarında yazar keyfine göre 7000000 yazamazsın.
devre şeması nerde?
harici kristal bağlımı?
niye 4550?

önce kolay sorulara cevap vereyim, 18f4550 kullanıyorum çünkü elimde o vardı, harici kristal var ve 20MHz, devre şeması koymaya gerek duymadım çünkü çok basit bir devre, sadece bir analog girişi kullanılıyor kodda görüldüğü gibi başka bir şey yok.
bu devreyi çalıştırmayı becerdikten sonra hemen 8MHz girip denedim fakat olmadı, datasheette dahili osilatör 8MHz yazıyor harici 20MHz kullanıyorum ama nedense en iyi sonucu 7MHz girince veriyor, kronometre ile baktığımda girdiğim delay_ms değerleri ile tam örtüşüyor. 8MHz veya 20MHz yazdığımda saçma sapan şeyler çıkıyor, baud rate'ini değiştiriyorum seri port ekranının fakat hep aynı sonuç. cidden ben de çok şaşırdım, internette o kadar devre baktım benimle aynı durumda olan bir kişi bile yok. INTRC_IO'yu kullanmam baştan hataymış zaten, datasheet'i sonradan okuyup anladım.

aliveli

18f4550 yeni başlayanlar için uygun bir mikrodenetleyici değil.
muhtemelen kopyala yapıştır yaptığın kod 16f877 için yazıldı ve 18f4550 için uygun sigorta ayarlarını doğru yapmadığınan çalışmadı

20MHz harici kristal takıp bunu sigorta ayarlarında HS olarak bildirmeden ve #use delay(clock=7000000) yaparak çalıştırman tamamen tesadüf