Proje ödevim için uzaktan kumandalı araba yapmaya çalışıyorum. 16f877'ye bağlı L293D ile iki dc motor kontrol edilecek. En büyük sorunum RF ile iletişim nasıl programlanabilir 6 bitlik veriyi tek bitle nasıl gönderebilirim? Kaynak araştırdım ama bulamadım yardımcı olursanız sevinirim.
Yapmaya çalıştığım devre böyle birşey:
(http://u1312.hizliresim.com/1j/r/vu8qd.png)
6 bitlik veriyi 8 bitlik tek bir sayı ile gönderebilirsiniz. İşlemci 8 bit olduğundan tek seferde 8 bit gönderebilir, seri port bunu bir seferde iletir.
Pek bilgili olmadığımdan doğru anlatamadım sanırım. Verici devrede 6 farklı buton var 6 farklı durumu tek pinde nasıl belirtebilirm. Sanırım çizdiğim devre yanlış alıcının RC7/RX girişine bağlı olması gerek.
Merhabalar 6 farklı buton olması sorun değil 8 bit = 1 byte'lık bir bilgi ile gönderebilirsiniz .
Bununda çok basit yolları var.B portunun durumunu herhangi bir değişkene atayın. Bu değişkeni karşı tarafa iletin. Karşı tarafın aldığı byte üzerinde işlemlerinizi tanımlayın.
Ayrıca zamanında paylaştığım örnekler bu konuda işinize yarayabilir .
https://www.picproje.org/index.php/topic,38490.0.html (https://www.picproje.org/index.php/topic,38490.0.html)
iyi çalışmalar saygılarımla ...
Çok teşekkürler ama sayfadaki hiçbir linkten faydalanamadım. Ya arşiv hatası diyor ya da dosya kaldırılmış.
Verdiğim linkte indirme linklerine bakın. Linklerin biraz altında RFDENEMESI.rar ve ccscdersleri.rar bölümüne tıklarsanız indirebilirsiniz. ARX - ATX bölümündeki link işinize yarayacaktır. ASK modüller ile haberleşme konusunda. İyi çalışmalar , saygılarımla ...
Bu linkten (http://mikrodunya.wordpress.com/2011/11/08/udea-nin-rf-veri-iletimi-alanindaki-kucuk-devleri-atx-34-nrx-34/) udea rf modüllerin kullanımını öğrenebilirsiniz.
Yardımlarınız için tekrar teşekkürler verdiğiniz örneklerde işin içine adc, uart gibi farklı şeyler girmiş kafam iyice karıştı :-[ Yazdığım kodlar bu şekilde. Vericinin tx çıkışından kare dalga elde ediyorum ama alıcıda rda kesmesi oluşmuyor. Gönderdiğim şeyleri doğru okumasa anlarım preamble, öncü veri gibi birşeyler yapmam lazım. Anlamadığım şey alıcının rx girişinde değişiklik olduğunda hiç kesme oluşmaması.
verici:
#include <16F877A.h>
#FUSES NOWDT //No Watch Dog Timer
#FUSES XT //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES NOPUT //No Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES NODEBUG //No Debug mode for ICD
#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
#use delay(clock=4M)
#use rs232(baud=600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
void main()
{
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_psp(PSP_DISABLED);
setup_spi(SPI_SS_DISABLED);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
set_tris_b(0x00);
set_tris_a(0xFF);
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
while (1)
{
if(input(pin_a0)==0)
{
putc('q');
delay_ms(1);
}
if(input(pin_a1)==0)
{
putc('a');
delay_ms(1);
}
if(input(pin_a2)==0)
{
putc('w');
delay_ms(1);
}
if(input(pin_a3)==0)
{
putc('s');
delay_ms(1);
}
if(input(pin_a4)==0)
{
putc('e');
delay_ms(1);
}
if(input(pin_a5)==0)
{
putc('d');
delay_ms(1);
}
}
}
alıcı:
#include <16F877A.h>
#device adc=8
#FUSES NOWDT //No Watch Dog Timer
#FUSES XT //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES NOPUT //No Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES NODEBUG //No Debug mode for ICD
#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 WRT_50% //Lower half of Program Memory is Write Protected
#use delay(clock=4000000)
#use rs232(baud=600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
char veri;
#int_rda
void RDA_kesme()
{
disable_interrupts(int_rda);
output_b(0x0F);
getc(veri);
}
void main()
{
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_psp(PSP_DISABLED);
setup_spi(SPI_SS_DISABLED);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
enable_interrupts(int_RDA);
enable_interrupts(GLOBAL);
set_tris_c(0xFF);
set_tris_A(0x00);
set_tris_b(0x00);
while(1)
{
enable_interrupts(int_rda);
if (veri=="q")
output_a(0x02);
if (veri=="a")
output_a(0x01);
if (veri=="w")
output_a(0x0A);
if (veri=="s")
output_a(0x06);
if (veri=="e")
output_a(0x08);
if (veri=="d")
output_a(0x04);
}
}
iyi günler arkadaşlar 2 yıl önce uğraştığınız çalışmalara ben de şu an dahil olayım istedim, tek başıma aylardır kurcalıyorum fakat beceremedim. yardım etmeniz mümkünmü, aşağıda kullandığım kodları paylaşıyorum.
verici:
#include <16F628A.h>
#device adc=16
#fuses INTRC_IO, NOWDT, NOPUT, NOPROTECT, NOBROWNOUT, NOMCLR, NOLVP, NOCPD
#use delay(clock=4M)
#use fast_io(a)
#use fast_io(b)
int m;
#use rs232(baud=900,parity=N,xmit=pin_B2,rcv=pin_B1,bits=8)
void main()
{
set_tris_a(0x03);
set_tris_b(0x00);
output_a(0x00);
output_b(0x00);
delay_ms(100);
while(TRUE){
if(input (pin_a0)==1){
delay_ms(39);while(input(pin_a0));
putc(0b01010101);// putc(0b00000000); putc(0b11111111);
putc('X');
delay_ms(39);
putc('A');
delay_ms(10);output_toggle(pin_a2);delay_ms(239);
}
if(input(pin_a1)==1){
delay_ms(39); while(input(pin_a1));
putc(0b01010101);// putc(0b00000000); putc(0b11111111);
putc('X');
delay_ms(39);
putc('B');
delay_ms(10);output_toggle(pin_a3);delay_ms(239);
}
}
}
alıcı:
#include <16F628A.h>
#device adc=16
#fuses INTRC_IO, NOWDT, NOPUT, NOPROTECT, NOBROWNOUT, NOMCLR, NOLVP, NOCPD
#use delay(clock=4M)
#use rs232(baud=900,parity=N,xmit=pin_B2,rcv=pin_B1,bits=8)
#int_rda
int i;
char e;
char x;
void kesgel(){
disable_interrupts(int_rda);return;
}
void main()
{
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
set_tris_a(0x00);
output_a(0x00);
enable_interrupts(int_rda);
enable_interrupts(global);
while(TRUE)
{enable_interrupts(int_rda);
enable_interrupts(global);
if(getch()=='X') { e = getch();
if(e=='A'){ kesgel();
output_toggle(pin_a0);delay_ms(500);
output_toggle(pin_a0);delay_ms(500);
output_toggle(pin_a0);delay_ms(500);
output_toggle(pin_a0);delay_ms(500);
output_toggle(pin_a0);delay_ms(500);
}
if(e=='B'){ kesgel();
output_toggle(pin_a1);delay_ms(239);
output_toggle(pin_a2);delay_ms(239);
output_toggle(pin_a3);delay_ms(239);
}
}
}
}
RF iletişim konusunda eğer konu başındaki şema ile çalışıyorsanız, hiç bir rf sinyali picin bacağına doğrudan gönderildiği gibi ulaşmazki picin bacağında doğrudan bir Rx kesmesi oluşsun. RF sinyaller milivolt veya mikrovolt seviyelerinde oluşuyor. Anten ve yükseltici devre sayesinde anlaşılır bir hale gelir. Picin Rx bacağına bu değerde bir sinyal geldiğinde doğal olarak 0 olarak algılanır ve kesme oluşmaz. Bu işlem için hem verici hem de alıcı tarafından modüllerin kullanılması gerekli. (Sizin için RF katını tasarlamanın daha zor olduğunu varsayarak).
Modül kullandığınızda kullandığınız modülün yapısına göre bir haberleşme yapısı kullanacaksınız. Çoğunlukla modül kullandıktan sonra doğrudan rx - Tx bağlı imiş gibi haberleşirsiniz.