در این جستار بر آنم تا اگر خدا یاری کند؛ بسته به گیرائی مطلب برای خوانندگان، هر از چندی، یکی از نکته های عملی، رهیافت های تجربی و یا فوت و فن هائی (Tips & Tricks) که در حین کار با کمپایلر BascomAVR در می یابم را با سایر دوستان و کاربران در میان بگذارم. بی گمان این راه برای همه دوستان فرهیخته انجمن باز است تا با همراهی، بر میوه آن بیفزایند و یا گفته های اشتباه را گوشزد کنند.
اطلاعیه
Collapse
No announcement yet.
کمپایلر بسکام؛ فوت و فن ها و برخی تجربیات عملی
Collapse
X
-
پاسخ : کمپایلر بسکام؛ فوت و فن ها و برخی تجربیات عملی
در دستور Lcdat برای نمایشگرهای LCD گرافیکی؛ اگر خطائی به شرح زیر رخ دهد، کمپایلر آن را به عنوان خطا تشخیص نمی دهد و ممکن است به نتایج ناخواسته ای منجر شود. مثلا شما می خواهید روی GLCD 128*64 با فونت 8*8 یک کاراکتر را نمایش دهید. چنانچه می دانید؛ در این حالت صفحه نمایش، حداکثر دارای 8 سطر است، حالا فرض کنید می خواهید کاراکتر F را در سطر اول و با شروع از پیکسل 72 نمایش دهید که باید بنویسید:
Lcdat 1 , 72 , F
اما فرضا به اشتباه دستور را به صورت زیر می نویسید:
Lcdat 81 , 72 , F
خوب LCD سطر 81 ندارد اما کمپایلر بدون گرفتن ایراد، به جای سطر یک،کاراکتر F را در سطر هشتم می نویسد و این خود شما هستید که باید محل اشتباه را یافته و آن را بازنویسی کنید.
-
پاسخ : کمپایلر بسکام؛ فوت و فن ها و برخی تجربیات عملی
اگر با Graphic LCD قصد نوشتن یک کاراکتر (الفبا یا عدد) را دارید، درست مثل LCDهای کاراکتری، حداقل پیکسلی را که به عنوان سطر می توانید بنویسید 1 است؛ مثلا دستور زیر غلط است و سبب می شود کل صفحه دوم GLCD، یک پیکسل پائین بیاید:
Lcdat 0 , 1 , "A" , 1
و شکل درست دستور به صورت زیر است:
Lcdat 1 , 1, "A" , 1
دیدگاه
-
پاسخ : کمپایلر بسکام؛ فوت و فن ها و برخی تجربیات عملی
عدد یا رشته اختصاص شده به متغیرهای از نوع SRAM ، طبیعتا ممکن است در طول اجرای برنامه، به دلیل پر و خالی شدن مرتب فضای حافظه موقت SRAM، دچار تغییر شوند. فرضا شما در ایتدای کدنویسی برنامه، یک متغیر به نام Language از نوع String*2 را برای تعیین نوع زبان نمایشگر پنل دستگاه تعریف می کنید که ممکن است دو حالت "en" برای زبان انگلیسی و یا "fa" برای زبان فارسی را بگیرد. اما پس از برنامه ریزی میکرو و اجرای عملی برنامه، متوجه می شوید در حین کار، پس از مدتی نمایش Textهای از پیش تعریف شده دچار اشکال شد. دلیل این است که اگر چه در ابتدای کار، توسط کاربر به متغیر Language ، یکی از دو مقدار "en" و یا "fa" اختصاص داده شده، اما در حین کار برنامه، برای این متغیر ، مقادیر غیر مرتبطی از SRAM فراخوانی و جایگزین شده است. راه حل این کار در بسکام، ذخیره مقدار مورد نظر برای این متغیر در حافظه دائم میکرو و فراخوانی آن در صورت لزوم می باشد. (در صورت تمایل بفرمائید تا یک نمونه برنامه به عنوان راه حل این موضوع ارائه دهم).
دیدگاه
-
پاسخ : کمپایلر بسکام؛ فوت و فن ها و برخی تجربیات عملی
معمولا اگر در نوشتن حلقه شرطی که خودش در خلال یک دستور Select Case استفاده شده است، یک خطای کد نویسی رخ دهد (مثلا یک End If زیاد و یا کم نوشته باشیم)، کمپایلر به درستی نمی تواند محل خطا را نشان دهد و معمولا خطا را در سطری نشان می دهد که دستور End Select نوشته شده است و با این عنوان اشتباه که :
Error in Line ..., End Select expected
در حالیکه شما دستور End Select را به درستی نوشته اید! پس در این موارد باید داخل دستور Select Case تا دستور End Select را برای یافتن خطای سینتاکس مربوط به حلقه شرطی بگردید.
دیدگاه
-
پاسخ : کمپایلر بسکام؛ فوت و فن ها و برخی تجربیات عملی
گاهی ممکن است مشاهده شود که یک اینتراپت خارجی بدون دلیل عمل می کند و سبب می شود روند اجرای برنامه مختل شده و میکرو عملکرد درستی ایجاد نکند. این موضوع معمولا به دو علت عمده است:
الف - نویزهای ناشی از عوامل محیطی (مثل روشن شدن بارهای القائی، عملکرد کنتاکتورهای الکتریکی، سرج های شبکه، موتورهای احتراقی و ...)
این مشکل عموما با ایجاد یک تاخیر بین 50 تا 100 میلی ثانیه در زیر برنامه وقفه و چک کردن مجدد وضعیت پین وقفه، برای پاسخ ندادن ناخواسته به نویز کمتر می شود. همچنین قرار دادن یک فیلتر پائین گذر در مسیر سیم تغذیه و سیم متصل به پین Interrupt (حتی المقدور نزدیک به میکرو) قابل حل است (شامل یک سلف سری 10uH و یک خازن تانتالیوم متصل به زمین 100nF).
ب - ممکن است در اثر یک اتصالی موقت و یا هر عامل دیگری، سکشن مربوط به اینتراپت خارجی در داخل سخت افزار میکرو دچار آسیب دائمی شده باشد. در این حالت سایر قسمتهای میکرو کاملا سالم هستند اما وقتی در حالت بدون اتصال، ولتاژ پین وقفه مربوطه را چک می کنید، به جای صفر، عددی نسبتا ناپایدار بین 2 تا 3 ولت را نشان می دهد. نشانه بروز این نوع مشکل این است که برنامه میکرو، دائما در زیر روال مربوط به وقفه باقی می ماند. در این حالت، سخت افزار داخلی این وقفه میکرو برای همیشه معیوب شده است (ولی کلیت میکرو هنوز سالم و قابل استفاده است) و فقط باید وقفه مربوطه را در کد برنامه Disable کرده و به جای آن، از سایر وقفه های خارجی استفاده کرد. همچنین بهتر است پین مربوط به وقفه خارجی معیوب را آزاد رها کرد (اگر چه ممکن است سبب ایجاد مقداری نویز شود)
دیدگاه
دیدگاه