Haberler:

Foruma Resim Yükleme ve Boyut Sınırlaması ( ! )  https://bit.ly/2GMFb8H

Ana Menü

RS232 INT_RDA Kesme sorunu

Başlatan garezza, 10 Mayıs 2015, 16:10:49

garezza

Merhabalar
Sorunum int_rda kesmesine izin verdiğimde program sürekli kesmede çalışıyor nedeni ne olabilir. CCS C 5.08 kullanıyorum. Şema çizmediğim için paylaşmadım ancak recive pinine hiçbişey bağlı değil rx pini boşta olmasına rağmen sürekli kesmede ana fonksiyona dönmüyor. Yardımlarınız için şimdiden teşekkürler.


#include <18F452.h>
#device ADC=16


#FUSES NOWDT                    //No Watch Dog Timer
#FUSES WDT128                   //Watch Dog Timer uses 1:128 Postscale
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O


#use delay(crystal=20000000)
#use FIXED_IO( D_outputs=PIN_D0 )
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8,stream=PORT1,errors)




#define Led PIN_D0


#INT_TIMER1
void  TIMER1_isr(void) 
{


}


#INT_RDA
void  RDA_isr(void) 
{




}


#define LCD_ENABLE_PIN PIN_B5
#define LCD_RS_PIN PIN_B7
#define LCD_RW_PIN PIN_B6
#define LCD_DATA4 PIN_B3
#define LCD_DATA5 PIN_B2
#define LCD_DATA6 PIN_B1
#define LCD_DATA7 PIN_B0


#include <lcd.c>


void main()
{
   clear_interrupt(INT_RDA);
    
   setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);      //104 ms overflow


  
   enable_interrupts(INT_TIMER1);
   enable_interrupts(INT_RDA);
   enable_interrupts(GLOBAL);




   lcd_init();


   lcd_putc("\fDeneme...\n");




   
   while(TRUE)
   {
    
    output_toggle(Led);
    delay_ms(500);
     
      //TODO: User Code
   }


}



baran123

Hiç bir şey bağlı olmadan veri alıyorsa donanımsal bir hata olabilir.Pine temas eden bir tel vs dikkat ettiniz mi ? Ben yine biraz daha düzenledim sizin kodunuzu sadece kullanılmayan özelikleri vs kapattım.Birde böyle deneyebilir misiniz ?

#include <18F452.h>
#device ADC=10 //Bu işlemcide 10 bit ADC çözünürlüğü mevcuttur.
#fuses HS,NOOSCSEN,NOPUT,NOBROWNOUT,NOWDT,NOSTVREN,NOLVP,NODEBUG,NOPROTECT,NOWRT
#use DELAY(CRYSTAL=20MHz, CLOCK=20MHz)//20 Mhz kristal takılı ve 20 mhz çalışma hızı
#use FIXED_IO( D_outputs=PIN_D0 )
#use RS232(BAUD=9600, PARITY=N, XMIT=PIN_C6, RCV=PIN_C7, BITS=8, STREAM=PORT1, ERRORS)

#define LCD_ENABLE_PIN  PIN_B5
#define LCD_RS_PIN      PIN_B7
#define LCD_RW_PIN      PIN_B6
#define LCD_DATA4       PIN_B3
#define LCD_DATA5       PIN_B2
#define LCD_DATA6       PIN_B1
#define LCD_DATA7       PIN_B0
#define LED             PIN_D0

#include <lcd.c>

#INT_TIMER1
void TIMER1_isr(void) 
{

}

#INT_RDA
void RDA_isr(void) 
{

}

void main(void)
{
   setup_timer_0(RTCC_INTERNAL);
   setup_timer_1(T1_INTERNAL | T1_DIV_BY_8); //104 ms overflow
   setup_timer_2(T2_DISABLED, 0, 1);
   setup_psp(PSP_DISABLED);    
   setup_spi(SPI_SS_DISABLED); 
   setup_adc_ports(NO_ANALOGS);    
   setup_adc(ADC_OFF); 
   setup_CCP1(CCP_OFF);        
   setup_CCP2(CCP_OFF); 
   
   enable_interrupts(INT_TIMER1);
   enable_interrupts(INT_RDA);
   enable_interrupts(GLOBAL);
   
   lcd_init();

   lcd_putc("\fDeneme...\n");

   while(TRUE)
   {
      output_toggle(Led);
      delay_ms(500);
   }
}

garezza

#2
Yardımın için teşekkür ederim. Gönderdiğin kodlada durum aynı. herhangi bi kısa devre durumuna karşı pini devreden ayırdım, toprağa çektim, dirençle 5 v çektim sonuç hep aynı.  "enable_interrupts(INT_RDA);" satırını sildiğimde herşey normal ama bu satırı ekleyince kesmede sürekli. Derleyiciden şüpeleniyorum rica etsem hex halini gönderebilirmisin ?

mesaj birleştirme:: 10 Mayıs 2015, 17:52:59

İnteruptları açmadan önce recive pinini low'a çektim durum düzeldi gibi duruyor. Nedenini anlayamadım. İyi forumlar

baran123

Rx pini veri alacağından giriş olmalıdır.Onu unuttuk :)

Dosyalar burada : http://s5.dosya.tc/server2/do75su/rx.rar.html

ahmetbudak

#4
Hocam kesme fonksiyonu cıkısında krsmeyi pasif yapmalısınız aksi halde program hep kesmede kalır

mesaj birleştirme:: 10 Mayıs 2015, 21:23:55

seri haberleşme kesme fonksiyonu  bu şekilde;

#INT_RDA
void RDA_isr(void) 
{
    disabled_interrupts(in_rda);
    komutlar
    komutlar
}


sonsuz döngü bloğunuz böyle olmalı

while(TRUE)
   {
      enable_interrupts(INT_RDA);
      output_toggle(Led);
      delay_ms(500);
   }

onepiro

Merhaba bende bir süredir int_rda kesmesi ile uğraşıyorum. CCS de bu kesme fonksiyonu içerisinde printf(lcd_putc,"") gibi lcd fonksiyonlarını yazınca uyarı veriyor, kesmeyi kapatıyor. Bende kesme içinde bir değişkeni set edip kesme işlemlerimi o değişkenin durumunu sorgulayarak yapıyorum. Bu seferde kesme çalışıyor fakat kesme için kullandığım programda donuyor kalıyor.  Bu konuda ne önerirsiniz bir fikri olan var mıdır? Teşekkürler.

Not kullandığım kod:
...
int1 Rx_Int=0;
char cevap[50];

#INT_RDA
void  RDA_isr(void) 
{
disable_interrupts(int_rda);  //kesme bayrağı sıfırlanıyor.
gets(cevap);                         //String ifadeyi okuyorum.
Rx_Int = 1;                           //Asıl kesme programımın çalışması için gerekli olan değilken
}


void main()
{
enable_interrupts(GLOBAL);    //Bütün kesmelere izin var.
enable_interrupts(int_rda);   //Seri port rx kesmesi aktif
lcd_init();
delay_ms(20);


while(1)
{

While(Rx_Int)
{

printf(lcd_putc,"\fCevap; ");
printf(lcd_putc,"\n%s",cevap);
delay_ms(100);
Rx_Int=0;
break;

} 

while(!Rx_Int)
{
enable_interrupts(int_rda);

Kesme haricinde ki programım..

} //Normal program while sonu


} //Ana program while sonu
} //VoidMain Sonu

baran123

" Bu seferde kesme çalışıyor fakat kesme için kullandığım programda donuyor kalıyor." Bu kısmı açar mısınız ?

Hocam while 1 içinde zaten sonsuz döngünüz var.Bir daha while kullanımına gerek yok basit bir if ile kullansanız daha iyi olur.

...
int1 RX_Int=0;
char cevap[50];

#INT_RDA
void  RDA_isr(void) 
{
   disable_interrupts(int_rda);  //kesme bayrağı sıfırlanıyor.
   gets(cevap);                  //String ifadeyi okuyorum.
   RX_Int = 1;                   //Asıl kesme programımın çalışması için gerekli olan değilken
}


void main()
{
   enable_interrupts(GLOBAL);    //Bütün kesmelere izin var.
   enable_interrupts(int_rda);   //Seri port rx kesmesi aktif
   lcd_init();
   delay_ms(20);
   
   while(TRUE)
   {
      if(RX_Int)
      {
         printf(lcd_putc,"\fCevap; ");
         printf(lcd_putc,"\n%s",cevap);
         delay_ms(100);
         RX_Int=0;
      } 
      else
      {
         enable_interrupts(int_rda);
         Kesme haricinde ki programım..
      } 
   } 
}

onepiro

Merhaba Baran Bey;
" Bu seferde kesme çalışıyor fakat kesme için kullandığım programda donuyor kalıyor." >>
Mesela kesme olmadığı zaman ana döngüde buton sorgulayıp, basıldığında seri porttan veri gönderiyorum ama seri porttan veri geldiğinde kesmedeki son işlem olan lcd'ye, gelen veriyi yazdırdıktan sonra program orada kalıyor. Butona bassam da veri göndermiyor.

baran123

Hmm nedendir bilemiyorum ama uzun vadeli işleri kesmeden yapmayalım kesmeden flag koyup bu flag a göre main içersinde yaparsak daha iyi olur.

MrDarK

gets kullanma kardeş ;

- Şahsi fikrim gets kadar saçma bir kod olamaz. Neden dersen int geldiğinde sen \r\n'yi bi şekilde bulamazsan o yazılım orada kalır. ! (Basit bir parazitte bile tıkanır yazılımın)
- Yapacağın iş şu ; madem \r\n kullanıyorsun açarsın 50 lik bir char array gelen bilgileri byte byte içine atarsın. Sonrada ana yazılımın içinde arka arkaya gelen \r\n'leri ararsın.
- Bu sayede tıkanma vb şey olmaz. Olay bu kadar basit.
Picproje Eğitim Gönüllüleri ~ MrDarK

garezza

Alıntı YapHocam kesme fonksiyonu cıkısında krsmeyi pasif yapmalısınız aksi halde program hep kesmede kalır
mesaj birleştirme:: 10 Mayıs 2015, 21:23:55
seri haberleşme kesme fonksiyonu  bu şekilde;

Kod: [Seç]
#INT_RDA
void RDA_isr(void)
{
    disabled_interrupts(in_rda);
    komutlar
    komutlar
}

sonsuz döngü bloğunuz böyle olmalı

Kod: [Seç]
while(TRUE)
   {
      enable_interrupts(INT_RDA);
      output_toggle(Led);
      delay_ms(500);
   }

Kesme sorunumu çözdü. Teşekkürler