C

PIC18F4550 adc problemi

Başlatan Cemil_mekatronik, 03 Mart 2014, 15:47:46

Cemil_mekatronik

Çalışmamı yaptım, devredeki 5 volt gerektiren kompanentleri ve PICi dışardan güç kaynağıyla besledim, anten güç devresi, ve 24 volt gerektiren diğer kısımları başka bir adaptörle besledim. Şu an her şey çalışıyor. Digital input tanımladığım bacaklar düzgün çalışmıyordu, düzeldi. Analog kanalların bazıları düzgün çalışmıyordu, çalıştı. Osilatör devresi genellikle çalışmıyordu, her zaman çalışıyor. Şimdi harici olarak düzgün 5 volt sağlamanın peşine düştüm. Cihaz atm içinde çalışacağı için elimde tek 24 volt var. Devreye iki farklı jack ile 24 volt girmeyi düşünüyorum. Birini anten besleme katı, v.s.ye, diğerini ise LM2476S-5 e verip çıkışındaki 5 voltu ilgili kompanentler ve PICe vermeyi düşünüyorum. Fakat toprakları devre içinde hiç bir şekilde birleştirmeyi düşünmüyorum çünkü devreme gelecek 2 tane  24 volt hattı  atmde bulunan aynı power supply çıkışından gelecek. Power supply da birleşsinler. Devre içinde toprakları birleştirirsem 5 voltun dolaştığı yerdeki toprağa 24 voltun toprağındaki gürültü bulaşacak. Bunun haricinde +24 voltu da devre içinde hiç bir şekilde birleştirmeyeceğim, onlar da power supply da birleşsin. Böylelikle +5 volt verecek devre katına minimum gürültü bindirmiş olurum diye düşünüyorum. Bu konuda daha iyi bir fikri olan varsa denemek isterim, ya da ekleyebileceğiniz bir şey var mı? Aklıma daha iyi bir çözüm gelmedi

Cemil_mekatronik

Şimdi de e0 ve e1 pinleri digital input olarak düzgün çalışmıyor :o hat logic 0'a düştüğünde pinde 1 - 2,5 Volt arası dalgalanmalar görüyorum. 2,5 Volt civarında biraz oynayınca bazen pic logic 1 olarak alıyor bu da hatalı çalışmaya neden oluyor. Çıldırtacak beni bu 18F4550

Cemil_mekatronik

ADC problemi tekrar başladı. Ya bu 18F4550 sıkıntılı mı ben mi sıkıntılıyım anlamadım :o

pwm3434

#18
kodlarının  tamamını  ekle. örneğin  sadece adc  okutturma satırlarını başka bir  pic ile dene.  kademeli  olarak çözüm  arayalım... kodlarının  mümkünse tamamını  ekle.

Cemil_mekatronik

Alıntı yapılan: Cemil_mekatronik - 03 Mart 2014, 16:27:04
Ete Bey,
Kodların bir kısmını paylaşıyorum


#include <18f4550.h>
#DEVICE ADC=10
#include <stdlib.h>
#include <math.h>
#include <string.h>
#fuses INTRC,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD
#use delay (clock=8000000)
//#use fast_io(c)
//#use fast_io(d)
//#use standard_io(c)
//#use standard_io(d)
#use rs232 (baud=57600, xmit=pin_c6, rcv=pin_c7, stop=1, parity=N)
#include <LCD_flex.C>
#byte UCON    =  0xF6D
#byte UCFG    =  0xF6F
#priority  rda, timer0, timer1, timer2

.
.
.
.
.
.
.
.
.
.
.
void main()
{         
  setup_timer_0(RTCC_INTERNAL | RTCC_DIV_256 | RTCC_8_BIT);
  setup_timer_1( T1_INTERNAL | T1_DIV_BY_8);
  //setup_adc_ports(NO_ANALOGS);
  setup_adc_ports(AN0_TO_AN3_ANALOG | VSS_VDD);
  setup_adc(ADC_CLOCK_DIV_16);         
  setup_ccp1(CCP_PWM);
  setup_ccp2(CCP_PWM);
  setup_comparator(NC_NC_NC_NC);
  setup_timer_2(T2_DIV_BY_4,249,1);
// setup_timer_3 (T3_INTERNAL | T3_DIV_BY_8);
  setup_timer_3(T3_DISABLED);
  //setup_oscillator(OSC_8MHZ|OSC_NORMAL|OSC_PLL_OFF);
  enable_interrupts(INT_timer0);
  disable_interrupts(INT_timer1);
  disable_interrupts(INT_timer2);
// disable_interrupts(INT_timer3);
  enable_interrupts(int_rda);
  disable_interrupts(GLOBAL);
  UCON=0;
  UCFG=0;
  bit_set(UCFG,3);
  set_pwm1_duty(0);
  set_pwm2_duty(0);
  set_tris_a(0x3F);                       
  set_tris_b(0xF4);
  set_tris_c(0xB4);
  set_tris_d(0x00);
  set_tris_e(0x0F);
  delay_ms(1000);
  output_high(pin_a4);          //rs232 haberleşme saçiliyor
  output_low(pin_d7);           //röleyi kes, readera eneri gitmesin
  output_high(pin_b3);          //led yakılıyor
  lcd_init();
  lcd_gotoxy(1, 1);
  printf(lcd_putc,"\f  CONN  ");
  lcd_gotoxy(1, 2);
  printf(lcd_putc,"CONTROL ");
.
.
.
.
.
.
.
diye devam ediyor. Kodun hepsini paylaşamıyorum çünkü ticari ürün ve imzalanmış sözleşmemiz var bu konuda :D Ben de vicdanım rahat olsun diye ilgili yerleri paylaşıyorum. Bu kodun dışında adc ile ilgili sadece set_adc_channel(), read_adc(), ve adc_done() komutlarını kullanıyorum.

pwm3434

#20
set_adc_channel  satırının  hemen altına  delay   ile  gecikme süresi  yaptınmı.  ticari  tamamda  nasıl çözümlenecek  bu  sorun  %50 yazlım  yada  %50 donnımsal  sorun  olur  başkada  sorun  olamaz değilmi.  kodlar  incelemez  ise   sorun  nasıl   çözülecek.   neyse  ticari  dedin bize  anlayışlı  olmak  düşer sanada sabır.  kendime  göre  elimden  geleni  şartlar  dahilinde  yaparım  tabiki.

Cemil_mekatronik

evet hatta fazladan fazladan bile yaptım, 20 us den fazla.

ete

C dilinin azizliği olsa gerek diye düşünmeden kendimi alamıyorum.
Şu anda bir proje üzerinde çalışıyorum. Analog olarak gelen ses sinyalinden 7 kanal bant geçiren filtre yardımı ile 7 ayrı çıkış elde ediyor ve bu çıkışlarıda mikro saniyeler mertebesinde okuyup bir sürü P10 paneli sürüyorum. Programda her 800 us de bir kesme çalışıyor kesmede dünya kadar panel sürme işi yapılıyor arada da panel dataları yükleniyor yani anlayacağın her şey limitlerde zorlanıyor buna rağmen ADC lerde en ufak bir aksama olmuyor. Okumalar arasına en ufak bir zaman gecikmesi bile koymuyorum.  Bu sendeki olaylara gerçekten bir anlam veremiyorum. Üstelik bende  kart vs de yok. Her şey protoboard da çalışıyor.
Konu ticari olduğu için senide zorlamak istemiyorum. Ortada bir sorun olduğu belli ama programdamı, derleyicidemi yoksa kartta mı belli değil. Sorunun Kaynağını bulabilsen işin kolay ama çaresiz kaldın gibi bir şey.
Mutlaka skop vs ile sürekli olarak sorun çıkan kanallar izlenmeli varsa bir zıplama sıçrama tespit edilmelidir.

Bu arada aklıma gelen bi iki tecrübeyi aktarayım. Geçenlerde başka bir projemde 5 adet 7 segment displayi kesme ile  sürüyordum. Sensör okumaları kesmeden etkilenmeye başlayıp displey lerde kırpışma yaratmaya başladı.  Kesme süresi ile oynayıp her türlü varyasyonu denedim ama maalesef sonuç alamadım. Sonunda parlak bir fikir aklıma geldi. Sorun aslında sensör okuması esnasında kesme emri gelmesi ve programın sensör okumasını bitirmeden kesme etiketine atlamaması idi. Ama bir şeyden emindim sensör okuma süresi iki kesme arasındaki süreden daha kısa idi yada olmalı idi.

Kesme içinde bir bit değişkenini set ettim ve sensör okumaya gitmeden evvel o değikeni sıfırladım ve yeniden 1 olmasını bekledim. değer 1 olunca  hemen sensörleri okudum sonuç mükemmel oldu. Kırpışma kalmadı. Çünki normalde sensör okuma süresi iki kesme arasındaki süreden kısa ama program rast gele sensör okumaya dalınca sorun başgösteriyor idi. Bende okumayı kesmeden çıkar çıkmaz yaparak sorunu aşmış oldum.
Sende de kesme çalışıyor sanırım belki benzer bir şey deneyebilirsin.

Yapabiliyorsan kesmeyi şimdilik kaldır ve okuma işini yap bakalım sorun oluyormu?
Ne bileyim bir yerden bir ip ucu yakalaman lazım ki çareyide peşinden bulasın yada bulalım.

Ete

Cemil_mekatronik

Bir çok şey denedim Ete Bey, yaklaşık 1,5 aydır izliyorum, deniyorum... Ben hiç böyle hatalar görmedim, öyle bir şey var ki yahu bu muydu sorun dedirtecek bana ama hala bulamadım. Söylediğinizi pazartesi günü işte deneyeceğim, inşallah sorunum bundan kaynaklanıyordur. Peki kesmenin digital input u etkilemesi mümkün mü? Bana pek olasılıklı gelmiyor. Sonuçları pazartesi paylaşacağım.

Hepinize iyi geceler

ete

#24
Anlattığın sorunların hiç birisi mümkün değil ama karşında duruyorlar. O halde her şeyden şüphelenmen gerekir. Mantıklı düşünecek olursak ortada iki alternatif var. Birisi adc okuma esnasında kesme gelirse ne olur. Bir şey olmaz diyesim geliyor ama geri planda sistemin nasıl çalıştığını bilemiyoruz. Okuma işlemi bölününce adc bozuk okunuyor olabilir. İkinci alternatif adc işlemi bölünmüyorsa sorun olmaması gerekir. Ben yinede iddia ediyorum ki sorunun referans voltajı kaynaklıdır mutlaka. Bir denemede bunun için yapmanda fayda var. Tamamen bağımsız bir kaynaktan ref voltajı gir ve ayarlardan ref voltajını harici kaynaktan (An3 den idi sanırım) girecek şekilde ayarla bak bakalım.
Ete

Cemil_mekatronik

Yarın deneyeceğim Ete Bey, burdan sizi bilgilendiririm

Powered by EzPortal