اطلاعیه

Collapse
No announcement yet.

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

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

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

    نوشته اصلی توسط شاهرخ مستقیمی نمایش پست ها
    خب...
    با عرض معذرت از تاخیر به وجود آمده!
    (این پست رو دوباره ویرایش خواهم کرد)
    مورد اول اینکه من یه اشتباهی کردم، تایمر 0 تو PIC18F452 تایمر 16 بیتی هست که میتونه 8 بیتی مورد استفاده قرار بگیره از طریق تنظیمات رجیستر T0CON
    مورد دوم، برنامه رو به این شکل اصلاح کردم. توی پروتئوس فایل با پسوند .cof رو به جای فایل .hex توی میکرو لود کنین و ctrl+F12 رو بزنین (وارد حالت دیباگ خواهید شد) حالا میتونین برنامه رو خط به خط اجرا کنین. از منوی Debug گزینه ی Watch Window رو فعال کنین و تو کادر باز شده با کلیک راست کردن و انتخاب گزینه ی (add item (by name میتونین هر رجیستری که خواستین رو اضافه کنین تا ببینین چه اتفاقی برای کدوم رجیستر میفته.
    مورد بعدی، از همون منوی Debug، گزینه ی PIC18CPU رو انتخاب کنین و بعدش گزینه های Source code و Variables رو فعال کنین تا هم سورس برنامه رو ببینین، هم متغیرهایی که تو برنامه تعریف کردین رو مشاهده کنین. خب....حالا موندش یه چیزی برای بررسی راحت برنامه، توی پنجره ی source code، چند تا گزینه میبینین:
    یه دو نقطه هست به اسم toggle breakpoint، چهار تا علامت پا هست و یه علامت آدم در حال دویدن
    ما بیشتر از گزینه ی step over source line استفاده میکنیم. روی هر خط که خواستین اون جا توقف داشته باشین، با ماوس کلیک میکنین و روی اون گزینه ی دو نقطه ( Toggle breakpoint) یه بار کلیک میکنین. حالا وقتی آیکون آدم در حال دویدن رو بزنین، برنامه به شکل عادی اجرا میشه تا برسه به breakpoint که مشخص کردین. با هر بار زدن step over source line برنامه یک خط اجرا میشه.
    و اما برنامه ای که تغییر دادم:
    کد:
    
    
    کد:
    #include <18F452.h>
    #device ADC=16
    
    
    #FUSES NOWDT                    //No Watch Dog Timer
    #FUSES WDT128                   //Watch Dog Timer uses 1:128 Postscale
    #FUSES NOBROWNOUT               //No brownout reset
    #FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
    
    
    #use delay(crystal=20000000)
    #use FIXED_IO( B_outputs=PIN_B0,PIN_B1 )
    #define LED     PIN_B0
    #define LED_2   PIN_B1
    
    
    #use rs232(baud=9600,parity=N,xmit=PIN_A1,rcv=PIN_A0,bits=8,stream=PORT1)

    بالایی main.h هست و پایینی هم main.c
    کد:
    
    
    کد:
    #include <main.h>
    unsigned char snd[20],rcv[20];
    
    
    #INT_TIMER0
    void  TIMER0_isr(void)
    {
    disable_interrupts(GLOBAL); 
    output_toggle(LED);
    snd="AT\r\n";
    puts(snd);
    //!gets(rcv);
    //!printf(lcd_putc,"%s",gets(rcv));
    snd="AT+PSWD=1234\r\n";
    puts(snd);
    //!printf(lcd_putc,"%s",snd);
    clear_interrupt(int_timer0);
    set_timer0(0);
    enable_interrupts(GLOBAL);
    }
    //!
    #define LCD_ENABLE_PIN PIN_D0
    #define LCD_RS_PIN PIN_D1
    #define LCD_RW_PIN PIN_D2
    #define LCD_DATA4 PIN_D4
    #define LCD_DATA5 PIN_D5
    #define LCD_DATA6 PIN_D6
    #define LCD_DATA7 PIN_D7
    
    
    #include <lcd.c>
    
    
    void main()
    {
       lcd_init();
       lcd_gotoxy(1,1);
       lcd_putc("Hi");
       
       setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1|RTCC_8_bit);      //51.2 us overflow
       enable_interrupts(INT_TIMER0);
       enable_interrupts(GLOBAL);
    
    
       
       set_timer0(250);
       while(TRUE)
       {
          //output_toggle(LED_2);
          //delay_ms(1);
       }
    
    
    }


    خواهش میکنم....ممنونم واقعاااا خیلی عالیه توضیحاتتون ...چیزهایی که نمیدونستم
    من حالا برنامه رو اونطوری که شما تغییر دادین توی شبیه سازی اجرا کردم وقفه درست کار میکنه...بعد اومدم روی میکرو (تو مدار)پروگرمش کردم هم LED روشن شد و هم LCD عبارت مورد نظر رو نشون داد....ولی مشکلی که هست رمز بلوتوث تغییر نکرده باز ...ولی خب اینها نشون میده که وقفه درست داره کار میکنه ولی نمیدونم چرا رمز همون قبلی مونده
    مشکل به نظر شما چیه؟؟؟؟
    ببخشید دو تا سوال هم بپرسم شاید خنده دار باشه
    چرا مقدار اولیه ی تایمرو 250 گرفتین؟؟ نمیشد اونم صفر بگیریم؟
    و این دستور هم دقیقا چیکار میکنه؟
    setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1|RTCC_8_bit) ; //51.2 us overflow

    دیدگاه


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

      نوشته اصلی توسط zahra_soveida نمایش پست ها
      خواهش میکنم....ممنونم واقعاااا خیلی عالیه توضیحاتتون ...چیزهایی که نمیدونستم
      من حالا برنامه رو اونطوری که شما تغییر دادین توی شبیه سازی اجرا کردم وقفه درست کار میکنه...بعد اومدم روی میکرو (تو مدار)پروگرمش کردم هم LED روشن شد و هم LCD عبارت مورد نظر رو نشون داد....ولی مشکلی که هست رمز بلوتوث تغییر نکرده باز ...ولی خب اینها نشون میده که وقفه درست داره کار میکنه ولی نمیدونم چرا رمز همون قبلی مونده
      مشکل به نظر شما چیه؟؟؟؟
      ببخشید دو تا سوال هم بپرسم شاید خنده دار باشه
      چرا مقدار اولیه ی تایمرو 250 گرفتین؟؟ نمیشد اونم صفر بگیریم؟
      و این دستور هم دقیقا چیکار میکنه؟
      setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1|RTCC_8_bit) ; //51.2 us overflow
      خواهش میکنم.
      دلیل تغییر نکردن رمز رو باید تو دستورات ماژول بررسی کنین. چون دستوراتی که میکرو باید بفرسته، درست ارسال میشه.
      جواب سوال اول به خاطر این هست که در حین دیباگ چون استپ به استپ برنامه رو اجرا میکردم، میخواستم با چند تا کلیک تایمر سرریز بشه و من تغییرات رجیسترها رو بتونم ببینم و هی تندتند کلیک نکنم تا مقدار رجیستر تایمر از 0 به 255 برسه. فقط به خاطر صرفه جویی در کلیک کردن بود!!
      دستور بعدی سورس کلاک ؛ تقسیم فرکانس و مد تایمر 0 رو تنظیم میکنه.
      RTCC_DIV_1 نسبت تقسیم فرکانسی تایمر صفر هست. که با مراجعه به دیتاشیت، بخش تنظیمات تایمر صفر، میتونین این تقسیمات رو مشاهده بفرمایید که 1:2 و 1:4 و...1:128 هست.
      دستور RTCC_8_bit هم تایمر 0 رو به شکل 8بیتی راه اندازی میکنه که باز هم بخاطر سریعتر پر شدن تایمر و ایجاد وقفه اینطوری تنظیمش کردم. اگر شما میخواین که تایمر صفر 16 بیتی باشه، این قسمت رو پاک کنین.
      باز هم سوالی بود مطرح بفرمایید.

      دیدگاه


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

        نوشته اصلی توسط شاهرخ مستقیمی نمایش پست ها
        خواهش میکنم.
        دلیل تغییر نکردن رمز رو باید تو دستورات ماژول بررسی کنین. چون دستوراتی که میکرو باید بفرسته، درست ارسال میشه.
        جواب سوال اول به خاطر این هست که در حین دیباگ چون استپ به استپ برنامه رو اجرا میکردم، میخواستم با چند تا کلیک تایمر سرریز بشه و من تغییرات رجیسترها رو بتونم ببینم و هی تندتند کلیک نکنم تا مقدار رجیستر تایمر از 0 به 255 برسه. فقط به خاطر صرفه جویی در کلیک کردن بود!!
        دستور بعدی سورس کلاک ؛ تقسیم فرکانس و مد تایمر 0 رو تنظیم میکنه.
        RTCC_DIV_1 نسبت تقسیم فرکانسی تایمر صفر هست. که با مراجعه به دیتاشیت، بخش تنظیمات تایمر صفر، میتونین این تقسیمات رو مشاهده بفرمایید که 1:2 و 1:4 و...1:128 هست.
        دستور RTCC_8_bit هم تایمر 0 رو به شکل 8بیتی راه اندازی میکنه که باز هم بخاطر سریعتر پر شدن تایمر و ایجاد وقفه اینطوری تنظیمش کردم. اگر شما میخواین که تایمر صفر 16 بیتی باشه، این قسمت رو پاک کنین.
        باز هم سوالی بود مطرح بفرمایید.

        خیلی ممنونم پس ماژول رو باید تست کنم
        خیلی لطف کردین این انجمن عالیه خدا خیرتون بده...ان شاالله موفق باشین
        اگه سوالی بود بازم میپرسم

        دیدگاه


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

          سلام دوستان
          یه سوالی داشتم ممنون میشم راهنماییم کنید
          برنامه ای نوشتم که تو بخشی از اون میخوام رشته ای رو روی lcd نمایش بده
          دستوری که نوشتم به این ترتیبه....ولی متاسفانه lcd واکنشی نشون نمیده به ارسال رشته ها...لطفا راهنمایی کنید...ممنون
          sprintf(lcd_putc,"%s",gets(str1));

          دیدگاه


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

            سلام.
            نوع LCD رو نفرمودین؟ فقط تو نمایش اعداد مسئله دارین یا سایر اطلاعات هم همینطور؟
            این کد برای نمایش اطلاعات روی LCD کاراکتری هست:

            char num_1=100,num_2=234;
            float temperature=41.7;

            lcd_gotoxy(1,1);
            printf(lcd_putc,"num_1=%u\nBB=%u\n"num_1,num_2);

            lcd_gotoxy(1,2);
            printf(lcd_putc,"temp = %f\n",temperature);

            دیدگاه


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

              سلام.
              نوبتی هم که باشه، نوبت خودمه که سوال بپرسم!!
              قسمت منفی تو این شرطها اصلا دیده نمیشه! چه برسه به اینکه بخواد اجرا بشه!! چرا؟؟؟!!!

              signed int16 delta;

              delta = sensor[1] - sensor[2];

              if(20 < delta) {
              move_left();
              lcd_gotoxy(1,2);
              lcd_putc(" MOVE M1 ");
              delay_ms(100);
              }
              else if(-20 < delta < 20) {
              move_direct();
              lcd_gotoxy(1,2);
              lcd_putc(" MOVE M2 ");
              delay_ms(100);
              }
              else if(delta < -20) {
              move_right();
              lcd_gotoxy(1,2);
              lcd_putc(" MOVE M3 ");
              delay_ms(100);
              }

              دیدگاه


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

                نوشته اصلی توسط شاهرخ مستقیمی نمایش پست ها
                سلام.
                نوبتی هم که باشه، نوبت خودمه که سوال بپرسم!!
                قسمت منفی تو این شرطها اصلا دیده نمیشه! چه برسه به اینکه بخواد اجرا بشه!! چرا؟؟؟!!!

                signed int16 delta;

                delta = sensor[1] - sensor[2];

                if(20 < delta) {
                move_left();
                lcd_gotoxy(1,2);
                lcd_putc(" MOVE M1 ");
                delay_ms(100);
                }
                else if(-20 < delta < 20) {
                move_direct();
                lcd_gotoxy(1,2);
                lcd_putc(" MOVE M2 ");
                delay_ms(100);
                }
                else if(delta < -20) {
                move_right();
                lcd_gotoxy(1,2);
                lcd_putc(" MOVE M3 ");
                delay_ms(100);
                }
                شرط دوم درست نیست. باید به این روش نوشته بشه.

                else if((delta > -20) && (delta < 20))


                این تکه کد رو امتحان کنید ببینید :


                signed int16 delta;

                delta = sensor[1] - sensor[2];

                if(delta > 20) {
                move_left();
                lcd_gotoxy(1,2);
                lcd_putc(" MOVE M1 ");
                delay_ms(100);
                }
                else if(delta > -20) {
                move_direct();
                lcd_gotoxy(1,2);
                lcd_putc(" MOVE M2 ");
                delay_ms(100);
                }
                else {
                move_right();
                lcd_gotoxy(1,2);
                lcd_putc(" MOVE M3 ");
                delay_ms(100);
                }
                If the wind will not serve, take to the oars

                دیدگاه


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

                  نوشته اصلی توسط ASHIT AXAR نمایش پست ها
                  شرط دوم درست نیست. باید به این روش نوشته بشه.

                  else if((delta > -20) && (delta < 20))


                  این تکه کد رو امتحان کنید ببینید :


                  signed int16 delta;

                  delta = sensor[1] - sensor[2];

                  if(delta > 20) {
                  move_left();
                  lcd_gotoxy(1,2);
                  lcd_putc(" MOVE M1 ");
                  delay_ms(100);
                  }
                  else if(delta > -20) {
                  move_direct();
                  lcd_gotoxy(1,2);
                  lcd_putc(" MOVE M2 ");
                  delay_ms(100);
                  }
                  else {
                  move_right();
                  lcd_gotoxy(1,2);
                  lcd_putc(" MOVE M3 ");
                  delay_ms(100);
                  }
                  سلام.ممنون ازراهنمایی. تو انجمن CCS پرسیده بودم و همین رو گفتن.شرط دوم ناقص اجرا میشد، و چون با else if نوشتم باعث میشد که شرط آخری رو اصلا نبینه.بعد از اصلاح شرط وسط به همین فرم که نوشتین، ایرادش برطرف شد.

                  دیدگاه


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

                    سلام
                    دوستان من با میکرو 16f877a کار میکنم مشکلم در دریافت داده ها از ماژول Gsm و نمایش روی lcd هستش(ccs)
                    نمیدونم چکار کنم
                    لطفا کمک کنید
                    جدیدترین ویرایش توسط hasan7478; ۱۴:۰۳ ۱۳۹۷/۰۴/۲۶.

                    دیدگاه


                      pid

                      سلام یه سوال کسی هست در مورد pid چیزی بدونه مثلا در مورد اینکه موتور در صورت ایجار بار بتونه به همون سرعت خودش ادامه بده؟؟؟
                      جدیدترین ویرایش توسط مهدی سلمانی; ۱۳:۴۳ ۱۳۹۷/۰۵/۰۵.

                      دیدگاه


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

                        سلام من یه برنامه نوشتم می*خوام کل برنامه من با یک پین فعال و غیر فعال بشه یعنی پین یک بود برنامه اجرا بشه هرکجای برنامه که بود اگه اون پین صفر شد از برنامه خارج بشه باید چکار کنم؟

                        دیدگاه


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

                          نوشته اصلی توسط saeid.al نمایش پست ها
                          سلام من یه برنامه نوشتم می*خوام کل برنامه من با یک پین فعال و غیر فعال بشه یعنی پین یک بود برنامه اجرا بشه هرکجای برنامه که بود اگه اون پین صفر شد از برنامه خارج بشه باید چکار کنم؟
                          2 حالت داره:
                          1-وصلش کنین به پایه ریست. در این حالت برنامه از اول شروع میشه
                          2-یک وقفه خارجی حساس به لبه پایین رونده و یک حلقه در وقفه تا زمانی که پین 0 هست. از همونجایی که قطع میشه ادامه پیدا می کنه.
                          جدیدترین ویرایش توسط Matin_Mirzadeh; ۱۵:۴۲ ۱۴۰۰/۰۴/۰۵. دلیل: اشتباه تایپی

                          دیدگاه


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

                            سلام وقت بخیر
                            سوالی داشتم در رابطه با adc ها نمیدونم همینجا باید بپرسم یا جای دیگ
                            مسعله اینه که وقتی از دوتا سنسور استفاده میکنم برای اندازه گیری دما و سنسور دود هر دو مستقل خوب کار میکنن ولی به محظ استفاده باهم دیگه روی میکرو تداخل adc ایجاد میشه و با بالا پایین شدن مقدار سنسور دود که نیازی هم به نمایشش نیست مقدار سنسور دما که داره نمایش داده میشه تغییر میکنه و خطی یا کم میشه یا زیاد که مشخصه این کم و زیاد شدن مطابق کم و زیاد شدن مقدار سنسور دود هست
                            راه حلی برای رفع این تداخل دارید ؟
                            کد رو میزارم که اگه این تداخل به خاطر کد هست واشتباهی کردم رفع بشه


                            Code:
                            #include <16f1939.h>
                            #FUSES PUT
                            #FUSES NOBROWNOUT
                            #fuses HS,NOWDT,NOPROTECT,NOLVP ,PLL_SW,NOMCLR
                            #device ADC=10
                            #use delay(internal=8000000)



                            Code:
                            //----------------------------temprature---------------------------//
                            void temprature(void){
                            set_adc_channel(7);
                            adc_value =read_adc();
                            adc_value=1023-adc_value;
                            if (adc_value<=600)
                            {
                            dama=0;
                            }
                            infrared();
                            if ((adc_value>600)&&(adc_value<=800))
                            {
                            dama=adc_value-600;
                            dama=dama/10;
                            }
                            infrared();
                            if ((adc_value>800)&&(adc_value<=863))
                            {
                            dama=adc_value-600;
                            dama=dama/8.7;
                            }
                            infrared();
                            if ((adc_value>863)&&(adc_value<=918))
                            {
                            dama=adc_value-600;
                            dama=dama/7.9;
                            }
                            infrared();
                            if ((adc_value>918)&&(adc_value<=1023))
                            {
                            dama=adc_value-600;
                            dama=dama/6.9;
                            }
                            infrared();

                            dama=dama/1.2;

                            dg_dama=dama/10;
                            yk_dama=dg_dama*10;
                            yk_dama=dama-yk_dama;
                            infrared();
                            if ((dama>dama_alarm-10)&&(speed==0))
                            {
                            output_low(buzzer);
                            delay_ms(260);
                            output_high(buzzer);
                            delay_ms(350);
                            output_low(buzzer);
                            delay_ms(470);
                            output_high(buzzer);
                            speed=1;
                            flag_dama=1;
                            }
                            infrared();
                            if ((dama<dama_alarm-11)&&(flag_Dama==1))
                            {
                            output_low(buzzer);
                            delay_ms(260);
                            output_high(buzzer);
                            delay_ms(350);
                            output_low(buzzer);
                            delay_ms(470);
                            output_high(buzzer);
                            speed=0;
                            flag_dama=0;
                            }


                            infrared();

                            }
                            //----------------------------temprature---------------------------//
                            //--------------------------------Gas------------------------------//
                            void gas_smoke(void){
                            //if (mq2_start>=1)
                            //{
                            set_adc_channel(9); //NetUI_11
                            adc_value =read_adc();


                            //gas2=adc_value/10;
                            if ((adc_value>550)&&(speed==0))
                            {
                            output_low(buzzer);
                            Delay_ms(100);
                            output_high(buzzer);
                            //Delay_ms(200);
                            //output_low(buzzer);
                            //Delay_ms(50);
                            // output_high(buzzer);
                            mq2_flag=1;
                            speed=1;
                            }
                            //infrared();

                            if ((adc_value<400)&&( mq2_flag==1))
                            {
                            mq2_flag=0;
                            output_low(buzzer);
                            Delay_ms(550);
                            output_high(buzzer);
                            speed=0;
                            }
                            //infrared();
                            //}
                            }
                            //--------------------------------Gas------------------------------//


                            Code:
                            void main()
                            set_tris_b(0xF3); // Configure RB0 ~ 1 as input pins
                            set_tris_e(0x0C);
                            port_b_pullups(0xF0);
                            port_e_pullups(0x08);


                            Setup_timer_0(RTCC_INTERNAL|RTCC_DIV_8);
                            enable_interrupts(INT_TIMER0);

                            setup_timer_1(T1_internal | T1_DIV_BY_8);
                            setup_oscillator(OSC_8MHZ | OSC_PLL_on);

                            enable_interrupts(GLOBAL);

                            setup_vref(VREF_ADC_1v024);
                            setup_adc_ports(sAN7|sAN9 , VREF_FVR);
                            setup_adc(ADC_CLOCK_DIV_64);
                            setup_adc_ports(sAN7|sAN9);
                            while (1)
                            {
                            temprature();
                            gas_smoke();

                            ////calculate_time();
                            ////display_all();
                            ////touch();
                            ////infrared();
                            }
                            }
                            {
                            یاد اوری میکنم که کد ها جداگونه درست کار میکنند
                            جدیدترین ویرایش توسط saeidkhy; ۰۹:۵۱ ۱۴۰۰/۰۶/۲۸.

                            دیدگاه


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

                              نوشته اصلی توسط saeidkhy نمایش پست ها
                              سلام وقت بخیر
                              سوالی داشتم در رابطه با adc ها نمیدونم همینجا باید بپرسم یا جای دیگ
                              مسعله اینه که وقتی از دوتا سنسور استفاده میکنم برای اندازه گیری دما و سنسور دود هر دو مستقل خوب کار میکنن ولی به محظ استفاده باهم دیگه روی میکرو تداخل adc ایجاد میشه و با بالا پایین شدن مقدار سنسور دود که نیازی هم به نمایشش نیست مقدار سنسور دما که داره نمایش داده میشه تغییر میکنه و خطی یا کم میشه یا زیاد که مشخصه این کم و زیاد شدن مطابق کم و زیاد شدن مقدار سنسور دود هست
                              راه حلی برای رفع این تداخل دارید ؟
                              کد رو میزارم که اگه این تداخل به خاطر کد هست واشتباهی کردم رفع بشه


                              Code:
                              #include <16f1939.h>
                              #FUSES PUT
                              #FUSES NOBROWNOUT
                              #fuses HS,NOWDT,NOPROTECT,NOLVP ,PLL_SW,NOMCLR
                              #device ADC=10
                              #use delay(internal=8000000)



                              Code:
                              //----------------------------temprature---------------------------//
                              void temprature(void){
                              set_adc_channel(7);
                              adc_value =read_adc();
                              adc_value=1023-adc_value;
                              if (adc_value<=600)
                              {
                              dama=0;
                              }
                              infrared();
                              if ((adc_value>600)&&(adc_value<=800))
                              {
                              dama=adc_value-600;
                              dama=dama/10;
                              }
                              infrared();
                              if ((adc_value>800)&&(adc_value<=863))
                              {
                              dama=adc_value-600;
                              dama=dama/8.7;
                              }
                              infrared();
                              if ((adc_value>863)&&(adc_value<=918))
                              {
                              dama=adc_value-600;
                              dama=dama/7.9;
                              }
                              infrared();
                              if ((adc_value>918)&&(adc_value<=1023))
                              {
                              dama=adc_value-600;
                              dama=dama/6.9;
                              }
                              infrared();

                              dama=dama/1.2;

                              dg_dama=dama/10;
                              yk_dama=dg_dama*10;
                              yk_dama=dama-yk_dama;
                              infrared();
                              if ((dama>dama_alarm-10)&&(speed==0))
                              {
                              output_low(buzzer);
                              delay_ms(260);
                              output_high(buzzer);
                              delay_ms(350);
                              output_low(buzzer);
                              delay_ms(470);
                              output_high(buzzer);
                              speed=1;
                              flag_dama=1;
                              }
                              infrared();
                              if ((dama<dama_alarm-11)&&(flag_Dama==1))
                              {
                              output_low(buzzer);
                              delay_ms(260);
                              output_high(buzzer);
                              delay_ms(350);
                              output_low(buzzer);
                              delay_ms(470);
                              output_high(buzzer);
                              speed=0;
                              flag_dama=0;
                              }


                              infrared();

                              }
                              //----------------------------temprature---------------------------//
                              //--------------------------------Gas------------------------------//
                              void gas_smoke(void){
                              //if (mq2_start>=1)
                              //{
                              set_adc_channel(9); //NetUI_11
                              adc_value =read_adc();


                              //gas2=adc_value/10;
                              if ((adc_value>550)&&(speed==0))
                              {
                              output_low(buzzer);
                              Delay_ms(100);
                              output_high(buzzer);
                              //Delay_ms(200);
                              //output_low(buzzer);
                              //Delay_ms(50);
                              // output_high(buzzer);
                              mq2_flag=1;
                              speed=1;
                              }
                              //infrared();

                              if ((adc_value<400)&&( mq2_flag==1))
                              {
                              mq2_flag=0;
                              output_low(buzzer);
                              Delay_ms(550);
                              output_high(buzzer);
                              speed=0;
                              }
                              //infrared();
                              //}
                              }
                              //--------------------------------Gas------------------------------//


                              Code:
                              void main()
                              set_tris_b(0xF3); // Configure RB0 ~ 1 as input pins
                              set_tris_e(0x0C);
                              port_b_pullups(0xF0);
                              port_e_pullups(0x08);


                              Setup_timer_0(RTCC_INTERNAL|RTCC_DIV_8);
                              enable_interrupts(INT_TIMER0);

                              setup_timer_1(T1_internal | T1_DIV_BY_8);
                              setup_oscillator(OSC_8MHZ | OSC_PLL_on);

                              enable_interrupts(GLOBAL);

                              setup_vref(VREF_ADC_1v024);
                              setup_adc_ports(sAN7|sAN9 , VREF_FVR);
                              setup_adc(ADC_CLOCK_DIV_64);
                              setup_adc_ports(sAN7|sAN9);
                              while (1)
                              {
                              temprature();
                              gas_smoke();

                              ////calculate_time();
                              ////display_all();
                              ////touch();
                              ////infrared();
                              }
                              }
                              {
                              یاد اوری میکنم که کد ها جداگونه درست کار میکنند
                              سلام

                              اولا که شما فیوزبیت HS رو فعال کردین و بعد اوسیلاتور داخلی رو فعال کردین
                              اگر از اوسیلاتور داخلی استفاده می کنین به جای HS فیوز INTRC یا INTRC_IO رو فعال کنین

                              دوما شما setup_adc_ports رو دوبار فرا خوندین. بار اول با ولتاژ حداقل از پین A2 و ولتاژ حداکثر رو از FVR ,ولی حالت دوم که فعال کردین از GND تا VDD میگیره
                              اگر هم میشه شماتیکو بفرستین

                              بعد هم باید وقتی کانال ADC رو عوض می کنین حتما حداقل 10 میکرو ثانیه دیلی بزارید
                              بعد هم کدتون رو کامل نزاشتین یا فایل رو زیپ کنید و بفرستید همراه با شماتیک یا مشخصات کامل پروژه رو بدین براتون تا فردا تو همون CCS مینویسم میفرستم

                              دیدگاه


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

                                نوشته اصلی توسط Matin_Mirzadeh نمایش پست ها
                                سلام
                                نوشته اصلی توسط Matin_Mirzadeh نمایش پست ها

                                اولا که شما فیوزبیت HS رو فعال کردین و بعد اوسیلاتور داخلی رو فعال کردین
                                اگر از اوسیلاتور داخلی استفاده می کنین به جای HS فیوز INTRC یا INTRC_IO رو فعال کنین

                                دوما شما setup_adc_ports رو دوبار فرا خوندین. بار اول با ولتاژ حداقل از پین A2 و ولتاژ حداکثر رو از FVR ,ولی حالت دوم که فعال کردین از GND تا VDD میگیره
                                اگر هم میشه شماتیکو بفرستین

                                بعد هم باید وقتی کانال ADC رو عوض می کنین حتما حداقل 10 میکرو ثانیه دیلی بزارید
                                بعد هم کدتون رو کامل نزاشتین یا فایل رو زیپ کنید و بفرستید همراه با شماتیک یا مشخصات کامل پروژه رو بدین براتون تا فردا تو همون CCS مینویسم میفرستم


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

                                دیدگاه

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