Selam arkadaşlar;
Üzerinde çalışmış olduğum bir projede takıldım kaldım, yardımlarınızı rica ediyorum..
Projem: Verici tarafında 16F84A kullanarak , beş buton ile ,alıcı tarafındaki , beş adet röleyi kontrol etmek istiyorum bunun için rf 433 mhz hazır alıcı verici kit kullanıyorum, bir türlü haberleştiremedim nerede hata yapıyorum acaba, verici ve alıcıyı koblo ile denediğimde çalışıyor. sizlere devrenin
CCS C ile yazılmış kodlarını da gönderiyorum.
yardımlarınızı bekliyorum..
VERİCİ KISIM
#include <okt_verici.h>
void main()
{
int a,b,c,d,e;
while(true)
{
set_tris_B(0x00);
set_tris_A(0xFF);
/* output_low(LED);
delay_ms(DELAY);
output_high(LED);
delay_ms(DELAY);*/
//1 NOLU BUTON KONTROLU
if(input(PIN_A0) == 1)
{
putc('A');
a=1;
delay_ms(DELAY);
}
else if (input(PIN_A0) == 0)
{
if(a==1)
{
putc('a');
a=0;
delay_ms(DELAY);
}
}
//2 NOLU BUTON KONTROLU
if(input(PIN_A1) == 1)
{
putc('B');
b=1;
delay_ms(DELAY);
}
else if (input(PIN_A1) == 0)
{
if(b==1)
{
putc('b');
b=0;
delay_ms(DELAY);
}
}
//3 NOLU BUTON KONTROLU
if(input(PIN_A2) == 1)
{
putc('C');
c=1;
delay_ms(DELAY);
}
else if (input(PIN_A2) == 0)
{
if(c==1)
{
putc('c');
c=0;
delay_ms(DELAY);
}
}
//4 NOLU BUTON KONTROLU
if(input(PIN_A3) == 1)
{
putc('D');
d=1;
delay_ms(DELAY);
}
else if (input(PIN_A3) == 0)
{
if(d==1)
{
putc('d');
d=0;
delay_ms(DELAY);
}
}
//5 NOLU BUTON KONTROLU
if(input(PIN_A4) == 1)
{
putc('E');
e=1;
delay_ms(DELAY);
}
else if (input(PIN_A4) == 0)
{
if(e==1)
{
putc('e');
e=0;
delay_ms(DELAY);
}
}
}
}
#include <16F84A.h>
#FUSES NOWDT //No Watch Dog Timer
#use delay(crystal=4000000)
#use rs232(baud=2400,parity=N,xmit=PIN_B0,rcv=PIN_A0,bits=8,stream=PORT1)
#define LED PIN_B0
#define DELAY 1000
ALICI KISIM
#include <okt_a.h>
char e;
void main()
{
output_B(0);
//Example blinking LED program
while(true)
{
set_tris_A(1);
set_tris_B(0);
/* output_low(LED);
delay_ms(DELAY);
output_high(LED);*/
e=getch();
// e='A';
//1 NOLU LED KONTROLU
if(e=='A')
output_high(PIN_B0);
else if(e=='a')
output_low(PIN_B0);
//2 NOLU LED KONTROLU
if(e=='B')
output_high(PIN_B1);
else if(e=='b')
output_low(PIN_B1);
//3 NOLU LED KONTROLU
if(e=='C')
output_high(PIN_B2);
else if(e=='c')
output_low(PIN_B2);
//4 NOLU LED KONTROLU
if(e=='D')
output_high(PIN_B3);
else if(e=='d')
output_low(PIN_B3);
//5 NOLU LED KONTROLU
if(e=='E')
output_high(PIN_B4);
else if(e=='e')
output_low(PIN_B4);
}
}#include <16F84A.h>
#FUSES NOWDT //No Watch Dog Timer
#use delay(crystal=4000000)
#use rs232(baud=2400,parity=N,xmit=PIN_B0,rcv=PIN_A0,bits=8,stream=PORT1)
#define LED PIN_B0
#define DELAY 5000
Verici ve alıcıyı kablo ile haberleştirdiğine göre kodlarda bir sorun yok. Eğer devreyi breadboarda kurduysan kesinlikle birşeyleri eksik yapıyorsundur. Fotoğrafını koyarsan inceleyebiliriz.
devreyi baskı devre ile plaket üzerinde kurdum ,breadboarda kurmadım, bağlantıların doğruluğunda şüphem yok ,alıcı verici kitleri de başka bir çalışan devre üzerinde deniyorum çalışıyor.
(http://s8.postimg.cc/8jyw3yngh/devre_Page_1.jpg) (http://postimg.cc/image/8jyw3yngh/)
eger uygulamayi gercek deneme yapacaksaniz INVERT komutu #use satirina eklenmeli.
su sekilde
alicida #use rs232(baud=600,parity=N,rcv=pin_c7,bits=8,INVERT)
ISIS'de deninrken bu satir cikartilmali!!
arkadaşlar burda b0 ile a0 a alıcı vericilerimi bağlıyoruz
Forumda en çok sorulan ve de en çok cevaplanan konulardan birisini sormuşsunuz.
preamble, uyandırma, udea, 433 anahtar kelimelerini aratırsanız çözüm olacak birçok başlık bulabilirsiniz.
Yapmak istediğiniz işe daha uygun önerileri PT2262 anahtar kelimesiyle bulabilirsiniz.
serkançetin, şemaya göre öyle görünüyor, alıcı verici b0 a0 da.
ustam bu devreyi uygulamada yaptım. çaılışmadı alıcıdaki led kafasına gre yanıp sönüyor.maksadım çalışma mantığını anlamak.çalışan düzgün ir devre bulamadım 4 tane denedim hiç biri çalışmadı
CCSC'de manchester code ile parazitlerden kurtulabilirsin. Birde veri yollarken alıcıyı uyandırmak için önden veri yollanır. (putc(0x55);)
TX
#include <12F683.h>
#device ADC=16
#include <string.h>
#include <stdlib.h>
#FUSES NOWDT //No Watch Dog Timer
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOMCLR
#use delay(internal=4000000)
#use rs232(baud=1200,parity=N,xmit=PIN_A5,bits=8,stream=PORT1)
#define LED PIN_A4
#define DELAY 1000
char durum="N";
#INT_EXT
void EXT_isr(void)
{
if(input(PIN_A2)) durum="A";
else durum="N";
}
void SEND_DATA(BYTE txbyte)
{
int i,j,b,me;
b = txbyte;
for (i=0; i<2; i++) {
me = 0; // manchester encoded txbyte
for (j=0 ; j<4; j++) {
me >>=2;
if (bit_test(b,0) )
me |= 0b01000000; // 1->0
else
me |= 0b10000000; // 0->1
b >>=1;
}
putc(me);
delay_ms(50);
}
}
main() {
enable_interrupts(INT_EXT);
enable_interrupts(GLOBAL);
while(1)
{
// sleep();
if(input(PIN_A2))
{
output_high(LED);
delay_ms(DELAY);
putc(0x55);
putc(0x55);
putc(0x55);
putc(0x55);
putc(0x55);
putc(0x00);
putc(0x00);
putc(0x00);
putc(0x00);
putc(0x00);
putc(0xFF);
putc(0xFF);
putc(0xFF);
putc(0xFF);
putc(0xFF);
putc(0xF0);
SEND_DATA('H');
SEND_DATA(durum);
putc(0xF0);
putc(0xF0);
output_low(LED);
delay_ms(DELAY);
}
}
}
RX
#include <16F628A.h>
#FUSES NOWDT //No Watch Dog Timer
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#use delay(internal=4000000)
#define LED PIN_B3
#define DELAY 1000
#use rs232(baud=1200, parity=N, xmit=pin_B2, rcv=pin_B1, bits=8)
#use rs232(baud=9600, parity=N, xmit=pin_B5, rcv=pin_B4, bits=8,stream=PORT1)
char c,a,i,dec,dec1,dec2,enc,pattern,son,j;
char nib[2]; //
char x;
BYTE DECODE_DATA() //decode function for machester encoded data. This code is working fine. I checked it.
{
enc = nib[0];
if (enc == 0xf0) // start/end condition encountered
return 0xf0;
dec = 0;
for (i=0; i<4; i++) {
dec >>=1;
pattern = enc & 0b11;
if (pattern == 0b01) // 1
bit_set(dec,3);
else if (pattern == 0b10)
bit_clear(dec,3); // 0
else
return 0xff; // illegal code
enc >>=2;
dec1=dec;
}
enc = nib[1];
if (enc == 0xf0) // start/end condition encountered
return 0xf0;
dec = 0;
for (i=0; i<4; i++) {
dec >>=1;
pattern = enc & 0b11;
if (pattern == 0b01) // 1
bit_set(dec,3);
else if (pattern == 0b10)
bit_clear(dec,3); // 0
else
return 0xff; // illegal code
enc >>=2;
dec2=dec;
}
dec2<<=4;
son=dec1|dec2;
x=0;
dec=0;
dec1=0;
dec2=0;
return (son);
}
#int_rda
void komut_al() //interrupt for receiving manchester coded data
{
disable_interrupts(int_rda);
c=getc();
if (x<2)
nib[x]=c; // assign low and high nibble of data
x=x+1;
enable_interrupts(int_rda);
}
main()
{
x=0;
nib[0]=0;
nib[1]=0;
enable_interrupts(int_rda);
enable_interrupts(GLOBAL);
while(1)
{
if (x>1)
{
x=0;
a=DECODE_DATA();
if (a=='H')
{
fprintf(PORT1,"GELEN=%c\r\n",a);
}
if (a=='N')
{
fprintf(PORT1,"NORMAL-%c\r\n",a);
}
if (a=='A')
{
fprintf(PORT1,"ALARM-%c\r\n",a);
}
enable_interrupts(int_rda);
}
}
}
@oktay5506 usta ben konuyla biraz ilgisiz olacak ama şunu söylemek isterim kodları direk mesajın içine değilde mesaj yazarken yukarıda KOD yazan yere tıklayarak kod parçacığı şeklinde yazarsan daha anlaşılır olur.
Örneğin;
if (i==0 & j==1)
{
printf("Örnek Yazı");
}
yerine
if (i==0 & j==1)
{
printf("Örnek Yazı");
}
bu şekilde daha anlaşılır olmakta
İyi Çalışmalar
Merhaba arkadaşlar hepinize çok teşekkür ederim. Devreyi calistirdim arada nadiren de olsa kendi kendine komut alıyor ama iyi sayılır su anda işler yoğun olduğu için zaman ayiramiyorum. Ve şehir disindayim dönünce ilk fırsatta kodları yayinlarim.
aliexpresden aldığım alıcı verici çalışmıyor galiba 5 tane yazılım denedim hiçbiri olmadı. rx ve tx lere data gönderiyorum hem simülasyonda hem uygulamada çalışıyor.
Hope rf in Hm-trp isimli, dorji isr dr ile başlayan kodlarda 433 mhz modülleri var. Hmtrp nin kullanımı kolay. 2000mt de sıkıntısız haberleştirdim.
Bir de yanlış hatırlamıyorsam f84te donanım uart yoktu. Software uart mı kullanıyorsun.
Direnc.net, m2mmarket.com.tr ve ara ara robotistan hm-trp satıyor.