Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME

Ana Menü

usart!

Başlatan MURSEL, 12 Mayıs 2007, 14:40:17

MURSEL

selam arkadaşlar seri haberleşme protoköllerine sizin yardımızla giricem inşallah  ilgili pic ten pice pic den pc ile ilgili çalışma ve giriş için dosyaları paylaşabilirmisiniz asm ile cok ama ccs az ve hep sorunlar üzerinde  umarım gereksiz acmamışımdır konuyu saygılar

MURSEL

SELAM @arkadaşlar
bir tane calışma yaptım umarım  yeni arkadaşlara faydalı olur

PROJE 3 fazlı A.C gerilimin ölcülmesi 1V-2V-3V akımın ölcülmesi I1-I2-I3 , motordaki sıcaklık  bilgisini ve frekansı(max-250 hz)   bilgisayara istege(basılan tuşa) göre göndemek  birebir sehir şebekelrine uygulayabilecegim uygunluk ta gibi (daha uygulamadım!)

volt kısmını ve frekans kısmını hallettim fakat akım  ve sıcaklık sensörleri(yapımcıdan yapımcıya) farklılık gösterecegi için bu  kısmı siz uyarlayın  (unutmayın yazılımda refarans deger +5 v dur  donanımın cıkışını buna göre uayrlayın max degeri +5 verebilcek sekilde )  sonra yazılım algoritmasında gerekli yerlere formulleri yazarak saglam ölçümler yapabilrsiniz gerekli yerleri yazılımda acıklayacagım )

yazılım algoritmasını kabaca acıklayım  klavyeden basılan tuşun ascı karsılıgı  pice gönderilir bu  kodu alıp bir  switch( )  case; komutuyla istedigimiz işlemi yaptırması

a=getc();       //klavyeden basılan tuşun ascı degerini al " a" degişkenine yükle
switch(a)        // a degeri neyse  asagıdaki esit olan case komutunu calıştır
{
case 65:
{
set_adc_channel(0); // pin a0 daki analog girişi aktif et
delay_us(20);
c=read_adc();          // anolog degerin  10 bit cözünürlükteki degerini al
// okudugumuz bu "c" degerini  donanımın özelligine bakarak gerekli formule  sokup pc gönderiyoruz
c=c*100;  //gerekli formulum gerilim için
c=c/256;
printf("\f\n\r1v=%3.2f" ,c); pc ye 32 bitlik ondalıklı olarak gönder
}

her bölüm bu şekilde oluşmaktır  siz gerekli pc den gelen veriye göre gerekli AN (anolg girişi a0-a1-a2-a3-a4-a5-a6-a7) aktif edeerk degeri okuyup tekrar pc  göndermek

FORMUL sanırım kafanızı karıştırdı
programda belirttigimiz  gibi adc=10 bit cözünürlükte

#device ADC=10

refarans degerimiz  +5 v olduguna göre  benimde hattan maxumum 400 v ölcecegimi var sayarsak(direk fazı pice baglamıyoruz tabi :roll:  ilk önce dogrultup saglam bi dogrultmacla sonra geilim bölücü dirençlerde  maximum 400 v da 5 v verecek devreyi yapıyoruz)))  maximum +5 degerini aldıgında adc degeri 1024 olucaktır ki bizimde maximum  ölcme degerimiz 400v olark ayarlandı  
1024/400=2.56 yani adc okudugum degeri 2.56 ya bölücem
formulle nasıl yaparız
c=c*100;
c=c/256;
tamamen gördügünüz gibi donaımsal faktörlere göre formul yazıyoruz

YORULDUM biraz dinlenebilirmiyim :roll:  :roll:

yazılımda diceksiniz bu neyi okuyor altta;
case 75:
{
m=input_d();
printf("\f\n\rfs=%3.2f" ,m);
break;
}
arkadaşlar burdada bir tane pic 16f628 i frekans ölcmek için kullandım ve port b sini parelel olarak direk 16f877 port d sine bagladım veriyi bu sekilde okuyorum :cry:  :cry:  biliyorum hambalca ama  siz bildiginiz veri alma yolalrını shift_right,left gibi bu komutları kullanarak daha az pinle işi götürüsünüz


ASCI KOD;
basında da bahsettigimiz gibi her tuşun ascı kodunu pice yolluyoruz  benim yazılımda kullandıgım harflerin ve bir kısmın ascı kodlarını vericem siz uygulmayı genişletmek isterseniz kullanırsınız

kullandıklarımın yanına // koyup acıklama yapıcam

ALT+065 Karakteri ==> ( A )   // 1v degeri
ALT+066 Karakteri ==> ( B )
ALT+067 Karakteri ==> ( C )
ALT+068 Karakteri ==> ( D )  //3v degeri
ALT+069 Karakteri ==> ( E )
ALT+070 Karakteri ==> ( F )   //1.akım degeri
ALT+071 Karakteri ==> ( G )  //2.akım degeri
ALT+072 Karakteri ==> ( H )   //3.akım degeri
ALT+073 Karakteri ==> ( I )
ALT+074 Karakteri ==> ( J )   // sıcaklık
ALT+075 Karakteri ==> ( K )   // frekans
ALT+076 Karakteri ==> ( L )   //  reklam  case 76 dan sonrasını silebilirsin ama uygulama için güzel biyazım bakamsızı tavsiye ederim
ALT+077 Karakteri ==> ( M )
ALT+078 Karakteri ==> ( N )
ALT+079 Karakteri ==> ( O )
ALT+080 Karakteri ==> ( P )
ALT+081 Karakteri ==> ( Q )
ALT+082 Karakteri ==> ( R )
ALT+083 Karakteri ==> ( S )   // 2.ci volt degeri
ALT+084 Karakteri ==> ( T )
ALT+085 Karakteri ==> ( U )
ALT+086 Karakteri ==> ( V )
ALT+087 Karakteri ==> ( W )
ALT+088 Karakteri ==> ( X )
ALT+089 Karakteri ==> ( Y )
ALT+090 Karakteri ==> ( Z )

rasgele harf secmedim tabi  klavyede bakarsanız  A,S,D,F,G,H,J,K,L yan yanadır zorluk cekmessiniz


GELELİM YAZILIMA;

yukaridaki acıklamadan sonra herşey kabak gibi ordada  :roll:


#include<16f877.h>
#device ADC=10
#use delay(clock=4000000)
#use fast_io(b)
#use fast_io(d)
#use rs232(baud=9600,xmit=PIN_C6,rcv=PIN_C7)
long b,d;
int a;
float c,e,f,g,h,i,o,m;
void main()
{
set_tris_b(0xff);
set_tris_d(0xff);
setup_adc_ports(ALL_ANALOG);
setup_adc(adc_clock_div_2);
output_b(0x00);
set_adc_channel(0);
delay_us(20);
while(1)

{
a=getc();
switch(a)
{
case 65:
{
set_adc_channel(0);
delay_us(20);
c=read_adc();
c=c*100;
c=c/256;
printf("\f\n\r1v=%3.2f" ,c);
break;
}
case 83:
{
set_adc_channel(1);
delay_us(20);
e=read_adc();
e=e*100;
e=e/256;
printf("\f\n\r2v=%3.2f" ,e);
break;
}
case 68:
{
set_adc_channel(2);
delay_us(20);
f=read_adc();
f=f*100;
f=f/256;
printf("\f\n\r3v=%3.2f" ,f);
break;
}
case 70:
{


set_adc_channel(3);
delay_us(20);
g=read_adc();
g=g*100;
g=g/256;
printf("\f\n\rI1=%3.2f" ,g);
break;
}
case 71:
{


set_adc_channel(4);
delay_us(20);
h=read_adc();
h=h*100;
h=h/256;
printf("\f\n\rI2=%3.2f" ,h);
break;
}

case 72:
{


set_adc_channel(5);
delay_us(20);
i=read_adc();
i=i*100;
i=i/256;
printf("\f\n\rI3=%3.2f" ,i);
break;
}
case 74:
{


set_adc_channel(6);
delay_us(20);
o=read_adc();
o=o*100;
o=o/256;
printf("\f\n\rsicaklik=%3.2f" ,o);
break;
}
case 75:
{
m=input_d();
printf("\f\n\rfs=%3.2f" ,m);
break;
}
case 76:
{
                           //yazım calışmasıdır  silebilirsiniz


printf("\f\n\r             ***********************************");
delay_ms(20);
printf("\n\r             *     hazİrlayan=MICROCELL        *");
delay_ms(20);
printf("\n\r             *       AKDENIZ UNIVERSTY         *");
delay_ms(20);
printf("\n\r             *     ELEKTRONIK HABERLESME       *");
delay_ms(20);
printf("\n\r             *İLETİSİM =mursel_58@hotmail.com  *");
delay_ms(20);
printf("\n\r             *******NEOBİL KATKILARIYLA*********");
delay_ms(30);
printf("  \n\r1V=%3.2f" ,c);
delay_ms(30);
printf("\      2V=%3.2f" ,e);
delay_ms(30);
printf("\      3v=%3.2f" ,f);
delay_ms(30);
printf("\n\rI1=%3.2f" ,g);
delay_ms(30);
printf("\      I2=%3.2f" ,h);
delay_ms(30);
printf("\      I3=%3.2f" ,i);
delay_ms(30);
printf("\n\rsİcaklİk=%3.2f" ,o);
delay_ms(30);
printf("\             Hz=%3.2f" ,m);
delay_ms(30);




break;
}
}
}
}


16 F628 İÇİN YAZILIM
herzamnki gibi acıklama
tabiki donanımsız olmassa olmuyor  yaptıgımız devre sehir sebekesine uygun oldugu iiçin 0-250HZ sınır koymamız uygun olacaktır
sebeke gerilimini dogrultmadan gerilim bölücü direnclerde  ve bir diyotla (--)ternansını kaldırıp sadece (+) alternansı   alıp sanideki sayısına bakarak frekansı bulmuş olucez  ve port b  ye bu degeri atıyacagız

gerkli timer taşması için presacaler  ve önbölücü degeri
ön bölücü=2 kendi bölücüsü=256 ve timer taşma degeri =1953
2x256x1940

#include<16f628.h>
#use delay(clock=4000000)
float a;
int c;
#use fast_io(a)
#use fast_io(b)
#int_timer0
void kesme (void)
{
a=a+1;
if(a>=1953) // toplam 1 sn için taşma sayısı
{
output_b(c);  
c=0;
a=0;
}
}
main()
{
setup_timer_0(rtcc_internal|rtcc_div_2);//2*256=512us her kesme süresi
enable_interrupts(INT_TIMER0);
enable_interrupts(GLOBAL);
output_b(0xff);
while(1)
{
while(input(pin_a0)); // her yeni alternans gelmesi
while(!input(pin_a0));
c=c+1;                                      //her alternansta 1 artır
}
}

the  END
umarım yararlı bişeyler olmuştur biraz geniş ve derinlemesi girdim sayfayıda baya işgal ettim  kusura bakmayın saygılar alttaki  linktede proteusta simulasyon ile dogrulanamsı  ve kodlar  SELAMETLE /A.E.O
http://dosya.cc/M_CROCELL.rar.html
NOT : EKSİKLERİMİ VE GELİŞTİRMEK İÇİN BİLGİ VE DÜŞÜNCELERİNİZİ belirtiniz
belirttigim gibi sadece gerilim ve frekans uygulamsı yapılmıştır   akımı lem akım sensörleriyle gerilime cevirip pice uayrlayabilirsiniz
veÜSTATLAR rs485 ile birden fazla pici kontrol etmek gibi uygulamalarınızı mümkünse aktarabilirmisin uygulama olarak