ايران ويج

نسخه‌ی کامل: سوالهای برنامه نویسی با کامپایلر BASCOM
شما در حال مشاهده‌ی نسخه‌ی متنی این صفحه می‌باشید. مشاهده‌ی نسخه‌ی کامل با قالب بندی مناسب.
صفحه‌ها: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
سلام.دوستان من یه سوال داشتم.کمکم کنید ممنون میشم.من سه تا دکمه به سه پایه از میکرو وصل کردم. یک برنامه بزرگ نوشتم که تووی این برنامه از هر سه دکمه استفاده میشه. حال من میخوام یه برنامه دیگه بنویسم. این برنامه ها جدا جدا جواب میده. اما من میخوام مثلا وقتی دکمه اول را میفشرم وارد برنامه اول و وقتی دکمه دوم را میفشرم وارد برنامه دوم بشه، چطوری باید این کار را بکنم؟
وقتی از if ساده استفاده میکنم جوابی که میخوام نمیگیرم/.
باید do , loop اول دو برنامه بذارم؟ یا اولش یه دونه بذارم برای جفتشون یا نه؟؟
سلام.
برای هر برنامه ی جدا یه لیبل بزنید.
اول برنامه برای هر کلید از دستور debounce استفاده کنید.

یعنی اول برنامه یه Do-Loop دارید که داخلش حداقل 3 دستور Debounce هست.
هر کدام هم وقتی فعال می شن به لیبل مربوطه شون پرش می کنن.
آخر هر کدوم از برنامه های جدا دوبارهه باید پرش بشه به اول Do-Loop مربوط به چک کردن کلیدها.
راه های زیادی دارهه ، اما این ساده ترینش هست.
اگر با این دستور آشنایی ندارید در help بسکام سرچش کنید و توضیحات و مثالش رو بخونید.

موفق باشید.
چطوری میشه از دو وقفه خارجی بصورت همزمان استفاده کرد؟

منظورم اینه که مثلا ما دو تا پایه وقفه خارجی رو در برنامه استفاده کنیم و هر کدوم زودتر دستور گرفت اون اجرا بشه همچنین اگه در میانه راه وقفه اولی در حال اجرا اون یکی وقفه (وقفه دوم) دستور گرفت اون اجرا بشه و اولی متوقف بشه و این چرخه ادامه داشته باشه ...


کد:
Config Int0 = Falling
Enable Int0
Enable Interrupts
On Int0 Q


Config Int1 = Rising
Enable Int1
Enable Interrupts
On Int1 W


Q:
...



W:
...



البته فرقی نمی کنه کدومش بالارونده باشه یا پایین رونده و ممکنه بخوام هر دوتاش از یه نوع باشن
راستش من طبق همون دستورات دو تا وقفه رو فعال کردم اما فقط یکیش کار می کنه و در وسط برنامه اگه وقفه دوم رو بخوام فعال بشه نمیشه!!

میشه یه کد مثال بذارین؟

البته داخل برنامه ها از تاخیر هم استفاده خواهم کرد و شاید همین تاخیر خودش مشکل ساز باشه
(۱۳-اسفند-۱۳۹۳, ۲۳:۳۸:۱۲)رسول نوشته است: [ -> ]راستش من طبق همون دستورات دو تا وقفه رو فعال کردم اما فقط یکیش کار می کنه و در وسط برنامه اگه وقفه دوم رو بخوام فعال بشه نمیشه!!

میشه یه کد مثال بذارین؟

البته داخل برنامه ها از تاخیر هم استفاده خواهم کرد و شاید همین تاخیر خودش مشکل ساز باشه

سلام
شما درست ميفرماييد و من هم در عمل نكات مبهمي را مشاهده كردم
البته الان اگر كد را مثال بزنم كه طبق همان تئوري است كه خودتان هم
بخوبي با ان اشنا هستيد
اما اگر وقت بدهيد مدارهاي عملي قبلي را كه خودم در اين مورد ساخته ام
نگاهي بياندازم و با اطمينان بيشتر پاسخگو باشم
اين مورد را كه شما ميفرماييد در مدارهايي كه از چند وقفه استفاده
ميكنند پيش ميايد وربطي به كانتر ندارد
در برنامه پترن وكلا ارسال كاراكتر بر روي تلويزيون با اين مورد خيلي
كلنجار رفتم
موردي كه در برنامه من بروز ميكرد اختلاف فاز وقفه ها بود كه سرانجام
هم حل نشد و بعد كه خوب بررسي كردم متوجه شدم كه اين اختلاف فاز اصولا
بر اثر اين است كه ميكرو بين وقفه ها ترجيح نمگذارد و كار اصلي ميكرو است
و اگر غير از اين بود بايد موجب تعجب ميشد
اين اختلاف فاز باعث ميشد كه در هر دوره 52 ميكروثانيه شروع پيكسلها
ويا كاراكترها كمي جابجا شود وخودش تشكيل يك سيكل را ميداد كه بصورت
پرش خطوط نمايش داده ميشد
اين مشكل باعث شد كه از وقفه ها بصورتي ديگر استفاده كنم


----
البته احتمال ميدهم بهر حال نوع كدنويسي در اين مورد دخيل است اما
ربطي به استفاده از كانتر ندارد
پس اگر خودتان حل كرديد كه خوب است و اگر حل نشد من حتما ان نكات را
پيدا ميكنم
در ميكرو اين قسمت هميشه مشكل ساز ترين قسمت برنامه است
-----
ارسال قبلي را حذف كردم
در ارسال قبلي كه گفته بودم وقفه نقطه بازگشت ندارد منظور اين بود
كه مقدار بازگشتي ندارد و همچنين نميشود انها را الويت بندي كرد
و براي انجام وقفه اي ديگر حتما بايد وقفه قبلي البته برگشت داده شود
اگر برچسبي كه به ان پرش شده داراي شرط باشد برگشت بايد در داخل حلقه
باشد و همچنين بيرون حلقه و اگر داراي شرط نيست در انتهاي برنامه

سپاس
آیا میشود از امکانات میکرو برای کنترل ترانزیستور تغذیه برق کلیدزنی(سوییچینگ) برای تبدیل برق شهر به مثلا 5 و 12 ولت
شایدم شبیه تغذیه رایانه(کامپیوتر) استفاده کرد بدون تراشه های کنترل کلیدزنی(سوییچینگ) . بیشتر تمرکز بر امکانات میکرو کنترلر باشد.
از مدارات کنترل آنالوگ و اینها زیاد دیدم خواستم ببینم با میکرو میشه همچین چیزی ساخت که بتونه خودش فرکانس را در محدوه مثلا 25 تا 150 کیلوهرتز با پهنای پالس متغیر متناسب با ولتاژ خروجی ایجاد کند. از پایه های کنترلی میکرو برای جلو گیری از خطاهای تغذیه بهره ببره. بیشتر مدارات رابط میتونه از کوپلر نوری یا ترانس وترانزیستور باشه.
اگه نشانی و یا مرجعی باشه ممنون میشم.Smile
At اینم بگم بیشتر از 12 سال از درس خوندنم گذشته و برای پروژه و کار تجاری نمیخواهم. برای یادگیری و سرگرمی خودم.Shy

اصولش بنویسید از سرمان زیاد است.
(۱۳-اسفند-۱۳۹۳, ۲۳:۳۸:۱۲)رسول نوشته است: [ -> ]راستش من طبق همون دستورات دو تا وقفه رو فعال کردم اما فقط یکیش کار می کنه و در وسط برنامه اگه وقفه دوم رو بخوام فعال بشه نمیشه!!

میشه یه کد مثال بذارین؟

البته داخل برنامه ها از تاخیر هم استفاده خواهم کرد و شاید همین تاخیر خودش مشکل ساز باشه

سلام
اين كد ساده اي است كه دو وقفه خارجي را اجرا ميكند
هربار كه يك وقف اجرا ميشود با يك RETURN تمام ميشود
و قفه بعدي يا خود وقفه اول اجرا ميشود
اگر در حين اجراي وقفه اول وقفه دوم اتفاق بيافتد بخاطر اينكه
روال وقفه اول تمام نشده وقوع وقفه دوم ذخيره شده و بعد از اتمام
وقفه اول وقفه دوم اجرا ميشود

براي ازمايش من در هر دووقفه تاخير 2 ثانيه اي را گذاشته ام
تا فرصت شود كه هردو كليد به فاصله يك ثانيه فشرده شوند
به اين ترتيب ميبينيد كه يك زيروال انجام ميشود وهمزمان
وقفه دگر اگر وقوع پيدا كند ذخيره ميشود وبلافاصله بعد از
اتمام زير روال اولي اجرا ميگردد
بين وقفه ها هيچ الويتي نميتوان قائل شد و بترتيب زمان وقوعشان
ذخيره وبعد از اتمام قبلي اجرا ميشوند
اما در هر صورت دوزير روال همزمان نميتوانند اجرا شوند بهيچوجه
----
از وقفه در وقفه بصورت سريال نيز ميتوان استفاده كرد
كه همواره وقفه اول اخرين RETURN را دارد و در داخل هر
روال وقفه RETURN وقفه ديگر


البته شما فعلا اين كد را بررسي كنيد

کد:
Config Int1 = Rising
  Config Int0 = Rising
Enable Interrupts
Enable Int1
On Int1 Vh
Enable Int0
On Int0 Vd

Ddrb.0 = 1
Ddrb.1 = 1
Portb.0 = 0
Portb.1 = 0
Do

Loop
Vh:

  Portb.1 = 1
  Waitms 2000
  Portb.1 = 0
Return

Vd:

  Portb.0 = 1
   Waitms 2000
   Portb.0 = 0
Return

[تصویر:  2sml7lur1h5a.png]

مدار پروتئوس و فايل هگز وباس
[attachment=13189]

موفق باشيد
با تشکر ویژه از شما که وقت گذاشتین ..

(۱۵-اسفند-۱۳۹۳, ۰۱:۲۵:۴۵)vigraz نوشته است: [ -> ]اگر در حين اجراي وقفه اول وقفه دوم اتفاق بيافتد بخاطر اينكه
روال وقفه اول تمام نشده وقوع وقفه دوم ذخيره شده و بعد از اتمام
وقفه اول وقفه دوم اجرا ميشود

اما هدف من از این پرسش و برنامه هم همینه که اینجوری نشه دیگه!!

یعنی در بین راهه وقفه اولی اگه وقفه دوم فعال شد دیگه منتظر نشه که وقفه اول تموم بشه و بعدش دومی که ذخیره شده شروع به کار بکنه

باید در هرجایی که وقفه دوم فعال شد دیگه وقفه اول قطع بشه و بره روی دومی
سلام من یه سوال پرسیدم از دوستان خواهشمندم اگه امکان داره جواب ما رو بدین.سوالم رو اینجا قرار میدم
" واسم یه سوال پیش اومده ممنون میشم جواب مارو بدین.اینکه تو مبدلهاخارجی پایه کلاک در حالت بیکاری بالا باشه یا پایین چه فرقی میکنه؟اصولا این دوحالت نسبت به هم چه مزیت یا عیبی دارند؟ (فرقی نمیکنه انالوگ به دجیتال یا دیجیتال به انالوگ)
(۱۵-اسفند-۱۳۹۳, ۱۹:۰۳:۰۶)رسول نوشته است: [ -> ]با تشکر ویژه از شما که وقت گذاشتین ..

(۱۵-اسفند-۱۳۹۳, ۰۱:۲۵:۴۵)vigraz نوشته است: [ -> ]اگر در حين اجراي وقفه اول وقفه دوم اتفاق بيافتد بخاطر اينكه
روال وقفه اول تمام نشده وقوع وقفه دوم ذخيره شده و بعد از اتمام
وقفه اول وقفه دوم اجرا ميشود

اما هدف من از این پرسش و برنامه هم همینه که اینجوری نشه دیگه!!

یعنی در بین راهه وقفه اولی اگه وقفه دوم فعال شد دیگه منتظر نشه که وقفه اول تموم بشه و بعدش دومی که ذخیره شده شروع به کار بکنه

باید در هرجایی که وقفه دوم فعال شد دیگه وقفه اول قطع بشه و بره روی دومی

سلام
من تاخير دو ثانيه را براي توضيح كد گذاشتم و گرنه برگشت به
برنامه بعد از وقوع وقفه بسيار سريع است واين زير روال است
كه اجرايش زمان ميبرد
اگر در هر روال وقفه يك عمل انجام شود و سپس بعد از اين عمل
RETURN بكاربرده شود وقفه تمام ميشود
پس روال اصلي ميتواند بايك حلقه معمولي اجراشود
چون با زير روال برنامه تست وقوع
وقفه هم بصورت موازي مشغول كار است
نتيجه اين است كه در اين برنامه ها هر وقفه بصورت يك حلقه معمولي در
ميايد
ممكن است برنامه هاي زيرروال شما پيچيده باشندو... اما در اين روش فرقي
نميكند و با حلقه DO LOOP براي هر حلقه يا زيرروال ميتوان هر تعداد
وقفه را بكار برد
اما به نسبت پيچيدگي وتعداد خطهاي برنامه


با بررسي اين كد بهتر متوجه ميشويد
کد:
$regfile = "m8def.dat"
$crystal = 4000000                                          '


Config Timer0 = Timer , Prescale = 8


Config Int1 = Rising
  Config Int0 = Rising
Enable Interrupts
Enable Int1
On Int1 V1
Enable Int0
On Int0 V0

Ddrb.0 = 1
Ddrb.1 = 1
Portb.0 = 0
Portb.1 = 0

Do
Loop
V1:

  Portb.1 = 1
  Portb.0 = 0
  Return
  
V0:
  Portb.0 = 1
  Portb.1 = 0
  Return

مدار هم همان مدار قبلي است

سپاس
سلام
متوجه شدم كه حلقه هاي بعدي اجرا نميشوند و برنامه همواره
به حلقه تهي ابتدا برنامه پرش ميكند به همين علت كد بالائي
را ويرايش كردم
تا موقعي كه مشخص نشود زيرروالها براي چه كار هستند نميتوان
در اين حلقه كدي نوشت

سپاس
صفحه‌ها: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23