momentary olarak nasıl çalıştırabilirim

Başlatan kadircalikusu, 14 Ekim 2010, 20:20:06

kadircalikusu

merhabalar yazdığım bu programda vericiden gelen bilgiye göre çıkış alıyorum.fakat çıkışı sürekli değilde momentary olarak almak istiyorum.yani 'A' verisi geldiği süre boyunca ilgili pinden çıkış almak istiyorum.ama ne yaptıysam bir türlü başaramadım.yardımcı olursanız sevinirim.
Alıntı Yap#include <16f628.H>
#fuses INTRC_IO, NOMCLR, NOPROTECT, NOWDT, NOLVP
#use delay(clock=4000000)
#use rs232(baud=2400, xmit=PIN_B2, rcv=PIN_B1)
int data=0;
#int_rda
void seri_kesme(){
disable_interrupts(int_rda);
if(getc()=='X'){data=getc();}}
void main(){
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_CCP1(CCP_OFF);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   output_low(pin_a2);
   output_low(pin_a3);
   enable_interrupts(GLOBAL);
while(1){
   enable_interrupts(int_rda);
   if(data=='A'){output_high(pin_a2);output_low(pin_a3);}
   if(data=='B'){output_low(pin_a2);output_high(pin_a3);}}}

Klein

Uart'a yeni veri gelene kadar uart tamponundaki veri aynı kalır.
uart tamponunu başka bir bir değişkene al.
karşılaştırma işlemini doğrudan uart tamponu ile değil bu değişken ile yap.
bir  zaman aşımı süresi koy.  eğer uart'a bu süre sonunda yeni veri gelmemişse bu değişkeni sıfırla.

mcn

Ben CCS de bir türlü seri haberleşme kesmesini istediğim gibi kullanamadım,sürekli sorun çıkartıyor,neden oluyor anlamadım gitti.
Bu şekilde kısa kodlar için ben şöyle yapıyorum,geçen de küçük bir projede kullandım işe yarıyor.Şu şekilde bir dene bakalım:
#include <16f628.H>
#fuses INTRC_IO, NOMCLR, NOPROTECT, NOWDT, NOLVP
#use delay(clock=4000000)
#use rs232(baud=2400, xmit=PIN_B2, rcv=PIN_B1)
int data=0;

void main(){
   
   output_low(pin_a2);
   output_low(pin_a3);
  
while(1){


   if(getc() == 0x41) //0X41=A'nın ASCII karşılığı
{output_high(pin_a2);output_low(pin_a3);
   

  if(getc() == 0x42) //0x42 B nin ASCII karşılığı
{output_low(pin_a2);output_high(pin_a3);}}}


Birde port yönlendirme komutlarını da yaparsan,daha sağlam olur.
www.teknikyazi.com --üşenme,erteleme,vazgeçme...

kadircalikusu

Alıntı YapUart'a yeni veri gelene kadar uart tamponundaki veri aynı kalır.
uart tamponunu başka bir bir değişkene al.
karşılaştırma işlemini doğrudan uart tamponu ile değil bu değişken ile yap.
bir  zaman aşımı süresi koy.  eğer uart'a bu süre sonunda yeni veri gelmemişse bu değişkeni sıfırla.
cevaplarınız için ikinizede teşekkür ederim.merak ettiğimde sizin verdiğiniz cevaptaki gibiydi.bende getc() de verinin kaldığını farketmiştim.zaten uğraştığımda onu nasıl değiştirebilirimdi."uart tamponunu başka bir bir değişkene al."demişsiniz data değişkeniyle zaten bunu yapmış olmuyormuyum ve zaman aşımı süresi ne kadar olmalı?tekrar teşekkürler.

JKramer

Siz gelen veri 'X' ise data değişkenine atıyorsunuz. Yapmanız gereken, gelen her ne ise okuyup işinize yarayanı kullanmak olmalı:

if(getc()=='X'){data=getc();}

yerine
data=getc();

olmalı. Daha sonra yaptığınız gibi ana döngüde data'yı test edebilirsiniz.

Bir de;

#use rs232(baud=2400, xmit=PIN_B2, rcv=PIN_B1,ERRORS)

mcn

Alıntı yapılan: JKramer - 15 Ekim 2010, 09:52:12


#use rs232(baud=2400, xmit=PIN_B2, rcv=PIN_B1,ERRORS)

"ERRORS" ne için hocam,ne gibi bir fayda sağlıyor?
www.teknikyazi.com --üşenme,erteleme,vazgeçme...

JKramer

Tampon dolduğunda set edilen overrun hata bit'ini otomatik sıfırlanması için gerekiyor. Bunu manuel ya da otomatik yapmazsanız yeni karakter alamazsınız. Katalogda "overrun error" diye geçiyor olması lazım.

mcn

bunu bilmiyordum teşekkürler JKramer hocam.

www.teknikyazi.com --üşenme,erteleme,vazgeçme...

kadircalikusu

#include <16f628.H>
#fuses INTRC_IO, NOMCLR, NOPROTECT, NOWDT, NOLVP
#use delay(clock=4000000)
#use rs232(baud=2400, xmit=PIN_B2, rcv=PIN_B1,ERRORS)
char data=0;
#int_rda
void seri_kesme(){
disable_interrupts(int_rda);
data=getc();}
void main(){
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_CCP1(CCP_OFF);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   output_low(pin_a2);
   output_low(pin_a3);
   enable_interrupts(GLOBAL);
while(1){
   enable_interrupts(int_rda);
   if(data=='A'){output_high(pin_a2);output_low(pin_a3);}
   if(data=='B'){output_low(pin_a2);output_high(pin_a3);}
   if(!kbhit()){delay_ms(10);data=0;output_low(pin_a2);output_low(pin_a3);}
   }}

JKramer hocam yardımlarınız için teşekkürler.dediklerinizi yaptım ve oldu.programın yeni hali yukarda.data değişkene atma işini denemelerimde zaten yapmıştım fakat olmamıştı.önemli nokta sizin dediğiniz zaman aşımı süresiymiş ve ondan daha önemlisi "ERRORS" muş.çünkü bu program "ERRORS" olmadan çalışmıyor.program dediğim gibi  gelen 'A' datasının gelip gelmemesine göre çıkışa yansıtıyor fakat data sürekli gelmesine rağmen  çok rahatsız etmesede aralıklarla bir kesilme oluyor.bunuda sorsam ayıb etmem inşallah.teşekkürler.

kadircalikusu

#9
merhabalar. programın son halini alıcı ve verici olarak buraya koyuyorum.bu uygulamada udea nın 433mhz modulleriyle iki motorun yön kontrolu yapılmakta.yanlız ne yaptıysam bu modulleri " motor sürerken " aynı kaynaktan besleyerek doğru olarak çalıştıramadım.ama farklı bir kaynaktan beslediğimde hiçbir sorun yok.ve bu modüllerin mesafesi beni baya şaşırttı.şöyleki evim üç cepheli ve en uç cepheye balkona çıktığımda ki arada bi sürü duvar ve engel var yaklaşık 30 metre (daha fazlasını deneyemedim) sorunsuz olarak haberleşme sağlanıyor.dileyen kullanabilir.
alıcı
#include <16f628.H>
#fuses XT, NOMCLR, NOPROTECT, NOWDT, NOLVP
#use delay(clock=4000000)
#use rs232(baud=1200, xmit=PIN_B2, rcv=PIN_B1,ERRORS)
char data=0;

void main(){
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_CCP1(CCP_OFF);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   set_tris_b(0b00000010);
   output_low(pin_b4);
   output_low(pin_b5);
   output_low(pin_b6);
   output_low(pin_b7);
while(1){
   if(kbhit()){
   if(getc()=='X'){
   data=getc();
   if(data=='A'){output_high(pin_b4);output_low(pin_b5);}
   if(data=='B'){output_low(pin_b4);output_high(pin_b5);}
   if(data=='C'){output_high(pin_b6);output_low(pin_b7);}
   if(data=='D'){output_low(pin_b6);output_high(pin_b7);}
   if(data=='E'){output_high(pin_b4);output_low(pin_b5);output_high(pin_b6);output_low(pin_b7);}
   if(data=='F'){output_high(pin_b4);output_low(pin_b5);output_low(pin_b6);output_high(pin_b7);}
   if(data=='G'){output_low(pin_b4);output_high(pin_b5);output_high(pin_b6);output_low(pin_b7);}
   if(data=='H'){output_low(pin_b4);output_high(pin_b5);output_low(pin_b6);output_high(pin_b7);}}}
   else{delay_ms(15);output_low(pin_b4);output_low(pin_b5);output_low(pin_b6);output_low(pin_b7);}
   }}


verici
#include <16f628A.H>
#fuses XT, NOMCLR, NOPROTECT, NOWDT, NOLVP
#use delay(clock=4000000)
#use rs232(baud=1200, xmit=PIN_B2, rcv=PIN_B1,ERRORS)
int i,j,k;

void main(){
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_CCP1(CCP_OFF);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
set_tris_b(0b11110010);

while(1){
while(input(pin_b4) && !input(pin_b5) && !input(pin_b6) && !input(pin_b7)){
for(i=1;i<=5;i++)putc(0x55);
for(j=1;j<=5;j++)putc(0x00);
for(k=1;k<=5;k++)putc(0xFF);
while(input(pin_b4) && !input(pin_b5) && !input(pin_b6) && !input(pin_b7)){putc('X');putc('A');}delay_ms(10);}

while(!input(pin_b4) && input(pin_b5) && !input(pin_b6) && !input(pin_b7)){
for(i=1;i<=5;i++)putc(0x55);
for(j=1;j<=5;j++)putc(0x00);
for(k=1;k<=5;k++)putc(0xFF);
while(!input(pin_b4) && input(pin_b5) && !input(pin_b6) && !input(pin_b7)){putc('X');putc('B');}delay_ms(10);}

while(!input(pin_b4) && !input(pin_b5) && input(pin_b6) && !input(pin_b7)){
for(i=1;i<=5;i++)putc(0x55);
for(j=1;j<=5;j++)putc(0x00);
for(k=1;k<=5;k++)putc(0xFF);
while(!input(pin_b4) && !input(pin_b5) && input(pin_b6) && !input(pin_b7)){putc('X');putc('C');}delay_ms(10);}

while(!input(pin_b4) && !input(pin_b5) && !input(pin_b6) && input(pin_b7)){
for(i=1;i<=5;i++)putc(0x55);
for(j=1;j<=5;j++)putc(0x00);
for(k=1;k<=5;k++)putc(0xFF);
while(!input(pin_b4) && !input(pin_b5) && !input(pin_b6) && input(pin_b7)){putc('X');putc('D');}delay_ms(10);}

while(input(pin_b4) && !input(pin_b5) && input(pin_b6) && !input(pin_b7)){
for(i=1;i<=5;i++)putc(0x55);
for(j=1;j<=5;j++)putc(0x00);
for(k=1;k<=5;k++)putc(0xFF);
while(input(pin_b4) && !input(pin_b5) && input(pin_b6) && !input(pin_b7)){putc('X');putc('E');}delay_ms(10);}

while(input(pin_b4) && !input(pin_b5) && !input(pin_b6) && input(pin_b7)){
for(i=1;i<=5;i++)putc(0x55);
for(j=1;j<=5;j++)putc(0x00);
for(k=1;k<=5;k++)putc(0xFF);
while(input(pin_b4) && !input(pin_b5) && !input(pin_b6) && input(pin_b7)){putc('X');putc('F');}delay_ms(10);}

while(!input(pin_b4) && input(pin_b5) && input(pin_b6) && !input(pin_b7)){
for(i=1;i<=5;i++)putc(0x55);
for(j=1;j<=5;j++)putc(0x00);
for(k=1;k<=5;k++)putc(0xFF);
while(!input(pin_b4) && input(pin_b5) && input(pin_b6) && !input(pin_b7)){putc('X');putc('G');}delay_ms(10);}

while(!input(pin_b4) && input(pin_b5) && !input(pin_b6) && input(pin_b7)){
for(i=1;i<=5;i++)putc(0x55);
for(j=1;j<=5;j++)putc(0x00);
for(k=1;k<=5;k++)putc(0xFF);
while(!input(pin_b4) && input(pin_b5) && !input(pin_b6) && input(pin_b7)){putc('X');putc('H');}delay_ms(10);}}}


devre şeması
[IMG]http://img209.imageshack.us/img209/6046/rfmotor.jpg[/img]

Uploaded with ImageShack.us


tayyar

bende seri iletişimde sorun yaşıyorum. benim olayım buradakinden biraz farklı siz tek bir karakter gönderiyorsunuz. ben string gibi ifade gönderip onu almak istiyorum. mesela "lamba=15" gönderip karşıdan bunu almak istiyorum sanırım bu durumda karakterleri tek tek alıp bir değişkene atmalı ve bu değişkeni bütün olarak ele almalıyım. doğrumuyum aceba?

Program kodları ve sim. dosyaları şurada
https://www.picproje.org/index.php/topic,30120.0.html
--EGEMENLİK KAYITSIZ ŞARTSIZ MİLLETİNDİR--

kadircalikusu

string ifadeyi getc() ile alımışsınız.gets() ile almanız lazım.atıyorum "lamba" stringini yolladınız alırken char data[20]; 20 karakterli data isminde değişken oluşturup (değişkenin kaç karekterli olacağına siz karar verin ben örnek olarak söyledim) data=gets(); diye almanız gerekiyor

mcn

ustam güzel çalışıo gerçekten ellerine sağlık.
Bu arada video yu çekerken ezan okunuyodu,iman gücüylemi gidio yoksa araba  :D
www.teknikyazi.com --üşenme,erteleme,vazgeçme...

kadircalikusu

sagolasın.yok ezan okunmazkende çalışıyo :).artı dışarı yola indirdiğimde piller tam dolu değilken 70 metre kadar gidiyo.üstelik antenler uyduruktan hesapsız kitapsız.birde bilen varsa bu modullerin uygulama notlarında mesafelerinin teorik olarak 2km olduğu hatta 4km ye kadar çıkarılabileceği yazıyor bu doğrumudur.nasıl?