اطلاعیه

Collapse
No announcement yet.

[گفتگو و تبادل نظر] سوالات برنامه نویسی در کامپایلر CCS

Collapse
این موضوع برجسته شده است.
X
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    پاسخ : سوالات برنامه نویسی در کامپایلر CCS

    اون وارنینگ ها برای اینه که احتمالا توی روتین وقفه از دستور lcd استفاده کردید یا تابعی رو صدا زدید که از این دستور داخلش استفاده شده
    برنامه رو قرار بدید تا ببینیم مشکل چیه
    AYRIC

    دیدگاه


      پاسخ : سوالات برنامه نویسی در کامپایلر CCS

      سلام
      دقیقا!! توی برنامه از دستور lcd و تابع delay زیاد استفاده کردم.
      وقتی دستورات lcd و توابع delay را بر میدارم ارتباط سریال درست میشه.اگه بخوام از توابع lcd و delay توی روتین وقفه استفاده نکنم کارم سخت میشه.
      کد:
      #include <18f4550.h>
      #use delay(int=8mhz)
      #use rs232(baud=9600,xmit=pin_c6, rcv=pin_c7) 
      #define use_portd_lcd true
      #include <lcd.c>
      #include <string.h>
      #DEFINE NULL  '\0'
      #define cont pin_a0
      #define abb pin_a1
      #define start pin_e0
      #define stop pin_c1
      int st=1;
      char number[12];
      char string[30];
      char buffer[200];
      int sms=0;
      int i=0;
      int j=0;
      int h=0; 
      char 
      ctrlz=26,
      double_quote=34,
      Enter=13,
      ctrl_z=26;
      //////////////////////////serial int\\\\\\\\\\\\\\\\\\\\\\\\\\
      #int_ext
      void ext0_isr()
      {
      
      delay_ms(100);
      if(input(cont)==1)
      {
      lcd_putc("\f");
      ext_int_edge(h_TO_l);
      lcd_putc("motor on");
      lcd_gotoxy(1,2);
      lcd_putc("chcking switch");
      st=0;
      for(i=1;i<5;i++)
      {
      delay_ms(1000);
      if(input(cont)==0)
      {
      lcd_putc("\f");
      lcd_putc("motor off");
      st=1;
      break;
      }
      }
      
      if(st==0)
      {
      if(input(abb)==1)
      {
      lcd_putc("\f");
      lcd_putc("motor on");
      lcd_gotoxy(1,2);
      lcd_putc("abb hast");
      
      }
      if(input(abb)==0)
      {
      lcd_putc("\f");
      lcd_putc("abb nist");
      output_high(stop);
      delay_ms(1000);
      output_low(stop);
      
      }
      }
      }
      if(input(cont)==0)
      {
      lcd_putc("\f");
      lcd_putc("motor off");
      ext_int_edge(l_TO_h);
      
      }
      }
      #int_RDA
      void serial_isr() {
       
      buffer[i]=getchar();
      
      if(buffer[i]=='S')
      {
      sms=1;
      }
      i++;              // Increment counter
      if(i==200)
      {
      i=0;
      }
      
      }
      //////////////////////////clear buffer \\\\\\\\\\\\\\\\\\\\\\\\\\
      void clear_buffer()
      {
      memset(string,NULL,30);   
      memset(number,NULL,12);
      
      }
      
      //////////////////////////get string & number\\\\\\\\\\\\\\\\\\\\\\\\\\
      
      void search_sms()
      {
      printf("AT+CMGDA=%CDEL ALL%C%C",double_quote,double_quote,Enter);
      sms=0;
      i=0;
      lcd_putc("\f");
      lcd_putc("hello");
      delay_ms(1000);
      lcd_putc("\f");
       
       while(buffer[i]!='9')
             { 
             i++; 
              } 
            j=0; 
              
            while(j<10) 
             { 
           if((buffer[i]=='9')&&(buffer[i+1]=='8')) 
               { 
                 for(j=0;j<12;j++) 
                 { 
                  number[j]=buffer[i]; 
                  i++; 
                   } 
                lcd_gotoxy(1,1);
                printf(lcd_putc,"%s",number);
                delay_ms(2000);
               } 
              else 
              { 
              i++; 
              }
              }
             
              
            lcd_putc("\f");
             j=0;
             i=0;
             for(i=0;i<=200;i++)
            {
            
            if(buffer[i]=='*')
            {
            
            for(h=0;h<=30;h++)
             {
            
            string[h]=buffer[i+1];
             i++;
          if(buffer[i+1]=='#')break;  
              }  
          
             }
            
           }
          lcd_gotoxy(1,1);
         printf(lcd_putc,"%s",string);
         delay_ms(2000); 
       lcd_putc("\f");
      clear_buffer();
      }
      //////////////////////////main program\\\\\\\\\\\\\\\\\\\\\\\\\\
      
      void main()
      {
      set_tris_A(0xff);
      set_tris_e(0x00);
      set_tris_c(0b11111100);
      enable_interrupts(int_rda);
      enable_interrupts(int_ext);
      enable_interrupts(global);
      ext_int_edge(l_TO_h);
      lcd_init();
       lcd_gotoxy(1,1);
       lcd_putc("starting");
       delay_ms(500);
      printf("AT%c",Enter);
       lcd_gotoxy(1,1);
       lcd_putc("starting");
      delay_ms(500);
      printf("ATE0%c",Enter);
      delay_ms(500);
      printf("AT+CMGDA=%CDEL ALL%C%C",double_quote,double_quote,Enter);
      delay_ms(500);
      lcd_putc("\f");
      memset(buffer,NULL,200);
      clear_buffer();
      while(true)
       {
       lcd_gotoxy(1,1);
       lcd_putc("watting for sms");
      if(sms==1)
        {
       
        lcd_putc("\f");
        lcd_putc("sms recived");
        
        printf("AT+CMGR=1%C",Enter);
        delay_ms(2000);
         search_sms();
        }
       } 
      }

      اضافه شده در تاریخ :
      دوستان لطفا یکی کمک کنه :cry2: باید تا یکشنبه پروژه را تحویل بدم :sad:
      چرا وقتی توی اینتراپت خارجی از تابع delay و lcd استفاده می کنم وقفه سریال کار نمی کنه؟ :redface:

      دیدگاه


        پاسخ : سوالات برنامه نویسی در کامپایلر CCS

        نمیتونید فلگی چیزی بذارید و توی حلقه اصلی برنامه با lcd کار کنید؟ این وقفه خارجی مال چیه؟
        AYRIC

        دیدگاه


          پاسخ : سوالات برنامه نویسی در کامپایلر CCS

          چرا میشه اما کارم یکم بیشتر میشه. :read:
          حالا شاید اینبار تونستم یه کاریش کنم اما شاید بعدا برای یه برنامه خاصی لازمم شد .اصلا راهی نداره؟ مثلا با غیر فعالا کردن وفقه ها و ...
          توی کدویژن مشکلی نداشت.

          دیدگاه


            پاسخ : سوالات برنامه نویسی در کامپایلر CCS

            من نمیدونم وقفه خارجی شما کی ایجاد میشه
            یا باید وقفه خارجی رو غیر فعال کنید یا اولویت وقفه ی RDA رو بالاتر از وقفه خارجی در نظر بگیرید
            AYRIC

            دیدگاه


              پاسخ : سوالات برنامه نویسی در کامپایلر CCS

              ممنون از راهنماییتون.
              چطور می تونم اولویت وقفه را سریال را بالاتر از سایر وقفه ها قرار بدم؟

              دیدگاه


                پاسخ : سوالات برنامه نویسی در کامپایلر CCS

                با استفاده از دستور priority به شکل زیر
                کد:
                #priority rtcc,rb
                چون rtcc زودتر نوشته شده اولویت بالاتری داره
                AYRIC

                دیدگاه


                  پاسخ : سوالات برنامه نویسی در کامپایلر CCS

                  ممنونم آقا رضا
                  تست می کنم نتیجه را بهتون خبر می دم

                  اضافه شده در تاریخ :
                  سلام دوستان
                  از کدی که فرموده بودید استفاده کردم اما بازم جواب نداد.
                  یه طوری زدم برنامه را جمع و جورش کردم
                  از راهنمایی هاتون هم ممنونم :bye

                  دیدگاه


                    پاسخ : سوالات برنامه نویسی در کامپایلر CCS

                    سلام دوستان. یه سوال و ان اینکه ایا تایمرها متوقف هم میشن یا اولین بار که راه انداختی دیگه متوقف نمیشه؟
                    ینده برنامه ای ک میخام پیاده کنم اینه که وقتی یه کلیدی را فشردم ،تایمر، 6 ثانیه بعد از فشردن کلید(6 ثانیه بعد از هربار فشردن کلید)،تایمر اینتراپت بده.
                    ایا این درست است که تایمر شروع ب شمارش میکند و هی سرریز میشود ولی من فقط میتوانم اینتراپتش را فعال یا غیرفعال کنم.
                    یعنی امکان دارد موقعی ک کلید را میزنم، بعد 2 ثانیه اینتراپت بده؟؟؟؟
                    انشالله ک متوجه سوال شدین oo: oo: oo: oo: oo:
                    رو به خودت نسبت هستی مده!**دل به چنین مستی و پستی مده! //زانچه نداری ز چه افسردهآ‌ای*و زغم و اندوه دل آزردهآ‌ای؟!//گر ببرد ور بدهد دست دوست*ور بِبَرد ور بنهد مُلک اوست//ور بِکِشی یا بکُشی دیو غم **کج نشود دست قضا را قلم//آنچه خدا خواست همان میآ‌شود**وآنچه دلت خواست نه آن میآ‌شود.
                    ....

                    دیدگاه


                      پاسخ : سوالات برنامه نویسی در کامپایلر CCS

                      نه نمیشه خاموش کرد فقط توی یه سری از میکروها (توی هلپ نوشته 18fxxx ) میشه با دستور RTCC_OFF این کار رو کرد.
                      شما نیازی به خاموش کردن تایمر نداری فقط باید وقتی کلید زده میشه تایمر رو 0 کنی و شمارش اینتراپت رو از اول شروع کنی کد زیر رو ببین :
                      [code=c]
                      #include <16f873a.h>
                      #use delay(xtal=20Mhz)

                      #define key input(pin_b0)

                      int overflow;

                      #INT_TIMER1
                      void t1_interr()
                      {
                      if(overflow<60) overflow++;

                      if(overflow==57)
                      {
                      //// user code

                      }
                      }


                      void main()
                      {
                      setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
                      enable_interrupts(INT_TIMER1);
                      enable_interrupts(GLOBAL);

                      while(true)
                      {
                      if(key)
                      {
                      set_timer1(0);
                      overflow=0;
                      while(key);
                      }
                      }
                      }
                      [/code]

                      توی کد بالا هر بار کلید زده بشه تایمر و متغیر شمارنده وقفه 0 میشه و 6 ثانیه بعد برنامه میره اونجا که با user code مشخص کردم. این کار فقط یکبار انجام میشه چون با رسیدن متغیر overflow به عدد 60 دیگه عملا توی وقفه هیچ کاری انجام نمیشه.
                      AYRIC

                      دیدگاه


                        پاسخ : سوالات برنامه نویسی در کامپایلر CCS

                        نوشته اصلی توسط RezaMahzoonie
                        نه نمیشه خاموش کرد فقط توی یه سری از میکروها (توی هلپ نوشته 18fxxx ) میشه با دستور RTCC_OFF این کار رو کرد.
                        سلام.
                        آقا رضا....شما استاد ما هستی....ولی جسارته....چرا نمیشه خاموش کرد؟
                        مثلا تایمر یک، رجیستر T1CON، بیت صفر با نام TMR1ON رو اگه صفر کنیم تایمر یک خاموش میشه....
                        البته باز هم ببخشیدها.... :redface:

                        دیدگاه


                          پاسخ : سوالات برنامه نویسی در کامپایلر CCS

                          ببخشید از اطلاعات اشتباهم
                          از بس این ccs تابع داره آدم کمتر مستقیم با رجیستر کار میکنه من تا حالا با این رجیستر کار نکرده بودم
                          ممنون

                          چه سوتیی
                          AYRIC

                          دیدگاه


                            پاسخ : سوالات برنامه نویسی در کامپایلر CCS

                            با سلام.من تازه برنامه نویسی با ccs شروع کردم.میخواهم lcd را به پورت c میکرو pic 18f25k80 وصل کنم.(ccs پورت c را پشتیبانی نمیکند). کسی میتونه برای نوشتن کد من را راهنمایی کند؟

                            دیدگاه


                              پاسخ : سوالات برنامه نویسی در کامپایلر CCS

                              سلام
                              من خودم از کتاب خانه lcd در ccs استفاده می کنم با شکل زیر:
                              کد:
                              #define use_portd_lcd true
                              #include <lcd.c>
                              روی پورت d و b جواب میده.البته ترتیب اتصال پایه های lcd به میکرو مهمه.
                              با دستور
                              کد:
                              #define LCD_RS_PIN   PIN_b0
                              هم می تونید کار کنید. البته خودم این دستور را تست نکردم

                              دیدگاه


                                پاسخ : سوالات برنامه نویسی در کامپایلر CCS

                                سلام. من باید lcd به پورت c وصل کنم.
                                کتابخانه lcd.c برای پورت های b &d قابل تعریف است. پایه های lcd با دستور define روی پورت c ادرس دهی میکنم ولی انگار lcd به میکرو متصل نیست

                                دیدگاه

                                لطفا صبر کنید...
                                X