منظور از کلاک PIO رو فعال کنید چی بودش؟
پیکر بندی پایه به عنوان ورودی :
AT91F_PIO_CfgInput(AT91C_BASE_PIOx, AT91C_PIO_PBxy);
دستور بالا پایه y از پورت x را به عنوآن ورودی تعریف می کند ، این دستور تابع زیر را در هدر lib_AT91SAM7X256.h اجرا می کند :
__inline void AT91F_PIO_CfgInput(
AT91PS_PIO pPio, // \arg pointer to a PIO controller
unsigned int inputEnable) // \arg PIO to be enabled
{
// Disable output
pPio->PIO_ODR = inputEnable;
pPio->PIO_PER = inputEnable;
}
همآنطور که مشاهده می کنید در این تابع ، ابتدا وضعیت خروجی غیر فعال شده و سپس واحد pio راه اندازی می شود .
شما می توانید به جای AT91C_PIO_Pxy از آدرس پایه یا پایه های مورد نظر استفاده کنید .ادر س می تواند به فرم هگز یا عددی باشد :
AT91F_PIO_CfgInput(AT91C_BASE_PIOx, y);
در دستور بالا پایه های y از پورت x به عنوآن ورودی تعریف می شوند( برای درک بهتر موضوع مثال را مشاهده کنید)
خواندن پایه یا پورت با دستور زیر آنجام می شود :
AT91F_PIO_GetInput(AT91C_BASE_PIOx) & AT91C_PIO_Paxy
دستور بالا مقدار موجود بر روی پورت را برمی گردآند ، شما می توانید با مقایسه کردن این دستور با مقدار دلخواه ( صفر یا یک ) وضعیت ورودی را چک کنید .
AT91F_PIO_GetInput(AT91C_BASE_PIOy) & y
در این دستور امکآن چک کردن گروهی پایه ها نیز وجود دارد . y آدرس پایه های هست که قصد خوآندشآن را داریم
همآنطور که قبلا توضیح دادیم ، برای خوآندن مقدار موجود بر روی یک پورت ابتدا باید کلاک pio را فعال کنید ، برای فعال کرک کلاک pio از دستور زیر استفاده می شود :
AT91F_PMC_EnablePeriphClock(AT91C_BASE_PMC, 1 << AT91C_ID_PIOx);
X می تواند A برای راه اندازی کلاک پورت A و B برای راه اندازی کلاک پورت B باشد .
راه اندازی مقاومت های Pullup داخلی :
AT91F_PIO_CfgPullup(AT91C_BASE_PIOx, AT91C_PIO_Pxy);
دستور بالا مقاومت Pullup ( مقاومت بالا کشنده ) پایه y از پورت x را فعال می کند . شما می توانید به جای AT91C_PIO_Pxy از آدرس پایه یا پایه های مورد نظر استفاده کنید .
AT91F_PIO_CfgPullup(AT91C_BASE_PIOx, y);
در دستور بالا مقاومت پایه های y از پورت x فعال می شوند . مثال :
به پایهa.30 یک کلید و به پایه b.19 یک led متصل است ، برنامه ای بنویسید که با تحریک کلید led روشن شود :
#include <AT91SAM7X256.H> /* AT91SAMT7X256 definitions */
#include "lib_AT91SAM7X256.h" //include lib_AT91SAM7X256.h in to project
int main (void) {
AT91F_PMC_EnablePeriphClock(AT91C_BASE_PMC, 1 << AT91C_ID_PIOA); //enable pio clack
AT91F_PIO_CfgInput(AT91C_BASE_PIOA, AT91C_PIO_PA30); // enable porta.30 as output
AT91F_PIO_CfgPullup(AT91C_BASE_PIOA,AT91C_PIO_PA30 ); //enable pull up resistor in porta.30
AT91F_PIO_CfgOutput(AT91C_BASE_PIOB,AT91C_PIO_PB19 ); // enable portb.19 as output
AT91F_PIO_ClearOutput(AT91C_BASE_PIOB,AT91C_PIO_PB 19); // reset portb.19
while(1) {
if ((AT91F_PIO_GetInput(AT91C_BASE_PIOA) & AT91C_PIO_PA30) == 0) { //chake porta.30
AT91F_PIO_SetOutput(AT91C_BASE_PIOB, AT91C_PIO_PB19); //if porta.30 is 0 set portb.19
}
}
}
با فعال کردن مقاومت Pullup ، نیازی به قرار دادن مقاومت خارجی نیست