اطلاعیه

Collapse
No announcement yet.

ایجاد زمان 1 ثانیه توسط AVR و تایمر 0 ( Atmega32 )

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

    ایجاد زمان 1 ثانیه توسط AVR و تایمر 0 ( Atmega32 )

    با سلام
    برای ایجاد 1 ثانیه در برنامه mikrobasic از تنطیمات زیر استفاده کردیم:

    const _THRESHOLD = 250 

    sub procedure timer0_init()
    ' // Timer/Counter 0 initialization
    ' // Clock source: System Clock
    ' // Clock value: 7.813 kHz
    ' // Mode: Normal top=0xFF
    ' // OC0 output: Disconnected
    TCCR0=0x04
    TCNT0=0x06
    OCR0=0x00
    ' // Timer(s)/Counter(s) Interrupt(s) initialization
    TIMSK=0x01
    ' // Global enable interrupts
    ' #asm("sei")
    SREG_I_bit = 1 '' // Enable Interrupts
    Delay_ms(100)
    PORTD6_bit=not PORTD6_bit ' toggle PORTD6_bit
    second_alarm_clock=0 minutes_alarm_clock=0 hours_alarm_clock=0
    end sub
    sub procedure Timer0Overflow_ISR iv IVT_ADDR_TIMER0_OVF
    ' // Reinitialize Timer 0 value
    TCNT0=0x06
    if (counter1 >= _THRESHOLD) then
    counter1 = 0 ' reset counter
    inc(second_alarm_clock)
    if second_alarm_clock>59 then
    second_alarm_clock=0 inc(minutes_alarm_clock) ' reset second_alarm_clock
    end if
    if minutes_alarm_clock>59 then
    minutes_alarm_clock=0 inc(hours_alarm_clock)
    end if
    if hours_alarm_clock>23 then
    hours_alarm_clock=0
    end if
    ' PORTD7_bit=not PORTD7_bit ' toggle PORTD7_bit
    ' PORTD6_bit=not PORTD6_bit ' toggle PORTD6_bit
    else
    Inc(counter1) ' increment counter

    end if
    ' if (counter1 >= 100) then
    ' WDT_Reset()
    '' Lcd_Out(1,1,"watchdog reset")
    ' end if
    end sub

    به عبارتی :
    TCCR0=0x04
    TCNT0=0x06
    OCR0=0x00
    ' // Timer(s)/Counter(s) Interrupt(s) initialization
    TIMSK=0x01
    و :
    sub procedure Timer0Overflow_ISR iv IVT_ADDR_TIMER0_OVF
    ' // Reinitialize Timer 0 value
    TCNT0=0x06
    if (counter1 >= _THRESHOLD) then
    counter1 = 0



    کلاک دستگاه روی 16 MHz تنظیم شده که با انتخاب TCCR0 برابر با 0X04 یعنی از Perescale 256 استفاده شده که برابر با عدد 62500 شده و با انتخاب 06= TCNT0 تعداد شمارش در یک دوره overflow برابر با 250 می شود. و برای رسیدن به 1 ثانیه باید :1/62500 زمان هر شمارش تایمر 0 و ضرب آن در 250 به عدد 0.004 ثانیه که زمان طی شده در هر Overflow تایمر 0 می رسیم.
    حال با تقسیم 1/0.004 به عدد 250 می رسیم که همان THRESHOLD = 250 که همان تعداد OVERFLOW تایمر 0 ( 250 )برای شمارش و رسیدن به 1 ثانیه مورد نیاز می باشد.
    مشکل ما این است که با این تنظیمات و تنظیم فیوز بیت ها روی میکرو به صورت زیر:

    LOW = 0xCF = 1100 1111
    HIGH = 0xD9 = 1101 1001

    شمارنده ما در 5 دقیقه حدود 5 ثانیه عقب می ماند.
    لطفا در صورت امکان جهت حل این مشکل، راهنمایی بفرمایید. با تشکر.

    #2
    پاسخ : ایجاد زمان 1 ثانیه توسط AVR و تایمر 0 ( Atmega32 )

    نوشته اصلی توسط soheil_sab نمایش پست ها
    با سلام
    برای ایجاد 1 ثانیه در برنامه mikrobasic از تنطیمات زیر استفاده کردیم:

    const _THRESHOLD = 250 

    sub procedure timer0_init()
    ' // Timer/Counter 0 initialization
    ' // Clock source: System Clock
    ' // Clock value: 7.813 kHz
    ' // Mode: Normal top=0xFF
    ' // OC0 output: Disconnected
    TCCR0=0x04
    TCNT0=0x06
    OCR0=0x00
    ' // Timer(s)/Counter(s) Interrupt(s) initialization
    TIMSK=0x01
    ' // Global enable interrupts
    ' #asm("sei")
    SREG_I_bit = 1 '' // Enable Interrupts
    Delay_ms(100)
    PORTD6_bit=not PORTD6_bit ' toggle PORTD6_bit
    second_alarm_clock=0 minutes_alarm_clock=0 hours_alarm_clock=0
    end sub
    sub procedure Timer0Overflow_ISR iv IVT_ADDR_TIMER0_OVF
    ' // Reinitialize Timer 0 value
    TCNT0=0x06
    if (counter1 >= _THRESHOLD) then
    counter1 = 0 ' reset counter
    inc(second_alarm_clock)
    if second_alarm_clock>59 then
    second_alarm_clock=0 inc(minutes_alarm_clock) ' reset second_alarm_clock
    end if
    if minutes_alarm_clock>59 then
    minutes_alarm_clock=0 inc(hours_alarm_clock)
    end if
    if hours_alarm_clock>23 then
    hours_alarm_clock=0
    end if
    ' PORTD7_bit=not PORTD7_bit ' toggle PORTD7_bit
    ' PORTD6_bit=not PORTD6_bit ' toggle PORTD6_bit
    else
    Inc(counter1) ' increment counter

    end if
    ' if (counter1 >= 100) then
    ' WDT_Reset()
    '' Lcd_Out(1,1,"watchdog reset")
    ' end if
    end sub

    به عبارتی :
    TCCR0=0x04
    TCNT0=0x06
    OCR0=0x00
    ' // Timer(s)/Counter(s) Interrupt(s) initialization
    TIMSK=0x01
    و :
    sub procedure Timer0Overflow_ISR iv IVT_ADDR_TIMER0_OVF
    ' // Reinitialize Timer 0 value
    TCNT0=0x06
    if (counter1 >= _THRESHOLD) then
    counter1 = 0



    کلاک دستگاه روی 16 MHz تنظیم شده که با انتخاب TCCR0 برابر با 0X04 یعنی از Perescale 256 استفاده شده که برابر با عدد 62500 شده و با انتخاب 06= TCNT0 تعداد شمارش در یک دوره overflow برابر با 250 می شود. و برای رسیدن به 1 ثانیه باید :1/62500 زمان هر شمارش تایمر 0 و ضرب آن در 250 به عدد 0.004 ثانیه که زمان طی شده در هر Overflow تایمر 0 می رسیم.
    حال با تقسیم 1/0.004 به عدد 250 می رسیم که همان THRESHOLD = 250 که همان تعداد OVERFLOW تایمر 0 ( 250 )برای شمارش و رسیدن به 1 ثانیه مورد نیاز می باشد.
    مشکل ما این است که با این تنظیمات و تنظیم فیوز بیت ها روی میکرو به صورت زیر:

    LOW = 0xCF = 1100 1111
    HIGH = 0xD9 = 1101 1001

    شمارنده ما در 5 دقیقه حدود 5 ثانیه عقب می ماند.
    لطفا در صورت امکان جهت حل این مشکل، راهنمایی بفرمایید. با تشکر.
    سلام یکجای کار شما اشکال داره 1 ثانیه خطا در هر دقیقه بسیار زیاده!!!
    به جای تایمر صفر من بهتون تایمر یک رو پیشنهاد می کنم این طوری می تونی زمان سنجی بهتری داشته باشی

    دلیل: ادغام دو پست برای جلوگیری از اسپم

    این جوری بنویس:


    //select mode
    TCCR1A = 0x00; //Normal Timer mode


    //setting bottom
    TCNT1 = 49911;

    //start timer
    TCCR1B = 0x05;

    ارادت داریم!


    دیدگاه


      #3
      پاسخ : ایجاد زمان 1 ثانیه توسط AVR و تایمر 0 ( Atmega32 )

      با تشکر از شما
      میشه بفرمایید چرا تایمر 1 زمان سنجی بهتری داره و اینکه ایا به نوع متغییر volatile ربطی دارد.

      دیدگاه


        #4
        پاسخ : ایجاد زمان 1 ثانیه توسط AVR و تایمر 0 ( Atmega32 )

        در اولین مرحله می یایم زمان پالس مورد نظر را بدست می یاریم:
        = 1s = 1000ms = 1000000us
        بعدش تقسیم فرکانسی:
        16MHz / 1024 = 0.015625MHz
        مدت زمان شمارش تایمر در هر کلاک:
        1 تقسیم بر عدد بالا که برابر می شه با 64 میکرو ثانیه
        TCNT1 = max - ( 1000000 / 64 ) = 65536 - 15625 = 49911 = C2F7 <-- H

        حالا عملیات بالا رو با تایمر صفر تونستی انجام بدی به من بگو لابد اشتباه کردم
        ارادت داریم!


        دیدگاه


          #5
          پاسخ : ایجاد زمان 1 ثانیه توسط AVR و تایمر 0 ( Atmega32 )

          جواب این سوال را در پست زیر می توانید مشاهده کنید و اگر نظری داشتید. اینجا بیان کنید.

          دیدگاه


            #6
            پاسخ : ایجاد زمان 1 ثانیه توسط AVR و تایمر 0 ( Atmega32 )

            نوشته اصلی توسط soheil_sab نمایش پست ها
            جواب این سوال را در پست زیر می توانید مشاهده کنید و اگر نظری داشتید. اینجا بیان کنید.
            خب چه دردیه که بیای یه کار رو 250 بار انجام بدی؟؟؟
            با تایمر یک به راحتی می تونی زمان سنجی بکنی که دیگه این همه درد سر نداره... :various_024:
            راستی! چرا از RTC استفاده نمی کنی؟ با یدونه کریستال ساعت.
            ارادت داریم!


            دیدگاه


              #7
              پاسخ : ایجاد زمان 1 ثانیه توسط AVR و تایمر 0 ( Atmega32 )

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

              دیدگاه


                #8
                پاسخ : ایجاد زمان 1 ثانیه توسط AVR و تایمر 0 ( Atmega32 )

                سلام
                به نظر من و بنا بر تجربه عرض می کنم
                به دلیل تلرانس کریستال ها به دست آوردن زمان دقیق با میکرو امکان پذیر نیست و حتما بعد از یک ساعت یا یک روز کار کردن اختلاف چند ثانیه ای رو خواهید داشت.
                حتی اگر از RTCو کریستال ساعت هم استفاده کنید ممکنه در عرض یک هفته چند ثانیه اختلاف داشته باشید.تنها در صورتی میشه ساعت دقیق داشت که پالس رو خودتون تولید کنید و از پالس تولید شده مطمئن باشید که اون هم به دلیل اینکه قطعات الکترونیکی تو گرما و سرما مقدار متفاوتی داره تقریبا نشدنیه ولی خیلی بهتر میشه ما فقط می تونیم به مقدار واقعی نزدیک بشیم

                دیدگاه

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