ايران ويج

نسخه‌ی کامل: درخواست کمک در محاسبه طول پالس ورودی میکرو
شما در حال مشاهده‌ی نسخه‌ی متنی این صفحه می‌باشید. مشاهده‌ی نسخه‌ی کامل با قالب بندی مناسب.
بسم الله الرحمن الرحیم

احتیاج به برنامه ای دارم که مدت زمان یک یا صفر بودن ورودی پایه ها را محاسبه ( برحسب میلی ثانیه با دقت 50 میکرو ثانیه ) کند.


بعد از محاسبه آنها را با یک مقدار خاص جمع کند و در خروجی ظاهر کند
حداقل برای 3 پایه
پیشاپیش از همکاری شما سپاسگذارم


[تصویر:  Untitled.jpg]
سلام
اگه با بسکام می خواهی می تونی از دستور pulsein استفاده کنی ولی با کدویژن کارت مشکل تره باید ازتایمر ها استفاده کنی
بعدش اینا عدد می دن و خودت باید با فرمول نویسی تبدیلشون کنی به زمان واقعیAt
کلا با بسکام آسونتره چون بیشتر دستوراش آماده هستWink
سلام. خودم خیلی راه ها به ذهنم میرسه و دوستان هم پیشنهاداتی کردند. اما خواهش میکنم در صورتی که برنامه عملی میشناسید برام بنویسیدش
(۲۸-مهر-۱۳۹۱, ۱۵:۱۱:۲۲)soonaeid نوشته است: [ -> ]سلام. خودم خیلی راه ها به ذهنم میرسه و دوستان هم پیشنهاداتی کردند. اما خواهش میکنم در صورتی که برنامه عملی میشناسید برام بنویسیدش
این راه کاملا عملیه به ترتیب اجرا کن
1-سخت افزاری رو برات می گذارم روی بردبرد پیاده کن
2- یه پالس با طول 2 میلی ثانیه به آی سی بده
3- عددی که روی ال سی دی می بینی یاد داشت کن
تا اینجا عدد مورد نظر بدست می یاری
4- حالا سخت افزار اصلیت رو بساز
5-حالا اینو به برنامه اصلیت اضافه کن
کد:
pulsein a,pinb,0,1
a=a+عدد موردنظر
pulseout portb,1,a
تو این برنامه portb.0 ورودیه وportb.1 خروجیهWink
البته اگر می خواهی دقیق تر باشه از تایمر باید استفاده کنیRolleyes
ضمن تشکر از شما ...
با این فرض که من هیچ سوادی در بیسیک ندارم کمک کنید.
خوب ... بنده قبلا به برنامه زیر رسیدم که البته به علت وجود حلقه نمیشه بیشتر از یک ورودی بهش اعمال کرد. این ساده ترین و ابتکاری ترین راه بوده. حالا میشه برنامه ای که بهم دادید رو هم به چند ورودی مستقل تعمیم داد تا خروجی هایی مستقل داشته باشند ؟
ضمن اینکه کدی که مجزا قرار دادید رو کجا باید اضافه کرد ؟
از همکاریتون بی نهایت سپاسگذارم
کد:
$regfile = "m16def.dat"
$crystal = 8000000
Config Pinb.1 = Input
Config Portb.2 = Output
Do
If Pinb.1 = 1 Then
Portb.2 = 1
L1:
If Pinb.1 = 1 Then Goto L1
Waitms 5
Portb.2 = 0
End If
Loop
این روش فقط برای یک ورودی جواب میده
فکر نکنم بشه برای چندتا ورودی تعمیمش داد یا یه راهی هست که من نمی دونم مشکل اصلی اینه که میکرو یک کار و انجام میده ولی شما می خواهین چندتا کار رو با هم انجام بده که نمیشهConfusedConfused
دوستان عزیز ... کسی راهی برای کمک سراغ نداره ؟
(۲۸-مهر-۱۳۹۱, ۱۹:۴۹:۵۸)soonaeid نوشته است: [ -> ]ضمن تشکر از شما ...
با این فرض که من هیچ سوادی در بیسیک ندارم کمک کنید.
خوب ... بنده قبلا به برنامه زیر رسیدم که البته به علت وجود حلقه نمیشه بیشتر از یک ورودی بهش اعمال کرد. این ساده ترین و ابتکاری ترین راه بوده. حالا میشه برنامه ای که بهم دادید رو هم به چند ورودی مستقل تعمیم داد تا خروجی هایی مستقل داشته باشند ؟
ضمن اینکه کدی که مجزا قرار دادید رو کجا باید اضافه کرد ؟
از همکاریتون بی نهایت سپاسگذارم
کد:
$regfile = "m16def.dat"
$crystal = 8000000
Config Pinb.1 = Input
Config Portb.2 = Output
Do
If Pinb.1 = 1 Then
Portb.2 = 1
L1:
If Pinb.1 = 1 Then Goto L1
Waitms 5
Portb.2 = 0
End If
Loop
سلام
این کد در پیکر بندی کمی اشتباه است
مثلا در پیکر بندی 1.pin نوشته اید و این غلط است
و به چشم نیامده در بسکام در پیکربندی (config)
فقط port نوشته میشود چه بصورت ورودی باشد که در برنامه اصلی میشود
pin وچه بصورت خروجی که در برنامه میشود port

--اگر یک بیت را میخواهید بصورت ورودی یا خروجی پیکر بندی کنید از DDRX
هم میتوانید استفاده کنید بدون دستور CONFIG مثل 0=1.DDRb برای ورودی
ویا 1=1.DDRb برای خروجی (در کد ویجن هم این دستور استفاده میشود)--

پس درپیکر بندی 1.pinb را به 1.portb تغییر دهید

برای محاسبه زمان پالس ورودی یک تایمر میکرو را بصورت تایمر پیکر بندی کنید ویک
متغیر را در ابتدای هر حلقه با ان بارگزاری کنید ودر انتهای حلقه یک متغیر دیگر را
تفاضل این دو متغیر زمان پالس است البته با محاسبه پیکر بندی تایمر بر حسب پالس ساعت
که در اینجا 8 مگاهرتز است این روش همزمان روی دو واحد دیگر هم بکار میرود فقط اسم متغیرها را باید عوض کنید
مقادیر تفاضل شده متغیرها را همزمان بر روی LCD میتوانید نمایش دهید


برای اضافه کردن 5 میلی ثانیه بصورتی که بر روی واحدهای دیگر تاخیر ایجاد نکند هم
باید از تایمر استفاده کنید نه از waitms
به این ترتیب که بجای 5 waitms در برنامه اتان از یک حلقه تاخیر تایمری استفاده
کنید وچون تایمر را نباید stop-start کنید باز هم از دو متغیر استفاده کنید
ومقدار تفاضل این دو متغیر را شرط خروج از حلقه قرار دهید
به این صورت همه واحدها مستقل از یکدیگر تاخیر ایجاد میکنند

موفق باشید
(۲۹-مهر-۱۳۹۱, ۲۱:۲۱:۵۸)vigraz نوشته است: [ -> ]
(۲۸-مهر-۱۳۹۱, ۱۹:۴۹:۵۸)soonaeid نوشته است: [ -> ]ضمن تشکر از شما ...
با این فرض که من هیچ سوادی در بیسیک ندارم کمک کنید.
خوب ... بنده قبلا به برنامه زیر رسیدم که البته به علت وجود حلقه نمیشه بیشتر از یک ورودی بهش اعمال کرد. این ساده ترین و ابتکاری ترین راه بوده. حالا میشه برنامه ای که بهم دادید رو هم به چند ورودی مستقل تعمیم داد تا خروجی هایی مستقل داشته باشند ؟
ضمن اینکه کدی که مجزا قرار دادید رو کجا باید اضافه کرد ؟
از همکاریتون بی نهایت سپاسگذارم
کد:
$regfile = "m16def.dat"
$crystal = 8000000
Config Pinb.1 = Input
Config Portb.2 = Output
Do
If Pinb.1 = 1 Then
Portb.2 = 1
L1:
If Pinb.1 = 1 Then Goto L1
Waitms 5
Portb.2 = 0
End If
Loop
سلام
این کد در پیکر بندی کمی اشتباه است
مثلا در پیکر بندی 1.pin نوشته اید و این غلط است
و به چشم نیامده در بسکام در پیکربندی (config)
فقط port نوشته میشود چه بصورت ورودی باشد که در برنامه اصلی میشود
pin وچه بصورت خروجی که در برنامه میشود port

--اگر یک بیت را میخواهید بصورت ورودی یا خروجی پیکر بندی کنید از DDRX
هم میتوانید استفاده کنید بدون دستور CONFIG مثل 0=1.DDRb برای ورودی
ویا 1=1.DDRb برای خروجی (در کد ویجن هم این دستور استفاده میشود)--

پس درپیکر بندی 1.pinb را به 1.portb تغییر دهید

برای محاسبه زمان پالس ورودی یک تایمر میکرو را بصورت تایمر پیکر بندی کنید ویک
متغیر را در ابتدای هر حلقه با ان بارگزاری کنید ودر انتهای حلقه یک متغیر دیگر را
تفاضل این دو متغیر زمان پالس است البته با محاسبه پیکر بندی تایمر بر حسب پالس ساعت
که در اینجا 8 مگاهرتز است این روش همزمان روی دو واحد دیگر هم بکار میرود فقط اسم متغیرها را باید عوض کنید
مقادیر تفاضل شده متغیرها را همزمان بر روی LCD میتوانید نمایش دهید


برای اضافه کردن 5 میلی ثانیه بصورتی که بر روی واحدهای دیگر تاخیر ایجاد نکند هم
باید از تایمر استفاده کنید نه از waitms
به این ترتیب که بجای 5 waitms در برنامه اتان از یک حلقه تاخیر تایمری استفاده
کنید وچون تایمر را نباید stop-start کنید باز هم از دو متغیر استفاده کنید
ومقدار تفاضل این دو متغیر را شرط خروج از حلقه قرار دهید
به این صورت همه واحدها مستقل از یکدیگر تاخیر ایجاد میکنند

موفق باشید
سلام آقای vigraz مشکل اصلی اینه که همزمان نمیشه سه تا ورودی این کارو ببکنن شما راهی سراغ ندارینShy
(۲۹-مهر-۱۳۹۱, ۲۳:۱۶:۴۸)hadikh73 نوشته است: [ -> ]
(۲۹-مهر-۱۳۹۱, ۲۱:۲۱:۵۸)vigraz نوشته است: [ -> ]
(۲۸-مهر-۱۳۹۱, ۱۹:۴۹:۵۸)soonaeid نوشته است: [ -> ]ضمن تشکر از شما ...
با این فرض که من هیچ سوادی در بیسیک ندارم کمک کنید.
خوب ... بنده قبلا به برنامه زیر رسیدم که البته به علت وجود حلقه نمیشه بیشتر از یک ورودی بهش اعمال کرد. این ساده ترین و ابتکاری ترین راه بوده. حالا میشه برنامه ای که بهم دادید رو هم به چند ورودی مستقل تعمیم داد تا خروجی هایی مستقل داشته باشند ؟
ضمن اینکه کدی که مجزا قرار دادید رو کجا باید اضافه کرد ؟
از همکاریتون بی نهایت سپاسگذارم
کد:
$regfile = "m16def.dat"
$crystal = 8000000
Config Pinb.1 = Input
Config Portb.2 = Output
Do
If Pinb.1 = 1 Then
Portb.2 = 1
L1:
If Pinb.1 = 1 Then Goto L1
Waitms 5
Portb.2 = 0
End If
Loop
سلام
این کد در پیکر بندی کمی اشتباه است
مثلا در پیکر بندی 1.pin نوشته اید و این غلط است
و به چشم نیامده در بسکام در پیکربندی (config)
فقط port نوشته میشود چه بصورت ورودی باشد که در برنامه اصلی میشود
pin وچه بصورت خروجی که در برنامه میشود port

--اگر یک بیت را میخواهید بصورت ورودی یا خروجی پیکر بندی کنید از DDRX
هم میتوانید استفاده کنید بدون دستور CONFIG مثل 0=1.DDRb برای ورودی
ویا 1=1.DDRb برای خروجی (در کد ویجن هم این دستور استفاده میشود)--

پس درپیکر بندی 1.pinb را به 1.portb تغییر دهید

برای محاسبه زمان پالس ورودی یک تایمر میکرو را بصورت تایمر پیکر بندی کنید ویک
متغیر را در ابتدای هر حلقه با ان بارگزاری کنید ودر انتهای حلقه یک متغیر دیگر را
تفاضل این دو متغیر زمان پالس است البته با محاسبه پیکر بندی تایمر بر حسب پالس ساعت
که در اینجا 8 مگاهرتز است این روش همزمان روی دو واحد دیگر هم بکار میرود فقط اسم متغیرها را باید عوض کنید
مقادیر تفاضل شده متغیرها را همزمان بر روی LCD میتوانید نمایش دهید


برای اضافه کردن 5 میلی ثانیه بصورتی که بر روی واحدهای دیگر تاخیر ایجاد نکند هم
باید از تایمر استفاده کنید نه از waitms
به این ترتیب که بجای 5 waitms در برنامه اتان از یک حلقه تاخیر تایمری استفاده
کنید وچون تایمر را نباید stop-start کنید باز هم از دو متغیر استفاده کنید
ومقدار تفاضل این دو متغیر را شرط خروج از حلقه قرار دهید
به این صورت همه واحدها مستقل از یکدیگر تاخیر ایجاد میکنند

موفق باشید
سلام آقای vigraz مشکل اصلی اینه که همزمان نمیشه سه تا ورودی این کارو ببکنن شما راهی سراغ ندارینShy
سلام
در همانجا توضیح داده ام
منظور از واحدها همان پایه ها یا ورودیها است

دلیلی ندارد که این حلقه برای محاسبه یک ورودی برای ورودیهای دیگر
بکار نرود چون مشکل اصلی تاخیر بصورت waitms 5 بود که توسط حلقه
تاخیر با تفاضل دو متغیر جایگزین میشود وبه ترتیب شمارش مقدار تایمر
تاخیر ایجاد میکند وهر واحد یا همان ورودی مستقل است وهمزمان میتواند
پابه های خروجی را صفر یا یک کند تایمر توسط هیچ کدام از ورودیها خاموش یا روشن نمی شود ودائم کار میکند

یک مقدار دقت کنید خواندن تایمر در یک حلقه میتواند در چند حلقه همزمان اجرا شود وخروجیها تغییر کنند تنها تاخیر در اینجا تاخیر ترتیب اجرای خطوط برنامه است که در این برنامه قابل اغماض است ولی همین تاخیر را هم میشود در برنامه منظور کرد -در حد 3تا5 میکرو ثانیه برای هر حلقه که برای دوحلقه میشود حداکثر 10
میکرو ثانیه تا حلقه سوم اجرا شود که این خیلی از ضریب خطای درخواست برنامه هم پایینتر است -هر سه IF برای ورودیها در یک LOOP قرار میگیرند وبرنامه در یک LOOp هر سه
ورودی را بررسی میکند خودتان تحلیل کنید نتیجه میگیرید

من فکر میکنم این برنامه واضح است اما اگر باز واضح نبود
کدش را بنویسم( البته این زیاد کار در ستی نیست که من این کد را بنویسم)

موفق باشید
آقایی که سوال داشتی و بیسکام بلد نبودید. به جواب رسیدید آیا؟
به منم کمک کنید چون منم این مشکلو دارم. یه پالس دارم و میخام مدت زمان پالس اول
تا پالس بعدی رو نمایش بدم با کد ویژن. هر چقدرم راجب تایمر کانتر سرچ میکنم هیچی متوجه نمیشم.
اااااااااااااایییییییییییییی کمککککک.