RS232 ile 3 ayrı RF verisini mikrodenetleyicinin 3 ayrı pinini kullanarak almak?

Başlatan toyo, 18 Mayıs 2012, 01:32:05

toyo

Merhabalar..Derdimi anlatmak için biraz fazla yazı yazdım kusuruma bakmayın,yazdığım kadar karmaşık değil aslında.umarım derdimi anlatabilmişimdir.
Üstadlar bir mikrodenetleyiciye gelen 3 ayrı rf bilgisni (RX-TX) pinlerini kullanmadan başka pinleri kullanarak almak istiyorum.
#use rs232(baud=2400,rcv=PIN_B3,parity=N,stop=1,stream=iletisim_1,force_sw)// iletisim_1 isimli rs232 ayarları
#use rs232(baud=2400,rcv=PIN_A3,parity=N,stop=1,stream=iletisim_2,force_sw)// iletisim_2 isimli rs232 ayarları
#use rs232(baud=2400,rcv=PIN_A4,parity=N,stop=1,stream=iletisim_3,force_sw)// iletisim_3 isimli rs232 ayarları


Bu kodlarda force_sw komutu ile iletisimin donanımsal olarak değil (TX - RX) ,başka pinlerle yazılımsal olarak kullanılacağı ayarlandı.
Stream ise rs232 iletişimine verdiğim ismi belirtir.eğer vericilerden birisi iletisim_1 ayarlarına göre 0x33 gönderdiyse bunu alıcı devrede iletisim_1 isimli rs232 ayarlarına göre alır.
Bu bilgiler kendi araştırmalarımdan yorumlarım.Doğrumudur acaba?
Ek olarak
1.verici uyandırma+0x4D
2.verici uyandırma+0x5F
3.verici uyandırma+0x6B
gönderdi diyelim bu bilgileri nasıl alabilirim.Şu şekilde yapıyorum olmuyor.diyelim alıcı devremde ilk olarak 3. vericinin gönderdiği bilgiyi sorguluyorum ikinci olarak 1.vericinin gönderdiği bilgiyi sorguluyorum üçüncü olarak 2.vericinin gönderdiği bilgiyi sorguluyorum.Bu dizilişi nasıl sıralarsam sıralayım 1. sorguladığım sinyal gelmeden 2. sorguladğım sinyali program dikkate almıyor. aynı şekilde 2. sorguladğım sinyal gelmeden 3.sorguladığım sinyali dikkate almıyor program.

İlk olarak alıcıda 1. sorguladığım sinyali  gönderiyorum sonra ikinci olarak 2.sorguladığım sinyali gönderiyorum son olarak 3. sorguladığım sinyali gönderiyorum oluyor.

Bence programda bir sıkıntı var çözemedim.Çok konu açtığım için özür dilerim ama yapamıyorum bir bilenden yardım almadan.o kadar iyi bilmiyorum CCS C 'yi.Yardımlarınız için çok teşekkür ederim.Yardım edecek arkadaşlar örnek program gönderebilir ise çok iyi olur  ::)
Not: =Denemelerimi isis similasyon programında yapıyorum.
RF Modüllerim ARX-ATX34.
Bu seri iletisim konusunda INT_RDA kesmesi kullanılıyor ancak donanımsal olarak (RX_TX) yapılabilirmiş.Ben yazılımsal olarak farklı pinler kullandığım için bu kesme işe yaramıyormuş.  :)
#include <16f628A.h>

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES XT                      //HACİRİCİ KRİSTAL OSİLATÖR KULLANILACAK
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection
#fuses nomclr

#use delay(clock=4000000)

#use rs232(baud=2400,rcv=PIN_B3,parity=N,stop=1,stream=iletisim_1,force_sw)
#use rs232(baud=2400,rcv=PIN_A3,parity=N,stop=1,stream=iletisim_2,force_sw)
#use rs232(baud=2400,rcv=PIN_A4,parity=N,stop=1,stream=iletisim_3,force_sw)

#define LCD_ENABLE_PIN     PIN_A0      //lcd enable pini A0
#define LCD_RS_PIN         PIN_A1      //lcd rs pini pin A1
#define LCD_RW_PIN         PIN_A2     //lcd rw pini pin A2
#define LCD_DATA4          PIN_B7         //lcdnin data4 pini pinB7 
#define LCD_DATA5          PIN_B6         //lcdnin data5 pini pinB6 
#define LCD_DATA6          PIN_B5         //lcdnin data6 pini pinB5 
#define LCD_DATA7          PIN_B4         //lcdnin data7 pini pinB4

#define dur pin_b0
#define tit pin_b2
#define led pin_b2
#include <Clcd.c>
int16 al=0,al1=0,al2=0;
void main()
{
lcd_init();
printf(lcd_putc,"\f TEKNO KULAK");
delay_ms(500);
printf(lcd_putc, "\f");
lcd_gotoxy(1,1);
printf(lcd_putc,"EMRE SIMSEK");
lcd_gotoxy(1,2);
printf(lcd_putc,"3510410077");
delay_ms(500);
printf(lcd_putc, "\f");

output_high(tit);
output_high(led);
delay_ms(500);
output_low(tit);
output_low(led);

while(TRUE)
{
//*****************KAPI ALICI KISIM*****************// 

 if(fgetc(iletisim_1))
   {
   al=fgetc(iletisim_1);
         if(al==49,(iletisim_1))
         {
              lcd_gotoxy(1,1);
               printf(lcd_putc,"______ALARM______");
               lcd_gotoxy(7,2);
               printf(lcd_putc,"KAPI");  
               output_high(led); // ledi yak
               output_high(tit);
               delay_ms(500);
               output_low(led);
               output_low(tit);
               delay_ms(250);
               output_high(led);
               output_high(tit);
               delay_ms(500);
               output_low(led);
               output_low(tit);
               
               al=0; 
               }       
         }
//*****************BEBEK ALICI KISIM*****************//   
if(fgetc(iletisim_2))
   {
   al1=fgetc(iletisim_2);
              if(al1==50,(iletisim_2))
               {
               lcd_gotoxy(1,1);
               printf(lcd_putc,"______ALARM______");
               lcd_gotoxy(1,2);
               printf(lcd_putc,"BEBEK");
               output_high(led); // ledi yak
               output_high(tit);
               delay_ms(500);
               output_low(led);
               output_low(tit);
               delay_ms(250);
               output_high(led);
               output_high(tit);
               delay_ms(500);
               output_low(led);
               output_low(tit);
               al1=0;  
            }
         }
   if(fgetc(iletisim_3))
   {
    al2=fgetc(iletisim_3);
            if(al2==51,(iletisim_3))
               {
               lcd_gotoxy(1,1);
               printf(lcd_putc,"______ALARM______");
               lcd_gotoxy(12,2);
               printf(lcd_putc,"GAZ");
               output_high(led); // ledi yak
               output_high(tit);
               delay_ms(500);
               output_low(led);
               output_low(tit);
               delay_ms(250);
               output_high(led);
               output_high(tit);
               delay_ms(500);
               output_low(led);
               output_low(tit);
               al2=0;
}}}}

Gelirken ne getirilir ki giderken ne götürülür.

toyo

Programda
if(fgetc(iletisim_3))
ile başlayan bölüm gaz alıcı kısmı çok özür diliyorum.
Gelirken ne getirilir ki giderken ne götürülür.

toyo

Bu alıcı devrede sorgulama sırasına göre veri alması RX-TX pinlerini kullanmayıp başka pinleri kullandığım içinmi oluyor acaba?  :-X Yardım edin lütfen  :'(
Gelirken ne getirilir ki giderken ne götürülür.

skara1214

ilk olarak atx-rtx te alıcıyı uyandırmak için belli şeyler yapman gerekli işte 0xfff v.s gibi şeyler yollayıp senkronu sağlaman gerekli direk bu şekilde olmaz.(Udea nın sitesine gir orada örnek uygulama var)

Diğer bir konuda ben su satırları çözemedim;
if(al==49,(iletisim_1))   burada şu yeterli if(al==49) aslen doğrusu getch kullanıyorsan al yi char tanımlamak çünkü getc char alır .Ama bu şekildede sıkıntı çıkmaz virgülden sonrakinin ne özelliği var onu tam anlamadım bir diğer önerimde sırf rcv  bacağı tanımlamak pek işe yaramıyor  onların transimtlerinide tanımlayın ayrıca 3 tane seri iletişim yapmaya bilir ilkönce 1 tane ile bu problemleri çözün sonra 3 tane denersiniz
Herkes ölür ama herkes gerçekten yaşamaz

toyo

ilginiz için teşekkürler.Uyandırma olayını gönderiyorum arkasından 0x3d gibi bir değer gönderiyorum.Alıcıda alıyor pratikte.(1 seri iletişim yaptığımda)
İletisim_1 olayı ise 3 adet veri alma ucu kullandığım için bu uçlara ayrı ayrı rs232 ayarı yapmam gerekiyor.Bu ayarlarada iletisim_1 iletisim_2 iletisim_3 gibi isimler veriyorum.örnek:iletisim_1 ayarlarına göre veri geldiyse yani iletisim_1 adlı rs232 ayarlarına göre veri geldiyse şunları şunları yap.
.Benim yukarda verdiğim program pratikte çalışmaya bilir 50 yerine 0x5A gönderirsem çalışıyor.

Asıl sorun tek mikrodenetleyici 3 farklı pinlerden 3 ayrı veriyi nasıl alır.Benim yazdığım programda if döngüsü ile sorguladığım veriler sorgulama sırasına göre gelirse sağlıklı çalışıyor.Sorgulama sırasına göre değilde ilk olarak 2. yada 3. sorguladığım veri gelirse dikkate almıyor program.
Not:Sizin söylediğiniz  if(al==49) komutu RX pini üzerinden 49'un gelip gelmediğini test eder.Oysa ben RX pini değil 3 farklı pin üzerinden veri okumaya çalışıyorum.Buda 3 farklı rs232 ayarı gerektiriyor.
Gelirken ne getirilir ki giderken ne götürülür.

skara1214

Tabiki 3 tane iletişim yaparken farklı tanımlamalar yapacaksınız ondan bahsetmiyorum ben ifin içinde bir daha iletisim 1 yazmanın manası yok zaten onu üstte  al=getc(iletisim_1) iletişim 1 ile al yi al diyerek yapmıssınız.bir daha ifin içine koymanın manası yok ;
Asıl sorununuzun cevabı;Getc derseniz bir harf gelene kadar sonsuza kadar bekler yani ilk sıraya iletisim 1 i koydugunuz için iletişim 1 e birşey gelmeden satırlar işlemez ama size bir öneride bulunayım eğer veriler aynı anda gelmiyorsa(geliyorsa yapacak birşey göremiyorum) 3 girişli and kapısı kullanarak tek bir veri hattından 3 alıcıdanda  veri alabilirsiniz.Bunu bir araştırın...
Kolay gelSin
Herkes ölür ama herkes gerçekten yaşamaz

toyo

Kusura bakmayın yanlış anlamışım sizi , dediğiniz doğru.Bu and kapısı ile nasıl yapacağımı anlayamadım çok teşekkürler.
Gelirken ne getirilir ki giderken ne götürülür.

serhat1990

Merhaba şimdi ilk olarak şunu söyleyeyim bir alıcı 3 verici kullanacaksınki çok basit bi uygulama . Yalnız sen 3 ayrı rx pini kullanmaya çalışıyorsunki buna ne gerek. o zaman biz cep telefonunda sınırsız sayıda gsm modülmü kullanacaz vericiler farklı diye... VERİCİ modül 3 tane tamam. Alıcı modül 1 tane kullanacaksın alıcı tarafta bir modül olacak . Gelen önbilgiye göre datanın kimden geldiğini anlayacaksın. Sana şöyle birsey söyleyeyim. Eğer her alıcı için bir modül kullanacaksan neden hepsi için farklı bir data gönderiyorsun :)  Alıcı sayını bire düşürüyorsun tek bir rx pinin oluyor. Ve data yapısını vericilerde şu şekilde yapıyorsun projen çalışıyor. Bu tür uygulamalardan çok yaptım 3-5 de verici yoktu :)

0x55 Veya 0xAA ile ilk başta vericiyi uyandır.

0x55 DİYELİM ..

0x55 ( 5 tane gönder ) + ( Adres1 + adres2 +... adresn ( kaç tane adres gönderdiğinin önemi yok. Vericinin kim olduğunu belli etsin . Örneğin adres1=0xA1
adres2=0xF1 GİBİ

son olarak datanı gönder data1+data2+.... data n ) şeklinde çalışsın bitsin işin kolay gelsin ... 

toyo

Kardeş verdiğin bilgi için öncelikle teşekkür ederim.Senin dediğin şekilde 3 verici 1 alıcılı bir proje yapacaktım ancak hocam 3 vericinin gönderdiği bilgiyi aynı anda alabilsin 2 alıcı daha ekle her vericinin bir alıcısı olsun deyince işler karıştı.Sizin söylediğiniz telefon örneğini hocaya ilettim birde tabi 3 veriyi aynı anda alamayınca hocada hak verdi ve tek alıcıya geri dön dedi :) Tekrar teşekkürler .. :D
Gelirken ne getirilir ki giderken ne götürülür.

serhat1990

 :) aynı anda veri gelse zaten hangisine bakacaksın hani fsk modul olsa fifo tamponu olsa işin çok basit yine ama ask usart modül kullanıyosun geleni direk veriyor. Bekleme falan yokki . İşlemci hangisini okuyacak aynı anda veri gelse. Kesme desen bile onunda bir önceliği var. 3 tane kesme aynı anda yürümez :)

toyo

Kardeş başarılı bir şekilde yaptım bilgilerin için çok teşekkürler çok sağol..
Gelirken ne getirilir ki giderken ne götürülür.

serhat1990

Bilgiler paylaştıkça güzelleşir unutma :) Daha öğrenmemiz gereken çok ama çok şey var. Hadi hayırlı olsun kolay gelsin...

toyo

Gelirken ne getirilir ki giderken ne götürülür.

erhanmete

Alıntı yapılan: serhat1990 - 21 Mayıs 2012, 17:20:24
:) aynı anda veri gelse zaten hangisine bakacaksın hani fsk modul olsa fifo tamponu olsa işin çok basit yine ama ask usart modül kullanıyosun geleni direk veriyor. Bekleme falan yokki . İşlemci hangisini okuyacak aynı anda veri gelse. Kesme desen bile onunda bir önceliği var. 3 tane kesme aynı anda yürümez :)


aslında aynı anda üç verici tek alıcı kullanılabilir. veya şöyle söyleyeyim üç verici butonunuz var tek alıcınız var üçüne aynı anda bassanız bile alıcı hepsinden gelen veriyi alabilir.
tabiki üçü aynı anda yayın yapmaz ama butona aynı anda basılır. zaten böyle çok vericili sistemlerde bu şekilde yazılımsal önlemler alınır mutlaka.
ama proje bitmiş sanırım.
kolay gelsin.

serhat1990

Alıntı yapılan: erhanmete - 23 Mayıs 2012, 09:07:17

aslında aynı anda üç verici tek alıcı kullanılabilir. veya şöyle söyleyeyim üç verici butonunuz var tek alıcınız var üçüne aynı anda bassanız bile alıcı hepsinden gelen veriyi alabilir.
tabiki üçü aynı anda yayın yapmaz ama butona aynı anda basılır. zaten böyle çok vericili sistemlerde bu şekilde yazılımsal önlemler alınır mutlaka.
ama proje bitmiş sanırım.
kolay gelsin.
Hocam ben almaz demedim zaten tek alıcı kullanmasını önerdim yazılımla herşey mümkün. Yapılabilir birazcık üzerinde durmayla kesme gelir bakar ama global kesmeleri kapatmaz kesmede kesme kontrolü yapar. Bu sayede diğer kesmeleri yakalar. İş bitince eski kesmedeki işleme devam eder. Yüksek baud hızında bu olay sıkıntı yaşatır. Yalnız kullandığı modüller nedeniyle maksimum 2.4kbps'de calısır. Bundan daha yüksek hızlara cıkamaz. 416uS 'da bir bit gelecegine göre kısa zamanlı bir timer ile yapabilir. İyi çalışmalar... :)