#define T1_OVF_FREQ 100
/* Timer1 clock prescaler value */
#define T1_PRESC 1024L
/* Timer1 initialization value after overflow */
#define T1_INIT (0x10000L-(_MCU_CLOCK_FREQUENCY_/(T1_PRESC*T1_OVF_FREQ)))
در خط سوم 1024L یعنی چه؟ L
#define T1_OVF_FREQ 100
/* Timer1 clock prescaler value */
#define T1_PRESC 1024L
/* Timer1 initialization value after overflow */
#define T1_INIT (0x10000L-(_MCU_CLOCK_FREQUENCY_/(T1_PRESC*T1_OVF_FREQ)))
در خط سوم 1024L یعنی چه؟ L
سلام
به نظر میرسه قسمت پیکره بندی تایمر یک هست که براش Prescal = 1024 قرار داده شده. اون L باید آخر کلمه PRESC باشه. نیست؟
.
در c++ برای نمایش عدد long انتهای اون l می گذارن.
Example:
/* ATmega128 I/O register definitions */#include <mega128.h>/* MMC/SD/SD HC card support */#include <sdcard.h>
/* Timer1 overflow interrupt frequency [Hz] */#define T1_OVF_FREQ 100/* Timer1 clock prescaler value */#define T1_PRESC 1024L/* Timer1 initialization value after overflow */#define T1_INIT (0x10000L-(_MCU_CLOCK_FREQUENCY_/(T1_PRESC*T1_OVF_FREQ)))
/* 100Hz timer interrupt generated by ATmega128 Timer1 overflow */interrupt [TIM1_OVF] void timer_comp_isr(void){/* re-initialize Timer1 */TCNT1H=T1_INIT>>8;TCNT1L=T1_INIT&0xFF;/* card access low level timing function */disk_timerproc();
/* the rest of the interrupt service routine *//* .... */
}
void main(void){/* initialize Timer1 overflow interrupts in Mode 0 (Normal) */TCCR1A=0x00;/* clkio/1024 */TCCR1B=(1<<CS12)|(1<<CS10);/* timer overflow interrupts will occur with 100Hz frequency */TCNT1H=T1_INIT>>8;TCNT1L=T1_INIT&0xFF;/* enable Timer1 overflow interrupt */TIMSK=1<<TOIE1;/* globally enable interrupts */#asm("sei")
/* the rest of the program *//* .... */
while(1){/* .... */
}}
این 1 نمونه برنامه توی هلپ کدویژنه برای mmc.(جهت مشاهده کد در help کد ویژن در قسمت index عبارت mmc را search نمایید)
که گفته. هر 10 میلی ثانیه 1بار باید تایع disk_timerproc با استفاده از وقفه سرریز فراخوانی بشه.
اما وقتی من 10 میلی ثانیه رو خودم ساختم برنامه کار نکرد.
عددی که توی TCNT1L قرار میگیره -78 است!!
اگر خودم -78 را مستقیما توی ریجستر میذارم کار میکنه که -78!!! با ماهیت تایمر ها همخوانی نداره!!!!
ویرایش توسط shahrivar88 : 24-03-2013 در ساعت 23:35
/* ATmega128 I/O register definitions */#include <mega128.h>
/* FAT on MMC/SD/SD HC card support */#include <ff.h>
/* printf */#include <stdio.h>
/* string functions */#include <string.h>
/* Timer1 overflow interrupt frequency [Hz] */#define T1_OVF_FREQ 100/* Timer1 clock prescaler value */#define T1_PRESC 1024L/* Timer1 initialization value after overflow */#define T1_INIT (0x10000L-(_MCU_CLOCK_FREQUENCY_/(T1_PRESC*T1_OVF_FREQ)))
/* USART Baud rate */#define BAUD_RATE 19200#define BAUD_INIT (_MCU_CLOCK_FREQUENCY_/(BAUD_RATE*16L)-1)
/* 100Hz timer interrupt generated by ATmega128 Timer1 overflow */interrupt [TIM1_OVF] void timer_comp_isr(void){/* re-initialize Timer1 */TCNT1H=T1_INIT>>8;TCNT1L=T1_INIT&0xFF;/* MMC/SD/SD HC card access low level timing function */disk_timerproc();}
کسی نظری نداره؟؟؟
دوست عزیز 4 تا ضرب و تقسیم برای محاسبه سرریز یا مقایسه تایمر برای 10 میلی ثانیه زیاد سخت نیست. از هردوتاش استفاده کردم همون تابع را هم باهاش فراخوانی کردم ولی برنامه کار نکرد.
-78 هم 78- است منفی هفتاد و هشت!!
کافیه مقدار ریجیتر رو از طریق یوزارت بفرستی و نگاش کنی.
من مقدار منفی هفتاد و هشت را توی ریجستر گذاشتم کار کرد ولی 78 نه!
حالا مسئله اصلی همون مقداری که طبق تعریف یرنامه تو ریجستر گذاشته میشه.
شما اصلا از روی برنامه بالا حساب کنید که چه عددی توی ریجستر TCNT1L فرار میگیره؟؟؟؟
TCNT1L=T1_INIT
T1_PRESC=1024L
T1_OVF_FRE=100
MCU_CLOCK_FREQUENCY=8000000
T1_INIT= (0x10000L-(_MCU_CLOCK_FREQUENCY_/(T1_PRESC*T1_OVF_FRE
12
ویرایش توسط shahrivar88 : 26-03-2013 در ساعت 02:27
1 سوال ساده ما بی جواب موند
این یه ماکرو(دستور پیش پردازنده) هستش که پرسکالر تایمر 1 رو روی 1024 قرار میده. البته چیز الکیه!
چون خودش دوباره پایین همین کار رو کرده.
در مورد مقدار دهی اولیه خودت حسابش کن بهتره. اون ماکرو رو هم پاک بکن.