PDA

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



mzarkoob
02-07-2011, 14:12
با سلام

در صفحه 35 مجله شماره 9 درگاه های ورودی خروجی مدل فیلیپس شرح داده شده است. همین طور توضیحات و مثالی از آقای تروشه در دسترس است:
You can see links before reply

اینها شده موضوع را تبیین کرده ولی یک موردی وجود دارد و آن این است که مثالی نزده که از حالت ورودی استفاده کرده باشد. مثالهای مذکور همه حالت خروجی است.

من می خواهم از مد ورودی استفاده کنم. ولی نمی دادم با یک شدن پایه ورودی مورد نظر، چه رجیستری یک شده و در برنامه از چه رجیستری برای اطلاع از یک شدن پایه استفاده کنیم؟

طبق مطالب آموزشی گفته شده اگر بخواهیم پورت صفر ورودی باشد :
SCS=SCS | 1; //for enabling Fast GPIO
FIO0MASK = 0x00000000;
FIO0DIR = 0x00000000; //set the direction of PORT1 as input

فرضا می خواهیم چند تا از پایه ها را استفاده کنیم(مثلا P0.0 و P0.1) . و فرضا برنامه این است که اگر پایه P0.0 یک بود فلان کار را انجام بده و اگر پایه P0.1 یک شد فلان کار را. می خواستم ببینم این کار چگونه انجام می شود؟

در آموزش های مذکور هم گفته شده FIO0PIN برای خواندن داده از روی پورت می باشد. ولی نحوه استفاده را نمی دانم!

کسی می تونه سوال من را جواب بده که به این هدفم برسم؟
البته در سایت ECA مطلبی تحت عنوان : مجموعه آموزش های میکروکنترولرهای ARM (You can see links before reply) در فایل GPIO.rar (You can see links before reply 0) به آدرس:
������ ����� ��ی �ی�����������ی ARM (You can see links before reply)

آورده است که ورودی خروجی ها را خیلی کامل توضیح داده و در انتها مثال هم زده است. در مثال گفته ورودی را بخوان:

temp=FIO1PIN; //read PORT1

ولی این قسمتش را نفهمیدم چیکار کرده:

temp&=0x00000003; //????????!!!!!


در ادامه هم گفته اگه temp یکی از این موارد بود روی آن سوییچ کن:
switch(temp)

من این برنامه را (که البته یه غلط کوچک هم داشت) ضمیمه کردم.

با تشکر

kavir
03-07-2011, 01:49
سلام
چون وقت نیست توضیح بدم خودتون این ÷ی دی اف بخونید

mzarkoob
03-07-2011, 02:32
با سلام
این فایل آقای تروشه است که من هم گفته ام مطالعه کرده ام! :wink: مثال گفته شده در حالت خروجی است نه ورودی. تنها مثالی که دیدم لینک داده ام و ضمیمه کرده ام که البته متوجه نشدم درست چیکار کردهcry::. برای همین سوال مطرح کردم.
اگه میشه یه مثال واضح بزنید که داده را از یک پورت ورودی (مثلا p0.0 ..)بخواند و اگر این پورت p0.0 یک شده بود فلان کار را انجام دهد. همین
با تشکر:hi:

kavir
03-07-2011, 10:26
سلام
برای ورودی هم توضیحاتش هست و کاری نداره توی همون بخش مثال بوت لودر دانلود کنید یکی مثال برای ورودی گذاشتم
نکته ای که داره چون مثال برای بوت لودر بوده یکی دیگه پروژه جدید ایجاد کنید و کد رو توش کپی کنید
از اینجا دانلود کنید
You can see links before reply

mzarkoob
04-07-2011, 02:12
با سلام و تشکر از راهنماییتان آقای زارعی

با دقت در مثالی که لینک دادید(کلیه آموزش ها و نکات مهم برد eke2lpc v1.0 کویرالکترونیک : GPIO.zip) ظاهرا مشکل حل شد. حالا من این مثال ساده را که گفتم میارم برای دوستان دیگه اگه با این مورد مواجه شدند:

برنامه ای که اگر پایه P2.0 یک شد در خروجی P1.21 پالس دهد و اگر این پایه صفر شد پاس قطع شود:
#include "LPC23xx.h"
#define pulse1 0x200000 //p1.21
#define set_pulse1 (FIO1SET=pulse1)
#define clr_pulse1 (FIO1CLR=pulse1)
void delay(unsigned long i);
int main(){
SCS |=0x00000001;
FIO1MASK=0x00000000;
FIO1DIR=0xFFFFFFFF;
FIO1CLR=0x00000000;
FIO1DIR=0x00000000;
while(1){
while( (FIO2PIN & 0x00000001)==1 ){
set_pulse1;
delay(1000);
clr_pulse1;
delay(1000);
}
while( (FIO0PIN & 1) == 0 )
clr_pulse1;
}
}
void delay(unsigned long i){
unsigned long j;
for (j=0;j<i;j++);
}

وقتی داریم debug می کنیم از گزینه Peripherals قسمت GPIO Fast Interface گزینه Port2 را که انتخاب کنیم در حین اجرای برنامه با برداشتن تیک پایه صفر در Pins دیگر در خروجی پالس نداریم و با گذاشتن مجدد تیک پاس شروع می شود.:o

ان شاءالله که درسته! نبود بگید.

amin1139
09-04-2013, 21:29
با سلام و تشکر از راهنماییتان آقای زارعی

با دقت در مثالی که لینک دادید(کلیه آموزش ها و نکات مهم برد eke2lpc v1.0 کویرالکترونیک : GPIO.zip) ظاهرا مشکل حل شد. حالا من این مثال ساده را که گفتم میارم برای دوستان دیگه اگه با این مورد مواجه شدند:

برنامه ای که اگر پایه P2.0 یک شد در خروجی P1.21 پالس دهد و اگر این پایه صفر شد پاس قطع شود:






#include "LPC23xx.h"
#define pulse1 0x200000 //p1.21
#define set_pulse1 (FIO1SET=pulse1)
#define clr_pulse1 (FIO1CLR=pulse1)
void delay(unsigned long i);
int main(){
SCS |=0x00000001;
FIO1MASK=0x00000000;
FIO1DIR=0xFFFFFFFF;
FIO1CLR=0x00000000;
FIO1DIR=0x00000000;
while(1){
while( (FIO2PIN & 0x00000001)==1 ){
set_pulse1;
delay(1000);
clr_pulse1;
delay(1000);
}
while( (FIO0PIN & 1) == 0 )
clr_pulse1;
}
}
void delay(unsigned long i){
unsigned long j;
for (j=0;j<i;j++);
}

اینطوری بزاری برنامتو بهتر نیست؟

mzarkoob
09-04-2013, 22:13
اینطوری بزاری برنامتو بهتر نیست؟ اووه .. تاریخ این پست دیدید!!؟
۱۳-۰۴-۱۳۹۰
:wink:

amin1139
09-04-2013, 22:30
نه الان نگاه کردم راست میگی هاااااااااااااااااااااااا اااا

arasbaran
26-08-2013, 23:04
سلام
من یک کاربر صفر کیلومترم
تازه با LPC1768 کارم رو شروع کرده
مشکلم با کنترل ورودی
می خواستم با یک کلید یک ال ای دی رو روشن کنم
برنامه هایی که تست کردم شبیه برنامه شما بود
می خواستم بدونم شما با این برنامه روی میکرو هم جواب گرفتید؟
روی میکرو تنظیم خاصی باید انجام بدم تا جواب بگیرم؟
برنامه ام اینه:
LPC_GPIO0->FIODIR=0x00000001;
while(1)
{
while((LPC_GPIO0->FIOPIN & 0x00000002)==1)
{
LPC_GPIO0->FIOSET=1;
delay(1000);
LPC_GPIO0->FIOSET=0;
delay(1000);
}
while((LPC_GPIO0->FIOPIN & 0x00000002)==0) LPC_GPIO0->FIOSET=0;
}
شرمنده نمیدونم چطوری باید کد رو وارد کنم که درست نشون بده cry::

roohlla
27-08-2013, 00:16
با پاک کردن fioset پین صفر نمیشه . شما باید بیت متناظر با پینی رو که میخواید صفر کنید از رجیستر fioclr یک کنید .

arasbaran
28-08-2013, 00:14
خیلی ممنون
البته تو تایپ برنامه اشتباه کردم
من این برنامه رو بارها و با چند روش نوشتم ولی جواب نداده
حتی مثال های کتاب رو که وارد میکنم جواب نمیده
الان برنامه اینه:
LPC_GPIO0->FIODIR=0x00000001;
while(1)
{
while((LPC_GPIO0->FIOPIN & 0x00000002)==1)
{
LPC_GPIO0->FIOSET=1;
delay(1000);
LPC_GPIO0->FIOCLR=1;
delay(1000);
}
while((LPC_GPIO0->FIOPIN & 0x00000002)==0) LPC_GPIO0->FIOCLR=0;
}

adibsp
28-08-2013, 10:02
سلام. این برنامه رو مهندس زرکوب برای تست led روی برد نوشتن. تست کنید و با برنامه خودتون مقایسه کنید.انشاءا... جواب سوالتون پیدا میشه توسط خودتون...، در ضمن برای کد نویسی در محیط پیام نویسی، از گزینه ای با آیکون # میتونید استفاده کنید(wrap code).مثل این:


delay(1000);
LPC_GPIO0->FIOCLR=1;
delay(1000);

arasbaran
28-08-2013, 19:38
ممنون آقا ادیب
البته منظور از کدی که نوشته بودید رو نفهمیدم
یعنی باید تست کنم خروجی درست ارسال میشه یا LED درسته؟
چنین برنامه ای نوشتم (FlipFlop) و درست هم کار کرده
ظاهرا تشخیص ورودی درست عمل نمیکنه
برنامه رو برعکس کردم ، اینجوری:


LPC_GPIO0->FIODIR=0x00000001;
while(1)
{
while((LPC_GPIO0->FIOPIN & 0x00000002)==1) LPC_GPIO0->FIOCLR=1;
while((LPC_GPIO0->FIOPIN & 0x00000002)==0)
{
LPC_GPIO0->FIOSET=1;
delay(1000);
LPC_GPIO0->FIOCLR=1;
delay(1000);
}
}
یعنی در حالت عادی خروجی فعال باشه و با زدن کلید غیر فعال بشه
ولی باز هم خبری نبود cry::
معلوم میشه مقدار LPC_GPIO0->FIOPIN برعکس چیزی که من فکر میکنم نه یکه نه صفر
تو نرم افزار Keil هم نتونستم تست بگیرم، فکر کنم چون قفل شکسته است
باز هم ممنون که وقت گذاشتید

adibsp
29-08-2013, 12:17
البته منظور از کدی که نوشته بودید رو نفهمیدم


خواهش می کنم.کدی که نوشتم قسمتی از کد خودتون بود که کپی کردم و منظورم از برنامه، فایل ضمیمه بود که الان متوجه شدم ضمیمه نشده.مجددا ضمیمه میکنم

از پین مربوط به کلید مطمئن بشین.هم چنین اگر از پروگرمر سریال استفاده می کنید از p0.0 نمیتونید gpio بگیرین

arasbaran
30-08-2013, 02:18
سلام
ممنون ار فایل ضمیمه
کد شما اجرا شد و از پین 26 پورت 3 خروجی چشمک زن گرفتم
البته عرض کرده بودم در گرفتن خروجی مشکلی نبود و چنین برنامه هایی رو چند بار تست کرده بودم، آخریش این بود:


int i;
LPC_GPIO0->FIODIR=0x00000003;
while(1)
{
for(i=1;i<3;i++){
LPC_GPIO0->FIOSET=1;
delay(2000000);
LPC_GPIO0->FIOCLR=1;
delay(2000000);
}
for(i=1;i<3;i++){
LPC_GPIO0->FIOSET=2;
delay(2000000);
LPC_GPIO0->FIOCLR=2;
delay(2000000);
}
اینجوری هر دو پین 0 و 1 از پورت صفر هر تست می شدند
ولی در زمان گرفتن ورودی درست عمل نمیکنه
یعنی مقدار LPC_GPIO0->FIOPIN بر خلاص تصور صفر یا یک نیست
باید راهی پیدا بشه که بتونم بفهمم مقدار داخل LPC_GPIO0->FIOPIN چنده
این تنها راهیه که به نظر خودم میرسه
باز هم ممنون

adibsp
31-08-2013, 15:57
سلام.
خب این مسئله سخت نیست.یه مثال ساده می نویسم.متناسب با بردت تغییرش بده.

knum = LPC_GPIO0->FIOPIN;
if ((knum & 1<<16)==0){
LPC_GPIO0->FIOSET = 1<<10;
LPC_GPIO0->FIOCLR = 1<<10;
}

arasbaran
31-08-2013, 21:00
سلام
ممنون
از این مثالها زیاد نوشتم، با if , while , switch و .... ولی خبری از خروجی نیست
نمیدوم شک داشتم شاید نیاز به ست کردن چیزی غیر از FIODIR , FIOSET , FIOCLR و ... باشه
واقعا دیگه نمیدونم چکار کنم!
میشه بردی که گرفتم مشکل سخت افزاری داشته باشه؟ یعنی پینی که خروجی درست میده نتونه ورودی رو اجرا کنه؟

adibsp
01-09-2013, 15:57
سلام
اتصالات سخت افزاری رو با اهم متر چک کن.اگه مشکل رفع نشد برنامه رو بفرست تا من رو بوردم تست کنم و اگه کار نکرد سعی میکنم اصلاحش کنم.

processor
01-09-2013, 17:13
سلام این برنامه رو تست کن
خودم اون موقع جواب گرفتم


// sw test program

#include "lpc17xx.h"

void delay (uint32_t Time)
{
uint32_t i;
i=0;
while(Time--)
{
for (i=0;i<5000;i++);
}
}

int main (void)
{
LPC_GPIO0->FIODIR0=0xff;
LPC_GPIO1->FIODIR-0x00;
LPC_GPIO0->FIOCLR0=0xff; // turn off port2
while(1)
{
if((LPC_GPIO1->FIOPIN & (1<<1))==0)
LPC_GPIO0->FIOSET=0x01;
else
LPC_GPIO0->FIOCLR=0x01;
delay(50);
}
}

arasbaran
02-09-2013, 10:19
سلام به همه

مثلا این برنامه


#include <lpc17xx.h>
#define dl2 delay(2000000)

void delay(unsigned int i)
{ while(i--); }

void a(void)
{
LPC_GPIO0->FIODIR=0x00000007;
LPC_GPIO0->FIOCLR=7;
while(1)
{
if((LPC_GPIO1->FIOPIN & 0x00000001)==1)
{
LPC_GPIO0->FIOSET=2; dl2;
LPC_GPIO0->FIOCLR=2; dl2;
}
if((LPC_GPIO1->FIOPIN & 0x00000001)==0)
{
LPC_GPIO0->FIOSET=1; dl2;
LPC_GPIO0->FIOCLR=1; dl2;
}
LPC_GPIO0->FIOSET=4; dl2;
LPC_GPIO0->FIOCLR=4; dl2;
}
}
توقع من اینه که پین 2 دائم چشمک بزنه
پین 1 در زمان فشار کلید و پین صفر در زمان عدم فشار کلید چشمک زن باشه

ولی روی برد پینهای 2 و 1 دائم چشمک میزنه و به کلید هم اصلا عکس العملی نشون نمیده!

ممنون میشم شما تست کنی ببینی جواب میگیری یا نه

mzarkoob
02-09-2013, 12:00
سلام
استفاده از gpio به عنوان مد ورودی چیز خیلی سختی نیست که بخواهید برایش این قدر وقت بگذارید. این مثال (که البته در فیلم آموزشی هم هست) به سادگی این کار را انجام می دهد:

// created : Mahdi Zarkoob
// Kavirelectronic.ir
int main (void)
{
// ---------------- Configuration ---------------
LPC_GPIO2->FIODIR = 0xff; /* LEDs PORT2 0...7 are Output */
LPC_GPIO2->FIOCLR = 0xff; /* turn off all the LEDs */
while(1){
clr_led1;
clr_sw1;
while( (LPC_GPIO2->FIOPIN & 1<<11)==0)
{
set_sw1; // LPC_GPIO2->FIOSET = sw1
set_led1 ; //LPC_GPIO2->FIOSET = 0x1
Delay(400);
clr_led1; // LPC_GPIO2->FIOCLR = 0x1
Delay(400);
}
}
}

arasbaran
05-09-2013, 00:05
سلام و ممنون
میدونم مطلب ساده ایه
ولی همین مورد ساده اجرا نمیشه
من به سخت افزارم شک کردم که نکنه اشکالی داره که ورودی رو قبول نمیکنه
برای همینه که روی این موضوع متوقف شدم