CCS S seri porttan veri gönderme

elmariacci

Üye
Katılım
17 Şub 2012
Mesajlar
14
Puanları
1
Yaş
33
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İ
Kod:
#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

Kod:
#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);
         }
}
 
Verici ;

Kod:
#use rs232(baud=2400, xmit=PIN_C0,rcv=PIN_C7)

putc(0x0f); // Alıcıyı Dürt
putc(0x0f);
putc(0xA1);
putc('M');
putc(YOLLANCAK DEGER);

Alıcı ;

Kod:
#use rs232(baud=2400, xmit=PIN_C6,rcv=PIN_C7)

#int_rda
void gelenveri_kesmesi(){
if(getc()==0xA1){
gelen=getc();
if (gelen=='M'){
gelenn[1]=getc();
gelenn[2]=getc();
}
}
}

enable_interrupts(int_rda);
enable_interrupts(GLOBAL);

600 baud'da alsın 2400de yollasın diyorsan şu şekilde yapabilirsin

Kod:
#use rs232(baud=600, xmit=PIN_C6,rcv=PIN_C7,stream=alici)
#use rs232(baud=2400, xmit=PIN_B1,rcv=PIN_B0,stream=panel)

#int_rda
void gelenveri_kesmesi(){
if(fgetc(alici)==0xA1){
gelen=fgetc(alici);
if (gelen=='M'){
gelenn[1]=fgetc(alici);
gelenn[2]=fgetc(alici);
}
}
}
-----------------------
fputc(0xA1,panel);
fputc('M',panel);
fputc(askor,panel);
fputc(ackapa,panel);
--------------------------
 
Verici ;

Kod:
#use rs232(baud=2400, xmit=PIN_C0,rcv=PIN_C7)

putc(0x0f); // Alıcıyı Dürt
putc(0x0f);
putc(0xA1);
putc('M');
putc(YOLLANCAK DEGER);

Alıcı ;

Kod:
#use rs232(baud=2400, xmit=PIN_C6,rcv=PIN_C7)

#int_rda
void gelenveri_kesmesi(){
if(getc()==0xA1){
gelen=getc();
if (gelen=='M'){
gelenn[1]=getc();
gelenn[2]=getc();
}
}
}

enable_interrupts(int_rda);
enable_interrupts(GLOBAL);

600 baud'da alsın 2400de yollasın diyorsan şu şekilde yapabilirsin

Kod:
#use rs232(baud=600, xmit=PIN_C6,rcv=PIN_C7,stream=alici)
#use rs232(baud=2400, xmit=PIN_B1,rcv=PIN_B0,stream=panel)

#int_rda
void gelenveri_kesmesi(){
if(fgetc(alici)==0xA1){
gelen=fgetc(alici);
if (gelen=='M'){
gelenn[1]=fgetc(alici);
gelenn[2]=fgetc(alici);
}
}
}
-----------------------
fputc(0xA1,panel);
fputc('M',panel);
fputc(askor,panel);
fputc(ackapa,panel);
--------------------------


hocam aliciyi uyarma işinde sıkıntı yok.rf ile vericiden aliciya değeri de gonderiyorum orda da sıkıntı yok.

aliciya rf ile ulaştirdiğim değeri seri port ile de pc ye gondermem lazim.


Kod:
#use rs232(baud=9600,rcv=pin_c7,xmit=pin_c6,stop=1,stream=iletisim_1)

fprintf(iletisim_1,"%lu \r")

bu şekil gonderme çaliştiğimda olmuyor.
 

Forum istatistikleri

Konular
128,158
Mesajlar
915,527
Kullanıcılar
449,904
Son üye
teknikbilimlers31

Yeni konular

Çevrimiçi üyeler

Geri
Üst