CCS S seri porttan veri gönderme

Başlatan elmariacci, 30 Nisan 2013, 20:58:32

elmariacci

Merhaba arkadaşlar

bitirme ödevim hasta takip sistemi.Bu sistemde hastanin nabzi otomatik olarak ölçülüyor.kablosuz habelerşme ile diğer pic'e gönderiliyor ordan da pc ye rs232 seri haberleşme ile veriyi göndermem gerekiyor.

şimdi ben nabiz ölçme kismini yaptim diğer alici pic'e ölçtüğüm nabiz değerinin udeanin modülleri ile gönderdim alici ile verici devredeki lcdlerde ayni değerler çikiyor bu kisimda sıkıntı yok.

alici ile verici pic 16f877a.bu pic'leri kablosuz haberleşmede kullandiğim için baud en fazla 2400 olabiliyor.Seri haberleşmede ise baud 9600 olmasi gerekiyor.

1)Alici devredeki pic ile direk pc arasinda seri haberleşme yapabilir miyim? (alici devredeki pic baudu:600)

2)ölçtüğüm 3 basamakli sayiyi seri haberleşme ile nasil gönderebilirim.Aşağida Kablosuz haberleşme ile nasil gönderdiğim Verici devresinde mevcut.Seri haberleşme için fput,fprintf gibi kodlari mi kullanmaliyim.f'lere dikkat


VERİCİ
#include "verici.h"





#use delay (clock=4000000) // Gecikme fonksiyonu için kullanılacak osilatör frekansı belirtiliyor.


#use rs232(baud=600,xmit=pin_c6,parity=N,stop=1)


#define use_portb_lcd TRUE


#include <lcd.c>   // lcd.c dosyası tanıtılıyor








int nabiz;
int16 a;


int gonder ;      //gonderilecek datanın aktarıldığı değişken
#bit bittest=gonder.7


void serigonder()
   {
      byte bitkaysayac;
      bitkaysayac=1;
      gonder=a;
      output_low(pin_c6);     //senkron biti
      delay_ms(20);           //için
      output_high(pin_c6);    //pine pals 
      delay_ms(20);           //veriliyor
      while(bitkaysayac<9)    
            {
             if(bittest==1)             //bittest 1 ise
                  {
                  output_low(pin_c6);   //portu 0 yap
                  delay_ms(1);          //1ms 0 da tut
                  output_high(pin_c6);  //portu 1 yap
                  delay_ms(2);          //2ms 1 de tut toplam peryot 3ms
                  }
            else                       //bittest 0 ise
                  {
                  output_low(pin_c6);  //portu 0 yap
                  delay_ms(2);         //2ms 0 da tut
                  output_high(pin_c6); //portu 1 yap
                  delay_ms(1);         //1ms 1 de tut toplam peryot 3ms
                  }
            gonder=gonder<<1;          //gönderi sola kaydır
            bitkaysayac++;             //kayma sayacını arttır
            }  
   }


void main()
   {
  
setup_timer_1(T1_DISABLED);
   
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   
   setup_timer_0(RTCC_EXT_H_TO_L | RTCC_DIV_1);
   
   set_tris_a(0x11);
   
   lcd_init();
   
  
   printf(lcd_putc,"\f     HAZIR!   ");
   
    
   
  
    while(input(pin_a0))
     {;}                // butona basılmamıssa 1 dir. 
     
       while (true)
   {  
   


      printf(lcd_putc,"\f  HESAPLANIYOR ");
      set_timer0(0);
            
      delay_ms(10000); 
         
     nabiz= get_timer0();
         
      a= nabiz * 6;
      
      
      serigonder();
      
     
       printf(lcd_putc,"\f NABIZ=%ld nn/dk",a);
       delay_ms(1000);
         
         }
   }
   




ALICI

#include "alici.h"


#use rs232(baud=600,rcv=pin_c7,parity=N,stop=1)




#define use_portb_lcd TRUE


#include <lcd.c>


int16 a;
int16 peryot_sayac;  //senkronizasyon için kontrol döngüsü
byte buffer;         //alınan data değişkeni
#bit bittest=buffer.0//buffer ın 0. biti için değişken tanımlaması
int bitkaysayac;


void serial()
   {
      peryot_sayac=0;buffer=0;bitkaysayac=1;
      while(input(pin_c7)==0) //pin 0 olduğu sürece burada bekle
            {
            }
      while(peryot_sayac<400)
            {
            if (input(pin_c7)!=1) peryot_sayac=0;//pin peryot_sayac 400 den küçükken 0
            delay_us(10);                           //olursa peryot_sayac sıfırla
            peryot_sayac++;            
            }   
      while(input(pin_c7)==1) //data 0 olana kadar bekle
            {
            }            
      delay_us(1500);
      
      while(bitkaysayac<9)       //kayma sayısını kontrol et
            {
            buffer=buffer<<1;    //bufferi sola kaydır
            if (input(pin_c7)==1) bittest=1; //eger data_pini 1 ise bufferın 0.bitini 1 yap
            else bittest=0;                     //değilse bufferın 0.bitini 0 yap
            delay_us(3000);                     //birdahaki peryot için 3ms bekle
            bitkaysayac++;                      //kayma sayacını arttır
            }
            
            a=buffer;                                  
   }














void main()
   {






lcd_init();
lcd_putc("\f");
lcd_gotoxy(1,1);
printf(lcd_putc,"nabiz ");


while(true){






 
serial();               //seri data al
         lcd_gotoxy(3,2);        //2.satır 3.sütuna git
         printf(lcd_putc,"%u nn/dk",a);//
         delay_ms(1000);
         }
}

skara1214

-bilgisayarla iletişim kurabilirsin max232 devrelerini bir araştır.
-datayı printf komutuyla yollayabilirsin
-seninde belirttiğin gibi software uart ile yollamalısın bilgisayara çünkü zaten hardwarre uartı rf ile kullanıyorsun.stream tanımlaması yapman gerekli ccs c nin manuelinde uarta bakarsan görebilirsin internettede biraz araştırma yapman gerekli
Herkes ölür ama herkes gerçekten yaşamaz

elmariacci

#2
Alıntı yapılan: skara1214 - 30 Nisan 2013, 21:48:35
-bilgisayarla iletişim kurabilirsin max232 devrelerini bir araştır.
-datayı printf komutuyla yollayabilirsin
-seninde belirttiğin gibi software uart ile yollamalısın bilgisayara çünkü zaten hardwarre uartı rf ile kullanıyorsun.stream tanımlaması yapman gerekli ccs c nin manuelinde uarta bakarsan görebilirsin internettede biraz araştırma yapman gerekli

max232'yi biliyorum bağlanti şeklini falan da biliyorum.

şimdi ben sadece alicidaki picten pc ye veriyi gönderecem stream atamam gerek var mi ki siz var demişsiniz ama TX ucu zaten boşta.Stream işini pek bilmiyorum.dediklerinizi araştiracam.


edit:stream işini halletim verici picteki baud600  alici picteki baud değeri ise 9600 rf haberleşme şuan sağlaniyor.şimdi alicidan pc ye veri gonderme işi kaldi 3 basamakli sayi gönderdiğimden dolayi bayaği bi uğraştim inşallah bu kısmı da sizlerin sayesinde yaparim.

bir de şoyle bişey soracam rs232 kablo dişi-dişi mi olmali bir taraf kesin dişi olacakta diğeri de mi dişi olmali??

skara1214

bilgisayarında rs232 portu neyse kabloda o olacak.
Neden 3 basamaklı sayı yollarken sıkıntı yaşadığını anlayamadım?sayıyı eğer işaretsiz tam sayıysa long unsigned olarak tanımla printf("%lu",sayi)  diyerek  yolla
Herkes ölür ama herkes gerçekten yaşamaz

toyo

#use rs232(baud=600, xmit=PIN_b2,rcv=PIN_b1,parity=N,stop=1

nabız bilgisini donanımsal rs232 ile yapıyorsun.rx tx pinlerini kullanarak.
buraya kadar tamam.
--------------------------------------------------

şimdi alıcı devre yani pc ye bilgi göndereceğin devreye iletişimi yazılımsal olarak yapacağın için şunu eklemelisin.
#use rs232(baud=9600, xmit=PIN_a2,rcv=PIN_a1,parity=N,stop=1,stream=iletisim_1)

yazılımsal olarak a2 pininden pcye bilgi yollayıp a1 pininde alacağını belirtik.pinleri değiştirebilirsin.

sen gönderme komutunun başına 'f' ekleyip stream isminide 'iletisim_1' belirtirsen pic a2 pininden pc ye veri yollar.
arkadaşımızın dediği gibi
fprintf(iletisim_1,"%lu",sayi);

şelinde gönderebilrisin.
unutmadan söyleyim yazılımsal olarak yaptığın iletişimde int_rda kesmesini kullanamassın.
Gelirken ne getirilir ki giderken ne götürülür.

elmariacci

Alıntı yapılan: toyo - 01 Mayıs 2013, 11:32:48
#use rs232(baud=600, xmit=PIN_b2,rcv=PIN_b1,parity=N,stop=1

nabız bilgisini donanımsal rs232 ile yapıyorsun.rx tx pinlerini kullanarak.
buraya kadar tamam.
--------------------------------------------------

şimdi alıcı devre yani pc ye bilgi göndereceğin devreye iletişimi yazılımsal olarak yapacağın için şunu eklemelisin.
#use rs232(baud=9600, xmit=PIN_a2,rcv=PIN_a1,parity=N,stop=1,stream=iletisim_1)

yazılımsal olarak a2 pininden pcye bilgi yollayıp a1 pininde alacağını belirtik.pinleri değiştirebilirsin.

sen gönderme komutunun başına 'f' ekleyip stream isminide 'iletisim_1' belirtirsen pic a2 pininden pc ye veri yollar.
arkadaşımızın dediği gibi
fprintf(iletisim_1,"%lu",sayi);

şelinde gönderebilrisin.
unutmadan söyleyim yazılımsal olarak yaptığın iletişimde int_rda kesmesini kullanamassın.

tamam hocam sağol dediklerini deneyecem onceden de çok yardimcı olmuştun.
3 basamakli sayiyi da dediğiniz şekilde gönderiyorum şuan o kismi rf de hallettim seri portta da ayni şekil hallederim.

rs232 kablonun bilgisayara takilan kismi kesin dişi olacak.diğer ucununda 2 nolu pinini kullanarak veri göndereceğim için dişi mi erkek mi alayim onu bilemedim.sonuçta kabloyu 2 nolu pine sokacam.o şekilde veriyi gönderecem.

@skara1214 siz de sağolun hocam gelişmeleri burdan yazarim.

xoom

Bu Alıcı devrede hangi tip konnectör kullandığınıza göre değişir.. Eğer Alıcı devreki kartınıza Dişi Soket taktıysanız PC'den gelen kablonun diğer ucu erkek olmalı..
Alıcı devrenize erkek Soket Takarsanız kablonuzun iki tarafıda dişi olmalıdır.

elmariacci

Alıntı yapılan: xoom - 01 Mayıs 2013, 18:29:39
Bu Alıcı devrede hangi tip konnectör kullandığınıza göre değişir.. Eğer Alıcı devreki kartınıza Dişi Soket taktıysanız PC'den gelen kablonun diğer ucu erkek olmalı..
Alıcı devrenize erkek Soket Takarsanız kablonuzun iki tarafıda dişi olmalıdır.

hocam şuan devre board da kurulu olduğundan konnektör falan bağli değil sadece tx pininden gelen utx kablo (zil teli) var.bu kabloyu direk rs232'nin 2 nolu pinine bağlasam bi sorun olur mu?

xoom

arada max232 entegresi olmadan bağlarsan sorun olur tabikide.. Max232 entegresi  +/-12V gerilimi lojik seviyeye indirgemek için kullanılıyor.

elmariacci

Alıntı yapılan: xoom - 01 Mayıs 2013, 19:13:52
arada max232 entegresi olmadan bağlarsan sorun olur tabikide.. Max232 entegresi  +/-12V gerilimi lojik seviyeye indirgemek için kullanılıyor.
(Resim gizlendi görmek için tıklayın.)

max 232 devresini aldim bağlantiyi biliyorum hocam pic 5v seri port 12v voltaji ayarlamak için kullaniyoruz.yorumun için teşekkkür ederim.

elmariacci

stream=iletisim_1 veri yolunu kullandim ama olmadi.ne hyperterminalde bi değer okuya bildim ne de başka programlarda.

elmariacci

şu seri port işini bir türlü halledemedim.bi merhaba yazisi bile yazdiramiyorum.gorunurde devrede sorun yok zaten pic'ten pc ye veri yolladiğimdan rs232 kablonun 2 ile 5. pinin kullaniyorum kondansatörlerin yonu de değerleride doğru.

kudretuzuner

Merhaba,
PIC'ten PC'ye Hex olarak gelen değerler PC'de desimal değer olarak görülür.Nedenini sormayın ben de bir türlü anlamadım.Yaptığım çalışmalarda örneğin PIC'ten hex(31) klavye 1 geldiği zaman PC dec(49) olarak okuyor.Bu sebepten dolayı PC tarafındaki Yazılımda ona göre bir program yazmak gerekiyor.CCS S ve C# bilmediğim için kod yazamıyorum.
Amatör

skara1214

Alıntı yapılan: kudretuzuner - 03 Mayıs 2013, 23:32:50
Merhaba,
PIC'ten PC'ye Hex olarak gelen değerler PC'de desimal değer olarak görülür.Nedenini sormayın ben de bir türlü anlamadım.Yaptığım çalışmalarda örneğin PIC'ten hex(31) klavye 1 geldiği zaman PC dec(49) olarak okuyor.Bu sebepten dolayı PC tarafındaki Yazılımda ona göre bir program yazmak gerekiyor.CCS S ve C# bilmediğim için kod yazamıyorum.
hocam bu dediğinizi pek anlamadım benim başıma hiç gelmedi böyle birşey ne yolluyorsam onu görüyorum kullandığınız terminal programı ile alakalı birşey olabilir.Ccs nin serial portunda gösterim şeklini ayarlayabiliyorsunuz
Herkes ölür ama herkes gerçekten yaşamaz

f15eagle

Merhaba,

Acaba piclerden biri ile donanımsal pinler ile bilgisayara veri göndermeyi denedin mi ? Hata donanımda mı yazılımda mı denemek lazım.
Yeni bir proje oluşturup denemeli.
Program olarak ccs c deki serial port monitorü kullanabilirsin. Belki problem soft uarttadır.
Bide bu çaprazlama olayı var ya rx tx e bende sık sık karıştırıyorum 2 ve 3 nolu pinleri de tek tek denedin mi?

Kudret hocam veri gönderirken integerden chara çevirirseniz problem olmaz gibi