با سلام
برای ایجاد 1 ثانیه در برنامه mikrobasic از تنطیمات زیر استفاده کردیم:
به عبارتی :
و :
کلاک دستگاه روی 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 ثانیه در برنامه 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 ثانیه عقب می ماند.
لطفا در صورت امکان جهت حل این مشکل، راهنمایی بفرمایید. با تشکر.
دیدگاه