Program işlemesinde bir sıkıntı var çözmemde yardımcı olurmusunuz :o

Başlatan toyo, 06 Mayıs 2012, 00:34:36

toyo

Üstadlar alıcı devremde işler yolunda değil  :(  Projemde 3 adet verici ve 3 adet alıcı var.Hangi vericeden sinyal gelirse gelsin sadece 1. sıraya yazdığım kodları işliyor .Örneğin aşağıdaki kodlarda kapı sinyalinin gelip gelmediğini ilk önce test ediyorum bebek yada gaz sinyali gelse dahi kapıdan sinyal gelmiş gibi çalışıyor similasyonda program.Yardımcı olurmusunuz. 
#include <16f628A.h>

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES XT                      //
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#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=4000000)

#use rs232(baud=2400,rcv=PIN_B3,parity=N,stop=1,stream=iletisim_1,force_sw)
#use rs232(baud=2400,rcv=PIN_A3,parity=N,stop=1,stream=iletisim_2,force_sw)
#use rs232(baud=2400,rcv=PIN_A4,parity=N,stop=1,stream=iletisim_3,force_sw)

#define LCD_ENABLE_PIN     PIN_A0      //lcd enable pini A0
#define LCD_RS_PIN         PIN_A1      //lcd rs pini pin A1
#define LCD_RW_PIN         PIN_A2     //lcd rw pini pin A2
#define LCD_DATA4          PIN_B7         //lcdnin data4 pini pinB7 
#define LCD_DATA5          PIN_B6         //lcdnin data5 pini pinB6 
#define LCD_DATA6          PIN_B5         //lcdnin data6 pini pinB5 
#define LCD_DATA7          PIN_B4         //lcdnin data7 pini pinB4

#define dur pin_b0
#define tit pin_b2
#define led pin_b2
#include <Clcd.c>
void main()
{
lcd_init();
printf(lcd_putc,"\f TEKNO KULAK");
delay_ms(500);
printf(lcd_putc, "\f");
lcd_gotoxy(1,1);
printf(lcd_putc,"EMRE SIMSEK");
lcd_gotoxy(1,2);
printf(lcd_putc,"3510410077");
delay_ms(500);
printf(lcd_putc, "\f");

output_high(tit);
output_high(led);
delay_ms(500);
output_low(tit);
output_low(led);

while(TRUE)
{
basla:

//*****************KAPI ALICI*****************// 
     if(fgetc(iletisim_1)==0x3d)//iletisim_1 yolu ile 0x3d geldimi
       {
        if(fgetc(iletisim_1)==('X'))
          {
            goto kapi;   
          }
         }     
                
//*****************BEBEK ALICI*****************//   

        if(fgetc(iletisim_2)==0x4B)    //iletisim_2 yolu ile 0x4b geldimi
          {
           if(fgetc(iletisim_2)==('C'))
              {
               goto bebek;
              }
          }
                  
//*****************GAZ ALICI*****************//   
        if(fgetc(iletisim_3)==0x9A)    //iletisim_3 yolu ile 0x9a geldimi
          {
           if(fgetc(iletisim_3)==('H'))
             {
               goto gaz;
             }
          }
  
                   
kapi:
               lcd_gotoxy(1,1);
               printf(lcd_putc,"______ALARM______");
               lcd_gotoxy(7,2);
               printf(lcd_putc,"KAPI");  
               output_high(led); // ledi yak
               output_high(tit);
               delay_ms(500);
               output_low(led);
               output_low(tit);
               delay_ms(250);
               output_high(led);
               output_high(tit);
               delay_ms(500);
               output_low(led);
               output_low(tit);    
               goto basla;
bebek:
               lcd_gotoxy(1,1);
               printf(lcd_putc,"______ALARM______");
               lcd_gotoxy(1,2);
               printf(lcd_putc,"BEBEK");
               output_high(led); // ledi yak
               output_high(tit);
               delay_ms(500);
               output_low(led);
               output_low(tit);
               delay_ms(250);
               output_high(led);
               output_high(tit);
               delay_ms(500);
               output_low(led);
               output_low(tit);
              
             
               goto basla;
gaz:           lcd_gotoxy(1,1);
               printf(lcd_putc,"______ALARM______");
               lcd_gotoxy(12,2);
               printf(lcd_putc,"GAZ");
               output_high(led); // ledi yak
               output_high(tit);
               delay_ms(500);
               output_low(led);
               output_low(tit);
               delay_ms(250);
               output_high(led);
               output_high(tit);
               delay_ms(500);
               output_low(led);
               output_low(tit);
              
               
               goto basla;
}
}
Gelirken ne getirilir ki giderken ne götürülür.

justice_for_all

gelen verilerde hata olabilir.kodunun isleyisi yalnis bikez. eger gelen datalar karsilastidirgin datalarin herhangi birine esit olmasa bile kapi  yazan yere gelecek ve program her seferinde oradan gececek duzeltmelisin.fonksiyon seklinde yap gotolu değil
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

toyo

Eğer gelen datalar istediğim datalara eşit değil ise kapı:'nın olduğu kısma gitmiyor program anlamayamadım bir türlü.
while(TRUE); döngüsü içinde eğer kapı devresinden bir sinyal geldiyse lcd ye şunları,bebek devresinden sinyal geldiyse şunları yazdır dediğimde de olmuyor.Fonksiyonlu nasıl yapabilirim yardımcı olurmusunuz?
Gelirken ne getirilir ki giderken ne götürülür.

justice_for_all

void kapi(void)
{
               lcd_gotoxy(1,1);
               printf(lcd_putc,"______ALARM______");
               lcd_gotoxy(7,2);
               printf(lcd_putc,"KAPI");  
               output_high(led); // ledi yak
               output_high(tit);
               delay_ms(500);
               output_low(led);
               output_low(tit);
               delay_ms(250);
               output_high(led);
               output_high(tit);
               delay_ms(500);
               output_low(led);
               output_low(tit);  


}

void bebek (void)
{
               lcd_gotoxy(1,1);
               printf(lcd_putc,"______ALARM______");
               lcd_gotoxy(1,2);
               printf(lcd_putc,"BEBEK");
               output_high(led); // ledi yak
               output_high(tit);
               delay_ms(500);
               output_low(led);
               output_low(tit);
               delay_ms(250);
               output_high(led);
               output_high(tit);
               delay_ms(500);
               output_low(led);
               output_low(tit);

}

void gaz (void)
{
               lcd_gotoxy(1,1);
               printf(lcd_putc,"______ALARM______");
               lcd_gotoxy(12,2);
               printf(lcd_putc,"GAZ");
               output_high(led); // ledi yak
               output_high(tit);
               delay_ms(500);
               output_low(led);
               output_low(tit);
               delay_ms(250);
               output_high(led);
               output_high(tit);
               delay_ms(500);
               output_low(led);
               output_low(tit);

}

void main()
{
lcd_init();
printf(lcd_putc,"\f TEKNO KULAK");
delay_ms(500);
printf(lcd_putc, "\f");
lcd_gotoxy(1,1);
printf(lcd_putc,"EMRE SIMSEK");
lcd_gotoxy(1,2);
printf(lcd_putc,"3510410077");
delay_ms(500);
printf(lcd_putc, "\f");

output_high(tit);
output_high(led);
delay_ms(500);
output_low(tit);
output_low(led);

while(TRUE)
{

//*****************KAPI ALICI*****************// 
     if(fgetc(iletisim_1)==0x3d)//iletisim_1 yolu ile 0x3d geldimi
       {
        if(fgetc(iletisim_1)==('X'))
          {
              kapi();
          }
         }     
                
//*****************BEBEK ALICI*****************//   

        if(fgetc(iletisim_2)==0x4B)    //iletisim_2 yolu ile 0x4b geldimi
          {
           if(fgetc(iletisim_2)==('C'))
              {
                    bebek();
              }
          }
                  
//*****************GAZ ALICI*****************//   
        if(fgetc(iletisim_3)==0x9A)    //iletisim_3 yolu ile 0x9a geldimi
          {
           if(fgetc(iletisim_3)==('H'))
             {
                   gaz();
             }
          }

}
}
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

toyo

Nasıl teşekkür etsem bilemedim :D  :D  :D Çok teşekkür ederim ÜSTAD.
Gelirken ne getirilir ki giderken ne götürülür.

toyo

Yalnız üstad yine sıkıntı var.Emre SIMSEK felan yazıyor ancak sinyal geldiğinde gerekenleri yapmıyor  :(
Gelirken ne getirilir ki giderken ne götürülür.

yldzelektronik

Tahmin ediyorum bunun sebebi gelen verilerim tamamını döngüler esnasında yakalayamasından.Bu iş için kesme kullanın bence.Yada ana göndüde fgetch kullanın.Yada timer ile kesme yapıp o sürelerin sonunda fgetch kontrolü yapsın.Yada uyandırma verisi olarak daha fazla kez veri gönderin.Yani tek karakter değil atıyorum 3 karakter.Son olarak gönderdiğiniz verileri daha fazla kez gönderebilirsiniz.Birde fgetch fonksiyonunun döndürdüğü değeri değişkene atın ordan sorgulayın...
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

toyo

Gelirken ne getirilir ki giderken ne götürülür.

toyo

Gelirken ne getirilir ki giderken ne götürülür.

taso

sıkıntı sanırım delay fonksiyonu...

chip delaya girdi mi belli bir sure no operation yaptıgı için uart gelmiş mi gelmemiş mi bakmaz  birde uartlardan gelen bilgisiyi 2 kez kontrol etmene gerek yok zaten olmaz :) ama illa ben ole yaparım dıyorsan    dizi elemanları olarak kaydedip bi rutin oluşturup kontrol edip işlemen gerekir 

iletisim_1[10];

if(kb_hit(iletisim_1)){iletisim_1=fgetc(iletisim_1);i++;}
şeklinde toplayıp işlemek mantıklıdır.   arka arkaya 2 farklı değer yollayıp 2 tane iç içe if koyman biraz riskli     0x0A geldiginde  0x01 gelmesinide bekliyor olacaksın   işlemcin 4 mhz , uart 1.78 mhz

aşagıda bir ornek verdim


int16 kademe; sure


#int_timer1
void led_isr(){

sure=(sure+1)%50;    //1snlik  timer kesmesi 20 mhz için

if(!(sure%25) && kademe== 0   ){
output_high(tit);
output_high(led);
kademe=1;
}

if(!(sure%12) && kademe== 1   ){
output_low(tit);
output_low(led);
kademe=2;
}


if(!(sure%25) && kademe== 2   ){
output_high(tit);
output_high(led);
kademe=3;
}


if(!(sure%12) && kademe== 3   ){
output_high(tit);
output_high(led);
kademe=0;
disable_interrupt(int_timer1);
}
set_timer(65535-50000);
}


#define kapi 1

# define bebek 2

#define gaz 3

void alarm_isr(int alarm){

lcd_gotoxy(1,1) printf(lcd_putc,"     alarm      ");

lcd_gotoxy(1,2)if(alarm==kapi)     printf(lcd_putc,"     kapı       ");
                        if(alarm==bebek)  printf(lcd_putc,"    bebek      ");
                        if(alarm==gaz) printf(lcd_putc,"            gaz       ");
                        

enable_interrupt(int_timer1);sure=0;set_timer(65535-50000);
 

}



main(){

setup_timer1(t1_internal| t1_div_by_8)


while(1){

if(kb_hit(iletisim_1)){ if(getch(iletisim_1)==1) alarm_isr(kapi)}

if(kb_hit(iletisim_2)){ if(getch(iletisim_2)==1) alarm_isr(bebek)}

if(kb_hit(iletisim_3)){ if(getch(iletisim_3)==1) alarm_isr(gaz)}

}

}


}


// #use rs232(     ,errors )         eklersen hata olduğunda uartlar durmaz

  //if(fgetc(iletisim_1)==0x3d)//iletisim_1 yolu ile 0x3d geldimi  bunlara ihtiyacın yok


birde bir anda 1 alarm yakalamak istiyorsan  alarm yakaladıktan sonra diğer cihazlara beklemeleri için bi sinyal yollamakta mantıklıdır. :) 

örnek kapıdan alarm geldıgınde gaz için 2 sn bekle bebek için 3 sn bekle gibi  bir eklemeyi  alarm veren chiplere  yaparsan    rahat edersin :)



toyo

Üstad bu kodlar benim bilgimin biraz üstünde olmuş  :D Benim bilgim tamamen yorumlayıp nasıl çalıştığına yetmedi.Bazı yerleri anlayabildim tabikide :) Kafam çok karışık belkide ondan anlayamadım.ilgilenip yazdığın için çok mutlu oldum çok teşekkürler.
Gelirken ne getirilir ki giderken ne götürülür.

justice_for_all

Timer interrupt icinde cok fazla kod var bu biraz sorun olabilir.o karsilastirmalari sonsuz dongu icindede yapabilirdin neden interrupt da yaptin acaba?
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

taso


taso

Alıntı yapılan: justice_for_all - 09 Mayıs 2012, 22:50:34
Timer interrupt icinde cok fazla kod var bu biraz sorun olabilir.o karsilastirmalari sonsuz dongu icindede yapabilirdin neden interrupt da yaptin acaba?

arkadasın ana sorunu main programının içinde delay olması delaydan dolayı bilgi kacırıyor

/*/*/*/*/*/*/*/*/*/*/*/*/*/*
#int_timer1
void led_isr(){

sure=(sure+1)%50;    //1snlik  timer kesmesi 20 mhz için

if(!(sure%25) && kademe== 0   ){
output_high(tit);
output_high(led);
kademe=1;
}

if(!(sure%12) && kademe== 1   ){
output_low(tit);
output_low(led);
kademe=2;
}


if(!(sure%25) && kademe== 2   ){
output_high(tit);
output_high(led);
kademe=3;
}


if(!(sure%12) && kademe== 3   ){
output_high(tit);
output_high(led);
kademe=0;
disable_interrupt(int_timer1);
}
set_timer(65535-50000);
}

/*/*/*/*/*/*/*/*/*/*/*/*/*/*

ledlerı yakmak için ne yapmak lazım zamanda boşluk yaratmak lazım ama diğer işlemleri bekletmeden :)   4 kademe led sırası yazdım 4 uncu kademe yapıldıktan sonra interrupt kendi kendini kapatacak yazılar yazılacak ardındanledlerı yakıp sondurme ısı tımer1 e bırakılacak oda işi bitince kendını kapatacak



mainde sadece delaysız yakalama olacak

/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*
while(1){

if(kb_hit(iletisim_1)){ if(getch(iletisim_1)==1) alarm_isr(kapi)}

if(kb_hit(iletisim_2)){ if(getch(iletisim_2)==1) alarm_isr(bebek)}

if(kb_hit(iletisim_3)){ if(getch(iletisim_3)==1) alarm_isr(gaz)}

}
/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*
kullandıgı işlemcinin interrupt kapasitesi yetersiz oldugu ıcın  kb_hit() fonksiyonunda bir değişim varsa bilgi vardır seklınde yakalamak kolay geldi

değişiklik istenilense

/*/*/*/*/*/*/*/*/*/*/*/*/*/*/
void alarm_isr(int alarm){

lcd_gotoxy(1,1) printf(lcd_putc,"     alarm      ");

lcd_gotoxy(1,2)if(alarm==kapi)     printf(lcd_putc,"     kapı       ");
                        if(alarm==bebek)  printf(lcd_putc,"    bebek      ");
                        if(alarm==gaz) printf(lcd_putc,"            gaz       ");
                       

enable_interrupt(int_timer1);sure=0;set_timer(65535-50000);


}
/*/*/*/*/*/*/*/*/*/*/*






toyo

Gelirken ne getirilir ki giderken ne götürülür.