Harici kesmeleri aynı anda kullanmak

Başlatan bulut_01, 03 Kasım 2013, 18:55:06

bulut_01

iyi aksamlar pic proje ailesi  ccs yazdıgım kodun küçük biyerinde takıldım int_ext , int_ext1 , int_ext2 kesmeleri oldugunda void EXT_kesme() etiketine dallanmasını istiyorum bunu nasıl yaparım ? int_ext kesmesi tamam diğer iki kesmeyi void EXT_kesme() buraya yönlendiremedim.

#include <18f1330.h> 
#fuses INTRC_IO,NOWDT,NOMCLR,H4
#use delay(clock=40M)
#use fast_io(a)
#use fast_io(b) 

int16 duty1;
int16 duty2;
int16 duty3;
int16 hall=0;
int16 p=200;
 

#int_EXT                 // int_ext1 ve int_ext2 kesme oldugunda buraya yönlenecek.
void EXT_kesme()
{
hall  = input_a()& 0b00000011 ;
hall |= input_b()& 0b00000100 ;


switch (hall)
{
case 0b00000101:
OUTPUT_B(0x00);
set_power_pwm0_duty(duty1=0);
set_power_pwm2_duty(duty2=0);
set_power_pwm4_duty(duty3=0);

set_power_pwm4_duty(duty3=P*64);
output_high(pin_b0);
break;

case 0b00000100:
OUTPUT_B(0x00);
set_power_pwm0_duty(duty1=0);
set_power_pwm2_duty(duty2=0);
set_power_pwm4_duty(duty3=0);

set_power_pwm2_duty(duty2=P*64);
output_high(pin_b0); 
break;

case 0b00000110:
OUTPUT_B(0x00);
set_power_pwm0_duty(duty1=0);
set_power_pwm2_duty(duty2=0);
set_power_pwm4_duty(duty3=0);

set_power_pwm2_duty(duty2=P*64);
output_high(pin_b6);
break;

case 0b00000010:
OUTPUT_B(0x00);
set_power_pwm0_duty(duty1=0);
set_power_pwm2_duty(duty2=0);
set_power_pwm4_duty(duty3=0);

set_power_pwm0_duty(duty1=P*64);
output_high(pin_b6);
break;

case 0b00000011:
OUTPUT_B(0x00);
set_power_pwm0_duty(duty1=0);
set_power_pwm2_duty(duty2=0);
set_power_pwm4_duty(duty3=0);

set_power_pwm0_duty(duty1=P*64);
output_high(pin_b4);
break; 

case 0b00000001:
OUTPUT_B(0x00);
set_power_pwm0_duty(duty1=0);
set_power_pwm2_duty(duty2=0);
set_power_pwm4_duty(duty3=0);

set_power_pwm4_duty(duty3=P*64);
output_high(pin_b4);
break;
}
}





           void main()
{
setup_power_pwm_pins(PWM_odd_on,PWM_odd_on,PWM_odd_on,PWM_odd_on);
setup_power_pwm(PWM_CLOCK_DIV_4|PWM_FREE_RUN,1,0,4095,0,1,0); 
setup_adc_ports(NO_ANALOGS); 
setup_adc( ADC_OFF );
setup_comparator(NC_NC_NC); 

set_tris_a(0b000000011);
set_tris_b(0b000000100);
OUTPUT_B(0x00);

enable_interrupts(INT_EXT); 
enable_interrupts(INT_EXT1); 
enable_interrupts(INT_EXT2);
ext_int_edge( L_TO_H ); 
ext_int_edge(1,L_TO_H ); 
ext_int_edge(2,L_TO_H );

enable_interrupts(GLOBAL);

while(TRUE)
{
}
}
YENİLMEZ..

esensoy

#1
#int_EXT1           
void EXT1_kesme(){
ext_kesme();
}
#int_EXT2                
void EXT2_kesme(){
ext_kesme();
}
En tehlikeli an "zafer" anıdır.

bulut_01

verdiğin blok derlemiyor hata verdi nerde hata var ?
YENİLMEZ..

esensoy

#3
parantezler yanlış olmuş, düzelttim, tekrar dener misiniz

mesaj birleştirme:: 03 Kasım 2013, 20:03:55

şöyle bir deneme yapmakta da fayda var, belki çalışır,
#int1_EXT
#int2_EXT
#int_EXT                 // int_ext1 ve int_ext2 kesme oldugunda buraya yönlenecek.
void EXT_kesme()
{
hall  = input_a()& 0b00000011 ;
hall |= input_b()& 0b00000100 ;
.
..
...
En tehlikeli an "zafer" anıdır.

yldzelektronik

#4
16f serisi olsa kesin diyebilirdim ama 18f serisinde interrupt priotry level olması kafamı karıştırdı. O yüzden kesin şu yöntem çalışır diyemem.Denemek gerek;

Bir kesme programı oluşturun.Mcu kesme rutininde interrupt flaglarını sorgulasın, siz de hangisini istiyorsanız ona göre işlem yapın.

Tek bir isr ile diğer int flaglarını sorgulayın.

Edit: http://ww1.microchip.com/downloads/en/DeviceDoc/31008a.pdf dökümanından yaptığım çıkarıma göre hangi int olursa olsun mcunun gidebileceği sadece bir isr var o da org 4. dolayısıyla dediğim yöntem kesinlikle bu chiplerde de çalışır.Hata yine dökümanda örnek program var.Sizin yazdığınız kod çalışmıyor mu?Sorun nedir?

Edit2: Muhtemelen ccs aktif edilen her kesme flagı için #int_xx kesmesi diye tanımlama görmek istiyor.Eğer öyle ise sayın @esensoy'un dediği şekilde yapman gerekebilir. Ayrı bir fonksiyona bütün isrler içinde çağrı yapabilirsin.
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.