ccs de rb4-rb7 kesmesi hatalı çalışıyor.

Başlatan remzi, 24 Şubat 2006, 14:47:19

remzi

merhaba. yapmış olduğum bir devrede rb4-rb7 portunun kesmesi doğru çalışmıyor. benim bildiğim bu uçlar + uca bir dirençle pull up yapılır ve bir butonla bu uç sıfıra çekilir ve kesme meydana gelirdi. ama şimdi yaptığım devre tam tersi şeklinde çalışıyor. ve proteusta simule ettiğim zaman kesmeden çıkamıyor. RB0 harici kesmesi ise düzgün şekilde çalışıyor. sizce ben nerede yanlış yapmış olablirim. teşekkür ederim....

Petek

Alıntı yapılan: "remzi"merhaba. yapmış olduğum bir devrede rb4-rb7 portunun kesmesi doğru çalışmıyor. benim bildiğim bu uçlar + uca bir dirençle pull up yapılır ve bir butonla bu uç sıfıra çekilir ve kesme meydana gelirdi. ama şimdi yaptığım devre tam tersi şeklinde çalışıyor. ve proteusta simule ettiğim zaman kesmeden çıkamıyor. RB0 harici kesmesi ise düzgün şekilde çalışıyor. sizce ben nerede yanlış yapmış olablirim. teşekkür ederim....
rb4-rb7 girişleri her iki konuma (0, 1) geçişte kesme üretir. Yani 0 da 1 ve 1 den 0 a. yani RB0 gibi değildirler.
“Önyargıları yıkmak atomu parçalamaktan zordur” A.Einstein

remzi

peki kesmeden çıkmamasının sebebi nedir?

burak_82

kesmeden çıkmama problemini bende yaşıyorum. RDA_int yani usarttan bilgi alındı kesmesi sürekli kendini yeniliyor. proteustan mı ccs den mi hala anlamadım.

Veli B.

Bunun yapısal olarak birden fazla sebebi olabilir.Sorun yaşadığınız kodu buraya açmadan, kimsenin faraza yorumlar yapması mümkün değil.Verilecek cevaplar sorunu en zor yoldan çözmeye çalışma olmaktan öte gidemez.

arslan74

İnterrupta cıkmadan önce mutlaka şu kodu:

MOVF PORTB,1


programına ekle.

Bunu eklemessen RB4-RB7 'in port değişim interrupundan cıkamassın.

Selamlar.

HEXF2

Alıntı yapılan: "burak_82"kesmeden çıkmama problemini bende yaşıyorum. RDA_int yani usarttan bilgi alındı kesmesi sürekli kendini yeniliyor. proteustan mı ccs den mi hala anlamadım.

Arkadaşlar bu yenilenme olayı çok büyük bir problem zaten bu başlık buraya açılmasaydı ben yeni bir başlık açıp soracaktım.PIC18F452'de basit bir kod yazıyorum.

#include <18f452.h>
#use delay(clock = 10000000)

void main() {

       printf("Selam\n\r");

       while(TRUE);
}


Normalde bu kod bir kere selam yazıp sonsuz döngüye girmesi gerek.Fakat simüle ettiğimde sürekli selam mesajını gönderiyor.Bunun sebebi 18F serisinde CCS'de WDT'nin doğru ayarlanamadımıdır diye düşündüm. Yukardaki kodlara #fuses NOWDT ekledim bu sefer hiç mesaj göndermedi yani program start olmadı.Bu direktifi silip setup_wdt(WDT_OFF) denedim bu sefer yine selam göndermeye devam etti.Son olarak aşağıdaki kodu yazdım ve sorun WDT'dan dedim çünkü program süreklli başa alınıyor ve selam gönderiyor.

void main() {

       switch(restart_cause()) {

                case WDT_TIMEOUT : printf("WDT sürekli reset atıyor");
       }
}


İşte olay bu arkadaşlar senin kesme probleminde belki bundandır.Ben şimdi çözüm olarak 18f de WDT'yi en yüksek seviyeye alıp ana programda sürekli resetleyeceğim bakalım olacak mı??

remzi

arkadaşlar yazdığım program şu şekilde.



#include "C:\....."
#int_RB
RB_isr()
{
output_high(PIN_C0);
delay_ms(250);
output_low(PIN_C0);
delay_ms(250);

}

#int_EXT
EXT_isr()
{
output_high(PIN_C0);
delay_ms(250);
output_low(PIN_C0);
delay_ms(250);
}



void main()
{

  setup_adc_ports(AN0);
  setup_adc(ADC_CLOCK_INTERNAL);
  setup_spi(FALSE);
  setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
  setup_timer_1(T1_DISABLED);
  setup_timer_2(T2_DISABLED,0,1);
  enable_interrupts(INT_RB);
  enable_interrupts(INT_EXT);
  enable_interrupts(GLOBAL);
 
  SET_TRIS_B( 0xF1 );
  SET_TRIS_C( 0x00 );
 
}


bu programda yapmak istediğim RB4-RB7 arası bir butona bastığımda C0 portunun kısa bir süre lojik 1 olmasını istiyorum. tabi devrede RB4-RB7 10k lık direçlerle pull-up yaptım. butonuda portlarlan şase arasına koydum. butona basınca portun uçuna sıfır bilgisi gidecek ve buda kesmeye gitmesi gerekiyor. RB0 portundaki kesme dürüst çalışıyor ama diğerlerini düzeltemedim. sizce sorun nerede arkdaşlar...

remzi

arkadaşlar birşey daha söyleyelim.hi-tech te bu programı yazınca RB4-RB7 ve RB0 harici kesmesi dürüst bir şekilde çalışıyor. acaba diyorum CCS de bilmediğimiz bir komutlamı düzeltiyorlar kesmeyi. yoksa CCS de hatamı var.yardımlarınızı bekliyorum. teşekkür ederim...

ete

Normalde RB4-Rb7 kesmesi biraz sorunlu çalışır. Sebebi de,
Kesme oluştuktan sonra yeniden kesme oluşmaması için RBIF bayrağının silinmesi gerekiyor. Ancak diğer kesmelerin aksine KESME bölümünde bu bayrağın sıfırlanması bayrağın silinmesi için yeterli olmuyor. Sıfırlamak için PortB değerinin bir kere program (veya programcı) tarafından okunması sonra bayrağın silinmesi gerekiyor. Aksi halde bayrak sıfırlanmadığından sürekli yanlış kesme oluşuyor ve sizde sanki program kesme bölümünden hiç  çıkmıyor zannediyorsunuz.
Bu şekilde deneyin göreceksiniz programlarınız çalışacaktır.

ETE
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

remzi

CCS de RBIF bayrağını nasıl silecem. ve bir soru daha sormak istiyorum. CCS de kesmeyi hazırladığımız zaman kesmeden çıktıktan sonra CCS kendi si RBIF bayrağını silmesi gerekmiyormu? 10k lık dirençlerle R5-RB7 portlarını + beslemeye çekmem normal değilmi? teşekkür ederim...

kalman

@Remzi
Bu konuda eski başlıkları okursan faydalı olur RBIF flagini nasıl sileceğin sana bağlı istersen ASM ile ister register adresini kullanarak örnekler bulunmakta

kolay gelsin

Herkese başarılar

mustafacifci

arkadaşlar dediğiniz problemle bende daha önce karşılaştım
kafayı yedim kesme bayrağınıda resetledim yine olmadı.
aslınca cevap çok basit.
kesme geldiğinde portb yi okuyun
yani
değişken=portb;

gibi bu şekilde portb kendini yeniliyor. aksi taktirde interruptan çıkmaz

c dilinde rbif yi resetlemenize gerek yok.

kolay gelsin.

forsa1975

değişken=portb;

İşte butun mesele bu.
Teşekkürler.