Haberler:

Eposta uyarılarını yanıtlamayınız ( ! ) https://bit.ly/2J7yi0d

Ana Menü

CCS INTERRUPT HATASI

Başlatan kalman, 15 Haziran 2005, 20:05:35

kalman

@Petek
galiba haklısın ben bunu isisle simule ediyorum belkide bu yüzden
bu hatayla karşılaşıyorum belkide gerçek devrede bu oluşmaz aslında bu
Rotary encoder devresinin ilk deneme aşaması isisle simuledemi bir sorun var bilmiyorum başka hangi programla deneyebiliriz fakat her şeye rağmen verdiğin cevaplar dolayı teşekkürler ve en kısa zamande gerçek devreyle deneyip sonucu  sizlere bildiririm

Aslında ISR içinde delay kullanmak bencede doğru değil fakat benim söylemek istediğim portRB ile oluyorsa neden PortRA olmasın bunun mantığını pek anlamadım ve bu konuyu bu sizle paylaşmak istedim
Güzel olan cevaplar hızlandı çoğaldı buda herkesi memnun ediyor sanıyorum

@bunalmış Lst dosyasında bir şeyler bulabildinmi??  sencede bu ISIS ten kaynaklanabilirmi

Saygılarımla

z

Asm kodlarda portun A yada B olusu disinda hic bir fark yok.
RBIF bitini silecek kod da 04DH adresine yerlestirilmis.

Bu durumda neden B portu yerine A portu kullanildiginda program sapitiyor ve RBIF hic silinemiyor?

Sanirim cevabi DS35007B 17.sayfada, RBIF'in surekli set olma durumu anlatilmis.

Sorun A portu ile calisilirken, interrupt programinin en sonuna asagidaki kod eklentisiyle duzelebilir

1. PortB yi oku,
2. RBIF'i oku,  1 ise 0 yap, 0 ise adim 4 e atla
3. 1.adima git
4. Islem tamam
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

Uretilen kodlari inceledikten sonra bu compiler ile  ciddi islere girilemeyecegi konusuna Erkana katiliyorum.

C ASM nin bir ustudur, hizlidir denir. Adamlar islemci yavas calissin diye ellerinden geleni yapmislar.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

kalman

@Bunalmış,

Bunu daha öncede denedim olmadı RBif her nedense resetlenmiyor
Sen isisde deneyip programı tümünü verebilirmisin!!!

Petekde aynı yöntemden söz etmişti sonuç malum olmuyor :roll:


herkese başarılar

saygılarımla

z

1. PortB yi oku,
2. RBIF'i oku, 1 ise 0 yap, 0 ise adim 4 e atla
3. 1.adima git
4. Islem tamam

aynen bu mantigi uygulayip interrupttan cikmayi denedinmi? C komutlari ile bence bunu dene. ilk satirdaki PORT B oku komutu cok onemli.

Ben hic bir sey denemedim. (Isis falan yuklu değil)

Eger zamanin olursa yukaridaki kismi dener sonucunu yazarsan sevinirim.
(Benim duzenegi kurmam kod yazmam kompilerlari yuklemem cok uzun is simdi)

RB7.4 pin change int ozelligini bu gune kadar hic kullanmadim. Ancak anladigim kadariyla RB portunu hic okumazsaniz bu ozellik dogru calismiyor.

Yani bu pini klasik external int pini gibi dusunmemek gerekiyor.
En son B portunu okudunuz bu hafizaya aliniyor portta bir degisim olursa int uretiyor. Ilk yapmaniz gereken seylerden birisi portB yi tekrar okuyup yeni degeri hafizaya aldirmak.

Hata compilerin uygun kod uretmemesi olabilir.

Tabiki benim kisa bir incelemeden sonra cikarttigim sonuc bu. Tamamiyla yaniliyor da olabilirim. PIC'e  uzun yillardir elimi surmedim.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

Tereddutlu olarak yazdigim yukaridaki cevabim uzerine dusunme firsatiniz oldumu yada denedinizmi?

Sonucu ben de cok merak ediyorum.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

kalman

@herkese selamlar,

Sonunda bu problem çözüme kavuştu CCS de eğer RB4-7 ınterruptunu
kullanacak olursanız mecburu portb i okumanız gerekli yoksa flag resetlenmiyor bu durumdada maalesef  RB İnt.ex i kullanamıyorsunuz.

Kısaca anlatayım ISR içinde portB i okuyorsunuz ve andliyorsunuz  bu işlemden sonra RBIF resetleniyor sonrası size kalmış ister ana programa veya başka fonksiyona atlama yapabilirsiniz  :P  :P

@Bunalmış aslında tahminlerin doğru Portb okunmadan olmuyor

herkese katkılarından dolayı  teşekkürler

Evet şimdi size çalışan programı veriyorum

#include <16F84A.h>
#fuses NOWDT,XT, NOPUT, NOPROTECT
#use delay(clock=4000000)

#define LED PIN_A1 //  nihayet calisan versiyon
#Byte STATUS = 0x6 //portB adresi
#define RBIE 3

bekle()
{
delay_ms(500); //bekleme süresi
}

#int_RB // Interrupt
LED_YAK()
{
output_high(LED);
STATUS &= ~RBIE; // püf noktasi
bekle();
}




void main() {

set_tris_a(0b00000);
set_tris_b(0b11110000); // RB4 den RB7e kadar giris

setup_counters(RTCC_INTERNAL,RTCC_DIV_2);
enable_interrupts(INT_RB);
  enable_interrupts(GLOBAL);

while (1)
{
output_low(LED); //LED söndür

}

}

Erkan Gench

Bir yandan heralde bu kadar zamandır boşuna konuşuyoruz diye düşünürken bir yandanda olması gereken kodu gönderiyorum bende.

#byte portb = 6

#define LED PIN_A1

int1 ledyak=0; 
char b;

#int_rb 
LED_YAK() 
{ 
   b = portb;
   ledyak=1; 
} 



void main() { 
   
   setup_counters(RTCC_INTERNAL,RTCC_DIV_2); 
   enable_interrupts(INT_RB); 
   enable_interrupts(GLOBAL); 
   
   while (1) 
   { 
      output_low(led); 
      if(ledyak) 
      { 
         output_high(LED);
         delay_ms(500); 
         ledyak=0; 
         
      } 
   } 
   
}
Zorluklar, zamanında yapmamız gerekip de yapmadığımız kolay şeylerin birikmesiyle oluşur. Henry Ford ----------- Ya Rabbi Filistin'deki ve dünyanın her tarafındaki Müslüman kardeşlerime yardım et.

z

Bence olması gereken kod bu değil.

INTRB rutininine girilince led yakılmalı, timer başlatılmalı  ve INTRP yeni isteklere kapatılmalı.

Timer int programı,  500ms sonunda  ledi söndürüp tekrardan INTRB interruptını açmalı.

Ana programın akışının da  uzun süreli kesintilere uğramaması da ana amaclardan biri olmalı.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Erkan Gench

Alıntı yapılan: "bunalmis"Bence olması gereken kod bu değil.

INTRB rutininine girilince led yakılmalı, timer başlatılmalı  ve INTRP yeni isteklere kapatılmalı.

Timer int programı,  500ms sonunda  ledi söndürüp tekrardan INTRB interruptını açmalı.

Ana programın akışının da  uzun süreli kesintilere uğramaması da ana amaclardan biri olmalı.

hocam dedikleriniz çok mantıklı işi bir adım öteye taşıdığımızda dediğiniz gibi yapmalıyız bu çok daha profesyonelce olur. (basit bir led yakma programı ne hale geldi :D)

zaten benim dikkat çekmek istediğim int kullanımında dikkat edilmesi gerekenler ve tris kullanmanın gereksizliği
Zorluklar, zamanında yapmamız gerekip de yapmadığımız kolay şeylerin birikmesiyle oluşur. Henry Ford ----------- Ya Rabbi Filistin'deki ve dünyanın her tarafındaki Müslüman kardeşlerime yardım et.

kalman

@Erkan,

Bu konuda üstteki mesajı okusaydın konunun çözüme kavuştuğunu
görürdün  ;)  ;)

Senin verdiğin programda çalışıyor fakat her nedense intcon ilk biti
RBIF hiç değişmiyor  
Interrupt geldiğinde 1 ISR terk edildiğinde ise 0 olmalı  sende bu olmuyor
bunu denedim RbIF hep aynı kalıyor bence buna bir bakman gerekecek

tekrar ediyorum vermiş olduğum program hatasız çalışmakta

@bunalmış yazdığın gibi ISR de Led yanıyor sonra bir süre bir başka foksiyona gidip bir süre bekliyor sen bunu banamı yoksa erkanamı
yazıyorsun bunu pek anlamadım  :roll:  :roll:
 

herkese başarılar

Erkan Gench

Ben zaten sizin çözüme kavuştu dediğiniz mesaja karşılık yazdım o kodu çünkü o kadar zamandır yazılan şeylere hiç dikkat etmemişsiniz.

RBIF bir oluyor isis'te coff dosyasını kullanarak debug ettim ve bunu gördüm (zaten bir olmazsa int'e nasıl girdiğini düşünüyorsunuz). burada yazdıklarımızı kafadan sallayıp yazdığımızı sanmayın ben bunları hep deneyerek göndermeye çalışıyorum.

bunalmis hocamda mesajı bana yazdı bunuda "olması gereken kod" cümlesinden anlayabilirsiniz.
Zorluklar, zamanında yapmamız gerekip de yapmadığımız kolay şeylerin birikmesiyle oluşur. Henry Ford ----------- Ya Rabbi Filistin'deki ve dünyanın her tarafındaki Müslüman kardeşlerime yardım et.

Petek

Arkadaşlar,

RBIF'i restelenmediği ni gördüğünüz ISIS'in versiyonu kaç. Ben 6.5SP5 te simule ediyorum. Daha sonraki versiyonlarda bu sorun acaba giderilmiş olabilir mi?

Kalman, int_ext'in port_b<4:7>  (yada int_rb) durum değişim interruptı ile ilgisi yok. "bu durumda malesef int_ex kullanamıyorsunuz" demişsin. Int_ex sadece ve sadece pin_b0 ın durumu ile ilgilidir. Bana biraz karıştırıyorsun gibi geliyor.

Erkan, CCS de bir sorunum daha olmuştu. Onu da ileteyim.
#define hi(x)   *(&x + 1)

şeklinde tanımladıktan sonra int16 tanımlı data isimli bir değişkeni byt tanımlı zz ile ilişkilendirirsek CCS de şöyle bir durum ortaya çıkıyor.

zz = hi(data); // bu data nın MSBaytını aktarıyor. Sorun yok.

ama

hi(data)=zz ;

yaptığınızda zz yi MSBayta aktarmasını bekliyorsunuz ama LSBaytına aktarıyor.

Bu hatayı anlayıncaya kadar bir kaç saatim gitmişti. Sorunu yine değişik yoldan şöyle çözmüştüm:

*(&data + 1) = zz;
“Önyargıları yıkmak atomu parçalamaktan zordur” A.Einstein

kalman

Petek,

Benim anlatmak istediğim olay şöyle diyelim int_rb i açtınız ve aynı zamandada int_ex i açtınız ve interrupt geldiğinde sizce ne yapar önce İNTcon Registerde  duruma bakıp hangi kaynaktan geldiğine bakar ve o kaynağın ISR ine atlama yapılır diye biliyorum  pekala ikisi aynı anda gelse sizce hangisi öncelikli olur???

bildiğim kadarıyla  her interrupta 04h ya atlama yapılıyor ve interrupt
önceliği pıc 16fxx bulunmuyor


erkan amacım herkes bilgilerini paylaşsın ve yardımcı olsun son yazdıklarından dolayı biraz düşünmeni öneririm lütfen kırıcı olmayalım
sanada başarılar dilerim


Saygılarımla

Erkan Gench

Alıntı yapılan: "kalman"son yazdıklarından dolayı biraz düşünmeni öneririm

Ben yazdıklarım hakkında hem göndermeden önce hemde gönderdikten sonra çok düşündüm ayrıca burada kırılan benim onca emek sarfedip bunların bir işe yaramadığını görmek beni üzdü doğrusu.

Neyseki bu başlıkta hem ben hemde katkıda bulunan diğer arkadaşlar bilgilerimizi paylaşarak tecrübe sahibi olduk.

Ben yazdığım mesajdan memnunun bence siz önceki mesajları baştan sona anlayarak okumayı bir deneyin çünkü bu başlıkta ve sitenin daha pek çok yerinde para verseniz dahi elde edemeyeceğiniz tecrübeler var.
Bunları size kimse anlatmaz.

Ayrıca internette forumların bir numaralı kuralı 'kimse size bir şey borçlu değildir' kuralıdır. Yani kimse sizin sorununuzu çözmek için zamanını harcamak zorunda değildir. Halbuki ben ve diğer arkadaşlar bir sürü zamanımızı harcadık. Buna biraz saygı gösterseniz yeterli.
Zorluklar, zamanında yapmamız gerekip de yapmadığımız kolay şeylerin birikmesiyle oluşur. Henry Ford ----------- Ya Rabbi Filistin'deki ve dünyanın her tarafındaki Müslüman kardeşlerime yardım et.