ccs c kesme uyarilari

Başlatan elmariacci, 19 Mart 2013, 00:27:08

elmariacci

arkadaşalar şu programda kesmelerde uyarı veriyor ve galiba bundan dolayi programi pic'e attiğimda çalişmiyor.nerede yanliş yapiyorum.


#include "sw2.h"
#zero_ram
#ignore_warnings 203



unsigned long int display[10];
unsigned long int a,heart_rate;   



#define LCD_EN PIN_B2
#define LCD_RS PIN_B1
#define LCD_D0 PIN_D3
#define LCD_D1 PIN_B3
#define LCD_D2 PIN_D2
#define LCD_D3 PIN_B4

#define ROLE   PIN_B5

#include "lcd_mini.h"



#int_EXT
void  EXT_isr(void) 
{
unsigned long int b,c;
   b=a;
   c=a;
   c=50000/c;
   if((c<200) && (c>40)){
      display[0]=display[1];
      display[1]=display[2];
      display[2]=display[3];
      display[3]=display[4];
      display[4]=display[5];
      display[5]=display[6];
      display[6]=display[7];
      display[7]=display[8];
      display[8]=display[9];
   
      display[9]=40000/b;
      heart_rate=(display[0]+display[1]+display[2]+display[3]+display[4]+display[5]+display[6]+display[7]+display[8]+display[9])/10;
      printf(lcd_putc,"\1NABIZ=%3Lu A=%3Lu \2NABIZ OLCER",heart_rate,display[9]);
      if(heart_rate>=120) output_high(ROLE); else output_low(ROLE);
   }
   a=0;
   
}




void main()
{
   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_CLOCK_DIV_2);
   setup_timer_0(RTCC_EXT_H_TO_L|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DIV_BY_4,200,12);
   setup_ccp1(CCP_OFF);
   delay_ms(1000);
//   input(PIN_A4);
   lcd_init();
   printf(lcd_putc,"\1NABIZ  \2OLCER");     
   delay_ms(1000);
   printf(lcd_putc,"\f");     
   enable_interrupts(INT_EXT);
   enable_interrupts(GLOBAL);

   

   while(1){
      delay_ms(1);
      a++;
//      if(a>=3000){
//         a=3000;
//         output_high(ROLE);
//      }
//      else
//         output_low(ROLE);
   }


}







bu da lcd

void lcd_delay(int data){
int i;
         for(i=0; i<data; ++i);
}

void LCD_PulseEnable (){
                     output_high ( LCD_EN );
                     delay_ms(2);
                     output_low  ( LCD_EN );
                     delay_ms(2);
                  }

void LCD_SetData (int cX ){
                        output_bit ( LCD_D0, cX & 0x01 );
                        output_bit ( LCD_D1, cX & 0x02 );
                        output_bit ( LCD_D2, cX & 0x04 );
                        output_bit ( LCD_D3, cX & 0x08 );
                     }

void lcd_adr ( int cX ){
                     LCD_SetData ( swap ( cX ) | 0x08 );
                     LCD_PulseEnable();
                     LCD_SetData ( swap ( cX ) );
                     LCD_PulseEnable();
                  }

void LCD_PutCmd ( int cX ){
                        LCD_SetData ( swap ( cX ) );
                        LCD_PulseEnable();
                        LCD_SetData ( swap ( cX ) );
                        LCD_PulseEnable();
                     }

void lcd_putc ( int cX ){
                     switch (cx) {
                           case '\f'   :  LCD_PutCmd ( 0x01 ); delay_ms(2); break;
                           case '\1'   :  lcd_adr( 0x00 );     delay_ms(2); break;
                           case '\2'   :  lcd_adr(0x40);       delay_ms(2); break;
                           default     :
                                       output_high ( LCD_RS );
                                       LCD_SetData ( swap ( cX ) );
                                       LCD_PulseEnable();
                                       LCD_SetData ( swap ( cX ) );
                                       LCD_PulseEnable();
                                       output_low ( LCD_RS );
                                }
                  }

void lcd_init (){

//               output_low        ( LCD_rw );
               output_low        ( LCD_RS );
               LCD_SetData       ( 0x00 );
               delay_ms          ( 100 );       //    wait enough time after Vdd rise
               LCD_SetData       ( 0x03 );      //    init with specific nibbles to start 4-bit mode
               LCD_PulseEnable   ();
               LCD_PulseEnable   ();
               LCD_PulseEnable   ();
               LCD_SetData       ( 0x02 );      //*    set 4-bit interface
               LCD_PulseEnable   ();            //*    send dual nibbles hereafter, MSN first
               LCD_PutCmd        ( 0x2C );      //*    function set (all lines, 5x7 characters)
               LCD_PutCmd        ( 0x0C );      //*    display ON, cursor off, no blink
               LCD_PutCmd        ( 0x01 );      //*    clear display
               LCD_PutCmd        ( 0x06 );      //*    entry mode set, increment & scroll left
          }
void lcd_refresh(void){

//               output_low        ( LCD_rw );
               output_low        ( LCD_RS );
               LCD_SetData       ( 0x00 );
               delay_ms          ( 100 );       //    wait enough time after Vdd rise
               LCD_SetData       ( 0x03 );      //    init with specific nibbles to start 4-bit mode
               LCD_PulseEnable   ();
               //LCD_PulseEnable   ();
               //LCD_PulseEnable   ();
               LCD_SetData       ( 0x02 );      //*    set 4-bit interface
               LCD_PulseEnable   ();            //*    send dual nibbles hereafter, MSN first
               LCD_PutCmd        ( 0x2C );      //*    function set (all lines, 5x7 characters)
               LCD_PutCmd        ( 0x0C );      //*    display ON, cursor off, no blink
               //LCD_PutCmd        ( 0x01 );      //*    clear display
               LCD_PutCmd        ( 0x06 );      //*    entry mode set, increment & scroll left
          }          



void lcd_gotoxy(int8 x, int8 y){
   if(y==1){
      lcd_adr( 0x00+x-1 );     delay_ms(2);
   }else{
      lcd_adr( 0x40+x-1 );     delay_ms(2);
   }

}



>>>Warning 216 "sw2.c" Line 87(0,1): Interrupts disabled during call to prevent re-entrancy: (LCD_SetData)

>>>Warning 216 "sw2.c" Line 87(0,1): Interrupts disabled during call to prevent re-entrancy: (@delay_ms1)

>>>Warning 216 "sw2.c" Line 87(0,1): Interrupts disabled during call to prevent re-entrancy: (LCD_PulseEnable)

>>>Warning 216 "sw2.c" Line 87(0,1): Interrupts disabled during call to prevent re-entrancy: (lcd_putc)


madpic

Aynı problemi şu anda bende yaşıyorum.
Sebebine gelince: int rutinleri içerisinde bekleme yapmak
hoş karşılanan bir durum değildir,
derleyicide  bunu size bildirip kesmedeki delayları kaldırıyor diye biliyorum ? ? ?.
sizin probleminiz kesmede delay kullanmamakla çözülebilir.
fakat ben şu andada kesmede delay işini kısa yoldan nasıl hallederiz arayışı içindeyim!.

Tagli

Emin değilim ama anladığım kadarıyla sorun kesme içinde ve dışında ortak kullanılan fonksiyonlardan kaynaklanıyor ki bunlar delay ve LCD fonksiyonları. Bu fonksiyonlar muhtemelen mevcut durumlarını bazı dahili değişkenlerde saklıyorlar ve tekrar çağrıldıklarında bunları kullanıyorlar. Bu sebeple, bir fonksiyonun aynı anda iki farklı yerden çağrılması sorun çıkarabiliyor.

Not: Literatürde bir fonksiyonun birden fazla yerde aynı anda çalışabilmesi özelliğine "thread-safe" denir.
Gökçe Tağlıoğlu

elmariacci

Alıntı yapılan: madpic - 19 Mart 2013, 09:28:22
Aynı problemi şu anda bende yaşıyorum.
Sebebine gelince: int rutinleri içerisinde bekleme yapmak
hoş karşılanan bir durum değildir,
derleyicide  bunu size bildirip kesmedeki delayları kaldırıyor diye biliyorum ? ? ?.
sizin probleminiz kesmede delay kullanmamakla çözülebilir.
fakat ben şu andada kesmede delay işini kısa yoldan nasıl hallederiz arayışı içindeyim!.

devre isis de çalişiyor hiç sorun yok ama bourdun üzerinde çalişmiyor.Warnings programin çalişmamasini etkiler mi ki bilmiyorum.

bir de tam olarak nereleri düzelteceğimi soylerseniz çok iyi olur.

elmariacci

Alıntı yapılan: Tagli - 19 Mart 2013, 09:56:55
Emin değilim ama anladığım kadarıyla sorun kesme içinde ve dışında ortak kullanılan fonksiyonlardan kaynaklanıyor ki bunlar delay ve LCD fonksiyonları. Bu fonksiyonlar muhtemelen mevcut durumlarını bazı dahili değişkenlerde saklıyorlar ve tekrar çağrıldıklarında bunları kullanıyorlar. Bu sebeple, bir fonksiyonun aynı anda iki farklı yerden çağrılması sorun çıkarabiliyor.

Not: Literatürde bir fonksiyonun birden fazla yerde aynı anda çalışabilmesi özelliğine "thread-safe" denir.

lcd çalişiyor ama görüntü falan yok devreye enerji verdiğim gibi "NABIZ ÖLÇER" yazmasi lazim ama yazi falan hiçbir şey gelmiyor.picte sorun yok başka programlar çalişiyor.

yusufburak

Alıntı yapılan: madpic - 19 Mart 2013, 09:28:22
Aynı problemi şu anda bende yaşıyorum.
Sebebine gelince: int rutinleri içerisinde bekleme yapmak
hoş karşılanan bir durum değildir,
derleyicide  bunu size bildirip kesmedeki delayları kaldırıyor diye biliyorum ? ? ?.
sizin probleminiz kesmede delay kullanmamakla çözülebilir.
fakat ben şu andada kesmede delay işini kısa yoldan nasıl hallederiz arayışı içindeyim!.

Ordan bi alt programa gitseniz ve orda bekleme yapsanız olabilir..
Öğretici aranıyor :)

xoom

Kesme rutininde Bekleme göremedim? Hangi beklemeden bahsediyorsunuz?

elmariacci

Alıntı yapılan: yusufburak - 19 Mart 2013, 19:55:21
Ordan bi alt programa gitseniz ve orda bekleme yapsanız olabilir..

uyarilar programin çalişmasini engeller mi peki simulasyonda sıkıntı yok devre üzerinde etkiler mi?

sadogan

Uyarılar devrenizin çalışmamına neden deyil.
Warning lerin olduğu yerde kesmelerin kapatıldığını size bildiriyor.
sw2.h dosyanızın da başka kesme açmadı iseniz
tek kaynaktan kesme kullandığınız için devrenizde sorun yaratmaz.



bayelektronik

lcd_init() ten sonra 400-500ms bekleme koyun bazen lcd nin açılmasını düzenleme için süre yeterli gelmiyor

elmariacci

sağolun arkadaşlar dedikelerinizi deneyecem.bir de şoyle bişey var kodlari ben yazmadim ama az çok ccs c bilirim."sw2.h" ile başlayan program da başlarda #include "lcd_mini.h" diye bi tanimlama var sanki alt program gibi kullanilmiş.ben "lcd_mini.h" in içindeki programi "sw2.h"in içine atip o şekil derleyip sorunu çözmeyi planliyorum.daha doğrusu sorunun bundan kaynaklandiğini düşünüyorum.

bunu neden boyle düşünüyorum derseniz."lcd_mini.h" sağ tiklayip Open File at Cursor dediğimde normalde sigorta ayarlarinin falan gelmesi gerekirken  programin içeriği ile karşilaşiyorum.

burda tek sorun lcd_mini.h içeriğini sw2.h 'in içine nereye atmam gerektiği biraz karişik oldu ancak bu kadar derdimi anlatabildim kusura bakmayin.

yasin_arsln

Alıntı yapılan: madpic - 19 Mart 2013, 09:28:22
Aynı problemi şu anda bende yaşıyorum.
Sebebine gelince: int rutinleri içerisinde bekleme yapmak
hoş karşılanan bir durum değildir,
derleyicide  bunu size bildirip kesmedeki delayları kaldırıyor diye biliyorum ? ? ?.
sizin probleminiz kesmede delay kullanmamakla çözülebilir.
fakat ben şu andada kesmede delay işini kısa yoldan nasıl hallederiz arayışı içindeyim!.

Aynı sorunla bende karşılaştım kesme içerisinde delay_ms(..) kullandığımda uyarı veriyordu ve çözümü aşağıdaki konuda gördüm.
http://www.ccsinfo.com/faq.php?page=delay_in_interrupt

kesme öncesinde #use delay..... tanımlayıp kesmeler ile ilgili kodlar bittikten sonra Ana fonkisondan önce tekrardan bir #use delay... tanımlamak gerekiyor. İyi çalışmalar.