Bir grup Türk mühendisi tarafından 1999 yılında Ankarada kurulmuş olan UDEA dünya genelinde bir müşteri portföyüne kablosuz haberleşme (Radyo Frekans – RF) teknolojileri konusunda ürün ve hizmet sağlamak amacıyla kurulmuş özel bir şirkettir. Udea’nın misyonu kablosuz haberleşme konusunda daha yüksek teknoloji ve kalitede ürün ve hizmet üretimidir. Sitesine buradan ulaşabilirsiniz.
Bu firmanın ürünleri ile tanışınca Türkiyede artık bu tür üretimin olması gerçeği göğsümü kabarttı. Ürün yelpazesi çok geniş olmasada yaptıkları işler gerçekten de çok büyük. Bu yazımızda bu firmanın en küçük, en ucuz ( alıcı verici çifti yaklaşık 30TL) ve kullanımı en kolay olan modülleri olan ATX-34 (verici) ve NRX-34 (alıcı) modülünü inceleyeceğiz. Bu modüller kendi aralarında kablosuz olarak iletişim kurabilmekte ve 300 metre mesafeden haberleşebilmektedirler.
Bu modüller sadece bir adet anten bağlantısı , +,- besleme bağlantıları ve NRX-34 seri data çıkışı için, ATX-34 ‘te seri data girişi için birer adet bağlantı içerirler. NRX-34’ün ayrıca türüne göre (iki farklı tür NRX-34 bulunmaktadır, NRX-34U-E, NRX34U-R) bir tane daha çıkış ucu bulunur. NRX-34U-R , RSSI isimli analog bir çıkışa sahiptir. Bu çıkış, eğer modül data alır ise 1V seviyelerinden 2V seviyelerine çıkarak bilgi geldiğini haber vermek için kullanılır. NRX-34U-E’de ise modülü aktif veya pasif etmek için “enable” ucu bulunur. Benim kullandığım modül NRX-34U-R’ idi.
Modüller hakkında bu kadar bilgi verdikten sonra işe koyulalım. Ben ilk önce ATX-34 ile 16f628A’nın bağlantısını yaptım. Mikrodenetleyicinin TX ucunu, modülün Data ucuna bağladım ve daha sonra beslemelerini bağladım. Alıcı kısımda ise yine bir 16F628A kullanarak NRX-34’ün Data ucu ile işlemcinin RX ucunu birleştirdim. Kodlarımı yazarak işlemcilere yükledim. Verici kısımda PORTB’nin 0.pinine bağlı butona basarak alıcı kısımdaki ledi yaktım. Butondan elimi çektiğimde led sönüyor, bastığımda ise yanıyor. Fakat bu işlemin gerçekleşmesi için takip etmemiz gereken adımlar var. Asıl olay şu: Alıcı modülün gönderdiğimiz verileri düzgünce alabilmesi için ilk önce uyandırılması gerekiyor. Bunun için “preamble” dediğimiz veriyi göndermemiz gerekiyor.Bu veri 10101010 veya 01010101 olabilir. Tabi 5 bayt olarak gönderiyoruz. Yani 0x55,0x55,0x55,0x55,0x55 veya UUUUU verilerini ardarda araya boşluk girmeden gönderiyoruz. Hemen arkasından senkronizasyon sağlamak için 5 byte 0xff ve 5 byte 0 gönderiyoruz. Bu verileri göndermemiz iletişim kurulabilmesi için şart. Bu verilerin arkasından da asıl bilgileri gönderiyoruz alıcıya. İsterseniz hemen kodlarımıza bakalım. Unutmadan ekleyeyim kodları MikroC PRO 5.20 ile yazdım. Ayrıca anten bağlantısı için ise 17.3 cm uzunluğunda bakır bir tel kullanabilirsiniz. Daha ayrıntılı bilgi modüllerin kataloglarında yer almakta.
VERİCİ:
char pre[15]={'U','U','U','U','U',255,255,255,255,255,0,0,0,0,0}; char yak[3]={'y','a','n'}; //Senkron için en az bir byte sıfır gönder kesinlikle..... char son[3]={'s','o','n'}; char i=0,j=0; void kurulum() { UART1_Init(2400); trisb.f0=1; Delay_100ms(); } void main() { kurulum(); while(1) { if(portb.f0) { for(i=0;i<15;i++) { UART1_Write(pre[i]); } for(j=0;j<10;j++) //garanti olması açısından 10 kez gönderiliyor veriler... { for(i=0;i<3;i++) { while(!UART1_Tx_Idle()); UART1_Write(yak[i]); } } } //************************************************************* if(!portb.f0) { for(i=0;i<15;i++) { UART1_Write(pre[i]); } for(j=0;j<10;j++) { for(i=0;i<3;i++) { while(!UART1_Tx_Idle()); UART1_Write(son[i]); } } } } }
ALICI:
char az,i=0, msg[6]; void main() { UART1_Init(2400); trisb.f0=0; portb.f0=1; delay_ms(100); while(1) { if(UART1_Data_Ready()) { msg[i]=UART1_Read(); if(msg[0]=='y' || msg[0] == 's')//Eğer msg[0] 'y' veya 's' ise i değişkeninin 1 arttır. { i++; } } if(i==3) { if(msg[0]=='y' && msg[1]=='a' && msg[2]=='n' )portb.f0=1; //Senkron için gönderilen sıfır veya 255 aranmaz.... if(msg[0]=='s' && msg[1]=='o' && msg[2]=='n' )portb.f0=0; i=0; msg[0]=0; } } }
NRX-34’ün kataloğuna buradan, ATX-34’ün kataloğuna ise buradan ulaşabilirsiniz..
İyi çalışmalar.
hocam pic basic de serout2 PORTC.0,396,[REP$AA\5,REP$00\5,REP$FF\5] böyle bir komut kullanıyordum ve çalışıyordu şimdi hi tech c ye geçtim bundan yola çıkarak 5 kere 0xaa 5 kere 0x00 5 kere 0xff gondersem alıcım uykundan uyanır mı ?
5byte 0x55 gönderirseniz alıcı uyanır. Senkronizasyon sağlamak için ise 5 byte 0, 5 byte 0xff göndermelisiniz.
udea nın kendi örneği mi bu ?
hayır kendi örneğim..
gönderimde veri tipi önemli mi? char tipinde bir veri gönderiyorum ama karsı tarafta farklı bir değer alıyorum. nedeni ne olabilir
Gönderimde veri tipi önemli. 8 bitlik veriler halinde gönderebilirsiniz.
Keşke CCS C olsaymış.. Başka dilleri anlamakta zorlanıyorum..
CCS C bir dil değildir. “C” bir dildir. “C”‘yi anlayan her yerde anlar…
Hocam modüllerle açık alanda kaç metre boyunca sıkıntısız haberleşebiliriz .. Denemişsindir diye umuyorum :D. Kullanım kılavuzuna göre 200-300mt ama
500 metreden nrx34 ile haberleşebildim
Ben de sipariş verdim bakalım heyecanla bekliyorum. Umarım istediğim gibi çalışır..
Cevap ve çalışmaların için teşekkürler Hocam …
Ben teşekkür ederim..
Hocam emeğinize sağlık, denedim gerçekten çok sağlıklı çalışıyor; ama benim büyük bir sorunum var, hatta genel bir sorun. Mikroc’ nin kendi kütüphanesindeki kodlar similasyonda çalışıyor; fakat gerçekte çalışmıyor. Kendi kütüphanesinde RX TX çıkışlarına bağlı olmadan kontrol sağlayabiliyor. Yani uart gibi komutları kullanmıyor, istediğimiz yeri kendimiz data seçerek Man_Send(0x0A); gibi bir örnekle veri gönderebiliyoruz. Bunu similasyonda çalıştırdım çalışıyor; fakat gerçek ortamda çok sağlıksız çalışıyor. Alıcı devresinde çıkışlar belirli bir müddet sonra kendiliğinden pasif oluyor veya aktif oluyor. Yardımcı olabilirseniz sevinirim. Yani benim istediğim RX TX çıkışlarına bağlı kalmadan istediğim çıkışı data yapabilmek.
O dediğiniz data pini değiştirme olayını soft uart kullanarak gerçekleştirebilirsiniz. Soft uart kütüphanesi de mevcut mikroc’de.
Hocam ilginiz için gerçekten çok teşekkür ederim. Daha denemedim, deneyeceğim. Gerçekten çok güzel bir paylaşım sitesi oluşturmuşsunuz ve bilgilerinizi paylaştığınız için tekrardan çok teşekkür ederim.
preamble dizisi içerisinde 15 byte veri göndermişsiniz. Bunlardan ilk 5i preamble, sonraki 10 byte (5+5) ise sencron datalarıdır. Preamble verisi modülü uyandırmak içindir. Alıcı bu veriyi algılamaz. Ama alıcı sencron datasını algılar. Alıcı tarafta neden bunu sorgulamıyorsunuz.
Senkron mesaj başlangıcının doğru algılanabilnmesini sağlar. Bunun için de 5 byte 0 veya 5 byte ff göndermek gerekir. Bunu göndermeden şu şekilde bir deneme yapabilirsiniz mesela: Tel üzerinden veri gönderirken teli söküp tekrar takın, bazı durumlarda iletişimin koptuğunu ve teli takmanıza rağmen tekrardan iletişim sağlayamadığınızı göreceksiniz.
Dediğiniz gibi sencron datası mesajın başının doğru algılanabilmesi içindir. Siz verici tarafta 10 bytelık sencron datası gönderiyorsunuz. Bu data alıcı tarafa ulaşıyor. Ama sencron datasının doğru gelip gelmediğini sorgulamıyorsunuz. Burada bir mantık hatası var. Birde şu var sencron datasının illa 5 byte 0, 5 byte ff olması gerekmiyor. Bunu istediğiniz şekilde istediğiniz byte kadar seçebilirsiniz. Benim dikkat çekmek istediğim şey, bu datanın alıcı taraftaki mcu ya ulaştığı halde neden sorgulayıp, kontrolünü yapmadığınız…
Senkron datası sorgulamak için gönderilen bir data değil. Herhangi bir hata yok burada. Senkron için gönderilen 0 ve 1 ler iletişimde meydana gelen kopuklukların önüne geçmek için gönderilir. Siz dediğim şeyi bir deneyin ne demek istediğimi daha iyi anlayacaksınız.
İki adet mcuyu karşılıklı bağlayın rx tx olarak. Birisinden diğerine sürekli veri basarak bu veriler ile iş yaptırın. Mesela “yak” gelince led yansın “son” gelince led sonsun. Veri bastığınız sırada aradaki bağlantıyı kopartıp tekrar bağlayın. İletişimin kesildiğini göreceksiniz.
http://www.mediafire.com/?jyu9y2s4g774993
Buradaki simülasyona bakın mesela..
Sizin verdiğiniz yazılımı denedim. Çalışmasına çalışıyor. Ama bu hata var olduğunu engellemez. Şimdi başka bir şekilde deniyorum ve sadece preamble gönderiyorum. Haberleşme gerçekleşiyor. Sencron datasını yanlış biliyorsunuz. Sencron datası karşı tarafa gider. Ve işlemciye UART tan gelir. Sizin bu datayı sorgulamanız gerekir. Gönderilen datanın başını yakalama meseleside şudur. Mesela alıcı tarafı, tam datanın ortasındaki byte gönderilirken enerjilendirdik. Bu durumda işlemci alması gereken datayı eksik almıştır. İşte tam bu durumda, sencron datasını sorgular. Ve mesajın başının tam olarak alınıp alınmadığını kontrol eder ve ona göre işlem yapar. Sencron un ne olacağını yazılımcı belirler. İstersen A, B, C gibi 3 data gönder. Ve alıcı tarafta bu A, B, ve C datalarını sorgula.. Eğer bu data algılanmışsa mesaj kopuk değildir ve datayı işleme sokar. Siz burada hata yapmışsınız. Ve hata yaptığınızı kabullenmek istemiyorsunuz.
Peki siz doğru biliyor olun. Son gönderdiğim örneği bir inceleyin isterseniz. Hata yapmış olsam elbette kabul ederim. Fakat bu işi bilmeyen sizsiniz birde üste çıkıyorsunuz. Sürekli veri gönderdiğiniz yani kesik kesik göndermediğiniz zamanda herhangi bir kopukluk oluşursa nasıl çözeceksiniz peki? Son yorumdaki örneği inceleyin. Mesajın doğru gelip gelmediğini benim yaptığım gibi sorgulayacaksınız. 4 byte veri gönderirsiniz , ilk 3 byte’ı sorgularsınız. 4. byte değerli veridir. Senkron ise mesajın başını yakalamak için gereklidir. Kesik kesik veri gönderlirse herhangi bir problem tabiki olmaz. Fakat sürekli veri gönderildiğinde problem ile karşılaşırsınız.
Sizin bu yazınızda verdiğiniz yazılımıda,bu rf alıcı ve verici ile ilgili birçok farklı yazılımıda denedim. Maalesef sizin dediğiniz gibi çalışmıyor. Benim derdim sizin hatalı benim hatasız olduğumu göstermek değil. Yaptığınız yanlışı size gösterip doğruyu ortaya koymak.. Anlamak istemiyorsanız, siz bilirsiniz…
Ortada bir yanlış yok. Bu modülleri ve daha büyüklerini yıllardır yüzlerce projede kullandım. Bugüne kadar herhangi bir problem çıkmadı hiçbirisinde. Led yakıp söndürürken senkron göndermeseniz bile problem olmaz. Fakat sürekli data iletiyorsanız eğer senkronu kesinlikle göndermeniz gerekir. Güvenli bir sistem tasarlamak istiyorsanız kablolu sistemlerde dahi senkron verisi göndermelisiniz. Eğer o dosyaya baktıysanız ve nasıl çalıştığını gördüyseniz ne demek istediğimi çok iyi anlamış olmalısınız.
Arkadaşım sen benim yorumumda gönderdiğim dosyasyı çalıştırdın mı? Oradaki butonu bir aç kapa bakalım ne oluyor?
Ben de sizin eksik bilginizi tamamlamak için uğraşıyorum. Aksi halde hakaretvari yorumlarınızı yayınlamayıp kale almazdım. Ayrıca vericideki koda da bir göz atın. Orada göreceksiniz ki senkron gönderilmiyor. Senkronu gönderirseniz butonu açıp kapatsanız dahi veri akışı doğru olacaktır.
merhaba.bende bi RF alıcı verici yaptım proteustak, devrede program cok güzel calışmasına ragmen gerçek uygulamada çalışmıyor…acaba program konusunda yardımcı olabilecek varsa çok sevinirim ??
Kodlar denenmiştir ve çalışmaktadır. Devreyi kurarken bir hata yapıyor olmalısınız.
yaptıgım RF’i baska bi yerden buldum hex kodlarıyla denedim calışıyor fakat oturup kendim başka program yazınca calıstıramadım.kodları ve devreyi size yollasam bi bakabilir misiniz
Gönderin..
nasıl gönderiliyor.yükleyemedim siteye mail adresinizi atsanız mail atsam olmaz mı
Ana sayfada var mail adresi.
hocam 4 kananlı uzaktan kumanda devresi rölelı arıyorum bana yardımcı olabılırmısınız
Sol tarafta mail adresim var. Oradan ulaşabilirsiniz bana.
hocam 4 kananlı uzaktan kumanda rölelı devresı arıyorum yardımcı olablırmısınız ltfen msnden bana ulasabılırsıznız s_sabri90@hotmail.com
Arkadaşlar bir sorunum ama önce devreyi bir açıklayım. RB1 – RB2 – RB3 verici devresinde 3 buton.
alıcı devresi ise vericinin rb1 butonuna basıldığı zaman led1 yanacak, rb2 basıldığı zaman led2 yanacak, rb3 basıldığı zaman led3 yanacak.
devre normal olarak çalışıyor.
Sorunum alıcı devresi bazen butonlara basmadan bile ledler yanıyor. sebebi ne olabilir.
preamp() bir sorun mu var
{
for(i=0;i<5;i++)
{
Uart1_Write(0x55); // datasheettinde yazan deger, uyandirma degeri
}
for(i=0;i<5;i++)
{
Uart1_Write(0x00); // datasheettinde yazan deger, uyandirma degeri
}
for(i=0;i<5;i++)
{
Uart1_Write(0xFF); // datasheettinde yazan deger, uyandirma degeri
}
şifreleme yaptınız mı?
Göndermede RB1’e basıldığı zaman
preamp(); çağırıyorum arkasından
UART1_Write(‘s’);
UART1_Write(‘t’);
gönderme yapıyorum..
ama verici kapalı durumda alıcı yine kafasına göre çalışıyor.
şifreleme derken bir örnek verirseniz.
siz komple proje dosyanızı gönderirseniz bir yorum yapabilirim. Bu kodlara bakarak bir şey söylemek zor.
hocam sizin yukarıda yazdığınız kodları devreme uyarladım 7-8 saat devre tamam olarak çalıştı.
şimdilik bir sorun yok…
alıçı iyi bir şekilde çalışıyor.
şifreleme derken sizin kodlarda uyguladığınız formülmü “y” harfi geldiği zaman i değişkenini artırıp i değişkeni 3 ise “y”.”a”.”k” koşulunu tamamlarsa komut işle. şifreleme bu mu oluyor hocam.
Bir de son bir kez bu yazdığınız kodları SOFT_UART ile yazarsanız seviniriz…
evet şifrelemeden kastım o.
hocam bir sorum daha olacak rf ile data gönderimi nasıl oluyor.
vericiden “ahmet” diye bir string göndermek istiyorum.
alıcıdan da bunu almak istiyorum nasıl oluyor. hazır bir örneğiniz varmı.
pre+sifre+data
pre+sifre+'a';
pre+sifre+'h';
pre+sifre+'m';
pre+sifre+'e';
pre+sifre+'t';
Veya pre+sifre+”ahmet”;
hocam paylaşım için teşekkürler. aynı kodları 8051 için yapmaya çalışıyorum. ancak burda kafama takılan şey şu, ben data gönderirken
pre+sifre+”ahmet”;
sırasını kullanıyorum. peki ahmet şeklindeki diziyi gönderdikten sonra nrx34 ne kadar süre bekledikten sonra tekrar uykuya dalıyor? yani gönderim 1 MikroSaniye kesintiye uğrarsa dahi tekrar preamble ve sifre(senkron) göndermem gerekiyor mu?
Veri kesildiği an modüller arasındaki iletişim durur ve tekrar başlatmanız gerekir. Buradaki kesinti süresi baudrate ile alakalı bir durum. Eğer düşük baudrate değerlerinde çalışacaksanız 1us önem arzetmez.
arkdaşlar ben lm35 ile ölçüm yapıp rf ile göndermek istiyorum biraz yardımcı olabilecek olan varmı acaba
Kolay gelsin hocam ben lm35 ile degeri olcup rf ile gondermek istiyorum ama olmuyor devreyi kurdum yine olmadi araya kablo baglarsam oluyor rfim calisiyor yukardaki devreyi kurdum calisiyor simdiden tesekkurler
Alıcı
sbit LCD_RS at RB2_bit;
sbit LCD_EN at RB3_bit;
sbit LCD_D4 at RB4_bit;
sbit LCD_D5 at RB5_bit;
sbit LCD_D6 at RB6_bit;
sbit LCD_D7 at RB7_bit;
sbit LCD_RS_Direction at TRISB2_bit;
sbit LCD_EN_Direction at TRISB3_bit;
sbit LCD_D4_Direction at TRISB4_bit;
sbit LCD_D5_Direction at TRISB5_bit;
sbit LCD_D6_Direction at TRISB6_bit;
sbit LCD_D7_Direction at TRISB7_bit;
Unsigned int derece,deger;
void main()
{
UART1_Init(2400);
trisb = 0;
Lcd_Init();
Lcd_Cmd(_Lcd_Clear);
Lcd_Cmd(_LCD_CURSOR_OFF);
Lcd_Cmd(_Lcd_Clear);
Lcd_Out(1, 1,”SICAKLIK=”);
Lcd_Chr (1,12,223);
Lcd_Chr(1,13,’C’);
delay_ms(100);
while(1)
{
if(UART1_Data_Ready()==1)
deger=Uart1_Read();
delay_ms(100);
derece=deger*500/1024;
Lcd_Chr(1, 10, (derece/10)+48);
Lcd_Chr(1, 11, (derece%10)+48);
delay_ms(100);
}
}
verici
char pre[15]={‘U’,’U’,’U’,’U’,’U’,255,255,255,255,255,0,0,0,0,0};
char i;
Unsigned int deger;
void kurulum()
{
ADCON0 = 0x01;
ADCON1 = 0x0e;
Uart1_Init(2400);
TRISA=0x01;
Delay_ms(100);
}
void main()
{
kurulum();
while(1)
{
for(i=0;i<15;i++)
{
UART1_Write(pre[i]);
}
deger=ADC_Read(0);
delay_ms(100);
while(!UART1_Tx_Idle());
UART1_Write(deger);
delay_ms(3000);
}
}
Verici için şunları söyleyebilirim.
ADC’den okuduğunuz “deger” integer bir değerdir. Dolaysı ile uarttan göndermek için birtakım işlemlerden geçmesi gerekir.
Bu işlemler ;
“deger” değişkeninin stringe (karakter dizisi) çevrilmesi veya bytelarına ayrılması gerekir. Çünkü uarttan veriler birer byte olarak gönderilebilir. int ise 1 bytedan büyüktür. Bu sebepten deger değişkenini ya stringe çeviririz ya da bytelarına ayırarak göndeririz.
Meslea adc’den okuduğumuz değer 1024 olsun. Bu hex olarak 0x0400’a denk gelir. Burada gidecek verinin ilk byteına “a” , ikinci byteına “b” dersek şöyle bir fonksiyonla işi halledebiliriz.
char a,b;
deger=adc_read(0);
a= deger & 0x00ff;
b= deger>>8;
uart1_write(a);
uart1_write(b);
alıcıda ise şöyle bişeyler yapabiliriz;
char gelen[2],i=0;
unsigned deger=0;
if(uart_data_ready())
{
gelen[i]=uart_read();
i++;
if(i==2)
{
deger=gelen[1];//2. byteı deger değişkenine at
deger<<=8;//deger değişkeni içeriğini 8 kez sola kaydır.
geger+=gelen[0];//ilk byte'ı deger değişkeni ile topla.
i=0;
}
}
Diğer yol ise vericide inttostr kullanarak adc verisini stringe çevirip, karakter dizisinin elemanlarını teker teker göndermektir. Bunu da daha sonra açıklarım.
Saygılar.
Sagol hocam birazdan deneyecegim verdiginiz bilgileri ins olurda kurtulurum su dertten saygilar
hocam Rc6-Rc7 alıcı ve vericimi bağladım çalışmadı. ama tek olarak ikisi de çalışıyor.
alıcı ve vericiyi tek devre üzerinde kullanamazmıyız.
İslemciye veri gönderdiği anda veri alma işlemi yaptırmaya çalışmışsınız. Bu durumda problem ortaya çıkar.
hocam veri alma while döngüsünün içerisinde devamlı olarak döndürüyorum. veri gönderme de ayni while döngüsü içerisinde RB1 butonuna basılınca göndermesini istiyorum. ama bir terslik var ve calışmıyor. ikisinden birini iptal ettiğim zaman çalışıyor. böyle olduğu zaman ikisi de aynı an çalışmış olmuyor değilmi. RB1 basılınca veriyi gönderiyor 10 kez sonra veri alma işlemine geri dönuyor olması gerekmiyormu.
Fakat alıcı modül veriyi gönderdiğiniz anda almaya başlıyor.
hocam bu sorunu nasıl çözebilirim. bir türlü olmuyor.
Anladığım kadarı ile iki adet devreniz var. İkisi de hem alıcı hem verici olarak çalışıyor. Bunu çalıştırmak için veri gönderirken aynı devredeki alıcıyı pasif hale getirmeniz. Veri göndermediğiniz zamanlarda ise vericiyi pasif hale getirmenizdir. Bunu yapmak için ise bir transistör ve bir direnç yetecektir.
evet hocam devrem aynen düşündüğünüz gibi. transistörun ve direncin değerleri ne olabilir?
bağlantısı rc6 girişine direnc ve direncten transistörün base gidiyoruz emiter ucunu gnd ve alıcının gnd,collector ucunu vcc ve alıcının vcc bağlıyoruz.
Verici ve alıcı için ayrı ayrı transistör devresi kuracağız.
———————— Alıcı vcc
|
—————220ohm————-vcc
|
|—–collector–
tx-rx—–5k—–|
|—–emiter—- |
————————– pic ve alıcı gnd baglanır
hocam böyle bir devremi
———————— Alıcı vcc
|
—————220ohm————-vcc
|
|—–collector–
tx-rx—–5k—–|
|—–emiter—- |
————————– pic ve alıcı gnd baglanır
hocam böyle bir devremi 220ohm direnc de koydum böyle devre tamammı?
Şemayı verdim resim olarak. Yalnız direnç değeri 10K değil 1K olacak.
çizdim ama yayılanırken bozuk gösteriyor.
Hocam ben resim olarak verdim yukarılardaki mesajımda. O şemayı kurun.
bu akşam deneyim hocam.
Hocam devrenizi yeni gördüm 2 haftadır uğraştığım haberleşme işini preamble olmadığı için yapamıyormuşum. Akşam denedim veri gönderildi. Sağlıklı olmasa da gönderiyordu. Fakat gelen rakamlara göre işlem yapacağım için if şartları koymam gerekti. Aynı sizin kodlar gibi 3 lü senkron verisine göre işlem yapmaya çalışıyorum fakat alıcıda tık yok. Ne alıyor ne bişey yapıyor. Program böyle çalışırken yanına gidiyorum alıcının bakıyorum falan sonra pat ekranda veri alındı bilgisi sonra eski halıne geri dönme falan. Acaba alıcı uyanmıyor mu?. Alıcının uyanması için preamble gönderiyorum fakat akşam denememde de alıcıya ilk 1 dakika yada belki 30 saniye hiç veri gönderemiyordum sonra veri alabiliyordu acaba belirli bir uyanma süresi mi var hocam
Kodunuzu görmeden bir şey söylemem zor.
hocam merhaba öncelikle yazılarınızı okuyorum. ben bi sorunla karşılaştım ve nereye baksam çözemedim
çin malı galiba alıcı verici var elimde rf.
uart ile veri göndermek istiyorum bunuda c#da arayüzle yaptım.usb den 4550 ye sonra rf ile 628a ya devre mantığı bu. devreleri gerçektede kurdum fakat bişey farkettim yabancı bi arkadaşta aynı sorunla karşılaşmış.
önce deneme amaçlı uart ile kablo üzerinden veri gönderiyordum 2. pic e fakat çalışmıyordu daha sonra o yazıyı gördüm toprakları kısa devre yaptım çalıştı
şimdi rf mödülünü taktım çalışmıyor nasıl çözeceğim bilmiyorum iki hafta oldu elektronikten soğudum. eğer uart da gerilimler farklıysa nasıl çözeceğim bilmiyorum herkes tak diye gönderirken niye ben gönderemiyorum anlamadım. verici tarafına rs232 mi bağlasam onu bile düşünüyorum. nerde hatam olmuş olabilir bakarmısınız usb için proteusta virtual usb ile sana usb oluşturarak devreyi deneyebilirsiniz gönderdiğim c# programında ise debug klasöründeki exe yi çalıştırın hocam. belki biliyorsunuz kusura bakmayın elim ayağım titriyor. isistede problem yok ordada çalışıyor devre ne olabilir sıkıntı yardım edermisiniz. ???
Devreyi nereye gönderdiniz? Ben link veya mail göremiyorum. Yazımdaki gibi veri gönderirseniz çalışacaktır.
mail attım iletilmemiş mikrodunya@gmail.com 2 kere mail attım hocam benim mail adresim ismailalgin1901@gmail.com
Herhangi bir mail bana ulaşmamış.
hotmailden atıyorum acaba konuyu burdada açsak hem herkes faydalansın mikroc kodlar çok sadece ben size şimdi hotmailden gönderiyorum şimdide gmail hata veriyor mail iletilmedi diye
Kodlarinizi burada paylaşın o halde.
ALICI TARAF 628a ile
char uart_rd;
void main()
{
trisb.rb1=1; trisb.rb2=0;
txsta.SYNC =0; rcsta.SPEN=1; rcsta.cren=1;
cmcon=7;
trisa.ra0=0; trisa.ra1=0; porta.ra0=0; porta.ra1=0;
delay_ms(3000);
uart1_init(4800);
delay_ms(1000);
while(1)
{
if(rcsta.FERR==1 || rcsta.oerr==1){rcsta.cren=0; rcsta.cren=1;}
if(uart1_data_ready()){ uart_rd=uart1_read(); }
else{uart_rd=0xFF;}
if(uart_rd==0){porta.f0=0; porta.f1=0; }
if(uart_rd==1){porta.f0=1; porta.f1=0;}
if(uart_rd==2){porta.f0=0; porta.f1=1;}
if(uart_rd==3){porta.f0=1; porta.f1=1;}
}
}
VERICI TARAF 18F4550
#include “USBdsc.c” //usb dosyasını ekledim vendorıd1234 productıd1234 yani 4660
//lcd bağlantıları
sbit LCD_RS at RB2_bit;
sbit LCD_EN at RB3_bit;
sbit LCD_D4 at RB4_bit;
sbit LCD_D5 at RB5_bit;
sbit LCD_D6 at RB6_bit;
sbit LCD_D7 at RB7_bit;
sbit LCD_RS_Direction at TRISB2_bit;
sbit LCD_EN_Direction at TRISB3_bit;
sbit LCD_D4_Direction at TRISB4_bit;
sbit LCD_D5_Direction at TRISB5_bit;
sbit LCD_D6_Direction at TRISB6_bit;
sbit LCD_D7_Direction at TRISB7_bit;
unsigned char readbuff[64] absolute 0x500;
unsigned char writebuff[64] absolute 0x540;
char text_kod;
char text_uzunlugu;
unsigned short i;
void interrupt(){ USB_Interrupt_Proc(); }
void main() {
//spbrgh=625; spbrg=25;
txsta.SYNC=0; rcsta.SPEN=1; txsta.tx9=0;
ADCON1 |=0x0F;
CMCON|=7;
TRISC.RC7=1; TRISC.RC6=0;
trisb.rb0=0; trisb.rb1=0; portb=0;
UART1_Init(4800); delay_ms(1000);
lcd_init();
lcd_cmd(_lcd_cursor_off);
lcd_cmd(_lcd_clear);
lcd_out(1,1,”USB gelen:”);
lcd_out(2,1,””);
HID_Enable(&readbuff,&writebuff);
while(1)
{ //Uart1_write(1); delay_ms(500); Uart1_write(2); delay_ms(500);
while(!HID_read());
text_kod=readbuff[0];
text_uzunlugu=readbuff[1];
//readbuff[0]=0xEF; readbuff[1]=3;
if(readbuff[0]==0xAB)
{
for(i=2;i<text_uzunlugu+2;i++)
{
lcd_chr_cp(readbuff[i]);
}
}
else if(readbuff[0]==0xCD)
{
lcd_cmd(_lcd_clear);
lcd_out(1,1,"USB gelen: ");
lcd_out(2,1,"");
}
else if(readbuff[0]==0xEF)
{
if(readbuff[1]==0)
{
lcd_out(1,1,"–RF iletisimi–");
lcd_out(2,1,"Gonderiliyor");
Uart1_write(0xa4); Uart1_write(0xa4); Uart1_write(0xa4);
Uart1_write(0xa4); Uart1_write(0xa4); Uart1_write(0xa4);
Uart1_write(0xa4); Uart1_write(0xa4); Uart1_write(0xa4);
Uart1_write(0xa4); Uart1_write(0xa4); Uart1_write(0xa4);
Uart1_write(0);
}
if(readbuff[1]==1)
{
lcd_out(1,1,"–RF iletisimi–");
lcd_out(2,1,"Gonderiliyor");
Uart1_write(0xa4); Uart1_write(0xa4); Uart1_write(0xa4);
Uart1_write(0xa4); Uart1_write(0xa4); Uart1_write(0xa4);
Uart1_write(0xa4); Uart1_write(0xa4); Uart1_write(0xa4);
Uart1_write(0xa4); Uart1_write(0xa4); Uart1_write(0xa4);
Uart1_write(1);
}
if(readbuff[1]==2)
{
lcd_out(1,1,"–RF iletisimi–");
lcd_out(2,1,"Gonderiliyor");
Uart1_write(0xa4); Uart1_write(0xa4); Uart1_write(0xa4);
Uart1_write(0xa4); Uart1_write(0xa4); Uart1_write(0xa4);
Uart1_write(0xa4); Uart1_write(0xa4); Uart1_write(0xa4);
Uart1_write(0xa4); Uart1_write(0xa4); Uart1_write(0xa4);
Uart1_write(2);
}
if(readbuff[1]==3)
{
lcd_out(1,1,"–RF iletisimi–");
lcd_out(2,1,"Gonderiliyor");
Uart1_write(0xa4); Uart1_write(0xa4); Uart1_write(0xa4);
Uart1_write(0xa4); Uart1_write(0xa4); Uart1_write(0xa4);
Uart1_write(0xa4); Uart1_write(0xa4); Uart1_write(0xa4);
Uart1_write(0xa4); Uart1_write(0xa4); Uart1_write(0xa4);
Uart1_write(3);
}
}
else {portb=readbuff[0];}
}
}
sıkınıtım toprak bağlantısı yapıp resetleyince alıcı tarafı çalışıyor ancak diğer türlü çalışıyor toprakları kısa devre yaptım rf alıcı vericiyi ekledim yine çalışmadı sorun nedir
Gördüğüm kadarı ile uyandırma ve senkron bilgisi göndermiyorsunuz. RF alıcı verici çiftlerinin çalışabilmesi için bunların gönderilmesi şart. Yayını dikkatli okuyunuz.
Çok çok teşekkür ederim ben meğer uyandırmamışım özellikle sonda 0 göndermek gerekiyormuş bende uyandırma sinyalini rastgele gönderiyoruz sanıyordum. hocam kusura bakmayın geç yazdım buraya olduktan sonra epey bi dinlendim şimdide usb den sıcaklık okuma kısmını hallediyorum kitaplarda ds1820 gibi sensörler kullanılmış ama ben lm35 i tercih ettim elimde o olmasından dolayı isteyen olursa mail atabilirler c# da lm35 ile sıcaklık ve pwm uygulaması büyük ihtimalle yarına bitecek rf ide katabilirim şuan için gerek görmedim kod konusunda bütün arkadaşlara yardım edebilirim bildiğim kadarıyla tabi
ismail_algn@hotmail.com mail atmaları buraya yazmaları yeter bakıyorum zamanım oldukça linkte ise yaptığım uygulamanın kısa bi denenmesi var
Güzel bir çalışma dostum…
Çok güzel çalışma olmuş, yerli ürünlerimizi tanıtmanızdan ötürü de ayrıca teşekkür etmek isterim. Bir şey sormak istiyorum mümkünse;
for(a=1100;a=<1900;a++)
{
led1=1;
delay_us(a);
led1=0;
delay_ms(20);
}
bu komutun neresi mantıksız acaba? RF kullanarak quadrokopter yapmaya çalışıyorum. joysticki ileri komutu aldığında artırmam gerekiyor. MicroC derleyicisi hata veriyor. delay_us() içinde değişken tanımlayıp değişken artığı zaman motor hızıda değişecek fakat derleme hatası veriyor. Bir yere odaklanıp bir noktayı kaçırıyor muyum?
birde derleyici neden şu şekilde for(int a=1000;a<2000;a++){…..}derlemeye imkan sağlamıyor?
Çok teşekkür ederim, çok cahilce bir soru sorduysam kusura bakmayın lütfen hatırladıklarımla bir şeyler çıkarmaya çalışıyorum.
int a;
void gecik(unsigned int deger)
{
unsigned int b;
for(b=0;b<deger;b++)
{
delay_us(1);
}
}
void main()
{
for(a=1100;a<=1900;a++)
{
led1=1;
gecik(a);
led1=0;
delay_ms(20);
}
}
Yukarıdaki kod ile istediğiniz gecikme değerini “gecik(x)” şeklinde yazarak 65536 us’ye ye kadar gecikme sağlayabilirsiniz.
Çok Teşekkür Ederim.
Merhaba. CCS C derleyicisiyle yazdığım kodlarla rf ile sıcaklık değerlerinden oluşan bir dizi göndermek istiyorum. TX-RX arasına tel bağlayınca veri düzgün iletiliyor, ama RF modülleri taktığımda saçma sapan 4 haneli sayılar çıkıyor. Paylaştığınız kodları inceledim, yalnız uart ı bilmediğimden pek anlayamadım.
Çalışma şeklini şöyle özetliyeyim: D0 ve D1 de 2 adet led var ve sıcaklık değeri 28 derecenin üstündeyken biri, altındayken diğeri yanıyor.
Aşağıda verici ve alıcı kodlarını paylaştım. Yardımcı olabilir misiniz?
verici kodlar:
#include
#FUSES NOWDT, XT, PUT, BROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=4000000)
#use rs232(baud=600, xmit=PIN_C6, rcv=PIN_C7)
#use fast_io(b)
#define use_portb_lcd TRUE
#include //lcd ait fonksiyonlar programa eklenir
#include “ds18b20.c” //ds18b20 ait fonksiyonlar programa eklenir
float sicaklik;
int16 data[3];
int i;
void sicaklik_gonder()
{
int16 a;
a = sicaklik*10;
delay_ms(20);
data[0] = (a/100)%10;
delay_ms(100);
//printf(lcd_putc,”\na = %d”,data[0]);
data[1] = (a/10)%10;
delay_ms(100);
//printf(lcd_putc,”\tb = %d”,data[1]);
data[2] = a%10;
delay_ms(100);
//printf(lcd_putc,”c = %d”,data[2]);
for(i=0;i<3;i++) putc(data[i]);
delay_ms(200);
}
void main()
{
lcd_init();
lcd_putc("\f");
printf(lcd_putc,"\fSICAKLIK = ");
while (TRUE)
{
sicaklik = ds1820_oku();
lcd_gotoxy(1,2);
printf(lcd_putc,"%3.1f %cC", sicaklik,223);
sicaklik_gonder();
}
}
alıcı kodlar:
#include
#fuses XT,NOWDT
#use delay(clock=4000000)
#define use_portb_lcd TRUE
#include
#use rs232(baud=600,xmit=PIN_C6,rcv=PIN_C7)
int8 i;
int16 data[3];
int16 a, b, c;
float d, sicaklik;
void sicaklik_oku()
{
for(i=0;i<3;i++) data[i] = getch();
a = 100*data[0];
b = 10*data[1];
c = data[2];
d = a + b + c;
sicaklik = d/10;
printf(lcd_putc,"\n%3.1f %cC",sicaklik,223);
//printf(lcd_putc,"\na=%ld",data[0]);
//printf(lcd_putc,"b=%ld",data[1]);
//printf(lcd_putc,"c=%ld",data[2]);
}
void main()
{
lcd_init();
printf(lcd_putc,"\fSICAKLIK = ");
while(TRUE)
{
sicaklik_oku();
if(sicaklik<28) {
output_high(PIN_D0);
output_low(PIN_D1);
}
else {
output_high(PIN_D1);
output_low(PIN_D0);
}
delay_ms(200);
}
}
Merhaba,
Bilgilendirme platformunuz için teşekkürler.
Benim sorun yaşadığım bir konu var. Rf iletişimi ben MikroC’nin Manchester kütüphanesini kullanarak yapıyorum. Manchester kütüphanesi ile konu bulamadığım için buraya yazıyorum. Aynı modülleri kullanacağım. Kendi kütüphanesindeki örnek birebir yapıldığında çalışıyor. Ama aşağıdaki kod çalışmıyor. Burada bulunan Man_Receive_Init() komutunu kaldırınca aynı kodlar çalışıyor. Sorun ne olabilir. yardımınızı rica ediyorum. Saygılarımla.
Kodlar:
//RF iletişim alıcı bacak bağlantıları ve yönlendirme ayarları
sbit MANRXPIN at RA2_bit; //A2 bacağı RX bacağı olarak belirlendi.
sbit MANRXPIN_Direction at TRISA2_bit; //A2 bacağı yönlendirildi.
//RF iletişim alıcı bacak bağlantıları yönlendirme son
short ss_sayici=0;
void main() {
ADCON1|=0x0F;
CMCON|=7;
TRISA2_bit=1;
RA2_bit=0;
TRISE=0b001;
PORTE=0;
Man_Receive_Init(); //RF alıcı modülü hazırlandı.
delay_ms(100);
while(1)
{
if(RE0_bit)
{
ss_sayici++;
while(RE0_bit);
}
if(ss_sayici==1)
{
INT0IE_bit=1;
RE1_bit=1;
}
else if(ss_sayici==2)
{
ss_sayici=0;
RE1_bit=0;
}
}
}
Bu modüllerle manchester kütüphanesini kullanmanızı önermem. Donanımsal uartı kullanmanızı tavsiye ederim. Donanımsal manchester kodlama ile çalışan udea modülleri de mevcut.
Teşekkürler. Önerinizi dikkate alacağım. Bu modüller hangisi? Ve koddaki sorunun ne olabileceğine dair fikriniz var mı?
Kodlarınızın tamamını paylaşırsanız yorum yapmak kolay olur.
Bahsettiğim modül şu: https://www.udeashop.com/UTR-C12M-4800,PR-16.html
Kodlarımın tamamı bu. Man_Receive_Init() komutu ekliyken kodlar çalışmıyor. Bu komutu pasifleştirince çalışıyor.
Ben bu kodlarda rf iletişime dair bir satır göremiyorum. Paylaştığım yazıyı dikkatlice okumanızı tavsiye ediyorum.
Özür dilerim ifade edemedim herhalde. Bende bunu demek istemiştim. RF iletişim adına daha bişey yapmadığım halde, sadece Kütüphane kurulum komutunu kullanmış olmam kodu çalıştırmıyor. Kullanmayınca aynı komutlar çalışıyor. Kütüphanede mi sıkıntı var. Daha rahat görün diye RF iletişim kodları oluşturmadım çünkü bu noktada bir sıkıntı var, başlangıçta bir sıkıntı var. Anlatamadıysamda kalsın artık. Teşekkürler.
“The Manchester receive routines are blocking calls (Man_Receive_Init and Man_Synchro). This means that MCU will wait until the task has been performed (e.g. byte is received, synchronization achieved, etc).
Manchester code library implements time-based activities, so interrupts need to be disabled when using it. ”
Yukarıdaki açıklama kütüphanenin help dosyasının en başında verilmiş. Demek istediği şu: “Man_Receive_Init ve Man_Synchro” komutları vericiden senkron veya data gelmeden işletilmez ve kodu bloke eder. Yani siz “Man_Receive_Init();” yazdığınızda mcu’ya bağlı rf modülden herhangi bir veri gelmezse program o satırda bekler.
Teşekkürler, çok, çok teşekkürler. Dikkatsizlik başa bela 🙂
Hocam UUUUU göndermemizin amacı nedir? U bildiğim kadarıyla Uninitialized yani değer girilmemiş demek. U göndermek preamble başlatma için her hangi bir olumlu etki yapıyor mu?
U harfinin hex karsiligi 10101010 oldugu icin o sekilde gonderim yapiliyor.
Soft_Uart ile ilgili ufak bir örnek yazarmısınız
hocam merhaba güzel bir çalışma olmuş elinize sağlık.
bu algoritma ile kanal sayısını nasıl çoğalta biliriz.
yeniden char ile karakter dizisi oluşturup farlı isimlerle yapmaya çalıştım ama olmadı
teşekürler
Soft uart ile ilgili bir ornek istedim 1 ay oldu yazmadiniz gerekte kalmadi kendim yazdim calistirdim.Yani artik ozgur olarak istedigim pinle bu isi yapabiliyorum.Yardim isteyen olursa mer_harun@mynet.com
Hocam daha önceki yazdığınız yorumu görmedim ama bu tür bilgileri MikroC’nin help kısmından edinebilirsiniz. derleyiciyi çalıştırdıktan sonra F1 tuşuna basmanız yeterli help için.
Saygılar.
kullanılan malzemeler 2xPic16F877a +ARX34-ATX34 RF modul
derleyici mblab xc8
bu baudrate ve uart hazırlama fonkisiyonlarını gösterebilirmisiniz
DS18B20 ile ölçtüğüm sıcaklık bilgisini RF ile başka bir devrede LCD’de görüntülemek istiyorum.Kodlar aşağıda ancak şöyle bir sorun var:
RF iletişiminde kullandığım preamble ve senkron bilgisinin ne yaptıysam LCD ‘de görüntülenmesine mani olamadım,sıcaklık bilgiside gözüküyor kayan yazı gibi 🙂
Bu sorunu nasıl aşabiliriz?
verici kodları:
sbit LCD_RS at RB0_bit;
sbit LCD_EN at RB3_bit;
sbit LCD_D4 at RB4_bit;
sbit LCD_D5 at RB5_bit;
sbit LCD_D6 at RB6_bit;
sbit LCD_D7 at RB7_bit;
sbit LCD_RS_Direction at TRISB0_bit;
sbit LCD_EN_Direction at TRISB3_bit;
sbit LCD_D4_Direction at TRISB4_bit;
sbit LCD_D5_Direction at TRISB5_bit;
sbit LCD_D6_Direction at TRISB6_bit;
sbit LCD_D7_Direction at TRISB7_bit;
const unsigned short TEMP_RESOLUTION = 9;
char pre[15]={‘U’,’U’,’U’,’U’,’U’,255,255,255,255,255,0,0,0,0,0};
int i=0,j=0,adet=1;
char *txt = “000.0000”;
unsigned temp,gecici_temp[40];
void InitTimer1(){
T1CON = 0x31;
TMR1IF_bit = 0;
TMR1H = 0x0B;
TMR1L = 0xDC;
TMR1IE_bit = 1;
INTCON = 0xC0;
}
void Interrupt(){
if (TMR1IF_bit){
TMR1IF_bit = 0;
TMR1H = 0x0B;
TMR1L = 0xDC;
gecici_temp[adet]=temp;
adet++;
if(adet==40) adet=0;
if(gecici_temp[adet]!=gecici_temp[adet-1]){
for(i=0;i<15;i++)
{
UART1_Write(pre[i]);
}
for(j=0;j<10;j++) //garanti olması açısından 10 kez gönderiliyor veriler…
{
for(i=0;i> RES_SHIFT ;
// Convert temp_whole to characters
if (temp_whole/100)
txt[0] = temp_whole/100 + 48;
else
txt[0] = ‘0’;
txt[1] = (temp_whole/10)%10 + 48; // Extract tens digit
txt[2] = temp_whole%10 + 48; // Extract ones digit
// Extract temp_fraction and convert it to unsigned int
temp_fraction = temp2write << (4-RES_SHIFT);
temp_fraction &= 0x000F;
temp_fraction *= 625;
// Convert temp_fraction to characters
txt[4] = temp_fraction/1000 + 48; // Extract thousands digit
txt[5] = (temp_fraction/100)%10 + 48; // Extract hundreds digit
txt[6] = (temp_fraction/10)%10 + 48; // Extract tens digit
txt[7] = temp_fraction%10 + 48; // Extract ones digit
// Print temperature on LCD
Lcd_Out(2, 5, txt);
}
void main() {
UART1_Init(2400);delay_ms(100);
InitTimer1();
CMCON=7;
Lcd_Init(); // Initialize LCD
Lcd_Cmd(_LCD_CLEAR); // Clear LCD
Lcd_Cmd(_LCD_CURSOR_OFF); // Turn cursor off
Lcd_Out(1, 1, " SICAKLIK: ");
// Print degree character, 'C' for Centigrades
Lcd_Chr(2,13,223); // Different LCD displays have different char code for degree
// If you see greek alpha letter try typing 178 instead of 223
Lcd_Chr(2,14,'C');
//— Main loop
do {
//— Perform temperature reading
Ow_Reset(&PORTA, 0); // Onewire reset signal
Ow_Write(&PORTA, 0, 0xCC); // Issue command SKIP_ROM
Ow_Write(&PORTA, 0, 0x44); // Issue command CONVERT_T
Delay_us(120);
Ow_Reset(&PORTA, 0);
Ow_Write(&PORTA, 0, 0xCC); // Issue command SKIP_ROM
Ow_Write(&PORTA, 0, 0xBE); // Issue command READ_SCRATCHPAD
temp = Ow_Read(&PORTA, 0);
temp = (Ow_Read(&PORTA, 0) << 8) + temp;
//— Format and display result on Lcd
Display_Temperature(temp/8);
Delay_ms(10);
} while (1);
}
Alıcı Kodları:
sbit LCD_RS at RB0_bit;
sbit LCD_EN at RB3_bit;
sbit LCD_D4 at RB4_bit;
sbit LCD_D5 at RB5_bit;
sbit LCD_D6 at RB6_bit;
sbit LCD_D7 at RB7_bit;
sbit LCD_RS_Direction at TRISB0_bit;
sbit LCD_EN_Direction at TRISB3_bit;
sbit LCD_D4_Direction at TRISB4_bit;
sbit LCD_D5_Direction at TRISB5_bit;
sbit LCD_D6_Direction at TRISB6_bit;
sbit LCD_D7_Direction at TRISB7_bit;
char txt[8];
char i=0;
void interrupt()
{
if (RCIF_bit)
{
txt[i]=Uart1_Read();
i++;
if(i==8) i=0;
}
}
void main() {
cmcon=7;
GIE_bit = 1; // Genel kesmeler aktif
RCIE_bit = 1; //Seri port kesmesi aktif
PEIE_bit = 1; // Enable Peripheral interrupt
UART1_Init(2400);delay_ms(100);
lcd_init(); DELAY_MS(50);
Lcd_Cmd(_LCD_CURSOR_OFF);
Lcd_Cmd(_LCD_CLEAR);delay_ms(100);
do {
lcd_cmd(_LCD_CLEAR); // lcd'yi temizle
lcd_out(1,1,"ISI=");
lcd_out(1,5,txt);
delay_ms(500);
lcd_chr_cp(223); //derece işareti
lcd_chr_cp('C');
delay_ms(10);
} while (1);
}
Özür dileerim verici kodlarını yanlış atmışım:(
sbit LCD_RS at RB0_bit;
sbit LCD_EN at RB3_bit;
sbit LCD_D4 at RB4_bit;
sbit LCD_D5 at RB5_bit;
sbit LCD_D6 at RB6_bit;
sbit LCD_D7 at RB7_bit;
sbit LCD_RS_Direction at TRISB0_bit;
sbit LCD_EN_Direction at TRISB3_bit;
sbit LCD_D4_Direction at TRISB4_bit;
sbit LCD_D5_Direction at TRISB5_bit;
sbit LCD_D6_Direction at TRISB6_bit;
sbit LCD_D7_Direction at TRISB7_bit;
const unsigned short TEMP_RESOLUTION = 9;
char pre[15]={‘U’,’U’,’U’,’U’,’U’,255,255,255,255,255,0,0,0,0,0};
int i=0,j=0,adet=1;
char *txt = “000.0000”;
unsigned temp,gecici_temp[40];
void InitTimer1(){
T1CON = 0x31;
TMR1IF_bit = 0;
TMR1H = 0x0B;
TMR1L = 0xDC;
TMR1IE_bit = 1;
INTCON = 0xC0;
}
void Interrupt(){
if (TMR1IF_bit){
TMR1IF_bit = 0;
TMR1H = 0x0B;
TMR1L = 0xDC;
gecici_temp[adet]=temp;
adet++;
if(adet==40) adet=0;
if(gecici_temp[adet]!=gecici_temp[adet-1]){
for(i=0;i<15;i++)
{
UART1_Write(pre[i]);
}
for(j=0;j<10;j++) //garanti olması açısından 10 kez gönderiliyor veriler…
{
for(i=0;i> RES_SHIFT ;
// Convert temp_whole to characters
if (temp_whole/100)
txt[0] = temp_whole/100 + 48;
else
txt[0] = ‘0’;
txt[1] = (temp_whole/10)%10 + 48; // Extract tens digit
txt[2] = temp_whole%10 + 48; // Extract ones digit
// Extract temp_fraction and convert it to unsigned int
temp_fraction = temp2write << (4-RES_SHIFT);
temp_fraction &= 0x000F;
temp_fraction *= 625;
// Convert temp_fraction to characters
txt[4] = temp_fraction/1000 + 48; // Extract thousands digit
txt[5] = (temp_fraction/100)%10 + 48; // Extract hundreds digit
txt[6] = (temp_fraction/10)%10 + 48; // Extract tens digit
txt[7] = temp_fraction%10 + 48; // Extract ones digit
// Print temperature on LCD
Lcd_Out(2, 5, txt);
}
void main() {
UART1_Init(2400);delay_ms(100);
InitTimer1();
CMCON=7;
Lcd_Init(); // Initialize LCD
Lcd_Cmd(_LCD_CLEAR); // Clear LCD
Lcd_Cmd(_LCD_CURSOR_OFF); // Turn cursor off
Lcd_Out(1, 1, " SICAKLIK: ");
// Print degree character, 'C' for Centigrades
Lcd_Chr(2,13,223); // Different LCD displays have different char code for degree
// If you see greek alpha letter try typing 178 instead of 223
Lcd_Chr(2,14,'C');
//— Main loop
do {
//— Perform temperature reading
Ow_Reset(&PORTA, 0); // Onewire reset signal
Ow_Write(&PORTA, 0, 0xCC); // Issue command SKIP_ROM
Ow_Write(&PORTA, 0, 0x44); // Issue command CONVERT_T
Delay_us(120);
Ow_Reset(&PORTA, 0);
Ow_Write(&PORTA, 0, 0xCC); // Issue command SKIP_ROM
Ow_Write(&PORTA, 0, 0xBE); // Issue command READ_SCRATCHPAD
temp = Ow_Read(&PORTA, 0);
temp = (Ow_Read(&PORTA, 0) << 8) + temp;
//— Format and display result on Lcd
Display_Temperature(temp/8);
Delay_ms(10);
} while (1);
}
can anyone help me to give some sample code to encrypt the data being sent using rf433 module….i am using PIC16F627A