CCs Derlemede warning mesajı alıyorum.

Başlatan thenorthstar, 21 Mart 2013, 09:03:47

thenorthstar

Merhaba Arkadaşlar.
CCS de derleme yaparken aşağıdaki Warning mesajları çıkıyor ve bir türlü kaldıramadım, bu uyarılar neden kaynaklanabilir

artapon

Aynı sorunu ben CCS C compiler ile yaşadım.  Program yine çalışıyordu ama dediğiniz gibi interruptları disable yapyordu. Bunu yapmasını önce yadırgadım ve neden olduğunu bir süre aradıktan sonra buldum ki:

- Bunu yapması zaten gerekli. Böyle olmasa siz bir interruptı kullanırken, diğer bir interrupt dan dolayı tekrar kesme meydana gelecektir. Bu nedenle 2 interrupt aynı anda kullanılıyorsa birisinden diğerine giriş olduğunda tekrar kesme olmaması ve önceki işlemin yarım kalmaması için interruptları disable yapacaktır.

Bendeki sorun böyle bir nedenden dolayı oluşuyordu ve eğer 2. interruptı kullanacaksam başka yolu olmadığı kanısına vardım ve daha sonra bu mantığa göre programlamaya yöneldim. Sizde de benzer bir durum olabilir.

Örnek verecek olursak:

Örneğin zamanla ilgili bir kesme yaptınız ve kesme ile ilgili alt program çalışmaya başladı. Bu alt programın işleminin ikinci bir kesme meydana gelmeden tamamlanması gerekiyor. Aksi halde tekrar bir kesme meydana gelecektir ve sonsız bir kısır döngü oluşur ve bir yerlerde taşma olur ve program kilitlenir çalışmaz. Bu nedenele mesela kesme oluşma zamanı 20 ms ise, kesme oluştuğunda siz 20 ms 'den önce kesme alt programını tamamlamak zorundasınız.

LCD_init, LCD_putc ve printf komutları uzun zaman alan işlemler ve alt programlardır. Eğer bunları kesme alt programı içerisinde kullanırsanız compiler tekrar kesime gitmeyi önlemek interrupları diasable yapacaktır.
Aldanma İnsanların Samimiyetine, Menfaatleri İçin Gelirler Vecde, Vaad Etmeseydi Allah cenneti, O'na Bile Etmezlerdi Secde!   (NFK)

haydarpasamikro

programın kesme kısımlarını yazın.
Mikro Dünyası.Haydarpaşa Teknik ve Endüstri Meslek Lisesi Mikrodenetleyici Atl. Şefi

thenorthstar

Hocam Programda 4 kesme interup kullandım
1-int_RDA
2-Timer0
3- Timer1   saniye olarak kullandım
4-#int_EXT portB 0 kesmesi  =   pals okuyorum  gerekli durumlarda aktif ve pasif ediyorum
Ayarlar:
   setup_timer_0(T0_INTERNAL | T0_DIV_4); // Timer0 ayarları yapılıyor
   setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
   set_timer1 (3036);
   set_timer0(65036);   // TMR0 değeri belirleniyor
   enable_interrupts(INT_timer0); // int_timer0 kesmesini aktif yapar
   enable_interrupts (INT_TIMER1);
   enable_interrupts(int_rda);
   enable_interrupts(GLOBAL);


Timer 1:
#int_TIMER1
void timer1_isr()  // 100 ms de bir kesme oluşturuyor
{
   GTimer1Counter++;

   if (GTimer1Counter == 10)  // 1sn artıyor
      {
        Bek_SN= Rek_Bek_SN+1;
        output_toggle(pin_c0);
        GTimer1Counter = 0;
       }
}


#Int_EXT:
void  EXT_isr()
   {
      pulse=pulse + 1;
    if (pulse== 180)  
      {
        pulse = 0;
      }
   }

yusufburak

#4
ilk gördüğüm timer0 ve timer1 içindeki değerler. timer1 16 bit olan timer0 8 bit. sanırım orda bi yanlışlık var
Öğretici aranıyor :)

mufitsozen

Alıntı yapılan: thenorthstar - 21 Mart 2013, 09:03:47
Merhaba Arkadaşlar.
CCS de derleme yaparken aşağıdaki Warning mesajları çıkıyor ve bir türlü kaldıramadım, bu uyarılar neden kaynaklanabilir
(Resim gizlendi görmek için tıklayın.)

Sayin @thenorthstar tanim olarak ISR (interrupt service routine) altprogramlari icinde kullanilan butun program kodu "re-entrant" olmalidir. (re-entrant nedir bahsi baska bir konu!)

buyuk ihtimalle CCS C compiler kullandiginiz bazi altprogramlarin re-entrant olmadigini fark ediyor yada bunlarin re-entrant olup olmadigina karar veremiyor, ve sizi uyariyor. Bu ISR'da kullanilan butun altyordamlar islerken baslangicindan bitisine kadar interruptlari off yapiyorum diyor.

Aslinda normal olarak ISR programlari zaten, cok istisnai bazi haller disinda, altyordam cagirmak, while/for looplarinda logic islemek, seri data yollamak gibi zaman alici isler yapmamasi lazim.



Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

haydarpasamikro

set_timer1 (3036);
   set_timer0(65036);   // TMR0 değeri belirleniyor


yerine

set_timer1 (65036);
   set_timer0(3036);   // TMR0 değeri belirleniyor

olmasın?
Mikro Dünyası.Haydarpaşa Teknik ve Endüstri Meslek Lisesi Mikrodenetleyici Atl. Şefi

yusufburak

Alıntı yapılan: haydarpasamikro - 21 Mart 2013, 14:45:17
set_timer1 (3036);
   set_timer0(65036);   // TMR0 değeri belirleniyor


yerine

set_timer1 (65036);
   set_timer0(3036);   // TMR0 değeri belirleniyor

olmasın?

hocam timer0 8 bit 255 üstünde değer alamaz diye biliyorum ama :S ?
Öğretici aranıyor :)

haydarpasamikro

#8
Evet doğru max 255 düzeltelim. pic18f serisinde 16bit çalışma modu da var. Kafa oraya gitti:)

Mikro Dünyası.Haydarpaşa Teknik ve Endüstri Meslek Lisesi Mikrodenetleyici Atl. Şefi

thenorthstar

Evet hocam 18F serisinde Timer0 16 de de çalışıyor ve aşağıdaki gibi düzgün bir sinyal alıyorum. bunda sıkıntı yom ama o warning leri gideremedim.

yusufburak

warningleri gidermedin diyelim. ya da gideremedin. o zaman olmuyo mu yapmak istediğin şey ?
Öğretici aranıyor :)

thenorthstar

Bir sorun olmuyor hocam program çalışıyor, warning lerin nedeninş öğrenmek istedim.

yusufburak

Kesmelere öncelik verseniz ? o zaman düzelebilir mi ? Ben iki kesme kullandığımda uyarı almıştım ama ne uyarısıydı hiç dikkat etmemiştim
Öğretici aranıyor :)

haydarpasamikro

Kesmelerin içinden fonksiyon çağırmayın. Sadece belli özel değişkenlerinizi bayrak gibi set edin. Herşeyi  ana programda kontrol edin.
Mikro Dünyası.Haydarpaşa Teknik ve Endüstri Meslek Lisesi Mikrodenetleyici Atl. Şefi

Okan AKÇA

kesmelerin icinde delay kullanmayın degişkenleri global yapın