PDA

توجه ! این یک نسخه آرشیو شده میباشد و در این حالت شما عکسی را مشاهده نمیکنید برای مشاهده کامل متن و عکسها بر روی لینک مقابل کلیک کنید : 1 سوال ساده!!!



shahrivar88
24-03-2013, 01:01
#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

morteza_rk
24-03-2013, 04:04
سلام

به نظر میرسه قسمت پیکره بندی تایمر یک هست که براش Prescal = 1024 قرار داده شده. اون L باید آخر کلمه PRESC باشه. نیست؟

modj.ir
24-03-2013, 13:47
در c++ برای نمایش عدد long انتهای اون l می گذارن.

shahrivar88
24-03-2013, 23:27
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!!! با ماهیت تایمر ها همخوانی نداره!!!!:baad:

shahrivar88
24-03-2013, 23:38
/* 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();

}

shahrivar88
25-03-2013, 21:58
کسی نظری نداره؟؟؟

Aghaeifar
26-03-2013, 01:21
اما وقتی من 10 میلی ثانیه رو خودم ساختم برنامه کار نکرد.





چطور هر ده میلی ثانیه فراخونی کردید تابع رو؟ شما هم با تایمر؟





عددی که توی tcnt1l قرار میگیره -78 است!!




این الان منفی 78 هست؟ اون خط تیره چیه؟






اگر خودم -78 را مستقیما توی ریجستر میذارم کار میکنه که -78!!!




این جمله معنیش چیه؟ از لحاظ ساختار نگارش فارسی مشکل داره!

shahrivar88
26-03-2013, 02:09
دوست عزیز 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

shahrivar88
26-03-2013, 02:16
12

shahrivar88
26-03-2013, 02:24
چطور هر ده میلی ثانیه فراخونی کردید تابع رو؟ شما هم با تایمر؟



این الان منفی 78 هست؟ اون خط تیره چیه؟



این جمله معنیش چیه؟ از لحاظ ساختار نگارش فارسی مشکل داره!



عرض شود به خدمت شما نوشته من از لحاظ قانون نوشتار پارسی مشکلی ندارد مشکل اینه که نوشتار پارسی راست به چپ و نوشتار بیگانه چپ به راست است.
این مشکل + مشکلات دیگر از لحظه ورود کامپیوتر به سرزمین باستانیمان همواره دامن گیر ما بوده.

shahrivar88
28-03-2013, 04:24
1 سوال ساده ما بی جواب موند:sa:lov::(

rozeh
28-03-2013, 10:17
این یه ماکرو(دستور پیش پردازنده) هستش که پرسکالر تایمر 1 رو روی 1024 قرار میده. البته چیز الکیه!
چون خودش دوباره پایین همین کار رو کرده.
در مورد مقدار دهی اولیه خودت حسابش کن بهتره. اون ماکرو رو هم پاک بکن.

niazmandihaye
29-03-2016, 19:07
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 است!!
نیازمندیهای ایران،تبلیغات،اگهی رایگان،نیازمندیها - نیازمندیهای ایران،نیازمندیها،تبلیغات رایگان،آگهی رایگان، (You can see links before reply)
اگر خودم -78 را مستقیما توی ریجستر میذارم کار میکنه که -78!!! با ماهیت تایمر ها همخوانی نداره!!!!:baad:





ممنون عالی بود