امروز سه شنبه ۳ شهریور ۱۴۰۵
دسته بندی سایت
پیوند ها
آمار بازدید سایت
در این مقاله سعی می شود در مورد تکنولوژی VSAT و انواع روشهای دسترسی به کانالهای مخابرات ماهواره ای و کاربرد آن در دنیای امروز بصورت مختصر بحث شود.
VSAT مخفف Very Small Aperture Terminal می باشد. همانگونه که از نام آن پیداست ترمینالهای بسیار کوجک ماهواره ای که در سایتهای پراکنده از لحاظ جغرافیایی واقع می باشند و از طریق یک لینک ماهواره با یک هاب که شامل تجهیزات مخابراتی پیشرفته و آنتن به مراتب بزرگتر از ترمینالها، مثلا حدود 6 متر، ارتباط دارند. در واقع با هزینه کردن در هاب می توان هزینه ترمینالها را بشدت کاهش داد. آنتنهای VSAT معمولا بین 0.75 تا 3.8 متر می باشند. دو نوع توپولوژی شبکه به نامهای STAR , MESH استفاده می شوند. در شبکه های کوچک، معمولا بین 5 تا 30 سایت، از MESH استفاده می شود و در شبکه های بزرگتر اغلب از توپولوژی STAR استفاده می شود.
باند فرکانسی مورد استفاده در این تکنولوزی باندهای C و KU و اخیرا باند Ka می باشد. آنتنهای مورد استفاده در باند KU کوجکتر از باند C می باشد( بعلت رابطه مستقیم گین آنتن با مجذور فرکانس).
موارد استفاده VSAT بطور اعم شامل: اینترنت، شبکه های خصوصی مخابراتی، ارتباطات تصویری و صوتی و فاکس می باشد. در دنیای امروزی می توان شبکه های VSAT را بطور گسترده مشاهده کرد که در ذیل به برخی از آنها اشاره شده است:

مهمترین موضوع در این نوع شبکه ها روش دسترسی به کانال است. کانال فرکانسی که هاب به VSAT ها دیتا می فرستد را Outroute گویند و در طرف مقابل از VSAT ها به هاب را Inroute گویند. اطلاعات از هاب روی یک باند فرکانسی مشترک برای تمام ترمینالهای واقع در آن شبکه ارسال می شود و معمولا از روش TDM برای مالتی پلکس استفاده می شود. در سمت Inroute اغلب یک پهنای باند بین تعداد زیادی پایانه تقسیم می شود، مگر ارتباط بصورت Point to Point و یا SCPC باشد. روشهای دسترسی به Inroute شامل TDMA ، FDMA ، FTDMA ، CDMA و SCPC(DAMA/PAMA)می باشد .
TDMA
مخفف Time Division Multiple Access می باشد.در این روش پایانه ها در اسلاتهای زمانی خاص که هاب به آنها تخصیص می دهد، به ارسال اطلاعات می پردازند. بدین ترتیب هر پایانه از کل پهنای باند فرکانسی ولی در اسلات زمانی مربوط به خود استفاده می کند. بازدهی این روش در سیستم تخصیص اسلاتها برای پایانه هاست. بطور معمول سه روش کلی وجود دارد: User Aloha ، Transaction Reservation و Stream.
User Aloha: در این روش پایانه ها دیتای خود را بصورت تصادفی در قسمتی از Inroute که برای این منظور تخصیص داده شده، می گذارند.در این حالت احتمال تصادم دیتا وجود دارد لذا برای دیتا با ترافیک کم، بسته های کوچک و با سایزهای یکسان مناسب می باشد.
Transaction Reservation: در این روش پایانه ای که یک یا چند Packet برای ارسال دارد، ابتدا یک درخواست تراکنش به هاب می فرستد. این درخواست شامل تعداد و سایز بسته ها می باشد. هاب نیز اسلاتهای لازم را تخصیص می دهد و پیام جواب را به پایانه می فرستد.
سپس پایانه بسته ها را در اسلاتها گذاشته و ارسال می کند و اگر دیتای بیشتری داشته باشد دوباره درخواست خود را می فرستد.
Stream : در این تکنیک فرصتهای ارسال بصورت Fixed و پریودیک به پایانه داده می شود. این روش در کاربردهای با Throughput بالا مانند ترافیک Voice مورد استفاده است.
FDMA
مخفف Frequency Division Multiple Access می باشد.در این روش بجای زمان باند فرکانسی تقسیم می شود و پایانه ها می توانند دیتای خود را هرزمان ارسال کنند ولی هر یک در محدوده فرکانسی خویش اقدام به ارسال می کنند. هاب نحوه تخصیص فرکانسها را بر عهده دارد.
FTDMA
مخفف Frequency Time Division Multiple Accessمی باشد. در این تکنیک همانطور که از نام آن پیداست هر دو روش فوق در هم ترکیب می شوند تا بازدهی بهتری بدست آید. یعنی با تقسیم کردن زمان و فرکانس بین پایانه ها در زمان واحد تعداد بیشتری پایانه قادر به تبادل اطلاعات می باشند. ضمنا با روش Frequency Hopping می توان امنیت ارسال دیتا را نیز بالا برد.
CDMA
در سیستم های رادیویی منابع،زمان و فرکانس می باشند و در روشهای ذکر شده در بالا نحوه تقسیم و تخصیص آنها را توضیح دادیم ولی در روش CDMA( Code Division Multiple Access)هر پایانه اقدام به ارسال دیتا در کل پهنای باند فرکانسی و در هر زمانی می پردازند. در این تکنیک از کدها برای تفکیک سیگنالها استفاده می شود. CDMA از کدهای یونیک جهت گسترده کردن spreading دیتای باند پایه قبل از ارسال می کند (Spread Spectrum) . سیگنال ارسالی در یک کانال زیر سطح نویز فرستاده شده و گیرنده از یک Correlator برای عکس گسترده سازی dispreading و استخراج سیگنال مطلوب (بعد از گذشت از یک فیلتر باند باریک) ، استفاده می کند.


گرفته شده از:
در این پایان نامه به بررسی در مورد دو فیلتر دیجیتال FIR , IIR که در پردازش سیگنال های دیجیتال DSP استفاده می شود می پردازیم. ابتدا تعریفی بر پیدایش DSP و مزایا و کاربرد فراوان آن می پردازیم ، سپس ساختارهای دو فیلتر و چگونگی تحقق آنها بررسی می شود برای تسلط کافی به مطالب اشاره ای نیز به فیلتر های آنالوگ داریم وهمچنین به طراحی این فیلتر ها نیزاشاره کرده ایم. طراحی این فیلترها به وسیله برنامه متلب امکان پذیر می باشد لذا طراحی این فیلتر ها را نیز در این نرم افزار بررسی می کنیم.
اصولا این دو فیلتر تفاوت هایی با هم دارند که در ادامه به آنها اشاره می کنیم. در اصل همین تفاوت این دو فیلتر است که کاربرد آنها را از هم در مدارات مختلف متمایز می کند از آنجایی که هر دو فیلتر کاربردهای فراوانی دارند ، چند نمونه از کاربرد آنها را به اختصار توضیح می دهیم.
فهرست :
تاریخچه
مقدمه ای بر فیلترهای دیجیتال و آنالوگ
مروری بر DSP
مزایای DSP
مشخصات سیستم های DSP
فیلتر و پاسخ ضربه
فیلتر چیست
ضربه
پاسخ ضربه
ضربه ها FIR , II
مقدمه ای بر فیلتر دیجیتال FIR
چگونگی عملکرد فیلتر FIR
محاسبات ریاضی FIR
ساختار پایه برای FIR
مقدمه ای بر فیلتر دیجیتال IIR
چگونگی عملکرد فیلتر IIR
ساختار پایه برای IIR
فیلتر های آنالوگ
فیلتر باترورث
فیلتر چبی چف
فیلتر الیپتیک
فصل : تحقق فیلترهای دیجیتال FIR , IIR
تحقق سیستمهای FIR
ساختارهای مستقیم در تحقق سیستم های FIR
صفرها وقطب ها در سیستم های FIR
سیستم های با فاز خطی
تحقق متوالی سیستم های FIR
ساختارهای FIR با فاز خطی
ساختارهای مشبک و مشبک نردبانی
تحقق سیستم های IIR
ساختارهای مستقیم
ساختارهای مستقیم جابجا شده
تحلیل تابع تبدیل سیستم IIR
قطب ها و صفرها
تحقق متوالی
تحقق موازی
ساختارهای فضای حالت
مفهوم حالت
فصل : طراحی فیلترهای دیجیتال FIR , IIR
طراحی فیلتر دیجیتال FIR
معرفی فیلترهای دیجیتال
فیلترهای ایده ال
فیلتر بالا گذر
فیلتر میان گذر مرتبه دوم
روش پنجره برای طراحی فیلترهای FIR
پاسخ نمونه واحد فیلتر های ایده ال
مفهوم پنجره در طراحی فیلتر های FIR
معرفی پنجره های دیگر
پنجره های تنظیم پذیر
فیلترهای با فاز خطی
طراحی فیلترهای FIR بر اساس نمونه برداری فرکانس
طراحی فیلترهای دیجیتال IIR
روش تبدیل تغییر ناپذیری پاسخ ضربه
طراحی فیلترهای دیجیتال در MATLAB
مروري بر فيلتر كردن سيستم هاي خطي و تبديلات
طراحي فيلتر IIR
طراحي فيلتر باترورث تعميم يافته
طراحي فيلترهاي FIR
فصل : مقایسه و کاربرد فیلترهای دیجیتال FIR , IIR
مقایسه فیلتر های دیجیتال FIR , IIR
پاسخ پله و تاخیر
پاسخ ضربه
پایداری
اندازه ثبات محاسبات ریاضی
ساختار و کد پیاده سازی
خلاصه تفاوت دو فیلتر
کاربرد فیلترهای دیجیتال IIR , FIR
طراحي فيلتر FIR با حداقل خطا با استفاده از شبكه عصبي
براي فشرده سازي موجك و پياده سازي آن بر روي تراشه FPGA
معرفي الگوريتم (Complex Least Mean Square) CLMS
براي فيلتر FIR وفقي براساس توابع همبستگی
استفاده از الگوریتم ها با طراحی فیلترهای وفقی
درمسائل پردازش سیگنالهای دیجیتال
پروژه فاصله سنج التراسونیک یک فاصله سنج صوتی بسیار دقیق با ماژول النراسونیک می باشد که فاصله را با دقت بسیار بالا اندازه میگیرد برای این پروژه هم می شود از ماژول آلتراسونیک سنجش مسافت SRF05 و هم ماژول آلتراسونیک سنجش مسافت HC-SR04 استفاده کرد ، تفاوت این دو ماژول در فاصله اندازه گیری است که در ماژول النراسونیک SRF-05 تا 4 متر برد افزایش یافته است در حالی که در ماژول التراسونیک HC-05 حداکثر سه متر را می تواند اندازه بگیرد ، تفاوت فیزیکی که این دو ماژول با هم دارند در تعداد پایه ها است که در ماژول SRF-05 یک پایه (out) به ماژول اضافه شده است که ما به استفاده از آن نیازی نداریم ، برای این پروژه هر دو ماژول را می توانید بر روی سوکت قرار دهید و هیچ تفاوتی ندارند تنها یک جامپر به برد پروژه اضافه شده است که با توجه به نوع ماژول در جای خودش قرار میگیرد ( در آموزش توضیح داده شده است ) ، برنامه نویسی این پروژه با زبان بسیک و با کامپایلر BASCOM-AVR انجام گرفته است ، برنامه نویسی این پروژه به ساده ترین روش ممکن صورت گرفتته است و به واضع ترین و ساده ترین روش خط به خط برنامه توضیح داده شده است ، فرمول های لازم و اعداد به کار رفته در برنامه بصورت کامل توضیح داده شده اند که در هیچ جای دیگر نمی توانید این اطلاعات کامل را کسب کنید ، قبلا پروژه التراسونیک با ماژول SRF05 را در سایت قرار داده بودیم که بسیار مورد استقبال کاربران قرار گرفت و این پروژه را به در خواست کاربران که در خواست کرده بودند در سایت قرار و برنامه نویسی آن به کل تغییر کرده است و ساده و روان شده است ، همچنین PCB بسیار ظریف و زیبایی برای آن طراحی کرده ایم و اطلاعات کامل آن را در قالب word برای کاربران گرامی قرار داده ایم
همان طور که در تصویر بالا می بینید دقت اندازه گیری آن بسیار زیاد است و فاصله را تا 2 رقم اعشاری نشان می دهد واحد اندازه گیری سانتی متر است ، نحوه کار کرد ماژول التراسونیک SRF-05 و HC-04 به این صورت است که ابتدا یک پالس 10 – 15 میلی ثانیه به ماژول اعمال می کنیم و ماژول هم یک پالس 100 تا 150 میلی ثانیه به ما می دهد که با اندازه گیری همین پالس حتی بدون نیاز به دانستن سرعت صوت در هوا می توان فاصله را محاسبه کرد
این هم فیلمی از عملکرد پروژه التراسونیک :
دانلود ویدیو با کیفیت فول اچ دی (19 مگابایت)
فایل های ضمیمه شده برای این پروژه:
اینترنت اشیاء یکی از پدیده های جدید در سالهای اخیر (2014 و 2015) به شمار می رود که در نمایشگاه CES2015 نمونه های فراوانی از آن به چشم می خورد. و منظور از آن اینست که هر شیئی در دنیای فیزیکی به شبکه جهانی اینترنت متصل شود یا تمام اشیاء با یکدیگر شبکه شده و به اینترنت متصل شوند و در نهایت بتوان تمام اشیاء را از طریق اینترنت کنترل و مانیتور کرد. منظور از اشیاء، دستگاه های الکتریکی و الکترونیکی مانند سیستم تهیه هوا، پنکه، لامپ، سنسور دما، دزدگیر، درب منزل و غیره می باشد. با این ایده تمام سیم کشی های اضافی و شبکه های رنگارنگ خاص که برای سیستم های حفاظتی، اعلام حریق، درب بازکن منزل، تلفن داخلی، روشنایی ساختمان و غیره کشیده می شود حذف شده و تمام این ها از طریق اینترنت به یکدیگر متصل می شوند (تقریباً می توان گفت تمام وسیله ها مثل دوربین های جدید IP به اینترنت متصل شده و از طریق اینترنت کنترل می شوند).
ممکن است تصور کنید برای متصل کردن هر وسیله ساده مثل لامپ به اینترنت نیاز به کابل شبکه و مودم و یک میکرو کامپیوتر داریم که کار را مشکل و گران می کند؛ اما شرکت های مختلف ماژول های کوچکی را برای این منظور طراحی کرده اند. یکی از این ماژول ها که ESP8266 نامیده می شود از یک آی سی با همین نام استفاده می کند و در واقع یک ماژول وای فای(WiFi)کامل به همراه تمام بخش های نرم افزاری و پشته پروتکل داخلی TCP/IP می باشد که با قیمت کم (در حدود 5$) ارائه می شود و با پروتکل سریال (رابط RS232 یا TTL) می توان آن را به یک میکروکنترلر کوچک AVR متصل کرد.

ماژول ESP8266 در دو حالت قابل استفاده است. حالت اول که ما از آن برای اینترنت اشیاء استفاده کرده ایم حالت Station می باشد که پس از تنظیمات لازم بصورت خودکار مودم ADSL را پیدا کرده و خود را به شبکه جهانی اینترنت متصل می کند. حالت دوم هم مد Access Point است که می توان با موبایل یا تبلت ماژول را جستجو کرد و به آن متصل شد و عموماً برای ساخت ریموت های تنها و بدون نیاز به اینترنت بکار می رود که از این مد صرفنظر کرده ایم.
قسمت مهم دیگر در اینترنت اشیاء یک وبسایت اینترنتی برای کنترلینگ و مانیتورینگ دستگاه ها می باشد. ما وبسایت رایگان iot.avr64.com را برای همین منظور طراحی کرده ایم. با ورود به این وبسایت و ثبت نام و ایجاد یک حساب کاربری می توانید دستگاه های خود را کنترل و مانیتور نمایید. (برای سفارش طراحی وبسایت های شخصی و قدرتمند تر با ما تماس بگیرید:
- قیمت پایه همین وبسایت: 240 هزار تومان، به ازای افزایش هر کانال 20 هزار تومان به قیمت پایه اضافه می گردد).
این سایت بعنوان یک سرور رایگان و همیشه آنلاین برای ارتباط با اشیاء طراحی شده است. اشیائی که ممکن است هر لحظه اطلاعات سنسور دمای خود را به سمت سرور ارسال کنند و یا آخرین وضعیت تنظیم شده رله خود را از سرور بخوانند. ما برای طراحی این سایت سه ایده کلی در نظر گرفته ایم.
ایده اول قابلیت روشن و خاموش کردن یک دستگاه است. برای این منظور بایستی بتوانیم مقدار یک فیلد متنی را در دیتابیس سایت روی دو مقدار 0 و 1 یا off و on قرار دهیم. در طرف دیگر دستگاه در فواصل زمانی مشخص مثلاً هر 5 ثانیه یکبار فیلد را بررسی میکند و بر اساس مقدار آن رله خود را روشن یا خاموش می نماید. از طرفی باید از روشن یا خاموش شدن دستگاه مطمئن شویم و به عبارتی از دستگاه Delivery دریافت کنیم. برای همین منظور فیلد دیگری به نام "وضعیت واقعی دستگاه" در نظر گرفته ایم که دستگاه پس از روشن یا خاموش شدن، مقدار این فیلد را آپدیت می کند.
دستگاه ما برای خواندن وضعیت رله خود بایستی URL زیر با با متد GET پردازش کند:
iot.avr64.com/read.php?u=test@avr64.com&p=123456&r=field_1
در URL بالا در برنامه میکرو بایستی جلوی u یوزرنیم که همان ایمیل ثبت نامی در سایت iot.avr64.com است را نوشته و در جلوی p پسورد خود را بنویسید در جلوی r هم فقط کلمات field_1 و field_2 با رعایت کوچک بودن حروف نوشته می شود و به دو کانال دستگاه یا دو دستگاه جدا اشاره دارد. (طبق سفارش می توان بینهایت کانال در وبسایت تعریف کرد). URL بالا را می توانید در مرورگر کامپیوتر نیز paste کرده و پس از Enter نتیجه را که کلمات on یا off می باشد مشاهده نمایید.
ایده دیگر کلیدی شبیه به ولوم برای کم و زیاد کردن شدت نور یا مقدار آب یا صدا می باشد که می توان طبق سفارش در وبسایت چنین بخشی را اضافه کرد (بجای روشن و خاموش مطلق).
در بخش Delivery، برنامه Bascom پس از خواندن لینک بالا و دریافت مقدار on یا off و تغییر وضعیت رله بایستی URL(های) زیر را پردازش کرده و وضعیت جاری خود را برای سرور ارسال کند:
iot.avr64.com/write.php?u=test@avr64.com&p=123456&f=state_1&v=off
يا:
iot.avr64.com/write.php?u=test@avr64.com&p=123456&f=state_1&v=on
در این URL همانند URL بالا مقدار u و p همان یوزر و پسورد بوده و مقدار جلوی f کلمات state_1 برای فیلد یک و یا state_2 برای فیلد دو می باشد. مقدار جلوی v هم یکی از دو کلمه on یا off است که وضعیت کنونی دستگاه را برای سرور ارسال می کند و میتوانیم آن را در فیلد "وضعیت واقعی دستگاه" در اکانت خود مشاهده کنیم.
ایده دوم دستگاهی است که مقدار سنسور دما، رطوبت، سرقت، حرکت و یا هر چیز دیگری را به صورت آنلاین برای سرور ارسال می کند. فرض کنید نیاز به دستگاهی دارید که دمای یک گلخانه را بصورت آنلاین برای شما ارسال کند و در هر لحظه دمای مکان مورد نظر را بر روی مانیتور ببینید. بر اساس این ایده بخشی به نام سنسور شماره ۱ و سنسور شماره ۲ در نظر گرفته ایم که دستگاه می تواند با پردازش URL زیر مقدار هر برچسب را بروز کند:
iot.avr64.com/write.php?u=test@avr64.com&p=123456&f=label_1&v=25.6
در URL بالا مقادیر u و p همانند قبل بوده، مقدار f فقط برابر label_1 یا label_2 با رعایت کوچک بودن حروف برای سنسور یک و دو می باشد و مقدار جلوی v هم مقدار عددی یا حرفی سنسور است.
ایده سوم تقریباً شبیه به بخش قبل بوده و برای نمایش اطلاعات سنسورهای دما و غیره می باشد، ولی تفاوت آن با بخش قبل اینست که تمام اطلاعات دریافتی Log شده و در یک textarea نشان داده می شود. کاربر می تواند اطلاعات دمایی یا هر نوع اطلاعات خاص را در یک بازه ذخیره کرده و پس از کپی از وبسایت برای رسم نمودار یا تحقیقات آماری از آن استفاده نماید. برای ارسال اطلاعات بایستی URL زیر پردازش شود:
www.iot.avr64.com/write2.php?u=test@avr64.com&p=123456&v=35.6
در URL بالا سایر بخش ها همانند قبل می باشد و مقدار v برابر با اطلاعات سنسور است.
برای پاک کردن Log نیز می توانید URL زیر را از طریق دستگاه و یا مرورگر کامپیوتر پردازش کنید:
www.iot.avr64.com/clear2.php?u=test@avr64.com&p=123456&v=cls
توجه داشته باشید که در تمام URL ها تمام حروف کوچک بوده و اسکریپت های سایت به کوچک و بزرگ بودن حروف حساس می باشند.
وبسایت اینترنت اشیاء با تکنولوژی AJAX طراحی شده که بصورت خودکار هر چند ثانیه یکبار رفرش می شود و در صورت باز بودن مرورگر همیشه اطلاعات آنلاین نمایش داده خواهد شد.
وبسایت اینترنت اشیاء با زبان php و دیتابیس mySQL طراحی شده که بر روی سرورهای Linux بخوبی عمل می کند.
سایز فیلدها در دیتابیس به شرح زیر است:
ممکن است ایده های دیگری نیز وجود داشته باشد که می توانید از طریق بخش تماس با ما برای ما ارسال کنید و یا برای وبسایت شخصی خود سفارش دهید.
در تصاویر زیر نمونه آزمایشی پروژه اینترنت اشیا با استفاده از ماژول اینترنت ESP8266 مشاهده می شود که برای تجسم واقعی کنترل از طریق اینترنت از یک قوری برقی به عنوان شی متصل به شبکه جهانی اینترنت استفاده شده و وضعیت آن از طریق اینترنت از هر نقطه از جهان قابل کنترل می باشد.

در بخش میکرو هم برنامه ای به زبان بیسیک و با کامپایلر بسکام یا بیسکام (BASCOM-AVR) نوشته شده است که با ماژول ارتباط برقرار کرده و دستگاه را از طریق ماژول به اینترنت و البته به سایت iot.avr64.com متصل می کند. با ورود به سایت مذکور و حساب کاربری خود می توانید رله دستگاه را روشن و خاموش کرده و اطلاعات سنسورها را بصورت آنلاین مشاهده نمایید. میکروکنترلر فوق میکروی ATmega8A می باشد که پسوند A مهم بوده و سبب می شود میکرو با ولتاژ 3.3 ولت راه اندازی شود. نکته مهم در راه اندازی ماژول ESP8266 اینست که ولتاژ کاری این ماژول 3.3 ولت بوده و پایه های TX و RX آن نیز تحمل ولتاژ بالاتر از 3.3 ولت را ندارند و به همین دلیل میکرو با ولتاژ 3.3 ولت راه اندازی شده است ولی LCD با ولتاژ 5 ولت راه اندازی شده و از نظر ارتباط با میکروی 3.3 ولتی هیچ مشکلی نخواهد داشت. آپدیت: 18/06/1394 : در آپدیت جدید از میکروی ATmega8 معمولی بدون پسوند A هم می توان استفاده کرد، چرا که میکرو در این آپدیت با ولتاژ 5 ولت راه اندازی شده است و بخاطر مشکلاتی که بعضی از LCD ها با I/Oی 3.3 ولتی میکرو داشتند مجبور به تغییر سخت افزار شدیم. شایان ذکر است در این نسخه برای جلوگیری از آسیب دیدن ماژول وای فای ESP8266 پایه RX این ماژول با مقاومت های 3.3 و 2.2 کیلو تا سطح 3.3 ولت پایین نگهداشته شده است.
در تصویر زیر شماتیک مربوط به پروژه راه اندازی ماژول Wifi وای فای ESP8266 مشاهده می شود:
برنامه راه اندازی این ماژول با صرف زمان و هزینه زیادی نوشته شده است، به همین منظور فایل Hex و Bin دموی این برنامه بصورت رایگان برای دانلود قرار داده شده که پس از دانلود و بارگذاری در میکروکنترلر ATmega8 و جواب گرفتن از آن می توانید سورس کد اصلی برنامه به زبان بیسیک (Bascom) را از انتهای همین صفحه خریداری نمایید. شایان ذکر است که دو فایل Hex و Bin با نام های IoT4_demo_115200.hex و IoT4_demo_9600.hex و پسوند bin در پوشه دانلود قرار داده شده است. بسته به پروگرامر خود فایل Hex یا Bin را در میکرو پروگرم کنید. فایل IoT4_demo_115200 برای باود ریت 115200 تنظیم شده و فایل دیگر برای باود ریت 9600. بسته به نوع ماژول ممکن است با یکی از باودریتها قادر به ارتباط با ماژول شوید. این فایلها فقط Demo بوده و صحت سخت افزار بسته شده و سالم بودن ماژول را چک میکنند. پس از بارگزاری فایل بایستی خروجی زیر را روی LCD ببینید که ماژول در پاسخ AT از طرف میکرو جواب OK را داده است. کاراکترهای بین حروف کاراکتر LF می باشد که برای نمایش کاراکتر پایان خط Line Feed طراحی شده است.

تمام نکات بالا در برنامه نوشته شده با بیسکام رعایت شده و ماه ها وقت برنامه نویس را گرفته است. برای نوشتن این برنامه مجبور به مطالعه کتب تخصصی شبکه و اطلاعاتی در خصوص نحوه عملکرد web server ها و سرورهای اشتراکی و درخواست های HTTP و متدهای GET و POST و غیره شدیم و به همین دلیل امیدواریم دلیل پولی بودن سورس این پروژه را درک کنید و با خرید و تعهد بابت عدم پخش آن در اینترنت از برنامه نویس حمایت نمایید.
یکی از دلایل عدم کارکرد صحیح برنامه ها و یا عملکرد دور از انتظار یک دستگاه، برنامه نویسی غیر اصولی می باشد. در این مقاله تصمیم داریم چند مورد از اشتباهات رایج در زبان برنامه نویسی BASIC و کامپایلر BASCOM را بررسی نماییم.
یکی از روش های ساده و غیر اصولی در برنامه نویسی استفاده از دستور Goto و پرش به Label های مختلف است. این روش بدلیل اینکه در آموزش طراحی الگوریتم برنامه ها مورد استفاده قرار میگیرد به اشتباه در برنامه های اولیه برنامه نویسان نیز استفاده می شود. مثلا در نوشتن الگوریتم برای دریافت عدد از کاربر و نمایش آن معمولا نوشته می شود:
۱- شروع
۲- دریافت عدد
۳- چاپ عدد
۴- برو به ۲
۵- پایان
این الگوریتم ممکن است در اولین پیاده سازی به همان صورتی که هست توسط برنامه نویس مبتدی نوشته شود و به دلیل جالب بودن و سادگی استفاده از دستور Goto (برو به) این دستور در سایر برنامه ها نیز توسط برنامه نویس بکار رود و نتیجه آن در برنامه های بزرگتر منجر به ایجاد کدی پیچیده گردد که به کد اسپاگتی (ماکارونی) مشهور است و چنین کدی موقع بررسی کاملاً ناخوانا بوده و اصلاح آن توسط فرد دیگر بسیار مشکل است.
علاوه بر Goto گاهی اوقات از دستورات اسمبلی JMP و RJMP هم استفاده می شود که کمی از Goto خطرناک تر می باشد؛ چرا که این دستورات تا مقدار خاصی از حافظه قدرت پرش داشته و اگر فاصله برچسب از این دستورات از حد خاصی بیشتر باشد منجر به خطاهای غیر عادی خواهد شد. در کل توصیه ما اینست که تا حد امکان از دستورات پرش در برنامه خود استفاده نکنید و بجای نوشتن کدهای پیوسته برنامه را به قطعاتی معنا دار به نام زیر برنامه، برچسب و تابع تبدیل کنید و آن ها را در مواقع خاص فراخوانی نمایید.
یکی از روش های ساده برای نوشتن برنامه های ساختیافته یا ماژولار استفاده از برچسب برای مجموعه کدهای خاص و فراخوانی آن در بخش های مختلف برنامه است. این کار در درجه اول خوانایی برنامه را بیشتر کرده و در درجه دوم به دلیل استفاده اشتراکیِ سایر بخش های برنامه از یک کد واحد از طول برنامه می کاهد و برنامه را کوچکتر و سبک تر می کند. برای نوشتن یک برچسب در BASCOM بایستی از ساختار زیر استفاده کنید:
Label:
your code
Return
مثال:
Write_msg:
Cls
Home
Lcd"salam"
Return
در این ساختار Label یک نام دلخواه است که بایستی با یک حرف شروع شده و حداکثر طول آن 32 کاراکتر باشد. تا حد امکان نام برچسب را با آندرلاین _ شروع نکنید. همچنین نام برچسب نباید با عدد شروع شود و استفاده از کاراکترهای خاص مثل + و - و * و / و . و ... هم ممنوع است. ضمناً از نام های رزرو شده کامپایلر مثل Print و ... که معمولا به محض نوشتن به رنگ آبی پررنگ تبدیل می شود استفاده نکنید. نام هایی مثل Ali، my_prog1، s4 و غیره نام های مناسبی است.
your code کد مورد نظر شماست که قرار است کار خاصی را انجام دهد.
Return نیز به معنای بازگشت بوده و سبب بازگشت خودکار برنامه به جایی می شود که از آنجا پرش کرده است.
نکته مهم در خصوص لیبل آنست که این برچسب ها بایستی پس از دستور End برنامه نوشته شده و حتماً با دستور Gosub فراخوانی گردند. لیبل ها برای اجرای کدهایی استفاده می شوند که کار خاصی را انجام داده و نه متغیر به عنوان ورودی می پذیرند و نه خروجی خاصی را باز میگردانند. هرگز برچسب های منتهی به Return را با دستورات Goto و Call فراخوانی نکنید.
یکی دیگر از روش های ایجاد زیر برنامه استفاده از سابروتین می باشد. سابروتین ها خاصیت ویژه های برای پذیرش متغیر داشته و معمولاً در زیربرنامه هایی که بایستی یک عدد یا متن را دریافت کرده و با استفاده از آن کار خاصی را انجام دهند مورد استفاده قرار می گیرد. برای نوشتن سابروتین بایستی قبل از فراخوانی آن و معمولاً در ابتدای برنامه دقیقاً پس از Regfile$ آن ها را معرفی نمود. معرفی Subroutine با استفاده از دستور Declare صورت می گیرد.
مثال:
$regfile="m8def.dat"
$crystal= 1000000
$hwstack= 32
$swstack= 32
$framesize= 32
Declaresub my_prog(byval x asbyte,byval y asbyte)
call my_prog(2,3)
end
sub my_prog(byval x asbyte,byval y asbyte)
local z asbyte
z = x + y
cls
home
lcd"x+y="; z
endsub
در نمونه کد بالا یک سابروتین به نام my_prog تعریف کرده ایم که دو عدد را به عنوان ورودی گرفته و مجموع آنها را در خروجی چاپ می کند. توجه داشته باشید که سابروتین بر خلاف تابع چیزی را بر نمی گرداند و عملیات چاپ بایستی در داخل سابروتین انجام پذیرد.
همانطوریکه در کد بالا مشاهده می فرمایید در ابتدا نوع میکرو و فرکانس کاری مشخص شده است. سپس با دستورات بعدی اندازه پشته سخت افزاری، پشته نرم افزاری و فریم را تعیین کرده ایم. این موارد بسار مهم بوده و توضیح آنها در مقاله "AVR نویز پذیر نیست" شرح داده شده است. در خط بعدی با استفاده از دستور Declare یک سابروتین به نام my_prog تعریف کرده ایم که در جلوی آن یک جفت پرانتز باز و بسته وجود داشته و دو متغیر x و y با پیشوند byval به جای Dim تعریف شده اند. تعریف متغیر در داخل پرانتزهای سابروتین کاملاً اختیاری بوده و می توانید سابروتینهایی بدون متغیر و بدون ورودی بنویسید که در این صورت بایستی یک جفت پرانتز خالی در جلوی سابروتین قرار داده شود، هرچند در این صورت بهتر است از لیبل بجای سابروتین استفاده گردد چرا که ویژگی اصلی سابروتین در این است که می تواند ورودی گرفته و آن را به زیر برنامه انتقال دهد. برای تعریف متغیرهای ورودی سابروتین از پیشوندهای Byval و Byref بجای Dim استفاده می شود. Byval به معنای "مقدار" بوده و هنگامی که از این پیشوند استفاده می کنیم هر ورودی که به سابروتین داده می شود یک کپی از آن تهیه شده (در فضای Frame) و کپی متغیر به زیر برنامه ارسال می شود. در این صورت اگر به اشتباه یا به دلخواه متغیر مورد نظر در زیر برنامه تغییر کند، متغیر اصلی دست نخورده باقی می ماند. با استفاده از این روش براحتی می توانید اعداد ثابت را نیز به سابروتین ارسال کنید. توجه داشته باشید که این روش سربار زیادی برای برنامه داشته و بایستی اندازه Frame را به اندازه حداکثر مقدار ورودی های سابروتین های همزمان فعال برنامه (برحسب بایت) قرار دهید. در ضمن این روش ممکن است باعث کندی اجرای برنامه ها گردد.
روش دیگر استفاده از پیشوند Byref می باشد. Byref به معنای رفرنس یا ارجاع بوده و آدرس متغیر نوشته شده در دستور فراخوانی به زیر برنامه ارسال می گردد. در موقع استفاده از این روش نمی توانید سابروتین را با اعداد ثابت فراخوانی کنید و نوشتن دستوری مثل call my_prog(1,2) منجر به خطا خواهد شد. روش فوق برای مواقعی استفاده می شود که سرعت اجرا مهم بوده، بهم ریختن احتمالی متغیر ورودی چندان اهمیتی نداشته و سایز متغیر های ورودی بزرگ و تعداد آنها زیاد می باشد و نیز فضای SRAM کافی برای Frame در اختیار نیست. در هر صورت معمولاً از روش اول یعنی Byref استفاده می شود تا بتوان اعداد ثابت را نیز به سابروتین انتقال داد.
برای فراخوانی سابروتین ها حتماً بایستی از دستور Call استفاده گردد. متاسفانه در بسیاری از کدهای نوشته شده با بسکام مشاهده میکنیم که سابروتین ها با دستور Gosub فراخوانی شده اند! این روش کاملاً اشتباه بوده و ممکن است منجر به خطاهای ظریف منطقی گردد.
در نمونه کد بالا پس از تعریف و فراخوانی سابروتین، دقیقاً پس از دستور end کد اصلی سابروتین که به آن بدنه سابروتین نیز گفته می شود نوشته شده است. ترتیب نوشتن سابروتین ها مهم نبوده و می توان آنها را به هر ترتیب دلخواهی پس از دستور End نوشت. بدنه یک سابروتین با دستور sub شروع شده و در جلوی آن نام سابروتین به همراه تعریف متغیرها قرار می گیرد. می توانید تعریف سابروتین را از ابتدای برنامه کپی کرده و Declare را با Sub عوض کنید و آن را در این قسمت Paste نمایید. هر سابروتین با دستور end sub پایان می یابد. یکی از ویژگیهای خاص سابروتین ها امکان تعریف متغیر در داخل آنها می باشد. ما در این سابروتین متغیری به نام z از نوع Byte تعریف کرده و مجموع متغیرهای x و y را در آن ذخیره نموده ایم و در نهایت آن را نمایش داده ایم. برای تعریف متغیر در داخل سابروتین بایستی از پیشوند Local بجای Dim استفاده گردد. Local به معنای محلی بوده و متغیرهای اینچنینی فقط موقع فراخوانی سابروتین ایجاد می گردند و با رسیدن به دستور End Sub از حافظه پاک می شوند. توجه داشته باشید که تعریف آرایه و بیت به عنوان متغیر لوکال یا محلی ممنوع است. در کل با استفاده از این قابلیت می توان مدیریت بهتری بر روی SRAM داشت و با میکروهای کم حافظه و کوچک کارهای بزرگی انجام داد.
آخرین روش برای نوشتن زیر برنامه های خاص محاسباتی که اعداد یا حروفی را به عنوان ورودی گرفته و یک مقدار به عنوان خروجی بر می گردانند استفاده از تابع است. توابع یا فانکشن ها تقریباً شبیه به سابروتین ها می باشند اما قادرند که یک مقدار را به عنوان خروجی بازگردانند.
مثال:
$regfile="m8def.dat"
$crystal= 1000000
$hwstack=32
$swstack=32
$framesize=32
DeclareFunction Addnum(byval X AsByte,Byval Y AsByte)AsByte
Dim I AsByte
Cls
Home
I = Addnum(1 , 2)
Lcd I
end
Function Addnum(byval X AsByte,Byval Y AsByte)AsByte
local z asbyte
z = x + y
Addnum = Z
EndFunction
نمونه کد بالا نحوه تعریف یک تابع به نام Addnum را نمایش می دهد که دو عدد ورودی را با یکدیگر جمع کرده و نتیجه را در متغیر Addnum که همان نام تابع می باشد ذخیره می کند. نحوه تعریف تابع تقریباً مشابه Sub است با این تفاوت که به جای Sub از Function استفاده شده است. همچنین پس از پرانتزهای جلوی تابع مجدداً عبارت as byte نوشته شده است. این عبارت آخر نوع خروجی تابع را مشخص می کند و نام تابع به عنوان متغیر خروجی شناخته می شود.
برای فراخوانی تابع به هیچ پیشوندی نیاز نیست. در نمونه کد بالا می بینیم که نام تابع به همراه ورودی های آن که اعداد 1 و 2 است به طور مستقیم فراخوانی شده و نتیجه آن در متغیر I قرار داده شده و سپس متغیر I در جلوی LCD قرار داده شده است. در این برنامه موقع اجرا، نام تابع با عدد 3 جایگزین شده و در نمایشگر کریستال مایع نشان داده می شود.
بدنه تابع نیز تقریباً شبیه به سابروتین می باشد با این تفاوت که با کلمه کلیدی function و پس از آن نام تابع و متغیرها و نوع تابع شروع شده و با End Function پایان می یابد. در تابع نیز می توان از متغیر های Local یا محلی با همان شرایط سابروتین استفاده کرد. نکته مهم در توابع اینست که نتیجه نهایی بایستی در نام تابع ذخیره شده و بدین صورت به خروجی بازگردد و بهتر است که این دستور در انتهای تابع و قبل از اتمام بدنه تابع نوشته شود.
به عنوان یک نکته مهم در خصوص سابروتین ها و توابع سعی کنید که از فراخوانی تو در تو پرهیز کنید. این کار موجب پر شدن سریع پشته نرم افزاری شده و برنامه به سرعت هنگ می کند. هر تابع یا سابروتین باید پس از فراخوانی به طور کامل اجرا شده و به انتها برسد و سپس تابع یا سابروتین بعدی اجرا گردد. همچنین توجه داشته باشید که اگر تابع یا سابروتینی را فراخوانی کردید و در داخل آن تابع دیگری را صدا زدید پس از اجرای تابع دوم مجدداً دستور به جایی که از آن قسمت فراخوانی شده بود (در داخل تابع اول) باز میگردد و سپس به جایی که تابع اول فراخوانی شده بود برمی گردد. یعنی در واقع با هر فراخوانی، آدرس تابع در فضایی به نام Stack که همان پشته نرم افزاری نام دارد قرار داده شده (مثل چیدن بشقاب ها روی یکدیگر) و پس از پایان یافتن تابع، آدرس آن از پشته حذف می شود، (مثل برداشتن بشقاب ها از روی یکدیگر).
یک برنامه ساختیافته باید از الگوی زیر پیروی کند:
$refile
$...
$...
Declare sub s1(byval i as byte, byval j as byte)
Declare Function f1(byval i as byte, byval j as byte) as byte
Do
حلقه اصلی برنامه
call s1()
gosub test
x = f1()
..
.
Loop
End
sub s1(byval i as byte, byval j as byte)
...
end sub
function f1(byval i as byte, byval j as byte) as byte
...
f1 = ...
end function
test:
...
return
در الگوی بالا قبل از دستور End یک حلقه نامحدود نوشته شده است که برنامه کنترلی داخل آن نوشته می شود. برنامه کنترلی عموماً یک برنامه کوچک بوده و وظیفه آن صدا زدن توابع، سابروتین ها و برچسب ها می باشد و عموماً با استفاده از دستورات شرطی کارهای خاصی را انجام می دهد. اشکال زدایی برنامه کوچی مانند آن بسیار راحت تر از برنامه های پشت سر هم بوده و سرعت بررسی و تغییر برنامه به مراتب بیشتر می شود. مثلاً در یک برنامه ساعت در داخل حلقه وضعیت فشردن کلید های تنظیم بررسی می شود و سابروتین افزایش ثانیه، هر ثانیه یکبار توسط اینتراپت تایمر فراخوانی می شود. در این صورت برنامه به طور دائم در داخل حلقه Do..Loop گردش داشته و "زنده" است. اگر Do..Loop نوشته نشود برنامه به محض اجرا به End رشیده و متوقف می شود و در این صورت نه اینتراپت تایمر جواب می دهد و نه می توان کار دیگری را انجام داد. پس همیشه قبل از دستور End بایستی یک حلقه نامحدود نوشته شود تا CPU را در وضعیت فعال نگه دارد. برنامه کنترلی نیز در داخل این حلقه قرار داده می شود و بایستی بسیار واضح بوده و دارای کامنت و توضیحات کامل باشد.
با نوشتن برنامه ها بصورت ماژولار براحتی می توانید برنامه خود را عیب یابی کرده و کد خوانایی طراحی کنید تا هر فردی بتواند آن را بررسی و ویرایش نماید. همچنین موقع نوشتن برنامه های جدید براحتی می توانید از ماژول های از پیش نوشته شده در برنامه های خود استفاده کنید و سرعت نوشتن برنامه های جدید را دو چندان نمایید. توجه داشته باشید که برنامه نویسی ساختیافته یا پیمانه ای یکی از روش های جدید برنامه نویسی می باشد که بسیار بهتر از روش های کلاسیک و پشت سر هم است. روش دیگری نیز در برنامه نویسی وجود داشته که به برنامه نویسی شی گرا یا OOP مشهور است. در این نوع برنامه نویسی قسمت های مختلف به اشیاء تبدیل شده و برای هر شی یک کلاس نوشته می شود. متاسفانه در کامپایلری مثل BASCOM این قابلیت پشتیبانی نشده و فقط می توان از برنامه نویسی ساختیافته استفاده نمود.یکی از دلایل عدم کارکرد صحیح برنامه ها و یا عملکرد دور از انتظار یک دستگاه، برنامه نویسی غیر اصولی می باشد. در این مقاله تصمیم داریم چند مورد از اشتباهات رایج در زبان برنامه نویسی BASIC و کامپایلر BASCOM را بررسی نماییم.
یکی از روش های ساده و غیر اصولی در برنامه نویسی استفاده از دستور Goto و پرش به Label های مختلف است. این روش بدلیل اینکه در آموزش طراحی الگوریتم برنامه ها مورد استفاده قرار میگیرد به اشتباه در برنامه های اولیه برنامه نویسان نیز استفاده می شود. مثلا در نوشتن الگوریتم برای دریافت عدد از کاربر و نمایش آن معمولا نوشته می شود:
۱- شروع
۲- دریافت عدد
۳- چاپ عدد
۴- برو به ۲
۵- پایان
این الگوریتم ممکن است در اولین پیاده سازی به همان صورتی که هست توسط برنامه نویس مبتدی نوشته شود و به دلیل جالب بودن و سادگی استفاده از دستور Goto (برو به) این دستور در سایر برنامه ها نیز توسط برنامه نویس بکار رود و نتیجه آن در برنامه های بزرگتر منجر به ایجاد کدی پیچیده گردد که به کد اسپاگتی (ماکارونی) مشهور است و چنین کدی موقع بررسی کاملاً ناخوانا بوده و اصلاح آن توسط فرد دیگر بسیار مشکل است.
علاوه بر Goto گاهی اوقات از دستورات اسمبلی JMP و RJMP هم استفاده می شود که کمی از Goto خطرناک تر می باشد؛ چرا که این دستورات تا مقدار خاصی از حافظه قدرت پرش داشته و اگر فاصله برچسب از این دستورات از حد خاصی بیشتر باشد منجر به خطاهای غیر عادی خواهد شد. در کل توصیه ما اینست که تا حد امکان از دستورات پرش در برنامه خود استفاده نکنید و بجای نوشتن کدهای پیوسته برنامه را به قطعاتی معنا دار به نام زیر برنامه، برچسب و تابع تبدیل کنید و آن ها را در مواقع خاص فراخوانی نمایید.
یکی از روش های ساده برای نوشتن برنامه های ساختیافته یا ماژولار استفاده از برچسب برای مجموعه کدهای خاص و فراخوانی آن در بخش های مختلف برنامه است. این کار در درجه اول خوانایی برنامه را بیشتر کرده و در درجه دوم به دلیل استفاده اشتراکیِ سایر بخش های برنامه از یک کد واحد از طول برنامه می کاهد و برنامه را کوچکتر و سبک تر می کند. برای نوشتن یک برچسب در BASCOM بایستی از ساختار زیر استفاده کنید:
Label:
your code
Return
مثال:
Write_msg:
Cls
Home
Lcd"salam"
Return
در این ساختار Label یک نام دلخواه است که بایستی با یک حرف شروع شده و حداکثر طول آن 32 کاراکتر باشد. تا حد امکان نام برچسب را با آندرلاین _ شروع نکنید. همچنین نام برچسب نباید با عدد شروع شود و استفاده از کاراکترهای خاص مثل + و - و * و / و . و ... هم ممنوع است. ضمناً از نام های رزرو شده کامپایلر مثل Print و ... که معمولا به محض نوشتن به رنگ آبی پررنگ تبدیل می شود استفاده نکنید. نام هایی مثل Ali، my_prog1، s4 و غیره نام های مناسبی است.
your code کد مورد نظر شماست که قرار است کار خاصی را انجام دهد.
Return نیز به معنای بازگشت بوده و سبب بازگشت خودکار برنامه به جایی می شود که از آنجا پرش کرده است.
نکته مهم در خصوص لیبل آنست که این برچسب ها بایستی پس از دستور End برنامه نوشته شده و حتماً با دستور Gosub فراخوانی گردند. لیبل ها برای اجرای کدهایی استفاده می شوند که کار خاصی را انجام داده و نه متغیر به عنوان ورودی می پذیرند و نه خروجی خاصی را باز میگردانند. هرگز برچسب های منتهی به Return را با دستورات Goto و Call فراخوانی نکنید.
یکی دیگر از روش های ایجاد زیر برنامه استفاده از سابروتین می باشد. سابروتین ها خاصیت ویژه های برای پذیرش متغیر داشته و معمولاً در زیربرنامه هایی که بایستی یک عدد یا متن را دریافت کرده و با استفاده از آن کار خاصی را انجام دهند مورد استفاده قرار می گیرد. برای نوشتن سابروتین بایستی قبل از فراخوانی آن و معمولاً در ابتدای برنامه دقیقاً پس از Regfile$ آن ها را معرفی نمود. معرفی Subroutine با استفاده از دستور Declare صورت می گیرد.
مثال:
$regfile="m8def.dat"
$crystal= 1000000
$hwstack= 32
$swstack= 32
$framesize= 32
Declaresub my_prog(byval x asbyte,byval y asbyte)
call my_prog(2,3)
end
sub my_prog(byval x asbyte,byval y asbyte)
local z asbyte
z = x + y
cls
home
lcd"x+y="; z
endsub
در نمونه کد بالا یک سابروتین به نام my_prog تعریف کرده ایم که دو عدد را به عنوان ورودی گرفته و مجموع آنها را در خروجی چاپ می کند. توجه داشته باشید که سابروتین بر خلاف تابع چیزی را بر نمی گرداند و عملیات چاپ بایستی در داخل سابروتین انجام پذیرد.
همانطوریکه در کد بالا مشاهده می فرمایید در ابتدا نوع میکرو و فرکانس کاری مشخص شده است. سپس با دستورات بعدی اندازه پشته سخت افزاری، پشته نرم افزاری و فریم را تعیین کرده ایم. این موارد بسار مهم بوده و توضیح آنها در مقاله "AVR نویز پذیر نیست" شرح داده شده است. در خط بعدی با استفاده از دستور Declare یک سابروتین به نام my_prog تعریف کرده ایم که در جلوی آن یک جفت پرانتز باز و بسته وجود داشته و دو متغیر x و y با پیشوند byval به جای Dim تعریف شده اند. تعریف متغیر در داخل پرانتزهای سابروتین کاملاً اختیاری بوده و می توانید سابروتینهایی بدون متغیر و بدون ورودی بنویسید که در این صورت بایستی یک جفت پرانتز خالی در جلوی سابروتین قرار داده شود، هرچند در این صورت بهتر است از لیبل بجای سابروتین استفاده گردد چرا که ویژگی اصلی سابروتین در این است که می تواند ورودی گرفته و آن را به زیر برنامه انتقال دهد. برای تعریف متغیرهای ورودی سابروتین از پیشوندهای Byval و Byref بجای Dim استفاده می شود. Byval به معنای "مقدار" بوده و هنگامی که از این پیشوند استفاده می کنیم هر ورودی که به سابروتین داده می شود یک کپی از آن تهیه شده (در فضای Frame) و کپی متغیر به زیر برنامه ارسال می شود. در این صورت اگر به اشتباه یا به دلخواه متغیر مورد نظر در زیر برنامه تغییر کند، متغیر اصلی دست نخورده باقی می ماند. با استفاده از این روش براحتی می توانید اعداد ثابت را نیز به سابروتین ارسال کنید. توجه داشته باشید که این روش سربار زیادی برای برنامه داشته و بایستی اندازه Frame را به اندازه حداکثر مقدار ورودی های سابروتین های همزمان فعال برنامه (برحسب بایت) قرار دهید. در ضمن این روش ممکن است باعث کندی اجرای برنامه ها گردد.
روش دیگر استفاده از پیشوند Byref می باشد. Byref به معنای رفرنس یا ارجاع بوده و آدرس متغیر نوشته شده در دستور فراخوانی به زیر برنامه ارسال می گردد. در موقع استفاده از این روش نمی توانید سابروتین را با اعداد ثابت فراخوانی کنید و نوشتن دستوری مثل call my_prog(1,2) منجر به خطا خواهد شد. روش فوق برای مواقعی استفاده می شود که سرعت اجرا مهم بوده، بهم ریختن احتمالی متغیر ورودی چندان اهمیتی نداشته و سایز متغیر های ورودی بزرگ و تعداد آنها زیاد می باشد و نیز فضای SRAM کافی برای Frame در اختیار نیست. در هر صورت معمولاً از روش اول یعنی Byref استفاده می شود تا بتوان اعداد ثابت را نیز به سابروتین انتقال داد.
برای فراخوانی سابروتین ها حتماً بایستی از دستور Call استفاده گردد. متاسفانه در بسیاری از کدهای نوشته شده با بسکام مشاهده میکنیم که سابروتین ها با دستور Gosub فراخوانی شده اند! این روش کاملاً اشتباه بوده و ممکن است منجر به خطاهای ظریف منطقی گردد.
در نمونه کد بالا پس از تعریف و فراخوانی سابروتین، دقیقاً پس از دستور end کد اصلی سابروتین که به آن بدنه سابروتین نیز گفته می شود نوشته شده است. ترتیب نوشتن سابروتین ها مهم نبوده و می توان آنها را به هر ترتیب دلخواهی پس از دستور End نوشت. بدنه یک سابروتین با دستور sub شروع شده و در جلوی آن نام سابروتین به همراه تعریف متغیرها قرار می گیرد. می توانید تعریف سابروتین را از ابتدای برنامه کپی کرده و Declare را با Sub عوض کنید و آن را در این قسمت Paste نمایید. هر سابروتین با دستور end sub پایان می یابد. یکی از ویژگیهای خاص سابروتین ها امکان تعریف متغیر در داخل آنها می باشد. ما در این سابروتین متغیری به نام z از نوع Byte تعریف کرده و مجموع متغیرهای x و y را در آن ذخیره نموده ایم و در نهایت آن را نمایش داده ایم. برای تعریف متغیر در داخل سابروتین بایستی از پیشوند Local بجای Dim استفاده گردد. Local به معنای محلی بوده و متغیرهای اینچنینی فقط موقع فراخوانی سابروتین ایجاد می گردند و با رسیدن به دستور End Sub از حافظه پاک می شوند. توجه داشته باشید که تعریف آرایه و بیت به عنوان متغیر لوکال یا محلی ممنوع است. در کل با استفاده از این قابلیت می توان مدیریت بهتری بر روی SRAM داشت و با میکروهای کم حافظه و کوچک کارهای بزرگی انجام داد.
آخرین روش برای نوشتن زیر برنامه های خاص محاسباتی که اعداد یا حروفی را به عنوان ورودی گرفته و یک مقدار به عنوان خروجی بر می گردانند استفاده از تابع است. توابع یا فانکشن ها تقریباً شبیه به سابروتین ها می باشند اما قادرند که یک مقدار را به عنوان خروجی بازگردانند.
مثال:
$regfile="m8def.dat"
$crystal= 1000000
$hwstack=32
$swstack=32
$framesize=32
DeclareFunction Addnum(byval X AsByte,Byval Y AsByte)AsByte
Dim I AsByte
Cls
Home
I = Addnum(1 , 2)
Lcd I
end
Function Addnum(byval X AsByte,Byval Y AsByte)AsByte
local z asbyte
z = x + y
Addnum = Z
EndFunction
نمونه کد بالا نحوه تعریف یک تابع به نام Addnum را نمایش می دهد که دو عدد ورودی را با یکدیگر جمع کرده و نتیجه را در متغیر Addnum که همان نام تابع می باشد ذخیره می کند. نحوه تعریف تابع تقریباً مشابه Sub است با این تفاوت که به جای Sub از Function استفاده شده است. همچنین پس از پرانتزهای جلوی تابع مجدداً عبارت as byte نوشته شده است. این عبارت آخر نوع خروجی تابع را مشخص می کند و نام تابع به عنوان متغیر خروجی شناخته می شود.
برای فراخوانی تابع به هیچ پیشوندی نیاز نیست. در نمونه کد بالا می بینیم که نام تابع به همراه ورودی های آن که اعداد 1 و 2 است به طور مستقیم فراخوانی شده و نتیجه آن در متغیر I قرار داده شده و سپس متغیر I در جلوی LCD قرار داده شده است. در این برنامه موقع اجرا، نام تابع با عدد 3 جایگزین شده و در نمایشگر کریستال مایع نشان داده می شود.
بدنه تابع نیز تقریباً شبیه به سابروتین می باشد با این تفاوت که با کلمه کلیدی function و پس از آن نام تابع و متغیرها و نوع تابع شروع شده و با End Function پایان می یابد. در تابع نیز می توان از متغیر های Local یا محلی با همان شرایط سابروتین استفاده کرد. نکته مهم در توابع اینست که نتیجه نهایی بایستی در نام تابع ذخیره شده و بدین صورت به خروجی بازگردد و بهتر است که این دستور در انتهای تابع و قبل از اتمام بدنه تابع نوشته شود.
به عنوان یک نکته مهم در خصوص سابروتین ها و توابع سعی کنید که از فراخوانی تو در تو پرهیز کنید. این کار موجب پر شدن سریع پشته نرم افزاری شده و برنامه به سرعت هنگ می کند. هر تابع یا سابروتین باید پس از فراخوانی به طور کامل اجرا شده و به انتها برسد و سپس تابع یا سابروتین بعدی اجرا گردد. همچنین توجه داشته باشید که اگر تابع یا سابروتینی را فراخوانی کردید و در داخل آن تابع دیگری را صدا زدید پس از اجرای تابع دوم مجدداً دستور به جایی که از آن قسمت فراخوانی شده بود (در داخل تابع اول) باز میگردد و سپس به جایی که تابع اول فراخوانی شده بود برمی گردد. یعنی در واقع با هر فراخوانی، آدرس تابع در فضایی به نام Stack که همان پشته نرم افزاری نام دارد قرار داده شده (مثل چیدن بشقاب ها روی یکدیگر) و پس از پایان یافتن تابع، آدرس آن از پشته حذف می شود، (مثل برداشتن بشقاب ها از روی یکدیگر).
یک برنامه ساختیافته باید از الگوی زیر پیروی کند:
$refile
$...
$...
Declare sub s1(byval i as byte, byval j as byte)
Declare Function f1(byval i as byte, byval j as byte) as byte
Do
حلقه اصلی برنامه
call s1()
gosub test
x = f1()
..
.
Loop
End
sub s1(byval i as byte, byval j as byte)
...
end sub
function f1(byval i as byte, byval j as byte) as byte
...
f1 = ...
end function
test:
...
return
در الگوی بالا قبل از دستور End یک حلقه نامحدود نوشته شده است که برنامه کنترلی داخل آن نوشته می شود. برنامه کنترلی عموماً یک برنامه کوچک بوده و وظیفه آن صدا زدن توابع، سابروتین ها و برچسب ها می باشد و عموماً با استفاده از دستورات شرطی کارهای خاصی را انجام می دهد. اشکال زدایی برنامه کوچی مانند آن بسیار راحت تر از برنامه های پشت سر هم بوده و سرعت بررسی و تغییر برنامه به مراتب بیشتر می شود. مثلاً در یک برنامه ساعت در داخل حلقه وضعیت فشردن کلید های تنظیم بررسی می شود و سابروتین افزایش ثانیه، هر ثانیه یکبار توسط اینتراپت تایمر فراخوانی می شود. در این صورت برنامه به طور دائم در داخل حلقه Do..Loop گردش داشته و "زنده" است. اگر Do..Loop نوشته نشود برنامه به محض اجرا به End رشیده و متوقف می شود و در این صورت نه اینتراپت تایمر جواب می دهد و نه می توان کار دیگری را انجام داد. پس همیشه قبل از دستور End بایستی یک حلقه نامحدود نوشته شود تا CPU را در وضعیت فعال نگه دارد. برنامه کنترلی نیز در داخل این حلقه قرار داده می شود و بایستی بسیار واضح بوده و دارای کامنت و توضیحات کامل باشد.
با نوشتن برنامه ها بصورت ماژولار براحتی می توانید برنامه خود را عیب یابی کرده و کد خوانایی طراحی کنید تا هر فردی بتواند آن را بررسی و ویرایش نماید. همچنین موقع نوشتن برنامه های جدید براحتی می توانید از ماژول های از پیش نوشته شده در برنامه های خود استفاده کنید و سرعت نوشتن برنامه های جدید را دو چندان نمایید. توجه داشته باشید که برنامه نویسی ساختیافته یا پیمانه ای یکی از روش های جدید برنامه نویسی می باشد که بسیار بهتر از روش های کلاسیک و پشت سر هم است. روش دیگری نیز در برنامه نویسی وجود داشته که به برنامه نویسی شی گرا یا OOP مشهور است. در این نوع برنامه نویسی قسمت های مختلف به اشیاء تبدیل شده و برای هر شی یک کلاس نوشته می شود. متاسفانه در کامپایلری مثل BASCOM این قابلیت پشتیبانی نشده و فقط می توان از برنامه نویسی ساختیافته استفاده نمود.
اولین پروژه ای که دقیقاً بعد از آزادی از خدمت یعنی بهار سال 92 انجام دادم یه چیزی شبیه mini PLC با LCD گرافیکی 240 در 128 به شماره TS240128 بود. یادمه با کلی دردسر LCD رو راه اندازی کردم و چون این LCD مدل های مختلفی داشت هم کتابها و هم دیتا شیت ها، هر کدوم یه چیزی نوشته بودن و بدتر از همه اینکه نام و استاندارد خاصی برای پایه ها وجود نداشت و هر کمپانی برای پایه ها از نام های مخفف خودش استفاده کرده بود و الان هم همینطوره. این پروژه هر طوری بود انجام شد تا اینکه دوباره امسال یعنی اواخر تابستان 93 برای یه پروژه صنعتی مجبور به راه اندازی یکی از همین LCD ها شدم. خوسبختانه سورس پروژه قدیم رو داشتم ولی شماتیک رو نه و مستند سازی هم نکرده بودم به این امید که یادم میمونه. ولی کلاً فراموش کرده بودم که داستان چی بود. بالاخره با کلی دردسر دوباره موفق به راه اندازی این نمایشگر شدم. برای همین تصمیم گرفتم که یه مستند سازی درست و حسابی در مورد این ال سی دی گرافیکی به عنوان یک مقاله انجام بدم تا اگه کسی برای راه اندازی LCD گرافیکی مدل TS240128 یا همون 240 در 128 که به T6963 هم معروفه با BASCOM (بسکام/بیسکام) به مشکلی برخورد کرد بتونه از این مقاله کمک بگیره.
قبل از هر چیز باید بگم که TS240128 با TS12864 زمین تا آسمون فرق داره. اولین تفاوتشون اینه که LCD گرافیکی 240 در 128 داخل خودش تمام فونتهای ASCII رو داره و هیچ نیازی به افزودن فایل font و استفاده از دستور setfont نیست و نوشتن توش دقیقاً مثل LCD کاراکتری با دستور LCD صورت میگیره نه Lcdat. نکته مهم هم استفاده از دستور locate 1,1 قبل از دستور LCD هست که مکان نما رو به خط اول و ستون اول میبره و اگه از این دستور استفاده نشه بر خلاف LCD معمولی کاراکتری هیچ چیزی روی LCD نوشته نمیشه و مثل LCD معمولی 2x16 نیست که با CLS مکان نما به Home یا همون خونه اول بره. ضمناً اعداد جلوی Locate سطر و ستون رو مشخص میکنن و اولی سطر و دومی ستون هست. در حالت فونت 8 در 8 میشه 16 تا سطر و هر سطر 30 ستون. مثلا دستور Locate 16,30 مکان نما رو به آخرین سطر و آخرین ستون میبره.
نکته دوم در خصوص نمایش عکس در این LCD هست. برای نمایش تصویر باید دقیقاً مثل مقاله شماره چهار بسکام عمل کنید با این تفاوت که باید در موقع تبدیل عکس با Graphic Converter بسکام تیک هر دوتا گزینه SED و Uncompressed رو بردارید.
نکته آخر و مهمترین نکته که معمولاً باعث سردرگمی موقع راه اندازی این نمایشگر مخصوصاً با BASCOM میشه استاندارد نام پایه هاست. این LCD در مدل های مختلفی ساخته میشه که قبل از کار با اون حتماً باید شماره سریال LCD رو سرچ کنید تا دیتاشیتش رو بدست بیارید. در مورد TS240128ی که برای پروژه ما بود خوشبختانه نام پایه ها روی LCD چاپ شده بود و نیازی به دیتاشیت نبود. ولی با این حال نام بعضی از پایه ها با دستور Config بسکام یکسان نبود. TS240128 معمولاً 22 تا پایه داره. پایه اول یا FG به نظرم مخفف Frame Ground هست که به بدنه فلزی LCD متصل شده و برای محیط های نویزی باید به بدنه دستگاه و زمین وصل بشه. پایه آخر یا همون شماره 22 هم NC یا No Connect هست که به جایی وصل نمیشه و احتمالاً برای اینکه پین هدر LCD زوج بشه طراحی شده. پایه Vo که پایه شماره 4 هست ورودی کنتراست نمایشگره که با یک پتانسیومتر 10کبلو از پایه Vout که پایه شماره 19 هست تامین میشه. اما نکته مهم در مورد پایه های CS و RS و RES هست. پایه RES مخفف RESET هست و داخل دستور پیکره بندی بیسکام هم با عبارت RESET مشخص شده. ولی CS داخل بسکام با Ce مشخص میشه که پایه "انتخاب چیپ" هست و کمپانی LCD مخفف اونو از Chip Select به معنای انتخاب چیپ گرفته و بسکام هم از Chip Enable یا فعال ساز چیپ که در کل معادل همدیگه هستن. پایه RS هم با توجه به بخش آخر کتاب 8050 اسکات مکنزی ترجمه دکتر سید رضی به معنای انتخاب ثبات بوده و و مخفف Register Select هست. یعنی با 0 و 1 شدن این پایه یکی از رجیسترهای اطلاعات یا دستور انتخاب میشن که اطلاعات برای زمانیه که میخوایم کد مورد نظر روی پایه های DB0 تا DB7 دقیقاً روی LCD نمایش داده بشه و دستور هم برای زمانی هست که کد مورد نظر یه کد کنترلی مثل CLS یا جابجایی مکان نما و ... هست. برای اطلاعات بیشتر جلسه دوم اسمبلی رو بخونید. این پایه در دستور Config بسکام با CD مشخص شده. CD مخفف Command/Data به معنای دستور/ اطلاعات هست که به نظر من دقیق تر از RS مفهوم کار پایه رو میرسونه و بهتر بود روی LCD هم CD چاپ می شد.

در کل با توجه به نکات بالا به این نتیجه میرسیم که برای شروع کار با این LCD حتماً به یک رفرنس خوب نیاز داریم و این مقاله این نیاز رو برآورده می کنه. شماتیک زیر نحوه بستن LCD مدل TS240128 رو به میکروی ATmega16 از خانواده AVR نمایش میده. روی عکس کلیک کنید تا بزرگ بشه.
در این قسمت هم سورس پروژه راه اندازی LCD گرافیکی مدل TS240128 در محیط Bascom آورده شده. در بخش کد Config نمایشگر توجه داشته باشید که Mode نام هیچ پایه ای از LCD نیست و فقط اندازه پهنای فونت رو مشخص میکنه. مثلا اگه روی 8 باشه هر سطر 30 تا کاراکتر رو جا میده و اگه 6 باشه داخل هر سطر 40 تا کاراکتر جا میگیره. ما فقط 8 رو امتحان کردیم. (توجه: این سورس رو کپی پیست نکنید! کد اصلی همراه با فایلهای ضمیمه bgf انتهای همین صفحه برای دانلود قرار داده شده که باید اونو اجرا کنید. این کد فقط برای بررسی سطحی آورده شده).
GLCD TS240128 (T6963) By Behnam Zakizadeh @ 17.01.92 [2013]
Web: http://avr64.com
Rev1.0: 17.06.93 [Sep.2014]
Compiler: Bascom FULL (2.0.7.7)
$regfile="m16def.dat"
$crystal= 1000000
$hwstack= 64
$swstack= 64
$framesize= 64
$projecttime = 1
GLCD
config Graphlcd = 240 * 128 , Dataport =Portb, Controlport =Portd, Ce = _
4 , Cd = 5 , Wr = 2 , Rd = 3 ,Reset= 6 , Fs = 7 ,Mode= 8
Cls
cursoroff
waitms 200
Showpic 0 , 0 , p1
wait 2
cls
Showpic 0 , 0 , p2
wait 2
cls
Showpic 0 , 0 , p3
wait 2
dim x asbyte
cls
for x = 1 to 16
locate x,1
Lcd"LCD-IS-OK-Chip==T6963##240x128"
next x
End
_______________________________________________________________________________
p1:
$bgf"blk.bgf"
p2:
$bgf"hor.bgf"
p3:
$bgf"ver.bgf"
end of file

به عنوان نکته آخر جالبه بدونید که چیپ این LCD به T6963 مشهوره و گاهی اوقات و مخصوصاً در دستگاه های صنعتی با این نام شناخته میشه و TS240128 فقط نام اختصاری هست که کارخونه سازنده که فکر کنم تیچ استار باشه برای این نمایشگر کریستال مایع انتخاب کرده.
در ادامه مقاله اینترنت اشیاء و راه اندازی ماژول WiFi وای فای ESP8266 به عنوان Client یا Station که قادر بود به یک سرور اینترنتی متصل شود و یک رله را کنترل نماید تصمیم گرفتیم مقاله دیگری برای مد کاری دیگر این ماژول یعنی مد Server یا AP (اکسس پوینت) بنویسیم.
ماژول WiFi وای فای ESP8266 در مد AP قادر است همانند یک سرور کوچک عمل کرده و ضمن اینکه می توان برای این اکسس پوینت (همانند مودم ADSL) نام SSID و Password در نظر گرفت می توان با AT Command خاصی ماژول را وادار به گوش دادن به پورت خاص نمود. شایان ذکر است که ماژول ESP8266 در مد AP معمولاً همیشه آی پی ثابت و فیکس 192.168.4.1 را گرفته و با تعریف یک پورت دلخواه مثلا پورت شماره 1394 می توان از ترکیب این آی پی و پورت یک سوکت مانند (192.168.4.1:1394) ایجاد کرد و با استفاده از نرم افزارهای مختلف تحت اندروید یا Windows همانند Telnet به این ماژول متصل شد و رشته های متنی را برای آن ارسال کرد. این رشته ها متقابلاً در خروجی پایه TX ماژول قابل دریافت بوده و می توان با کمک آن رله ای را فعال یا غیر فعال کرد.
از این ایده می توان برای ساخت ریموت کنترل WiFi وای فای بدون نیاز به اینترنت و روتر و مودم استفاده کرد. در این ایده با استفاده از یک موبایل یا تبلت یا لپ تاپ دارای WiFi براحتی میتوان نام ماژول را جستجو کرده و پس از وارد کردن رمز عبور به ماژول متصل شد. پس از متصل شدن به ماژول بسته به نوع دستگاه ما (اندروید، ویندوز، IOS و ...) بایستی به نحوی به سوکت ماژول متصل شده و رشته دلخواه مثلا on یا Off را برای ماژول ارسال کنیم. برای این منظور ما در گوشی اندروید از نرم افزار رایگان تل نت Telnet استفاده کرده ایم که می توانید از انتهای همین صفحه فایل APK آن را دانلود نمایید. برای ویندوز فون هم مطمئناً این نرم افزار در دسترس خواهد بود و در بر روی تبلت و لپ تاپ ویندوز هم بصورت پیش فرض Telnet نصب می باشد.
برنامه ای که برای میکروکنترلر ATmega8 با کامپایلر BASCOM بسکام/بیسکام نوشته شده یک ریموت کنترل یک کانال وای فای WiFi با ماژول ESP8266 می باشد و قادر است در پاسخ به رشته های on و off رله خود را روشن و خاموش کرده و پیام Delivery برای دستگاه ارسال نماید. همچنین با ارسال رشته status وضعیت کنونی رله را ارسال می نماید. توجه داشته باشید که رشته ها کاملاً با حروف کوچک و بدون فاصله اضافه در ابتدا و انتها در Telnet تایپ شود.
توجه: شماتیک این پروژه با پروژه قبل (اینترنت اشیاء) هیچ تفاوتی ندارد.
پس از دانلود و پروگرام کردن فایل Hex در میکروکنترلر ATmega8 و تنظیم فیوز بیت اسیلاتور روی کریستال خارجی (111111) و اتصال تغذیه مشاهده خواهید کرد که عباراتی برای تنظیم اولیه ماژول بر روی LCD نوشته می شود. پس از حدود 10 ثانیه علامت آنتن در گوشه سمت راست LCD و عدد 1 در گوشه سمت چپ LCD نمایش داده می شود. این به معنی آماده بودن دستگاه برای اتصال است.
قبل از هر چیز WiFi گوشی را روشن کرده و وارد تنظیمات وای فای شوید. بایستی دستگاهی به نام AVR64.com را مشاهده کنید. دستگاه مذکور که همین ماژول ESP8266 می باشد را انتخاب کرده و برای اتصال، گزینه رمزنگاری WPA/WPA2 را انتخاب و رمز 12345678 را وارد کنید تا به ماژول متصل شوید. در صورت اتصال موفقیت آمیز علامت آنتن وای فای در گوشی شما روشن شده و سیگنال با قدرت بالا را نمایش می دهد (قدرت ماژول ESP8266 از مودم های خانگی به مراتب بیشتر است).

حال برنامه Telnet.apk را از انتهای همین صفحه دانلود و بر روی گوشی یا تبلت اندرویدی خود نصب کنید. پس از نصب برنامه آیکن آن را در گوشی پیدا کرده و با لمس آن وارد محیط برنامه شوید.

پس از ورود به برنامه Telnet پنجره زیر را خواهید دید. IP و Port را مطابق شکل زیر وارد کرده و کلید Connect را لمس کنید.

نمایش عبارت ...Connecting در پنجره Telnet به معنای اتصال به ماژول می باشد. حال با نوشتن عبارت on در فیلد متنی پایین برنامه و لمس کلید GO، رله متصل به ماژول روشن خواهد شد و عبارت RELAY TURN ON از طرف ماژول برای ترمینال ارسال می شود. با نوشتن رشته off نیز رله خاموش شده و رشته RELAY TURN OFF برای موبایل ارسال می شود. همچنین می توانید با ارسال عبارت status وضعیت کنونی رله را ببینید، بدین ترتیب در صورت روشن بودن رله عبارت Relay is on با حروف کوچک مشاهده خواهد شد و در صورت خاموش بودن رله عبارت Relay is off را در صفحه ترمینال خواهید دید.
دانلود Hex + شماتیک + عکس تنظیم فیوزبیت ها + Telnet.apk
* از جمله نکات مهم در خصوص این پروژه نوع ماژول های ESP8266 موجود در بازار است. برخی از این ماژول ها با سرعت 115200 بیت در ثانیه کار میکنند و بعضی دیگر با سرعت 9600. به همین روی دو فایل هگز با نام ESP8266_AP_115200.hex و ESP8266_AP_9600.hex در پوشه دانلود شده موجود می باشد که بسته به ماژول شما ممکن است با یکی از این فایلها قادر به ارتباط با ماژول باشید. نکته دیگر ولتاژ کاری ماژول است که 3.3 ولت بوده و میکرو هم با 5 ولت راه اندازی شده و رله نیز با 12 ولت درایو شده است. این موارد را از روی شماتیک می توانید بررسی کنید. نکته مهم دیگر تنظیم فیوزبیت نوسان ساز میکرو بر روی کریستال خارجی می باشد که در غیر این صورت میکرو قادر به ارتباط با ماژول نخواهد بود. همچنین برای صحت کار ماژول می توانید پس از بستن شماتیک این پروژه و پروگرم کردن میکرو، محیط ترمینال را باز کرده تنظیمات را بر روی سرعت = 115200 یا 9600، دیتابیت = 8، پریتی = n، و استاپ بیت = 1 قرار داده و پایه TX ماژول را که به RX میکرو متصل شده با یک سیم به پایه RX پورت سریال کامپیوتر هم متصل کنید (زمین پورت سریال کامپیوتر هم به زمین مدار وصل شود) تا اطلاعات ارسالی ماژول را در محیط ترمینال نیز ببینید و از صحت کار ماژول مطمئن شوید. برای تنظیم هایپرترمینال مقاله راه اندازی ماژول بلوتوث HC05 را ببینید.
در صورتی که می خواهید از بلوتوث در پروژه هایتان استفاده کنید ماژول بلوتوث HC-05 بهترین گزینه است زیرا هم قیمت مناسبی دارد و هم کار با آن بسیار راحت است و ارتباط با آن از نوع سریال است . میخوایم ماژول بلوتوث HC-05 رو بصورت کامل راه اندازی کنیم و استفاده از فرامین دستوری (AT command) مربوط به ماژول بلوتوث HC-05 را آموزش دهیم تا به راحتی بتوانید رمز بلوتوث ، نام بلوتوث ، Baut Rate و … را تغییر دهیم . همچنین اطلاعات اولیه نحوه ارتباط AVR با گوشی اندروید را از طریق ماژول بلوتوث HC-05 آموزش می دهیم ، آموزش به این شکل است که ابتدا یک برنامه به زبان بیسیک برای اتمگا 8 می نویسیم و سپس AVR را به ماژول بلوتوث HC-05 وصل می کنیم ، روی گوشی اندروید یک ترمینال بلوتوث نصب می کنیم . سپس از طریق گوشی و بلوتوث با ماژول ارتباط برقرار می کنیم . از طریق ترمینال گوشی کارکتر “A” را ارسال می کنیم ، کارکتر A از طریق ماژول بلوتوث به AVR می رسد و سپس AVR توسط برنامه ای که برایش نوشته شده است یک عدد LED را روشن می کند و هم زمان عبارت “ON” را برای ترمینال گوشی ارسال می کند ، برای خاموش کردن LED کارکتر “B” را مجددا از ترمینال گوشی اندروید ارسال می کنیم و سپس LED خاموش می شود و هم زمان عبارت “OFF” به ترمینال بازگردانده می شود . همچنین یک کلید روفی مدار تعبیه شده است که با فشار دادن آن کلید عبارت “wle.ir” به ترمنال گوشی ارسال شده و در آن به نمایش در می آید .
در این آموزش نحوه استفاده از فرامین دستوری (AT command) بصورت کامل و مرحله به مرحله بصورت تصویر نمایش داده شده است ، برای ارسال فرامین دستوری به ماژول باید یک نرم افزار ترمینال روی کامپیوتر نصب باشد ترمینال های معمولی پاسخ گو نیستند و نمیتوانند فرامین را ارسال کنند تنها ترمینالی که خوب جواب داده است هایپر ترمینال است که به علت قدیمی بودن و نمایش پیام های مختلف و به درستی عمل نکردن بسیار آزار دهنده است ، در این آموزش یک ترمینال بسیار عالی و هوشمند قرار داده شد است که علاوه بر محیط زیبا و کار پسند ، به درستی عمل می کند و با ارسال هر دستور فقط یک جواب از جانب ماژول دریافت می کندکه در هایپر ترمینال تا جایی که من بررسی کردم با ارسال هر دستور بی نهایت جواب از جانب ماژول میاد که مجبور مشید برای هر دستور یک بار مژولرو قطع و وصل کنید .
اهداف آموزش راه اندازی ماژول بلوتوث :
همراه با پروژه آموزش راه اندازی ماژول بلوتوث فایل های زیر برای دانلود قرار داده شده اند:
نمایشگر نوکیا ۵۱۱۰ (LCD NOKIA 5110) یک نمایشگر کوچک و کم هزینه و بسیار کاربری است که دارای اندازه فیزیکی ۴۵x45 میلیمتر و رزولوشن صفحه نمایش ۴۸*۸۴ پیکسل است ، این LCD در اصل برای گوشی های نوکیا ۳۳۱۰ و ۵۱۱۰ بکار می رفته که شرکت های مختلف برای این LCD یک PCB طراحی کرده اند و آن را با چیپ PCD8544 درایو کرده اند ، به این ترتیب بصورت تجاری برای عموم مردم در دسترس قرار گرفت ، LCD NOKIA 5110 یک صفحه نمایش کاربردی است که می توان از آن برای طراحی بساری از پروژه های حرفه ای و تجاری کمک گرفت ، ما با استفاده از زبان بیسیک و کامپایلر BascomAVR نمایشگر نوکیا ۵۱۱۰ (LCD NOKIA 5110) را راه اندازی کرده ایم که به راحتی می توانید به وسیله آن انواع کاکتر ، اعداد ، علائم ، حروف ، نوشته ، انواع متغییر و تصاویر را در LCD NOKIA 5110 نمایش دهید ، برای هر یک از موارد ذکر شده مثالی عملی آورده شده است که دیگر هیچ جای ابهامی برای شما باقی نمی ماند و به راحتی می توانید از LCD NOKIA 5110 برای ساخت پروژه های خود به زبان بیسیک استفاده کنید ، در حال حاضر توابع نوشته شده از زبان انگیسی پشتیبانی می کنند ولی اگر این مطلب مورد استقبال واقع شود زبان عزیز فارسی را هم به LCD NOKIA 5110 اضافه می کنیم که پروژه های خود را حرفه ای تر از همیشه طراحی کنید ، این ال سی دی را می توانید از فروشگاه های اینترنتی موجود تهیه کنید .
فیلم دموی عملکرد ۵۱۱۰ LCD NOKIA :
همراه پروژه فایل های زیر جهت دانلود آماده سازی شده اند :
در پروژه ساخت خازن سنج دقیق با AVR با استفاده از میکروکنترلر Atmega8 و زبان بیسیک با ساده ترین روش ممکن ظرفیت خازن را با دقت ۱ نانو فاراد اندازه میگیریم ، برای ساخت این مدار از کمترین قطعات ممکن استفاده شده است و بالاترین دقت ممکن را دارا می باشد ، چون این پروژه جنبه آموزشی دارد برنامه نویسی آن به ساده ترین شیوه ممکن انجام گرفته است و توضیحات کامل درباره نحوه کارکردن سنج دقیق با AVR و نحوه اندازه گیری خازن و هم همچنین برنامه نویسی آن بصورت خط به خط و کامل توضیح داده شده است که مبتدی ترین فرد هم با دیدن آن به نحوه برنامه نویسی و عملکرد آن تسلط کامل پیدا می کند ، نحوه برنامه نویسی در پروژه ساخت خازن سنج دقیق با AVR به این شکل است که ابتدا میکرو خازن را شارژ می کند و سپس اقدام به دشارژ خازن می کند ، زمان خالی شدن شارژ خازن اندازه گیری می شود و سپس با استفاده از یک فرمول ساده فیزیک دبیرستان ظرفیت واقعی خازن را به دست می آوریم ، این خازن سنج می تواند رنج ۰ نانو فاراد تا ۱ میکرو فاراد را با دقت ۱ نانو فاراد اندازه گیری کند
این خازن سنج بسیار مناسب خازن های پلی استر ، عددسی ، تانتالیوم و مولتی لایر است و خازن ها را با دقت ۱ نانو فاراد اندازه می گیرد .
فیلم پروژه خازن سنج با AVR :
دانلود ویدیو با کیفیت بالا (۲۹ مگابایت)
مشخصات سخت افزاری:
مشخصات نرم افزاری:
همراه پروژه فایل های زیر جهت دانلود آماده سازی شده اند :
این فایل از نوع فایل های Zip می باشد ( فایل فشرده شده ) که شامل یک کتاب آموزشی با فرمت PDF بعلاوه فایل ها ضمیمه که برنامه های مرتبط با این کتاب آموزشی را شامل می شود .
فهرست کتاب »
| زبان: فارسی | نویسنده: علی حیدری | ||
| نوع فایل: ZIP | |||
| تعداد صفحات: 13 | ناشر: ALI_ZBACK@YAHOO.COM | ||
| حجم کتاب: 452 کیلوبایت |
Introduction: Introduction to micro controllers
What is micro controller?
Types of micro controllers
8051 Microcontroller by
AVR Microcontroller by
PIC Microcontroller by
Variety of programming languages
C language
Basic language
Assembly language
STK 200/300 programmer training
Construction methods and equipment needed
Printer port connector (25 pins)
Flat cable about a meter
74HC244 buffer IC number
100 kilo ohms of resistance of a number
Schematic view of the circuit programmer
Software Training codevision avr
Working with menus and various parts of an application codvision AVR .
Software errors not detected due to the programmer
Create a simple project (with the program described) in the environment codevision avr
کی وردها :
اموزش کامل برنامه نویسی برای میکروکنترلر ها - همه چیز درباره میکرو کنترلر ها - اموزش مکروکترلر ای وی ار - میگروکنترلر - آموزش میکرو گنترلر - آموزش میکرو کوننرولر AVR -
amozesh mikro kontroler - amozesh kodvisen - amozesh barnameh nevisi ba microcontroler - mikrocontroler avr - narm afzar codvisen avr -
lrnli : luvtd ld;v, ;kjvgv ih ld;v, ;kjvgv ]dsj ؟ hk,hu ld;v, ;kjvgv ih ld;v,;kjvgv ihd 8051 ld;v,;kjvgv ihd AVR ld;v,;kjvgv ihd PIC hk,hu cfhk ihd fvkhli k,dsd cfhk C cfhk fdsd; cfhk hslfgd Hl,ca shoj v,vhlv STK 200/300 v,a shoj , ,shdg l,vn kdhc ;hk;j,v ,vj vdkjv ( 25 dk ) ;hfg Flat pn,n 1 ljv Hd sd fhtv fi alhvi 74HC244 d; unn lrh,lj 100 ;dg, hil klhd alhjd; lnhv v,vhlv Hl,ca kvl htchv codevision avr Hl,ca ;hv fh lk, ih , rslj ihd lojgt kvl htchv ;n,dck hd ,d Hv oxhd kvl htchv fi ugj akhshdd kank v,vhlv shoj d; v,ci shni ( fi ilvhi javdp fvkhli ) nv lpdx
هدفقخیعزفهخد هدفقخیعزفهخد فخ ئهزقخ زخدفقخممثقس صاشف هس ئهزقخ زخدفقخممثق فغحثس خب ئهزقخ زخدفقخممثقس ئهزقخزخدفقخممثق ذغ شرق ئهزقخزخدفقخممثق ذغ حهز ئهزقخزخدفقخممثق ذغ رشقهثفغ خب حقخلقشئئهدل مشدلعشلثس ز مشدلعشلث ذشسهز مشدلعشلث شسسثئذمغ مشدلعشلث سفن حقخلقشئئثق فقشهدهدل زخدسفقعزفهخد ئثفاخیس شدی ثضعهحئثدف دثثیثی حقهدفثق حخقف زخددثزفخق حهدس بمشف زشذمث شذخعف ش ئثفثق از ذعببثق هز دعئذثق نهمخ خائس خب قثسهسفشدزث خب ش دعئذثق سزاثئشفهز رهثص خب فاث زهقزعهف حقخلقشئئثق سخبفصشقث فقشهدهدل زخیثرهسهخد شرق صخقنهدل صهفا ئثدعس شدی رشقهخعس حشقفس خب شد شححمهزشفهخد زخیرهسهخد شرق سخبفصشقث ثققخقس دخف یثفثزفثی یعث فخ فاث حقخلقشئئثق زقثشفث ش سهئحمث حقختثزف صهفا فاث حقخلقشئ یثسزقهذثی هد فاث ثدرهقخدئثدف زخیثرهسهخد شرق
این ماژول جهت کارکرد راحتتر با LCD های رنگی 2.8 اینچی ساخته شده و تمام پایه های مورد استفاده این LCD و همچنین پایه های تاچ اسکرین بیرون کشیده شده است. ماژول فوق قابلیت اتصال بر روی برد برد و تمام بردهای کاربردی و صنعتی را دارا می باشد. در ضمن ماژول دارای بسته بندی مناسبی جهت حفاظت از شکستگی در مرسوله های پستی می باشد.
اطلاعات مربوط به LCD :
LCD رنگی فوق دارای چیپست به شماره ی ili9325-ili9320 بوده که می تواند از طریق 16 خط داده با انواع میکروکنترلر های 8 و 32 بیتی از قبیل AVR-XMEGA-PIC-ARM ارتباط برقرار کرده و اطلاعات مربوط به تصاویر را از آنها دریافت کند. برای LCD مورد بحث امکان راه اندازی در هر 2 مود 8 و 16 بیتی وجود دارد که برای اینکار می بایستی مقاومت های روی LCD را تغییر دهید و یا از پایه IM0 استفاده نمایید که برای این کار نیاز به لحیم کاری LCD می باشد. این ماژول برای عملکرد 16 بیتی طراحی شده و تغییر مود عملکرد بر عهده کاربر خواهد بود.
این LCD در بازار موبایل، به نام LCD Nokia N96 چینی شناخته می شود که دارای چیپست های بسیار متنوعی هستند که تنها مدل های خاصی از آنها قابل راه اندازی هستند.
رزولیشن تصویر : 320*240 پیکسل بوده و ابعاد
ابعاد : 7*5 سانتی متری (2.8 اینچ)
چیپست کنترلی – درایور : - ili9325 ili9320
برد درایور نمایشگر های تمام رنگی (TFT) سایز 7 اینچ مدل 50 پین (تهیه LCD قابل راه اندازی توسط برد)
چیپست درایور روی برد تراشه SSD1963 بوده و جهت راه اندازی تاچ اسکرین های مقاومتی، تراشه XPT2046 بر روی برد قرار داده شده است.
بر روی این برد 2 کانکتور برای تاچ اسکرین یکی در سمت رات و یکی در سمت چپ برد قرار داده شده است تا قابلیت نصب انواع تاچ اسکرین های مقاومتی بر روی برد وجود داشته باشد.
امکان اتصال Memory Card سایز استاندارد و همچنین تراشه فلش برای استفاده در بردهای میکروکنترلی بر روی برد وجود دارد.
مشخصات برد راه انداز :
ترتیب پایه های خروجی ماژول :
(در هر 2 سمت این ماژول پایه های خروجی با ترتیب یکسان در دسترس هستند)
01 feet 3V3 power supply positive
02 foot ND power of negative
03 Pin DB00 data cable
04 Pin DB01 data cable
05 Pin DB02 data cable
06 Pin DB03 data cable
07 Pin DB04 data cable
08 Pin DB05 data cable
09 Pin DB06 data cable
10 foot DB07 cable
11-pin data cable DB8
12 foot DB9 cable
13 Pin DB10 data cable
14-pin data cable DB11
15-pin data cable DB12
16-pin data cable DB13
17 Pin DB14 data cable
18-pin DB15 data cable
19 foot screen CS chip select, active low
20-pin RS Register Select
21 feet WR write enable, active low
22 feet RD read enable, active low
23 RESET Reset pin, active low
24 NC NC
25 feet MISO SPI Master In Slave Out
26 feet touch the interrupt output INT
27 pin MOSI SPI Master Out Slave
28-pin PWM backlight control pin
29 feet SCLK SPI clock
30 feet F_CS DATAFLASH chip select
31 feet TP_CS touch chip selects
32 feet SD_CS SD card option
33 pin 5V power supply is
34-pin GND power of negative
ماژول فوق دارای یک LCD 3.2 اینچی به همراه تاچ اسکرین بوده و قابلیت راه اندازی با تمامی میکروکنترلرهای سری ARM-AVR-XMEGA-PIC,... را دارا می باشد. با توجه به رزولیشن بالا و وضوح تصویر مناسب از این ماژول می توان در امور آموزشی و صنعتی استفاده نمود.
چیپ کنترلر این ماژول HX8352B می باشد.
امکانات ماژول :
خانوادهSTM32 از سری میکروکنترلرهای 32 بیتی مبتنی بر پردازندهARM Cortex می باشد که با هدف ایجاد معنای جدیدی از آزادی عملکرد برای کاربران میکروکنترلرها ایجاد گشته است. در این خانواده از میکروکنترلرها تلفیقی از کارایی بالا، عملکرد همزمان، پردازش سیگنال های دیجیتال و کاربردهای کم توان در بالاترین سطح کیفی و با حفظ یکپارچگی کامل و سهولت توسعه، ارائه می گردد.
از جمله امکانات مهم میکرکنترلر STM32F103RET6، هسته Cortex M3 با سرعت 72MHZ، اینترفیس موازی LCD، 3 عدد ADC 12 بیتی، 2 عدد DAC 12 بیتی و دارا بودن اینترفیس های متنوعی از جمله USB، Can، I2C، USART، SDIO و ... می باشد.
خلاصه مشخصات برد راه انداز STM32F103RET6
Features:


اگر به یک وب سایت یا فروشگاه رایگان با فضای نامحدود و امکانات فراوان نیاز دارید بی درنگ دکمه زیر را کلیک نمایید.
ایجاد وب سایت یامحبوب ترین ها
پرفروش ترین ها
پر فروش ترین های فورکیا
پر بازدید ترین های فورکیا
آموزش برنامه نویسی آردوینو
آموزش كامل تعمير لامپ كم مصرف(اختصاصي)
دانلود پاورپوینت فیلتر کالمن بر روی یک سنسور شتاب سنج برای تخمین سه متغیر حالت
مجموعه آموزشی میکروکنترلر AVR به همراه 20 پروژه کاربردی به زبان ساده بیسکام
دانلود پاورپوینت سمینار برق قدرت-بررسی خطوط انتقال HVDC
دانلود رايگان گاوصندوق اندرويد
دانلود فایل آموزش پردازش تصویر در MATLAB به همراه فایل شبیه سازی
چگونه دو تا کامپیوتر را با هم شبکه کنیم؟
دانلود جزوه ترانسفورماتور-طرح 18 ماهه ایران و آلمان
100 مدار الكترونيكي به زبان فارسي همراه نقشه مدار ها و توضيح قابل ساخت در خانه حتما ببينيد براي اولين بار در فضاي مجازي
مدار اینورتر 100 آمپری جهت جوشکاری
آموزش راه اندازی ماژول GPS با آردوینو
جزییات چاه ارت حلقه ای
آموزش برنامه نویسی آردوینو
الکترونیک صنعتی رشید-ترجمه فارسی
دانلود بسته کامل مدار فرمان
طراحی تقویت کننده کم نویز (#LNA) با نرم افزار ads# برای باند فرکانسی L
آموزش ساخت مدار تقويت آنتن
دانلود پویانمایی نیروگاه اصفهان
کتاب مدارهای میکرو الکترونیک سدرا اسمیت (ترجمه فارسی)
روش نصب آیفون تصویری
دانلود پاورپوینت سمینارD-FACTs (ادوات FACTs شبکه توزیع)
دانلود پاورپوینت آموزش شبيه سازي با Arena
دیکشنری تخصصی رشته برق مخصوص اندروید
دانلود پروژه الکترونیک صنعتی-مدارات یکسوساز گرتز، برشگر،اینورتر و چاپر
مدار تبدیل برق ماشین به برق شهری
دانلود پاورپوینت جامع و کامل مدار منطقی