اطلاعیه

Collapse
No announcement yet.

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

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

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

    نوشته اصلی توسط شاهرخ مستقیمی نمایش پست ها
    یه چیزی رو خجالت میکشم بگم! ولی باید گفت!
    من تا الان قسمت نشده I2C کار کنم ولی به مثال های CCS که نگاه کردم، اکثرا بعد از ارسال دستور آدرس، دوباره فرمان استارت I2C رو فرستاده به دستگاه جانبی.
    این رو امتحان بفرمایید، ان شاءالله که جواب بده.
    همین که وقت می زارید واسه من کلی ارزش داره... حالا این شکلی هم که گفتید امتحان می کنم ببینم چی میشه... به هر حال بازم ممنون
    جدیدترین ویرایش توسط شاهرخ مستقیمی; ۰۸:۲۱ ۱۳۹۵/۰۵/۲۳.

    دیدگاه


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

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

      ممنون میشم راهنماییم کنید

      با تشکر
      اگر هدف شما ساخت پالس سوزنی باشه، این مدار رو ببندید
      Click image for larger version

Name:	RC.jpg
Views:	1
Size:	63.8 کیلو بایت
ID:	1124290
      بعدش اون رو با اینتراپت خارجی اندازه بگیرین.
      اما اگر هدف اندازه گرفتن فرکانس هست، به ورودی تایمر صفر همون موج مربعی رو اعمال بکنین و تعداد پالس در زمان مشخصی رو اندازه بگیرین(بشمارین). تایمر 0 رو به صورت شمارنده کانفیگ کنین، اون رو روشن کنین و یه مکث 100 میلی ثانیه داشته باشین. تو زیربرنامه ی وقفه ی تایمر 0، به ازای هر سرریز، یه متغیر رو افزایش بدین. بعد از اتمام اون 100 میلی ثانیه مکث،شمارنده رو خاموش میکنین. تعداد دفعات سر ریز روز ضرب در 256 بکنین و با عدد موجود در رجیستر شمارنده جمع کنین. حاصل میشه تعداد شمارش کل در عرض 100 میلی ثانیه. با توجه به prescale کانتر که 1:2 هست یا 1:16 یا... میشه فهمید به ازای چند پالس ورودی، شمارنده یه دونه افزایش پیدا کرده. در نتیجه میشه با یه ضرب و تقسیم ساده فرکانس رو بدست آورد.
      موفق باشید

      (راستی معذرت میخوام که بدون اجازه پست هاتون رو ویرایش کردم، از ابزارهای انجمن ناقص استفاده شده بود، به خاطر همین اصلاحش کردم )
      جدیدترین ویرایش توسط شاهرخ مستقیمی; ۰۹:۳۸ ۱۳۹۵/۰۵/۲۳.

      دیدگاه


        من منظورم اینه که چطور میشه پین به حالت Tristate بره و بی تاثیر تو مدار باشه؟

        نوشته اصلی توسط eca_user نمایش پست ها
        من منظورم اینه که چطور میشه پین به حالت Tristate بره و بی تاثیر تو مدار باشه؟
        من سوالم رو تکمیل کنم لطفا اگر کسی میدونه راهنمایی کنه
        دو پین میکرو با مقاومت 60 اهم به هم وصلند. وقتی رو ی یکی از پین ها موج مربعی تولید میشه موج مربعی از حالت مربع و تیز بودن خارج میشه و قوس دار به سمت 5 ولت حرکت میکنه شبیه موج مثلثی .وقتی اتصال دو پین بصورت سخت افزاری قطع میشه شکل موج مربعی درست میشه.چطوری میشه تاثیر پین دیگر را بصورت نرم افزاری از بین برد؟
        جدیدترین ویرایش توسط شاهرخ مستقیمی; ۰۲:۳۳ ۱۳۹۵/۰۵/۲۵. دلیل: ادغام دو پست برای جلوگیری از اسپم

        دیدگاه


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

          نوشته اصلی توسط eca_user نمایش پست ها
          من منظورم اینه که چطور میشه پین به حالت Tristate بره و بی تاثیر تو مدار باشه؟

          من سوالم رو تکمیل کنم لطفا اگر کسی میدونه راهنمایی کنه
          دو پین میکرو با مقاومت 60 اهم به هم وصلند. وقتی رو ی یکی از پین ها موج مربعی تولید میشه موج مربعی از حالت مربع و تیز بودن خارج میشه و قوس دار به سمت 5 ولت حرکت میکنه شبیه موج مثلثی .وقتی اتصال دو پین بصورت سخت افزاری قطع میشه شکل موج مربعی درست میشه.چطوری میشه تاثیر پین دیگر را بصورت نرم افزاری از بین برد؟
          سلام.
          اگر پایه مربوطه به صورت ورودی تنظیم بشه، در اصل وارد حالت tri-state شده.
          این هم نتیجه ی یه سرچ کوچولو!
          و یه سرچ دیگه از فروم میکروچیپ!
          امیدوارم که مفید واقع شده باشه

          دیدگاه


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

            ممنون.پین را بصورت ورودی تعریف کردم ولی مشکل همچنان پا برجاست

            دیدگاه


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

              نوشته اصلی توسط eca_user نمایش پست ها
              ممنون.پین را بصورت ورودی تعریف کردم ولی مشکل همچنان پا برجاست
              سلام
              میتونم بپرسم میکرو شما چیه؟ مدلش رو بفرمایید.
              ویه سوال اینه که چرا دو پین باید به هم وصل باشند؟ اون مقاومت برای چیه؟ اگه مثلا اگه دوتا پین روی یه ترک دارن کاری میکنند چرا با دیود جداشون نمیکنید؟

              دیدگاه


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

                سلام دوستان
                برنامه ای که نوشتم در مورد ارتباط سریال بین pic18f452 وماژوله بلوتوث هست....این برنامه رو با وقفه ی تایمر صفر نوشتم و باید زمانیکه وارد وقفه میشه ابتدا یکی از پین ها رو روشن و خاموش کنه بعد یه سری دستوراتو به ماژول بفرسته(میخوام اسم و رمزشو عوض کنم) ولی توی شبیه سازی اون پایه ی میکرو روشن خاموش نمیشه...پس یعنی وارد وقفه نشده....به نظرتون مشکل از چیه؟؟؟؟؟خواهش میکنم راهنمایی کنین خیلی فوریه

                دیدگاه


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

                  نوشته اصلی توسط zahra_soveida نمایش پست ها
                  سلام دوستان
                  برنامه ای که نوشتم در مورد ارتباط سریال بین pic18f452 وماژوله بلوتوث هست....این برنامه رو با وقفه ی تایمر صفر نوشتم و باید زمانیکه وارد وقفه میشه ابتدا یکی از پین ها رو روشن و خاموش کنه بعد یه سری دستوراتو به ماژول بفرسته(میخوام اسم و رمزشو عوض کنم) ولی توی شبیه سازی اون پایه ی میکرو روشن خاموش نمیشه...پس یعنی وارد وقفه نشده....به نظرتون مشکل از چیه؟؟؟؟؟خواهش میکنم راهنمایی کنین خیلی فوریه
                  سلام.
                  سورس برنامه لطفا؟
                  از کجا مطمئن هستین وارد زیربرنامه نمیشه؟ شاید تایمر روشن نیست/شاید روتین اینتراپت اشکالی داشته باشه/شاید اون پایه رو خروجی تعریف نکردین/ شاید.....

                  دیدگاه


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

                    این سورس برنامست، نمیدونم کجا ایراد داره ...ممنونم،لطفا راهنمایی کنین

                    کد:
                    #include <18F452.h>
                    #use delay(clock=20000000)
                    #use rs232(baud=38400,XMIT=pin_A1,RCV=pin_A0,bits=8)
                    #fuses HS,NOWDT
                    #define LCD_TYPE2
                    #include <lcd.c>
                    #INT_TIMER0
                    unsigned char snd,rcv;
                    void TIMER0_isr(void) 
                    {
                    output_toggle(pin_b0);
                    set_timer0(15536); 
                    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);
                    }
                    
                    void main()
                    {
                    setup_timer_0(RTCC_INTERNAL|RTCC_DIV_128); //51.2 us overflow
                    enable_interrupts(INT_TIMER0);
                    enable_interrupts(GLOBAL);
                    set_tris_b(0xFE);
                    output_low(pin_b0);
                    lcd_init();
                    lcd_gotoxy(1,1);
                    lcd_putc("Hi");
                    while(TRUE){}
                    }
                    جدیدترین ویرایش توسط شاهرخ مستقیمی; ۱۲:۳۲ ۱۳۹۵/۰۵/۲۷.

                    دیدگاه


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

                      تایمر 0 یه تایمر 8 بیتی هست، شما نمیتونین مقدار 15536 رو داخلش بنویسین. یعنی اگر هم بنویسین، فقط 8 بیت کم ارزش توش نوشته میشه.
                      لطفا فایل های سورس برنامه و شبیه سازی رو قرار بدین تا اونها رو هم یه نگاه بندازم.
                      جدیدترین ویرایش توسط شاهرخ مستقیمی; ۱۲:۵۶ ۱۳۹۵/۰۵/۲۷.

                      دیدگاه


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

                        نوشته اصلی توسط شاهرخ مستقیمی نمایش پست ها
                        تایمر 0 یه تایمر 8 بیتی هست، شما نمیتونین مقدار 15536 رو داخلش بنویسین. یعنی اگر هم بنویسین، فقط 8 بیت کم ارزش توش نوشته میشه.
                        لطفا فایل های سورس برنامه و شبیه سازی رو قرار بدین تا اونها رو هم یه نگاه بندازم.
                        ببخشید فایلارو زیپ کردم ولی نوشته امکان پیوست فایل برام وجود نداره.....چجوری بفرستم؟؟؟؟

                        دیدگاه


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

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




                          دیدگاه


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

                            خیلی ممنونم...درست شد
                            جدیدترین ویرایش توسط zahra_soveida; ۲۰:۴۴ ۱۳۹۵/۰۵/۲۷.

                            دیدگاه


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

                              برنامه رو نگاه کردم. صبح بهتون جواب میدم.
                              برنامه وارد اینتراپت تایمر نمیشه. با اینکه اینتراپت فعال هست. جای بعضی خطوط رو عوض کردم، ولی همچنان اشکالاتی داره. صبح عرض میکنم خدمتتون.

                              دیدگاه


                                پاسخ : [گفتگو و تبادل نظر] سوالات برنامه نویسی در کامپایلر 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);
                                   }
                                
                                
                                }

                                جدیدترین ویرایش توسط شاهرخ مستقیمی; ۱۱:۴۶ ۱۳۹۵/۰۵/۲۹.

                                دیدگاه

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