RS232 sıralı led yardım

Başlatan alicanbesci, 27 Temmuz 2013, 05:22:09

alicanbesci

mrb projede klavyeden gelen bilgiye göre led ler sıralı sekilde yanacaktır.ornegin klavyeden e geldiyse 10 led asagı doğru yanacaktır sonsuz döngüde ancak o anda h harfi geldgnde birden ledlerin yanma yonu zıt olacaktır ne yaptıysam olmadı yardım ederseniz sevinirm c kodunu ve isis çizimini ekledim
kod:
#include <16f877a.h>
#fuses xt,nowdt,nowrt,nodebug,nolvp,nocpd,noput,noprotect,nobrownout

#use delay(clock=4000000)
#use rs232(baud=9600,xmit=pin_c6,rcv=pin_c7,parity=N,stop=1)
   int i =0,j;
   char gelen;
  #use rs232(baud=9600,xmit=pin_c6,rcv=pin_c7,parity=N,stop=1)
#INT_RDA
void hab_kesmesi(){
disable_interrupts(GLOBAL);
if(getch()=='d')
gelen='d';
if(getch()=='t')
gelen='t';

clear_interrupt(INT_RDA);
disable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
}
void bekle (){
   
      delay_ms(100);
}

void main(void){
    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(GLOBAL);
   enable_interrupts(INT_RDA);
   ext_int_edge(H_TO_L);
   
   set_tris_d(0x00);
  while(1)
  {
if(gelen=='d')
  {
  while(TRUE)
      {
      if(gelen=='t') break;
         output_d(i);
         i++;
         delay_ms(150);
         if(i>=10)
            i=0;
       }
  }
if(gelen=='t') 
  {
      while(TRUE)
      {
      i--;
      output_d(i);
      if(i<=0)
            i=10;
      delay_ms(150);   
      }
  }
}

}

[IMG]http://img594.imageshack.us/img594/6988/usqz.png[/img]

[IMG]http://img407.imageshack.us/img407/5396/2g3.png[/img]


Kabil ATICI

#1
önce ben c'yi pek bilmem ama

while(1)
  {
if(gelen=='d')
  {
      output_d(i);
      i--;
      if(i<=0)
            i=10;
      delay_ms(150);
}
if(gelen=='t')
   {
         output_d(i);
         i++;
         delay_ms(150);
         if(i>=10)
            i=0;
       }
  }
şeklinde bir şey olması gerektiğini düşünüyorum.
Hatta bu işlemi timer kesmesi içinde delay olayına girmeden yapman daha iyi olur.
hatta çalışıp çalışmadığını görmek için while döngüsünden sonra gelen="d" veya "t" vererek de görebilirsin.
Önce bunları çalıştır ki diğer bölümün çalışıp çalışmadığını görebilesin...
ambar7

alicanbesci

yok bu şekilde olduğu zaman d karakteri bir kere geldiğinde birinci led yanıyor sadece sonra diğerleri yanmak için tekrar d göndermek lazım ancak ben tek bir d de akışı sağlamak istiyorum ve başka bir harf geldiğinde olayın terse dönmesi gerek.

ahmetgokce01

#3
gönderdiğiniz kodlarda düzenleme yapıp ekliyorum, eğer devrenizde hata yoksa aşağıdaki kodlar %90 çalışacaktır.

#include <16f877a.h>
#fuses xt,nowdt,nowrt,nodebug,nolvp,nocpd,noput,noprotect,nobrownout
#use delay(clock=4000000)
#use rs232(baud=9600,xmit=pin_c6,rcv=pin_c7,parity=N,stop=1)

char gelen[1];

#INT_RDA
void hab_kesmesi(){
disable_interrupts(INT_RDA);
gets(gelen);
enable_interrupts(INT_RDA);
}

void led_efekt_1(){
//BURAYI İSTEDİĞİNİZ GİBİ EFEKTLE DOLDURUN
}
void led_efekt_2(){
//BURAYI İSTEDİĞİNİZ GİBİ EFEKTLE DOLDURUN
}

void led_efekt_3(){
//BURAYI İSTEDİĞİNİZ GİBİ EFEKTLE DOLDURUN
}

void led_efekt_4(){
//BURAYI İSTEDİĞİNİZ GİBİ EFEKTLE DOLDURUN
}

void led_efekt_5(){
//BURAYI İSTEDİĞİNİZ GİBİ EFEKTLE DOLDURUN
}

void main(void){
   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);
   
  while(TRUE){
   
   if(gelen[0]==A){
      led_efekt_1();

   }
   if(gelen[0]==B){
      led_efekt_2();
   }
   if(gelen[0]==C){
      led_efekt_3();
   }
   if(gelen[0]==D){
      led_efekt_4();
   }
   if(gelen[0]==E){
      led_efekt_5();
   }

}

alicanbesci

hocam ugrasın için teşekkürler ancak ben galiba anlatamıyorum ne demek istediğimi ledler a ya bastığımda ok yanıo ancak bundan sonra ben b gönderdiğimde ledler ters yöne doğru yanmalı yani isiste run etmeyi durdurup a yada b yapmıycam bir kere run edicem a gondericem sıralı yanacak herhangi bir anda yeni bir b harfi gelirse yaptığı işten çıkıp ilgili yere gidicek yani ters yanmaya baslıycak kesme mantığı gibi .. bu dediğim şekilde ne yapabiliriz tekrar teşekkür ediyorum.

ahmetgokce01

Tamam o zaman sizde if sorgulamalarını while olarak değiştirin karakter değiştiğinde bulunduğu while'dan çıkıp istediğiniz while döngüsüne girecektir;


#include <16f877a.h>
#fuses xt,nowdt,nowrt,nodebug,nolvp,nocpd,noput,noprotect,nobrownout
#use delay(clock=4000000)
#use rs232(baud=9600,xmit=pin_c6,rcv=pin_c7,parity=N,stop=1)

char gelen[1];

#INT_RDA
void hab_kesmesi(){
disable_interrupts(INT_RDA);
gets(gelen);
enable_interrupts(INT_RDA);
}

void led_efekt_1(){
//BURAYI İSTEDİĞİNİZ GİBİ EFEKTLE DOLDURUN
}
void led_efekt_2(){
//BURAYI İSTEDİĞİNİZ GİBİ EFEKTLE DOLDURUN
}

void led_efekt_3(){
//BURAYI İSTEDİĞİNİZ GİBİ EFEKTLE DOLDURUN
}

void led_efekt_4(){
//BURAYI İSTEDİĞİNİZ GİBİ EFEKTLE DOLDURUN
}

void led_efekt_5(){
//BURAYI İSTEDİĞİNİZ GİBİ EFEKTLE DOLDURUN
}

void main(void){
   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);
   
  while(TRUE){
   
   while(gelen[0]==A){
      led_efekt_1();

   }
   while(gelen[0]==B){
      led_efekt_2();
   }
   while(gelen[0]==C){
      led_efekt_3();
   }
   while(gelen[0]==D){
      led_efekt_4();
   }
   while(gelen[0]==E){
      led_efekt_5();
   }

}