آقایون سلام
من کتاب میکروکنترولر ای ار ام از انتشارات نص رو گرفتم اقا فقط یه مشکل این برنامه رو ببینید
#include <Atmel/ioat91sam7s64.h>
#include "lcd.h"
void delay (void);
void main ()
{
//--------------------start up--------------------------
AT91C_BASE_WDTC->WDTC_WDMR = AT91C_WDTC_WDDIS; // AT91C_WDTC_WDDIS=(1<<15)
AT91C_BASE_RSTC->RSTC_RMR=0xA5000001;
//--------------------speed up--------------------------
AT91C_BASE_CKGR->CKGR_MOR = 0xF01;
AT91C_BASE_CKGR->CKGR_PLLR = 0x2903FFC;
AT91C_BASE_PMC->PMC_MCKR = 0x3;
AT91C_BASE_PMC->PMC_SCER = 0x1;
//-----------------------------------------------------
AT91C_BASE_PMC->PMC_PCER = ( 1<<AT91C_ID_PIOA ); // AT91C_ID_PIOA=2
//------------------------------------------------------
AT91C_BASE_PIOA->PIO_PER=(1<<0|1<<1);
AT91C_BASE_PIOA->PIO_OSR=(0<<1);
//AT91C_BASE_PIOA->PIO_ODR=(1<<1);
//AT91C_BASE_PIOA->PIO_IFER=(1<<1);
AT91C_BASE_PIOA->PIO_OER=(1<<0);
AT91C_BASE_PIOA->PIO_SODR=(1<<0);
//lcd_pininit(0,1,2,3,4,5,6,7,8,9);
//lcd_init();
//lcd_gotoxy(0,0);
//lcd_putsf("ARM"
;
while(1)
{
AT91C_BASE_PIOA->PIO_SODR=(1<<0);
delay();
AT91C_BASE_PIOA->PIO_CODR=(1<<0);
delay();
}
}
void delay (void)
{
unsigned int i;
for (i=0;i<1000000;i++);
}
کامل درست کار می کنه فقط یه مشکل داره اونم تابع تاخیر هست
متغییر i
1000000 تکرار می شه و اگر بخوایم خوب هم فکر کنیم و هر بار حلقه هم یک میکرو ثانیه طول می کشه.حالا آقا محاسبات شروع می شه
فرکانس روی پایه میکرو 18.432 مگاهرتز هست و با تنظیم پی ال ال به 48 مگاهرتز فرکانس تراشه می رسه
یعنی هر دستور ماشین رو داخل
1/48000000=20 نانو
باید اجرا بشه اما من با دستور بالا خروجی میکرو که به یه ال ای دی وصل بود رو تونستم با چشم ببینم طوری که انگار تقریبا 800 میلی ثانیه بین چمشک زدنانش فاصله بود این چه جوری؟
یعنی بخوایم بگیم اینجوری دستور بالای من که باید 20 میلی ثانیه بین خاموش رونش باشه تبدیل شده به بالای 500 میلی ثانیه که قابل دیدن هست!!!!
آقا جالبش اینکه داخل کتاب نوشته یه تاخیر کم :و تاخیر رو اینجوری نوشتن
بخوایم خوب هم ببینیم زمان تاخیر می شه 10 به توان 12 حالا اینو در عدد 1/48000000 ضرب کنیم می شه
20833.3
ثانیه
یعنی 347 ساعت !!!!!!!!! بله یه تاخیر کم :eek:
من کتاب میکروکنترولر ای ار ام از انتشارات نص رو گرفتم اقا فقط یه مشکل این برنامه رو ببینید
#include <Atmel/ioat91sam7s64.h>
#include "lcd.h"
void delay (void);
void main ()
{
//--------------------start up--------------------------
AT91C_BASE_WDTC->WDTC_WDMR = AT91C_WDTC_WDDIS; // AT91C_WDTC_WDDIS=(1<<15)
AT91C_BASE_RSTC->RSTC_RMR=0xA5000001;
//--------------------speed up--------------------------
AT91C_BASE_CKGR->CKGR_MOR = 0xF01;
AT91C_BASE_CKGR->CKGR_PLLR = 0x2903FFC;
AT91C_BASE_PMC->PMC_MCKR = 0x3;
AT91C_BASE_PMC->PMC_SCER = 0x1;
//-----------------------------------------------------
AT91C_BASE_PMC->PMC_PCER = ( 1<<AT91C_ID_PIOA ); // AT91C_ID_PIOA=2
//------------------------------------------------------
AT91C_BASE_PIOA->PIO_PER=(1<<0|1<<1);
AT91C_BASE_PIOA->PIO_OSR=(0<<1);
//AT91C_BASE_PIOA->PIO_ODR=(1<<1);
//AT91C_BASE_PIOA->PIO_IFER=(1<<1);
AT91C_BASE_PIOA->PIO_OER=(1<<0);
AT91C_BASE_PIOA->PIO_SODR=(1<<0);
//lcd_pininit(0,1,2,3,4,5,6,7,8,9);
//lcd_init();
//lcd_gotoxy(0,0);
//lcd_putsf("ARM"

while(1)
{
AT91C_BASE_PIOA->PIO_SODR=(1<<0);
delay();
AT91C_BASE_PIOA->PIO_CODR=(1<<0);
delay();
}
}
void delay (void)
{
unsigned int i;
for (i=0;i<1000000;i++);
}
کامل درست کار می کنه فقط یه مشکل داره اونم تابع تاخیر هست
متغییر i
1000000 تکرار می شه و اگر بخوایم خوب هم فکر کنیم و هر بار حلقه هم یک میکرو ثانیه طول می کشه.حالا آقا محاسبات شروع می شه
فرکانس روی پایه میکرو 18.432 مگاهرتز هست و با تنظیم پی ال ال به 48 مگاهرتز فرکانس تراشه می رسه
یعنی هر دستور ماشین رو داخل
1/48000000=20 نانو
باید اجرا بشه اما من با دستور بالا خروجی میکرو که به یه ال ای دی وصل بود رو تونستم با چشم ببینم طوری که انگار تقریبا 800 میلی ثانیه بین چمشک زدنانش فاصله بود این چه جوری؟
یعنی بخوایم بگیم اینجوری دستور بالای من که باید 20 میلی ثانیه بین خاموش رونش باشه تبدیل شده به بالای 500 میلی ثانیه که قابل دیدن هست!!!!
آقا جالبش اینکه داخل کتاب نوشته یه تاخیر کم :و تاخیر رو اینجوری نوشتن
for(i=0;i<1000000;i++)
for(j=0;j<1000000;j++);
for(j=0;j<1000000;j++);
بخوایم خوب هم ببینیم زمان تاخیر می شه 10 به توان 12 حالا اینو در عدد 1/48000000 ضرب کنیم می شه
20833.3
ثانیه
یعنی 347 ساعت !!!!!!!!! بله یه تاخیر کم :eek:
دیدگاه