اطلاعیه

Collapse
No announcement yet.

یه مشکل با کریستال ساعت دارم

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

    یه مشکل با کریستال ساعت دارم

    سلام

    این سوالو یه بار دیگه هم پرسیدم ولی جواب درستی نگرفتم . راستش یه ساعت با 7segment درست کردم ولی نمیدونم چرا جلو میوفته :redface:
    از یه کریستال خارجی 4MHz ویه کریستال ساعت استفاده کردم
    ایا مشکلش تو قسمت فیوز بیتاس که باید برای کریستال ساعت تنظیم بشه یا جای دیگه است ؟ ( تو فیوز بیتا فقط ckopt رو پروگرام کردم)

    در ضمن از 2 تا وقفه یکی برای رفریش 7segment ها ویکیم برای ساعت استفاده کردم امکان داره اشکال از زیرول وقفه ساعت باشه؟
    میشه یه راهنمایی بکنید
    ذكات علم ياد دادنه ....

    #2
    پاسخ : یه مشکل با کریستال ساعت دارم

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

    دیدگاه


      #3
      پاسخ : یه مشکل با کریستال ساعت دارم

      در روز تقریبا 2 تا 3 دقیقه

      ذكات علم ياد دادنه ....

      دیدگاه


        #4
        پاسخ : یه مشکل با کریستال ساعت دارم

        2-3 دقیقه در فرکانس کلاک 4 مگا یعنی 4MHz * 120sec = 480Mhz اشتباه نوسانی :surprised: این اشتباه به هیچ وجه قابل قبول نیست برای یک اسیلاتور کریستالی(حتی در طول یک شبانه روز) ، حتما برنامه ایراد داره.
        راستی هر چند ساعت 2-3 ذقیقه جلو می افته؟
        بت در بغل و به سجده پیشانی ما کافر زده خنده بر مسلمانی ما
        اسلام به ذات خود ندارد عیبی هر عیب که هست در این مسلمانی ماست

        دیدگاه


          #5
          پاسخ : یه مشکل با کریستال ساعت دارم

          راستی هر چند ساعت 2-3 ذقیقه جلو می افته؟
          راستش نمی دونم چی شد الان هر 1 ذقیقه 4-5 ثانیه جلو میوفته :eek:

          برنامشم اینه:


          #include <mega16.h>
          #define xtal 4000000
          #define anode PORTD
          #define kathod PORTB
          #define hi 1
          #define low 0


          flash unsigned char arry [4]={0X0E,0X0D,0X0B,0X07};

          flash int digits[11]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,
          0x7D,0x07,0x7F,0x6F,0X80};

          unsigned int i,j,k,l;
          unsigned int seg;
          unsigned int second;


          // Timer 1 overflow interrupt service routine
          interrupt [TIM1_OVF] void timer1_ovf_isr(void)
          {
          // Reinitialize Timer 1 value
          TCNT1H=0xFF;
          TCNT1L=0x78;
          // Place your code here

          seg++;

          switch (seg) {
          case 1:
          kathod=arry[0];
          anode=digits[i];
          break;

          case 2:
          kathod=arry[1];
          anode=digits[j];
          break;

          case 3:
          kathod=arry[2];
          anode=digits[k];
          break;

          case 4:
          kathod=arry[3];
          anode=digits[l];
          break;

          default:
          seg=0;
          }
          }

          // Timer 2 overflow interrupt service routine
          interrupt [TIM2_OVF] void timer2_ovf_isr(void)
          {
          // Place your code here

          second++;

          if (second==59)
          {
          second=0;
          l++;

          if (l==10)
          {
          l=0;
          k++;

          if (k==6)
          {
          k=0;
          j++;

          if (j==10)
          {
          j=0;
          i++;

          if (i==3 & j==4)
          {
          i=0;
          j=0;

          }
          }
          }
          }
          }

          }

          // Declare your global variables here

          void main(void)
          {


          // Declare your local variables here

          // Input/Output Ports initialization
          // Port A initialization
          // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
          // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
          PORTA=0x00;
          DDRA=0x00;

          // Port B initialization
          // Func7=In Func6=In Func5=In Func4=In Func3=Out Func2=Out Func1=Out Func0=Out
          // State7=T State6=T State5=T State4=T State3=1 State2=1 State1=1 State0=1
          PORTB=0x0F;
          DDRB=0x0F;

          // Port C initialization
          // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
          // State7=T State6=T State5=T State4=P State3=P State2=P State1=T State0=T
          PORTC=0x1C;
          DDRC=0x00;

          // Port D initialization
          // Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
          // State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0
          PORTD=0x00;
          DDRD=0xFF;

          // Timer/Counter 0 initialization
          // Clock source: System Clock
          // Clock value: Timer 0 Stopped
          // Mode: Normal top=FFh
          // OC0 output: Disconnected
          TCCR0=0x00;
          TCNT0=0x00;
          OCR0=0x00;

          // Timer/Counter 1 initialization
          // Clock source: System Clock
          // Clock value: 62.500 kHz
          // Mode: Normal top=FFFFh
          // OC1A output: Discon.
          // OC1B output: Discon.
          // Noise Canceler: Off
          // Input Capture on Falling Edge
          // Timer 1 Overflow Interrupt: On
          // Input Capture Interrupt: Off
          // Compare A Match Interrupt: Off
          // Compare B Match Interrupt: Off
          TCCR1A=0x00;
          TCCR1B=0x04;
          TCNT1H=0x01;
          TCNT1L=0x38;
          ICR1H=0x00;
          ICR1L=0x00;
          OCR1AH=0x00;
          OCR1AL=0x00;
          OCR1BH=0x00;
          OCR1BL=0x00;

          // Timer/Counter 2 initialization
          // Clock source: TOSC1 pin
          // Clock value: PCK2/128
          // Mode: Normal top=FFh
          // OC2 output: Disconnected
          ASSR=0x08;
          TCCR2=0x05;
          TCNT2=0x00;
          OCR2=0x00;

          // External Interrupt(s) initialization
          // INT0: Off
          // INT1: Off
          // INT2: Off
          MCUCR=0x00;
          MCUCSR=0x00;

          // Timer(s)/Counter(s) Interrupt(s) initialization
          TIMSK=0x44;

          // Analog Comparator initialization
          // Analog Comparator: Off
          // Analog Comparator Input Capture by Timer/Counter 1: Off
          ACSR=0x80;
          SFIOR=0x00;

          // Global enable interrupts
          #asm("sei&quot

          while (1)
          {


          // Place your code here

          };
          }
          ذكات علم ياد دادنه ....

          دیدگاه


            #6
            پاسخ : یه مشکل با کریستال ساعت دارم

            خیلی عجیبه چرا ساعت جلو میوفته
            یه سوال :تو یه برنامه (مثل همین برنامه ساعت ) اگه از 2 تا وقفه استفاده کنیم مگر اینطور نیست که در هر لحظه که وقفه اتفاق بیوفته میکرو میره سراغ
            همون وقفه ؟
            اگه اینجوری باشه پس باید تو interrupt تایمر 2 اگر میکرو داشت زیروال اون وقفه رو اجرا می کرد همزمان وقفه تایمر 1 هم اتفاق بیوفته اونوقت میره سراغ اون
            پس زمانی که محاسبه میشه کمتر از 1 ثانیه باید باشه.؟

            البته نظر منه نمیدونم شایدم اشتباه باشه

            یه نفر لطف کنه یه توضیح بده ما که نفهمیدیم چرا جلو میوفته(ساعتو میگم)
            ذكات علم ياد دادنه ....

            دیدگاه


              #7
              پاسخ : یه مشکل با کریستال ساعت دارم

              سلام دوست من
              نه اینطوری نیست که اگه هر وقفه اتفاق بیفته میکرو بره سراغ اون وقفه ها اولویت بندی دارند که در اینجا اگه در دیتا شیت دقت کنید میبینید که در مگا 16 یا 32 وقفه تایمر 2 اولویت بیشتری نسبت به تایمر 1 داره و نکته دیگه اینکه وقتی میکرو میره یه وقفه را اجرا کنه دیگه به هیچ وقفه ای جواب نمیده چون در هنگام اجرای وقفه بیت I از SREG که بیت پذیرفتن وقفه عمومی است را صفر میکنه حالا شما بیا در حال اجرای وقفه تایمر 1 که مربوط به refresh سون سگمنت هاست وقفه تایمر 2 را هم بپذیر به این صورت که بیا یه #asm(sei) درون زیر روال وقفه مربوط به تایمر 1 بنویس که اگه وقفه تایمر 2اتفاق افتاد میکرو بره اونا اجرا کنه :job:
              فرزندم در راه است

              دیدگاه


                #8
                پاسخ : یه مشکل با کریستال ساعت دارم

                شاید به خاطر استفاده از کریستال دومه. یکی دیگه از بچه ها هم با این کریستال های 32KHz مشکل داره:
                http://www.eca.ir/forum2/index.php?topic=8285.0
                بت در بغل و به سجده پیشانی ما کافر زده خنده بر مسلمانی ما
                اسلام به ذات خود ندارد عیبی هر عیب که هست در این مسلمانی ماست

                دیدگاه


                  #9
                  پاسخ : یه مشکل با کریستال ساعت دارم

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

                  دیدگاه


                    #10
                    پاسخ : یه مشکل با کریستال ساعت دارم

                    از لطف دوستان ممنونم

                    شاید به خاطر استفاده از کریستال دومه. یکی دیگه از بچه ها هم با این کریستال های 32KHz مشکل داره:
                    اینو دیده بودم ولی کمکم نکرد به نظر شما اشکال از برنامه نیست ؟

                    حالا شما بیا در حال اجرای وقفه تایمر 1 که مربوط به refresh سون سگمنت هاست وقفه تایمر 2 را هم بپذیر به این صورت که بیا یه #asm(sei) درون زیر روال وقفه مربوط به تایمر 1 بنویس که اگه وقفه تایمر 2اتفاق افتاد میکرو بره اونا اجرا کنه
                    میشه لطف کنید بیشتر توضیح بدین (من اسمبلی بلد نیستم ) دقیقا چی باید بنویسم؟

                    تنها کاری که باید انجام بدی اینه که از کریستال 32687 استفاده کنی و منتظر وقفه اون باشی. و در بین دو وقفه کارهای دیگه رو ردیف کنی.
                    اگه باز هم مشکلی بود احتمالا تو برنامه و یا استفاده درست از وقفه هاست.
                    خوب منم از کریستال ساعت استفاده کردم ولی نمیدونم اشکال از کجاست؟؟؟؟؟؟؟؟؟ :angry:
                    ذكات علم ياد دادنه ....

                    دیدگاه


                      #11
                      پاسخ : یه مشکل با کریستال ساعت دارم

                      ببین دوست من شما واسه پذیرفتن یه وقفه در avr باید دو تا کار بکنی یکی اینکه بیت I در SREG را 1 کنی که این بیت بیت عمومی وقفه است یعنی اگه این بیت را 1 نکنی هیچ وقفه ای رخ نمیدهد اگر هم رخ دهد واسه میکرو مهم نیست و بقول خودمون محلش نمیزاره این بیت با دستور
                      #asm("sei&quot
                      (که خودت تو برنامه قبل از(while(1 نوشتی) یک خواهد شد هنوز کار تموم نشده حالا در مرحله دوم باید بعد از 1 کردن این بیت عمومی بیای و بیت اختصاصی را 1 کنی در واقع حالا باید بیای بگی کدوم وقفه را نیاز داری (در اینجا مثلا وقفه تایمر 2) حالا اینو چطوری باید به میکرو حالی کنی باید بیای یه بیت را 1 کنی تا میکرو بفهمه (مثلا در اینجا بیت صفرم از رجیستر TIMSK که با دستور TIMSK=0b0000001 بسادگی این کار را میکنی حالا هر بار تایمر 2 به 255 رسید وقفه رخ میده و مثلا یکی به ثانیه اضافه میشه
                      نکته:اگر میکرو در حال اجرای یک وقفه بود بصورت سخت افزاری بیت I صفر میشه و در نتیجه هیچ وقفه ای را نمی پذیرد و تا اتمام تابع وقفه باید صبر کنی تا دوباره بصورت سخت افزاری بیت I 1 بشه حالا میتونی دوباره وقفه ایجاد کنی
                      - پس اگه شما بیای و بیت I را در داخل تابع وقفه تایمر 1 بصورت نرم افزاری 1 کنی اگه یه وقت تایمر 2 در حین اجرای تابع refresh سون سگمنت ها به 255 برسه وارد تابع وقفه تایمر 2 میشه ودوباره بر میگرده (احتمال زیاد مشکل شما همین جاست )
                      - در مورد کریستال خارجی باید بگم نیاز نیست که حتما از کریستال خارجی 4 مگ استفاده کنی میتونی از اسیلاتور داخلی 8 مگ استفاده کنی و این مورد اصلا ربطی به فیوز بیت ها نداره
                      فرزندم در راه است

                      دیدگاه


                        #12
                        پاسخ : یه مشکل با کریستال ساعت دارم

                        این کارو هم کردم یعنی TIMSK=0b0000001 ولی این بار کلا سگمنتا خاموش شدن
                        در حالت پیش فرض TIMSK=0X44 هستش با این کار فکر کنم وقفه تایمر 1 غیر فعال شد (دارم گیج میشم ) :angry:
                        به نظر شما نباید TIMSK=0b1000101 باشه (تو این حالت جواب داد)
                        میشه یه توضیحی رو این ریجیستر TIMSK بدین ممنون میشم؟
                        ذكات علم ياد دادنه ....

                        دیدگاه


                          #13
                          پاسخ : یه مشکل با کریستال ساعت دارم

                          من اصلا فکر نمی کنم که لازم باشه این تغییرات رو با زبان اسمبلی وارد کنی. چرا با همون C این کار ها رو انجام نمیدی؟
                          من خودم با بسکام کار می کنم ورگنه دقدیقا بهت می گفتم که باید چیکار کنی؟
                          عمر گران میگذرد خواهی نخواهی سعی بر آن کن نرود رو به تباهی
                          مطلب دل را طلب از سوی خدا کن زآنکه بود رحمت او لا یتناهی

                          دیدگاه


                            #14
                            پاسخ : یه مشکل با کریستال ساعت دارم

                            من اصلا فکر نمی کنم که لازم باشه این تغییرات رو با زبان اسمبلی وارد کنی. چرا با همون C این کار ها رو انجام نمیدی؟
                            اگه منظورتون این دستوره #asm("sei&quot این فقط برای فعال سازی وقفه هاست
                            حالا نمیدونم کدوم بیت ریجیستر TIMSK رو باید 1 کنم که وقفه تایمر 2 اولویت داشته باشه(هر چند تو جدول وقفه ها اولویت با تایمر 2 )
                            از دوستان کس دیگه نظری نداره شاید اشکال از جای دیگه باشه ؟؟؟؟؟ :cry2:
                            ذكات علم ياد دادنه ....

                            دیدگاه


                              #15
                              پاسخ : یه مشکل با کریستال ساعت دارم

                              نوشته اصلی توسط majid.4206
                              این کارو هم کردم یعنی TIMSK=0b0000001 ولی این بار کلا سگمنتا خاموش شدن
                              در حالت پیش فرض TIMSK=0X44 هستش با این کار فکر کنم وقفه تایمر 1 غیر فعال شد (دارم گیج میشم ) :angry:
                              به نظر شما نباید TIMSK=0b1000101 باشه (تو این حالت جواب داد)
                              میشه یه توضیحی رو این ریجیستر TIMSK بدین ممنون میشم؟
                              ببخشید من اشتباه کردم شرمنده :icon_razz:
                              ببینید این رجیستر شامل بیت های اختصاصی وقفه تایمر هاست(یه نیگاه به دیتا شیت l MEGA 32 بندازید صفحه 130) در اینجا شما باید بیت اختصاصی مربوط به سرریز تایمر 1 و2 را 1 کنی یعنی TIMSK=0b01000100 در ضمن بازم تاکید میکنم حتما #asm("sei" را در تابع وقفه مربوط به تایمر 1 بنویسید
                              اگه مشکل حل نشد حتما یه خبر بدید تا اساسی حلش کنیم :agree: :agree: :nice: :nice:
                              فرزندم در راه است

                              دیدگاه

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