EXT interup'i ile

Başlatan rakkoc, 17 Nisan 2013, 15:04:05

rakkoc

#include <18F4520.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)

#use rs232(BAUD=9600, XMIT=PIN_C6, RCV=PIN_C7, BITS=8, STOP=1, BRGH1OK, PARITY=N)

int8 c;
#int_rda
void seri(){
   c=getc();
   output_toggle(pin_E2); //LED1
}

#INT_EXT 
EXT_kesmesi(void)
{
   adet++;
   output_toggle(pin_E1); //LED2
   return;
}


void main()
{
 
   c = 1;

   // settings [url=http://www.teknobakis.com/ccs-c-ile-pic-programlama-pic-interrupts-kesmeler]http://www.teknobakis.com/ccs-c-ile-pic-programlama-pic-interrupts-kesmeler[/url]
   setup_psp(PSP_DISABLED);       
   setup_spi(SPI_SS_DISABLED);
   

   //enable_interrupts(INT_EXT | INT_RDA);  // EXT & rs232 kesmesi aktif
   
   enable_interrupts(INT_EXT);  // EXT kesmesi aktif
   ext_int_edge(H_TO_L); // sinyalin yükselen kenarynda kesme olu?
   
   enable_interrupts(global); // Aktif edilen tüm kesmelere izin ver

   enable_interrupts(int_rda); 
   set_tris_b(0xff);
   
   delay_ms(250);
   adet = 0;

 for(;;)
    {
    
    if(c == 0x49)
    {
         unsigned long tmpAdet = adet;
         tmpAdet = adet;
         int8 adetLow = tmpAdet;
         int8 adetMid = tmpAdet >> 8;
         int8 adetHigh = tmpAdet >> 16;

         output_toggle(pin_A1);
          putc(0x0A);
          putc(adetLow);
          putc(adetMid);
          putc(adetHigh);
    }
    else if (c == 0x50)
    {
      adet = 0;
      c = 0x01;
    }
      delay_ms(500);
      output_toggle(pin_E0); //LED3
}

}// end MAIN

Seklinde 2 adet kesmeyi birlikte kullaniyorum fakat sormak istedigim bir sey var. Arada Interup tetiklenmiyor (EXT_Kesmesi) bunun sebebinin RS232'den veri gonderdigi an'a denk geldigini dusunuyorum.

EXT interupindan gelen ine dalga sinyali sayip rs232'den gonderen bir program neden arada interup tetiklemesini algilamaz kafam karisti. Veri transferinde suanda sorun yasamiyorum ama hatali veri almam cok onemli olmaz onemli olan EXT interipndan gelen veriyi saglikli okumam.

esensoy

gerçekten zamansal sıkışıklık var ise uart interrupt içinde bir değişken değerini 1 yapıp çıkın,
ana program sonsuz döngüsünde de değişken değeri 1 ise uarttan veriyi okursunuz,
programınızı kısa bir sıkıntı olmaz sanırım,
bir de şema paylaşın, onu da görmek lazım,
En tehlikeli an "zafer" anıdır.

rakkoc

http://l1304.hizliresim.com/18/k/m5nkr.png >> Optokuptor kismi bu sekilde. gelen sinyal 30 V ine dalga

Sorun benim anladigim kadari ile UART dan sinyal giderken putC(xxx) kisminda paket bozulmasin ve extra gecikme yasanmasin diye INT_EXT'e gitmiyor.

RB0 'a sinyal gelmeden 1 DK once sadece 1 kere UART dan c degiskenine 0x49 datasi yukleniyor. "kbhit()" filan mi olur. yada INT_EXT'den gelen leri o an bir yerde bufferlaya bilirmiyim diye bakiyorum.

esensoy

dediğin gibi olamaz, uart modülünde veri gönderirken 1 leri 0 ları işlemci oluşturmuyor, gönderilecek data register a yazılıyor, modül kendisi gönderiyor,
okumaya çalıştığın sinyalin frekansı ne ki? opto ofrekansta çalışmıyordur belki,
sorun yok gibi görülüyor çünkü,
devreyi simulasyonda mı çalıştırıyorsun? yoksa borda döktün mü?
En tehlikeli an "zafer" anıdır.

rakkoc

Devreyi PCB de kurdum da deniyorum hocam. Sorun su sekilde bir Encoder dan ine dalga sinyal aliyorum. sinyal 6 Hz yi gecmiyor.

band 1.2 Km gittigi zaman (cm'de 1 palse aliyorum 1200 palse sonunda) benim bu sistem 1193; 1185; 1188; 1193 seklinde cikislar verdi. opto tlp814 takili uzerinde. kayibin az olmasi bana o gonderim esnasinda kayip olusuyor diye dusundurdu.

esensoy

"ine" dediğin sine mi nedir?
sinus çıkışlı encoder mi yani?
En tehlikeli an "zafer" anıdır.

rakkoc

Igne, gocmenim de ben karakterlerde sorun yasiyorum. Pin die de gecebilir