18f452'de int_rda kesmesi oluşmuyor?

Başlatan Nedenler, 04 Haziran 2013, 11:14:17

Nedenler

Merhaba arkadaşlar kolay gelsin,

16F877A için yazdığım programı 18F452'ye çeviriyorum. Pin dizilimlerinde kesmelerde herhangi bir problemim yok zaten hemen hemen hiç bir pini ve donanımı da kullanmıyorum. Fakat 16F877A'da sorunsuz veri alıp gönderebildiğim int_rda kesmesi include kodunu 18F452 olarak değiştirdiğimde çalışmıyor. Hem proteusta hem de fiziksel devrede aynı sorun var. Acaba kesme tanımlarken iki pic arasında herhangi bir farklılık mı var ?

Main içinde printf kullanabiliyorum, sorun kesme oluşmasında.

setup_adc_ports(AN0);
setup_adc(ADC_CLOCK_DIV_32);
setup_psp(PSP_DISABLED);
setup_spi(SPI_SS_DISABLED);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_CCP1(CCP_OFF);
setup_CCP2(CCP_OFF);
   
set_tris_a(0x01);
set_tris_d(0x00);
   
enable_interrupts(GLOBAL);



enable_interrupts(INT_RDA); satırı while döngüsü içinde.

Bu haliyle 16F877A'da çalışıyor.

#int_RDA
void  RDA_isr() 
{
   disable_interrupts(int_rda);
   gets(ch);
   x = atoi (ch);
   x-=1;
   selected=1;
}

sadogan

disable_interrupts(int_rda);
Bu nerde aktif oluyor

Nedenler

asıl işlemlerin yapıldığı while(1) döngüsünün ilk satırında.

Okan AKÇA

setup_adc_ports(AN0);
setup_adc(ADC_CLOCK_DIV_32);
setup_psp(PSP_DISABLED);
setup_spi(SPI_SS_DISABLED);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_CCP1(CCP_OFF);
setup_CCP2(CCP_OFF);
   
set_tris_a(0x01);
set_tris_d(0x00);
enable_interrupts(int_rda);
enable_interrupts(GLOBAL);




#int_RDA
void  RDA_isr()
{
   disable_interrupts(int_rda);
   gets(ch);
   x = atoi (ch);
   x-=1;
   selected=1;
enable_interrupts(int_rda);
}

Nedenler

cyclone

Kesme bloğu sonuna enable_interrupts(int_rda); koymasam bile en azından blok içindeki komutları 1 kere olsun icra etmesi gerekmez mi?
Yine de verdiğiniz şekilde uyguladım. Sorun devam ediyor. Main döngüsü içine koyduğum printfler ve diğer işlevler çalışıyor fakat kesmeye hiç uğramıyor.

Okan AKÇA


justice_for_all

buyuk ihtimal error vardir.

#use rs232(.........,ERRORS)

kullanin buyuk ihtimal sorun gidecektir.
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

Nedenler

#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8,ERRORS)

şeklinde düzenledim. herhangi bir değişiklik olmadı.

Kodu sadece hatayı görebileceğimiz şekilde özetledim. 16F877A şeklinde derleyip 877A'da çalıştığımda Virtual Terminal'de "Başla..." yazdıktan sonra klavyeden girdiğim sayının bir eksiğini ekranda görebiliyorum. Fakat 18F452 şeklinde derleyip 452 picde çalıştığımda sadece "Başla..." yazısını görebiliyorum. Kesme bloğuna yine uğramıyor.

#include <18F452.h>
//#DEVICE ADC=8
#include <stdlib.h>     /* atoi */

#FUSES NOWDT,HS,NOPROTECT,NOBROWNOUT,NOPUT,NODEBUG,NOCPD,NOLVP,NOWRT

#use delay(clock=20000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8,ERRORS)

char ch[20];
int1 selected,found=0;
unsigned int8 type,i,k=0,basamak;

#int_RDA
void  RDA_isr() 
{
   disable_interrupts(int_rda);
   gets(ch);
   type = atoi (ch);
   type-=1;
   selected=1;
   printf("Sayi: ");
   printf("%d",type);
   enable_interrupts(int_rda);
}

void main()
{
   setup_adc_ports(AN0);
   setup_adc(ADC_CLOCK_DIV_32);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_CCP1(CCP_OFF);
   setup_CCP2(CCP_OFF);
   
   set_tris_a(0x01); 
   set_tris_d(0x00);
   enable_interrupts(int_rda);
   enable_interrupts(GLOBAL);   
      
   set_adc_channel(0);
   delay_us(100);   
   printf("Basla...\r\n");
   
   while(1);
}

Okan AKÇA

rx bacagını 1k direncle +5 bağlayınız.

Nedenler

Yine olmadı... Şaka gibi.
Sizin simule etme şansınız var mı acaba?
18F452 header dosyamda mı sorun var, derleyicim mi bozuyor hex dosyayı... Nedir anlamadım.

M_B

main dongusunde
while(1);


kısmını
while(1)
 {

 }

şeklinde yaparmısın.
İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

Nedenler

İkisi de aynı şey değil mi ?

Yine de yaptım tabi. Sorun devam ediyor.

Bu kod çalışıyor zaten kodda herhangi bir sıkıntı yok.  Ama 877A'dan 452'ye geçerken bir şeyler oluyor.

xoom

Simule ettiğiniz ISIS ve CCs C dosyalarını ekler misiniz. Böylece sorun sizde mi Yazılımda mı daha iyi anlaşılır.


xoom

#14
Program çalışıyor.

Edit:Resim Eklendi