اطلاعیه

Collapse
No announcement yet.

کد مربوط به راه اندازی Quadrature Decoder

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    #46
    پاسخ : کد مربوط به راه اندازی Quadrature Decoder

    در ابتدا باید بررسی کنید که به ازای هر بار چرخش 360 درجه انکودر چه مقدار جابجایی دارید.
    .
    1- منظورتون اینکه میزان تغییرات خروجی متغییر TCC1_CNT رو اندازه بگیرم ؟

    سپس با توجه به رزولوشن 5000 پالس انکودر مذکور
    در دیتا شیت انکودر من
    Max. allowable revolution = 5000 RPM
    Pulse/4 Revolution = 500 Pulse
    Wheel girth = 250mm
    Ratio of gear = 2:1
    Measuring Unit = 1mm

    2- با این مشخصات اگه اشتباه نمی کنم انکودر من 500 پالس هست و در یک دور کامل 250 میلیمتری باید 500 پلس بفرسته درسته ؟
    3- در مورد دیگر اطلاعاتش میشه یه توضیحی بدید ؟

    اگه مقدار بیشتری برای اندازه گیری مد نظرتون هست می بایست بجای ضربدر 4 نمودن عدد 5000, آنرا در اعداد بیشتری ضرب کنید ( البته سقف آن بستگی به نوع متغیر مورد استفاده داره)
    خوب در این خط
    کد:
    	TCC1_PER= (4 * N_PalseEncoder) - 1 ;
    4- یعنی من می تونم بجای 4 از اعداد بزرگتری استفاده کنم ؟ خوب در این صورت باید بدونم حداکثر مقداری که متغییر TCC1_PER میگیره چه عددی هست ؟ (نوعش چیست ؟)


    - به دنبال فرصت عمری تباه کردم ! فرصت جوانی ام بود من اشتباه کردم .

    دیدگاه


      #47
      پاسخ : کد مربوط به راه اندازی Quadrature Decoder

      1- منظورم اینه که اگه انکودر یک دور کامل بزنه , میزان جابجایی چند میلیمتره؟ اون وسیله چقدر جابجا میشه؟
      2- پس با این چیزی که شما نوشتید در هر دور 500 پالس میزنه یعنی باید عدد 1999 رو داخل TCC1_PER بریزید
      و به ازای هر دور کامل n میلی متر جابجا میشه که مقدار n رو باید ببینید چقدره. یعنی رجیستر TCC1_CNT به ازای این جابجایی
      تا سقف 1999 میره و دوباره صفر میشه.
      اگه میخواهید رجیستر TCC1_CNT به ازای مقدار بیشتری از جابجایی که مد نظر شماست overfow بشه پس باید داخل TCC1_PER مضربی از 2000 رو بریزید( البته یک منهای یک هم باید آخرش بزارید)
      سقف رجیستر مذکور 65535 می باشد
      مشخصات من در لینک زیر
      http://www.eca.ir/forum2/index.php?topic=1721.msg698645#msg698645

      www.********

      دیدگاه


        #48
        پاسخ : کد مربوط به راه اندازی Quadrature Decoder

        خیلی ممنون دوست عزیز . بررسی می کنم و بعد نتیجه رو اعلام می کنم . مرسی
        - به دنبال فرصت عمری تباه کردم ! فرصت جوانی ام بود من اشتباه کردم .

        دیدگاه


          #49
          پاسخ : کد مربوط به راه اندازی Quadrature Decoder

          lما متاسفانه هنوز مشکلم حل نشده . اگر کسی کدی برای مثال داره لطفا برام بزاره . :redface:

          من متوجه نشدم که اگر تایمر من چندین مرتبه در متراژ مثلا از صفر تا 100 متر آور بشه خوب چه موقعی و از روی چی (آیا رویدادی اتفاق می افته در اون لحظه یا باید شرطی رو چک کنم مرتب ) متوجه بشم و مثلا یه کانتر رو افزایش بدم . حالا مشکل بعدی اینکه اگر برعکس چرخید دوباره چطور متوجه بشم و اون کانتر رو کم کنم منظورم رو نمی دونم درست رسوندم یا نه ؟

          مثلا متراژ من 50 متر باشه و فرض کنیم کانتر توی هر 4 متر آورفلو میشه . خوب من تا الان تونستم که بصورت میلی متری تا 4 متر اول رو از رروی اعداد کانتر داشته باشم
          حالا باید بیام و یه کانتر بزارم که مثلا اگر 3 تا آورفلو داشتم متراژ 12 رو نشون بده . درسته ؟ حالا اگر برعکس چرخید چی دوباره درست سر همون جایی که قبلا آورفلو بوده حالا چه اتفاقی می افته که من کانتر 3 رو مثلا یکی کم کنم . یعنی مثلا وقتی به صفر میرسه دوباره بعدش متغیر تایمر ماکسیمم مقدار خودش میشه ؟
          - به دنبال فرصت عمری تباه کردم ! فرصت جوانی ام بود من اشتباه کردم .

          دیدگاه


            #50
            پاسخ : کد مربوط به راه اندازی Quadrature Decoder

            با سلام
            به نظر من شما باید ابتدا یک تایمری داشته باشید که درون وقفه اون تایمر دو تا رجیستر داشته باشید ک دره یکی از اونها مقدار فعلی انکودر را پدیت کنید و در رجیستر دیگه مقدار قبلی رو داشته باشید و از روی تفاضل اونا می تونید به جهت چرخش
            پی ببرید. همچنین باید یک کانتر داشته باشید که در هر بار overflow انکودر مقدار اون کانتر رو باتوجه به جهت چرخش که از روی مقدار تفاضل بدست میاد اون رو اضافه یا کم کنید
            مشخصات من در لینک زیر
            http://www.eca.ir/forum2/index.php?topic=1721.msg698645#msg698645

            www.********

            دیدگاه


              #51
              پاسخ : کد مربوط به راه اندازی Quadrature Decoder

              ممنون دوست خوبم .
              درست میگید شما . ولی قبلا فکر می کردم خوب اگر مثلا سر هر 4 متر overflow بشه خوب مقادیر بینشون رو چی کار کنم . ؟
              حالا با این صحبت شما یه فکری بنظر رسید که نمی دونم درست هست یا نه ؟! oo:

              می تونم زمان OverFlow شدن رو مثلا طوری تنظیم کنم که روی هر سانتیمتر (دقت سانتیمتر مد نظرم هست ) OverFlow بشه فکر کنم این طوری خیلی راحتتر باشم چون مجموع همه سانتی مترها رو میشمرم و در آخر کار هم طول رو برحسب سانتیمتر دارم و میشه تبدیل به مترش کرد .

              خوبه و آیا می تونم ؟ راهش چیه ؟ آیا همون تغییر مقدار متغییر TCC1_PER کافیه ؟ راستش تا حالا با کانترها بصورت عملی کار نکردم (کردم ولی یه جورایی فقط کپی بوده و من درک درستی ازشون پیدا نکردم ) مخصوصا توی Xmega . :mrgreen:
              - به دنبال فرصت عمری تباه کردم ! فرصت جوانی ام بود من اشتباه کردم .

              دیدگاه


                #52
                پاسخ : کد مربوط به راه اندازی Quadrature Decoder

                سلام
                من منظورم overflow شدن انکودر بود نه overflow شدن تایمر زمان سنج , overflow شدن انکودر بستگی به عددی داره که شما بعنوان ضریب رزولوشن انکودر داخل رجیستر period تایمر/کانتر مربوط به اون ریختید
                اگه شما بخواهید با استفاده از یک زمان سنج میزان تغییرات حرکت رو تشخیص بدید باید حتما میزان سرعت حرکتتون ثابت و دقیق باشه که این روش کار زیاد خوبی نیست
                به نظر من بهترین راه استفاده از overflow شدن خود انکودر هستش
                مشخصات من در لینک زیر
                http://www.eca.ir/forum2/index.php?topic=1721.msg698645#msg698645

                www.********

                دیدگاه


                  #53
                  پاسخ : کد مربوط به راه اندازی Quadrature Decoder

                  منظور منم همون Overflow شدن خود انکودر بود به نظرتون می تونم اون رزولشینی که شما می فرمائید رو طوری تنظیم کنم که هر یک سانتی متر over بشه که اونوقت می تونم ار تعداد Over شدن های اون یه کانتری بزارم و تعداد سانتی متر هارو باهاش بشمارم . آخه الان روی هر چهار متر Over میشه ! oo:

                  الان برای پیدا کردن جهتش دیگه مشکلی نیست . متوجه شدم . ممنونم :rolleyes:
                  - به دنبال فرصت عمری تباه کردم ! فرصت جوانی ام بود من اشتباه کردم .

                  دیدگاه


                    #54
                    پاسخ : کد مربوط به راه اندازی Quadrature Decoder

                    بله شما میتونید با کم کردن اون عددی که داخل رجیستر period مربوط به تایمر/ کانتر انکودر گذاشتید کاری کنید که سر هر یک سانتیمتر overflow بشه مثلا اگه الان سر هر 4000 سانتیمتر overflow میشه
                    اگه اون عدد رو تقسیم بر 4000 کنید در تئوری میتونه سر هر یک سانتیمتر overflow بشه البته در عمل این بستگی به این داره که نتیجه اون تقسیم از عدد یک کمتر نشه
                    چرا که دیگه خود انکودر قادر به شمارش نیست
                    مشخصات من در لینک زیر
                    http://www.eca.ir/forum2/index.php?topic=1721.msg698645#msg698645

                    www.********

                    دیدگاه


                      #55
                      پاسخ : کد مربوط به راه اندازی Quadrature Decoder

                      این کد من :

                      کد:
                      int main(void)
                      {
                      	system_clocks_init();
                      	
                      	Output(DDRB,0);
                      	Output(DDRE,3);
                      	Input(DDRC,1);
                      	Input(DDRC,2);
                      	Input(DDRC,3);
                      	Input(DDRC,4);
                      	
                      	TCC0_PER = 9764;   // (F Crystal) 10.000.000 / (TC_CLKSEL_DIV256_gc) 256 = 39062.5 ~ -1 = 39060 = 1s / LED   250 ms 9764
                      	TCC0_INTCTRLA = TC_ERRINTLVL_OFF_gc | TC_OVFINTLVL_LO_gc;
                      	TCC0_CTRLA = TC_CLKSEL_DIV256_gc;
                      	
                      	TCD0_PER = 39060;   // (F Crystal) 10.000.000 / (TC_CLKSEL_DIV256_gc) 256 = 39062.5 ~ -1 = 39060  = 1s / Send Function
                      	TCD0_INTCTRLA = TC_ERRINTLVL_OFF_gc | TC_OVFINTLVL_LO_gc;
                      	TCD0_CTRLA = TC_CLKSEL_DIV256_gc;
                      	
                      	PMIC_CTRL = PMIC_LOLVLEN_bm;
                      
                      	usarte0_init();
                      
                      	PORTC_PIN3CTRL=PORT_ISC_LEVEL_gc; // QDPH0
                      	PORTC_PIN4CTRL=PORT_ISC_LEVEL_gc; // QDPH90
                      	TCC1_PER = 39;   
                      	EVSYS_CH0MUX=EVSYS_CHMUX_PORTC_PIN3_gc;
                      	EVSYS_CH1MUX=EVSYS_CHMUX_PORTC_PIN2_gc;
                      	EVSYS_CH0CTRL=EVSYS_QDIEN_bm|EVSYS_QDEN_bm|EVSYS_DIGFILT_2SAMPLES_gc;
                      	EVSYS_CH0CTRL=EVSYS_QDEN_bm|EVSYS_DIGFILT_2SAMPLES_gc;
                      	TCC1_CTRLD=TC_EVACT_QDEC_gc|TC_EVSEL_CH0_gc;
                      	TCC1_CTRLA=TC_CLKSEL_DIV1_gc;
                      	
                      	sei();
                      	
                      	while(1)
                      	{
                      		Now_value=TCC1_CNT;
                      
                      		if((Now_value>10)&&(Now_value< 30))
                      		{
                      			FlgZero=false;
                      			FlgMax=false;
                      		}
                      		else if(Now_value<10 && !FlgZero && !FlgMax)
                      		{
                      			FlgZero=true;
                      			FlgMax=false;
                      		}
                      		else if(Now_value>30 && !FlgZero && !FlgMax)
                      		{
                      			FlgMax=true;
                      			FlgZero=false;
                      		}
                      		
                      		if(Now_value<10 && FlgMax==true)
                      		{
                      			Centimeter++;
                      			FlgMax=false;
                      			FlgZero=true;
                      		}
                      		else if(Now_value>30 && FlgZero==true)
                      		{
                      			Centimeter--;
                      			FlgZero=false;
                      			FlgMax=true;
                      		}
                      		
                      	}
                      }
                      
                      
                      
                      ISR (TCD0_OVF_vect)
                      {
                      	SendMetraj();
                      }
                      
                      void SendMetraj()
                      {
                      	unsigned char DIGITS_IntPart[6]={0,0,0,0,0,0};
                      	unsigned char i;
                      	
                      		for (i=0;i<6;i++)
                      		{
                      			DIGITS_IntPart[i]=Centimeter%10;
                      			Centimeter/=10;
                      		}
                      
                      	SendData(0xBB);
                        SendData(0xEE);
                      	
                      	SendData(DIGITS_IntPart[5]);
                      	SendData(DIGITS_IntPart[4]);
                      	SendData(DIGITS_IntPart[3]);
                      	SendData(DIGITS_IntPart[2]);
                      	SendData(DIGITS_IntPart[1]);
                      	SendData(DIGITS_IntPart[0]);
                      
                      
                      }
                      همون طور که در مشخص هست من از کدی که استاد طراح در همین تاپیک پیشنهاد داده بودند استفاده کردم البته با اندکی تغییرات در مقادیر .

                      قرار است که مقدار طول بصورت سانتیمتر در متغییر سانتیمتر دخیره شده و توسط تایمری در هر یک ثانیه برای کامپیوتر ارسال بشه .
                      در ضمن مقدار تایمر / کانتر مربوطه به انکودر رو روی 39 گذاشتم که در هر یک سانتی متر OF شود .
                      حالا دو تا مشکل :

                      1- اندازه ای که دستگاه بهم نشون میده دقیق نیست .
                      2- تا زمانی که انکودر در حال چرخش هست اعداد مرتب و درست افزوده شده و ارسال میشوند ولی بمحض ایستادن انکودر عدد سانتیمتر کم شده و صفر میشود .
                      oo:
                      - به دنبال فرصت عمری تباه کردم ! فرصت جوانی ام بود من اشتباه کردم .

                      دیدگاه


                        #56
                        پاسخ : کد مربوط به راه اندازی Quadrature Decoder

                        به دلیل پراکندگی پاسخ های گذشته، یکبار دیگر بصورت دقیق به این دو سوال پاسخ دهید:

                        1- انکودر مورد استفاده شما در هر یک دور چند پالس تولید می کند (500 پالس)؟

                        2- به ازای هر دور چرخش انکودر، چه میزان جابجایی در خروجی بخش مکانیکی ایجاد می شود؟
                        اوژن: به معنای افکننده و شکست دهنده است
                        دانایی، توانایی است-Knowledge is POWER
                        برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
                        وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
                        قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
                        اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
                        ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

                        دیدگاه


                          #57
                          پاسخ : کد مربوط به راه اندازی Quadrature Decoder

                          استاد ممنون از پیگیریتون .

                          2 - دور چرخی که بر روی انکودر من می باشد 25 سانتی متر می باشد . پس در هر دور گردش انکودر 25 سانتی متر جابجایی دارم .

                          1 - و این هم مشخصات فنی اون از داخل دیتاشیتش :


                          Max. allowable revolution = 5000 RPM
                          Pulse/4 Revolution = 500 Pulse
                          Wheel girth = 250mm
                          Ratio of gear = 2:1
                          Measuring Unit = 1mm

                          حالا با توجه به اطلاعات فوق نمی دونم دقیقا 500 پالس هست یا چیز دیگه ؟

                          و اینکه توسط کد های بالا کارم داره انجام میشه و من قصدم اینکه در هر یک سانتیمتر مقدار متغییر Centimeter یک واحد افزایش یا کاهش داشته باشه و در آخر اون رو با پورت سریال ارسالش کنم .
                          ولی دو مشکل اشاره شده در پست قبلی را دارم . بازم ممنون


                          - به دنبال فرصت عمری تباه کردم ! فرصت جوانی ام بود من اشتباه کردم .

                          دیدگاه


                            #58
                            پاسخ : کد مربوط به راه اندازی Quadrature Decoder

                            در مورد مشخصات انکودر ظاهرا از نوع 500 پالس است که در هر دور 2000 لبه را در دو خروجی خود ایجاد می کند. با توجه به وجود یک چرخ دنده 2:1 (که معلوم نیست جنبه کاهش یا افزایش دور دارد)، اگر دنده با نسبت 1 به چرخ و دنده با نسبت 2 انکودر متصل باشد، هر تغییر شمارنده معادل 0.025 سانتیمتر است که در این شرایط 39 برای رجیستر TCC1_PER صحیح است. اما در شرایط برعکس باید 159 در این رجیستر قرار داده شود.
                            اما صرف نظر از این مورد، مشکل اصلی شما این است که در برنامه بجای اینکه از یک کپی متغیر Centimeter برای تقسیمات متوالی استفاده کنید، از خود این متغیر استفاده کرده اید که این مسئله باعث تغییر مقدار آن ناشی از تقسیم بر 10 در محاسبات می شود. در صورت توقف هم به دلیل اینکه این متغیر هر بار بر 10 تقسیم می شود، بعد از مدتی صفر می شود. بنابراین باید در حلقه ای که تقسیمات متوالی به 10 انجام می شود، ابتدا یک کپی از متغیر Centimeter در یک متغیر موقت ریخته شود و محاسبات روی آن انجام شود.
                            اوژن: به معنای افکننده و شکست دهنده است
                            دانایی، توانایی است-Knowledge is POWER
                            برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
                            وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
                            قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
                            اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
                            ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

                            دیدگاه


                              #59
                              پاسخ : کد مربوط به راه اندازی Quadrature Decoder

                              استاد ممنون از پاسختون . واقعا عرض میکنم . برای تشکر از شما فقط زدن دکمه تشکر کافی نیست . بازم ممنون .
                              بررسی میکنم و نتیجه رو اعلام میکنم .
                              - به دنبال فرصت عمری تباه کردم ! فرصت جوانی ام بود من اشتباه کردم .

                              دیدگاه


                                #60
                                پاسخ : کد مربوط به راه اندازی Quadrature Decoder

                                :applause:

                                بلاخره مشکل حل !

                                از همگی دوستانی که در انجام این کار مرا یاری دادند ، مخصوصا جناب طراح بخاطر راهنمایی های با حوصله و کاملا دقیق و علمیشون تشکر و قدردانی دارم .
                                و با تشکر ویژه از دوست خوبم majid68

                                کد نهایی رو برای استفاده دیگران در همین پست می زارم .

                                توضیحات : این کد برای راه اندازی یک انکودر 500 پالس که یک چرخ با دور 25 سانتی متر بر روی شفت آن بسته شده است توسط میکروکنترلر ATXMega32A4 می باشد که خروجی های A و B انکودر به پین های PC3 و PC4 متصل شده اند (البته توسط یک تقسیم مقاومتی و ترانزیستور های مربوطه که شماتیک مدار را هم قرار می دهم . ) در این برنامه تایمر TCC0 فعال شده و در وقفه سرریز آن یک LED هر 250 میلی ثانیه چشمک می زند . (همین ! فقط برای اینکه مطمئن بشم مدارم در حال کار هست ) و تایمر TCD0 فعال شده و در هر یک ثانیه توسط پورت UART مقدار فعلی متغییر Centimeter را برای کامپیوتر ارسال می کند . موفق باشید . مرد نامرئی

                                کد:
                                #include <avr/io.h>
                                #include <avr/interrupt.h>
                                
                                //delay functions
                                #define F_CPU 10000000UL 		//Your clock speed in Hz
                                
                                
                                
                                //-----------------delays---------------------------------------------------------
                                #define LOOP_CYCLES 8 				//Number of cycles that the loop takes
                                
                                #define fcpu_delay_us(num) delay_int(num/(LOOP_CYCLES*(1/(F_CPU/1000000.0))))
                                #define fcpu_delay_ms(num) delay_int(num/(LOOP_CYCLES*(1/(F_CPU/1000.0))))
                                
                                void delay_int(unsigned long delay);
                                //--------------------------------------------------------------------------------
                                void system_clocks_init(void);
                                void usarte0_init(void);
                                void SendData(char c);
                                void SendMetraj();
                                
                                #define Set(a, b) (a) |= (1 << (b))
                                #define Reset(a, b) (a) &= ~(1 << (b))
                                #define Output(a, b) (a) |= (1 << (b))
                                #define Input(a, b) (a) &= ~(1 << (b))
                                
                                #define DDRB _SFR_IO8(0x0620)
                                #define PORTB _SFR_IO8(0x0620)
                                #define PORTB0 0
                                #define DDRE _SFR_IO8(0x0680)
                                #define DDRC _SFR_IO8(0x0640)
                                
                                int Counter = 0;
                                float Metr = 0 ;
                                int Centimeter = 0;
                                float number = 0.025; 
                                
                                int MaxValue = 39 ;  
                                
                                unsigned int Sefr_value;
                                unsigned int Now_value;
                                unsigned int OLD_value;
                                int Jahat = 1;
                                unsigned char i;
                                int XLED = 0;
                                bool FlgZero = false;
                                bool FlgMax = false;
                                
                                int main(void)
                                {
                                	system_clocks_init();
                                	
                                	Output(DDRB,0);
                                	Output(DDRE,3);
                                	Input(DDRC,1);
                                	Input(DDRC,2);
                                	Input(DDRC,3);
                                	Input(DDRC,4);
                                	
                                	TCC0_PER = 9764;   // (F Crystal) 10.000.000 / (TC_CLKSEL_DIV256_gc) 256 = 39062.5 ~ -1 = 39060 = 1s / LED   250 ms 9764
                                	TCC0_INTCTRLA = TC_ERRINTLVL_OFF_gc | TC_OVFINTLVL_LO_gc;
                                	TCC0_CTRLA = TC_CLKSEL_DIV256_gc;
                                	
                                	TCD0_PER = 39060;   // (F Crystal) 10.000.000 / (TC_CLKSEL_DIV256_gc) 256 = 39062.5 ~ -1 = 39060  = 1s / Send Function
                                	TCD0_INTCTRLA = TC_ERRINTLVL_OFF_gc | TC_OVFINTLVL_LO_gc;
                                	TCD0_CTRLA = TC_CLKSEL_DIV256_gc;
                                	
                                	PMIC_CTRL = PMIC_LOLVLEN_bm;
                                
                                	usarte0_init();
                                
                                	PORTC_PIN3CTRL=PORT_ISC_LEVEL_gc; // QDPH0
                                	PORTC_PIN4CTRL=PORT_ISC_LEVEL_gc; // QDPH90
                                	TCC1_PER = 39;   
                                	EVSYS_CH0MUX=EVSYS_CHMUX_PORTC_PIN3_gc;
                                	EVSYS_CH1MUX=EVSYS_CHMUX_PORTC_PIN2_gc;
                                	EVSYS_CH0CTRL=EVSYS_QDIEN_bm|EVSYS_QDEN_bm|EVSYS_DIGFILT_2SAMPLES_gc;
                                	EVSYS_CH0CTRL=EVSYS_QDEN_bm|EVSYS_DIGFILT_2SAMPLES_gc;
                                	TCC1_CTRLD=TC_EVACT_QDEC_gc|TC_EVSEL_CH0_gc;
                                	TCC1_CTRLA=TC_CLKSEL_DIV1_gc;
                                	
                                	sei();
                                	
                                	while(1)
                                	{
                                		Now_value=TCC1_CNT;
                                
                                		if((Now_value>10)&&(Now_value< 30))
                                		{
                                			FlgZero=false;
                                			FlgMax=false;
                                		}
                                		else if(Now_value<10 && !FlgZero && !FlgMax)
                                		{
                                			FlgZero=true;
                                			FlgMax=false;
                                		}
                                		else if(Now_value>30 && !FlgZero && !FlgMax)
                                		{
                                			FlgMax=true;
                                			FlgZero=false;
                                		}
                                		
                                		if(Now_value<10 && FlgMax==true)
                                		{
                                			Centimeter++;
                                			FlgMax=false;
                                			FlgZero=true;
                                		}
                                		else if(Now_value>30 && FlgZero==true)
                                		{
                                			Centimeter--;
                                			FlgZero=false;
                                			FlgMax=true;
                                		}
                                		
                                	}
                                }
                                
                                
                                
                                ISR (TCD0_OVF_vect)
                                {
                                	SendMetraj();
                                }
                                
                                void SendMetraj()
                                {
                                	unsigned char DIGITS_IntPart[6]={0,0,0,0,0,0};
                                	unsigned char i;
                                	int CopyOFCentimeter = 0;
                                	
                                	CopyOFCentimeter = Centimeter;
                                	
                                		for (i=0;i<6;i++)
                                		{
                                			DIGITS_IntPart[i]=CopyOFCentimeter%10;
                                			CopyOFCentimeter/=10;
                                		}
                                
                                	SendData(0xBB);
                                
                                	SendData(DIGITS_IntPart[5]);
                                	SendData(DIGITS_IntPart[4]);
                                	SendData(DIGITS_IntPart[3]);
                                	SendData(DIGITS_IntPart[2]);
                                	SendData(DIGITS_IntPart[1]);
                                	SendData(DIGITS_IntPart[0]);
                                	
                                  SendData(0xEE);
                                
                                
                                }
                                
                                ISR (TCC0_OVF_vect)
                                {
                                	if(XLED==0)
                                	{
                                		Set(PORTB, 0);
                                		XLED = 1;
                                	}
                                	else
                                	{
                                		Reset(PORTB, 0);
                                		XLED = 0;
                                	}
                                }
                                
                                void delay_int(unsigned long delay)
                                {
                                	while(delay--) asm volatile("nop");
                                };
                                
                                // System Clocks initialization
                                void system_clocks_init(void)
                                {
                                	OSC.XOSCCTRL=0XCB;
                                	OSC.CTRL = 9;
                                	while(!(OSC.STATUS & 8));
                                	CCP = 0xD8;
                                	CLK.CTRL = 0x03;
                                	CLK.PSCTRL = 0x01;
                                }
                                
                                // USARTE0 initialization
                                void usarte0_init(void)
                                {
                                	// Note: the correct PORTE direction for the RxD, TxD and XCK signals
                                	// is configured in the ports_init function
                                
                                	// Transmitter is enabled
                                	// Set TxD=1
                                	PORTE.OUTSET=0x08;
                                
                                	// Communication mode: Asynchronous USART
                                	// Data bits: 8
                                	// Stop bits: 1
                                	// Parity: Disabled
                                	USARTE0.CTRLC=USART_CMODE_ASYNCHRONOUS_gc | USART_PMODE_DISABLED_gc | USART_CHSIZE_8BIT_gc;
                                
                                	// Receive complete interrupt: Disabled
                                	// Transmit complete interrupt: Disabled
                                	// Data register empty interrupt: Disabled
                                	USARTE0.CTRLA=(USARTE0.CTRLA & (~(USART_RXCINTLVL_gm | USART_TXCINTLVL_gm | USART_DREINTLVL_gm))) |
                                	USART_RXCINTLVL_OFF_gc | USART_TXCINTLVL_OFF_gc | USART_DREINTLVL_OFF_gc;
                                
                                	// Required Baud rate: 9600
                                	// Real Baud Rate: 9601.5 (x1 Mode), Error: 0.0 %
                                	USARTE0.BAUDCTRLA=0x03;
                                	USARTE0.BAUDCTRLB=((0x0B << USART_BSCALE0_bp) & USART_BSCALE_gm) | 0x08;
                                
                                	// Receiver: Off
                                	// Transmitter: On
                                	// Double transmission speed mode: Off
                                	// Multi-processor communication mode: Off
                                	USARTE0.CTRLB=(USARTE0.CTRLB & (~(USART_RXEN_bm | USART_TXEN_bm | USART_CLK2X_bm | USART_MPCM_bm | USART_TXB8_bm))) |
                                	USART_TXEN_bm;
                                }
                                
                                // Write a character to the USARTE0 Transmitter
                                #pragma used+
                                void SendData(char c)
                                {
                                	while ((USARTE0.STATUS & USART_DREIF_bm) == 0);
                                	USARTE0.DATA=c;
                                }
                                #pragma used-
                                - به دنبال فرصت عمری تباه کردم ! فرصت جوانی ام بود من اشتباه کردم .

                                دیدگاه

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