Haberler:

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

Ana Menü

ccs c pic c yardım

Başlatan thespear, 21 Ağustos 2008, 14:57:28

thespear

merhaba arkadaşlar,
ccs c pic c ile programlama yapıyorum. Seri port interrupt kullanıyorum. (int_rda). Interrupt içine girdiğinde disable ediyorum ve çıkışta da enable ediyorum. Disable etmeme rağmen interrupt içinde işlem yaparken gönderdiğim datayı hafızasına alıp işlem bittikten sonra interrupt almış gibi işlemi yapıyor. Disable etmeme rağmen bunu neden yapıyor?

sagamen

herkEse kolay gelsin

thespear

merhaba sagamen akşam kodu koyarım bakıp yardımcı olursan çok sevinirim. Yardımcı olur musun?

707yunus

bide disable global de belki işe yarar.

thespear

Aşağıda kodu koydum mesela while loopun içindeyken interrupt alıyorum ve while işlemi bitince aldığı dataya göre yeni işlemi yapıyor. Fakat interruptlarım kapalı. Çözemedim.

#int_rda 
void isr(void) 
{ 
         disable_interrupts(GLOBAL);
         disable_interrupts(int_rda);
         data = getc();
       if(data=='!'|| data=='ü' )
       {


         output_toggle(PIN_A3);
         a=0;
              while(a<71)
            {
             while(goster<15)
            {
               output_d(a);
               output_b(0x05);
               Delay_us(1000);
               a=a+1;
               output_d(a);
               output_b(0x2A);
               Delay_us(1000);
               a=a+1;
               output_d(a);
               output_b(0x5C);
               Delay_us(1000);
               a=a+1;
               output_d(a);
               output_b(0x2A);
               Delay_us(1000);
               a=a+1;
               output_d(a);
               output_b(0x05);
               Delay_us(1000);

              a=a-4;

              goster=goster+1;
            }
            goster = 0;
            a=a+1;
         }

         a=0;
         printf("sag");

         
      }
      enable_interrupts(GLOBAL);
      enable_interrupts(int_rda); 
     
}

Erol YILMAZ

CCS delay rutininde süreyi tutturmak için interruptları kapatıyor olmasın ?

thespear

Kusura bakmayın ne demek istediğinizi anlayamadım. Interrupt kapatmıyor ki disable yaptığım halde ineterrupt alıyor.

iyonosfer

@thespear

interrupt içerisindeki printf("sag") satırını silip dener misin?
Blog Sayfam: www.teknobakis.com

XX_CİHAN_XX

Alıntı yapılan: "thespear"Kusura bakmayın ne demek istediğinizi anlayamadım. Interrupt kapatmıyor ki disable yaptığım halde ineterrupt alıyor.
asm kodlarını incelersen nerde kapatıp nerde açtığını yada kapatması gereken yerde kapatıyorda ondan sonra nerde açıyor vs....  :lol:
Hepsi asm den çıkar çok uzun bi kod değil sonuçta.
Kolay gelsin.
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

sagamen

data=='ü'  için ingilizce karakter ve sayısal değer kullanın oyle bir deneyin
herkEse kolay gelsin

thespear

Arkadaşlar bir gelişme yok yorumlara devam edersek sevinirim. Bu arada ben de uğraşmaktayım.

ferdem

Arkadaşım kodun tamamını verseydiniz de yardımcı olmak isteyen arkadaşlar kodunuzu rahatca derleyebilseydi. Hangi PIC i kullanıyorsunuz, osilatör frekansınız nedir? Eğer frekansınız 4MHz ise bu interrupt rutininde  yaklaşık 5 sn zaman geçiyor, bu 5 sn içinde bir data daha gelirse interruptan çıkar çıkmaz bir interrupt daha gelmesi gerekir. Çünkü data gelip RX buffer dolunca  RCIF 1 olur, interruptları enable eder etmez RCIF & RCIE sonucu 1 olduğundan tekrar interrupt oluşur. Bu süre içerisinde başka data göndermediğinizden emin olursanız ikinci bir interrupt oluşmayacaktır. 5 sn bir interrupt rutini için çok uzun bir süre, yapmak istediğiniz olayı tarif ederseniz arkadaşlar başka bir yöntem önerebilir.

Bu arada benim takıldığım başka bir nokta
....................          disable_interrupts(int_rda);
004E:  BSF    03.5
004F:  BCF    0C.5
....................
CCS C rda kesmesini disable etmek için PIR1.5 i yani RCIF yi "clear" ediyor, PIE1.5 i yani RCIE yi "clear" etmesi gerekmez miydi? Bir interruptu disable etmek interrupt flag ini sıfırlamak mıdır yoksa o interrupt ın enable bitini sıfırlamak mıdır? Ne yapmış CCS C burda!

İyi çalışmalar.

iyonosfer

@ferdem
PIR1 bank 0'da PIE1 ise bank 1 de ve aynı hizadadırlar (12. adres) datasheet'e bakarsan daha rahat görürsün

BSF 03.05  // bank 1'i seç
BCF 0C.5   // bank 1 seçili olduğundan PIE1 işlem görür
Blog Sayfam: www.teknobakis.com