armeducation – Telegram
armeducation
3.58K subscribers
367 photos
326 videos
115 files
370 links
آموزش حرفه ای میکروکنترلرهای ARM

ادمین:
@mzarkoob
مهندس مهدی زرکوب
شروع مطالب :
https://news.1rj.ru/str/armeducation/1
اینستاگرام :
@armeducation
کانال ایتا:
https://eitaa.com/armeducation
همراه :
09359956361
Download Telegram
Forwarded from armeducation (Mahdi Zarkoob)
از دوستان عزیز تقاضامندم در صورت تمایل، مطالب پست ها را تنها بصورت فوروارد در سایر گروها و کانال ها (و سایت ها) قرار دهند و از کپی کردن مطالب بدون ذکر مرجع خودداری کنند.
با تشکر
@armeducation
تجربه عملی برنامه نویسی یکی از دانشپذیران دوره آموزشی برای کاربا واحد ADC:
در روال گفته شده
https://news.1rj.ru/str/armeducation/216
برای خواندن آنالوگ به دیجیتال از رجیستر دیتا
ADC_StartCnv();
while (!ADC1->SR & (1 « 1)){};
ADC_StopCnv();
در دستور while جای پرانتز و ! کمی جابجا شده بود:
while ! (ADC1->SR & (1 « 1)){};
بنابراین این خط عملکرد خود را نداشت و برنامه در آن گیر می کرد و اصلا خارج نمی شد.
کوچکترین مشکلی در برنامه نویسی ممکن است منجر به عدم کارکرد صحیح در عمل شود. همچنان که عدم تنظیم یک بیت در اینیشیالیز (چالش یک بیت) می تواند منجر به عدم کارکرد آن پریفرال شود :
https://news.1rj.ru/str/armeducation/61
تا زمانی که دانشپذیران اقدام عملی برای برنامه نویسی و اجرا روی برد میکروکنترلر نکنند و با مشکل مواجه نشوند نمی توانند ایرادات خود را متوجه شوند.
@armeducation
با تمرینات ساده ترکیبی مرحله به مرحله در مباحث میکروکنترلرهای ARM که یک کاری را برای ما انجام می دهد، هم می توان با چند پریفرال از میکرو کار کرد و هم تسلط خود را به زبان برنامه نوسی C افزایش داد و از مرحله آشنایی به مرحله تسلط رسید.
@armeducation
به عنوان نمونه از تمرینات ساده ترکیبی تمرین از مبحث Timer و EXTI و ADC و GPIO و USART
به روش سنجش زمان یک پریود، فرکانس پالس ورودی را اندازه گیری کنید و در پورت سریال نمایش دهید. به این صورت که پالس ورودی به پایه وقفه خارجی متصل است و با لبه اول تایمر شروع به شمارش و در لبه دوم پالس، تایمر متوقف می شود. با محاسبات لازم، فرکانس محاسبه و در خروجی قرار داده می شود.
با تغییرات کوچکی در برنامه می توان دیوتی سایکل پالس ورودی را هم محاسبه نمود.
برای ایجاد پالس می توانید از یک تایمر دیگر استفاده کنید که با پتانسیومتر ورودی، مقدار فرکانس یا دیوتی سایکل را می توان تغییر داد. خروجی پالس تایمر دیگر را به ورودی وقفه خارجی متصل نمایید.
در صورتی که ADC از مقدار مشخصی بیشتر شد یک LED روشن و اگر کمتر شد LED خاموش شود.
آیا نمی توان بدون نیاز به وقفه خارجی، محاسبه فرکانس را انجام داد!؟
@armeducation
برای محاسبه زمان دقیق یک پروسه می توان از تایمر استفاده کرد:
https://news.1rj.ru/str/armeducation/215
در نظر بگیرید در ابتدای کار تایمر را فعال و در انتها آن را متوقف می کنید. عددی در شمارنده تایمر وجود دارد که از این عدد بایستی زمان پروسه را محاسبه کنید. این کار به سادگی بر اساس کلاک اعمالی به تایمر (و با محاسبات پیش دبستانی!) انجام می شود.
اگر کلاک اعمالی به تایمر CLOCK باشد بنابراین در 1 ثانیه شمارنده تایمر به عدد CLOCK می رسد. پس اگر عدد شمارنده تایمر SH شده باشد زمان پروسه به ثانیه با یک طرفین وسطین ساده بدست می آید :
Time = SH * 1 / CLOCK
حال اگر پروسه کمی طولانی بود و شمارنده تایمر سرریز داشت چگونه این زمان محاسبه می شود؟
@armeducation
در نظر بگیرید شما قصد دارید در جایی استخدام شوید. آن شرکت (چه کوچک چه بزرگ و معروف) یک شرایط کاری را برای شما مطرح می کند. به صورت شفاهی هم عنوان می شود که اگر کار شما خوب باشد طبیعتا همکاری ادامه دارد و ... . بعد از مدتی با توجه به حسن انجام کار(یا اتمام قرارداد) اعلام عدم نیاز می شود! و شما این را با آن حرف در تناقض میبینید. حالتی که ممکن است پیش آمده باشد بدین صورت است که به جای اینکه کار به صورت پروژه ای به کسی داده شود، فردی را مدتی استخدام می کنند و بعد از انجام پروژه اعلام عدم نیاز می شود. در کل نیاز موقت به فردی دارند ولی این نیاز به صورت طولانی مدت وانمود می شود.
@armeducation
GPIO_STM32F10x_MZarkoob.rar
2.7 MB
استفاده از GPIO در STM32CubeMX با کیل 4
@armeducation
گاهی موارد انجام جزییات کار یا پروژه ای بیش از انجام اصل خود کار زمان بر است!
بنابراین در انجام کاری کاملا باید جزییات کار مشخص باشد.
@armeducation
با استفاده از دستور atoi() در کتابخانه stdlib.h می توان یک رشته را به عدد تبدیل کرد. نمونه ای از کاربرد ساده این دستور در پورت سریال است که از دیتای دریافت شده که در رشته به عدد تبدیل شده، استفاده نمود.
@armeducation
بیشتر موارد با کپی کردن قسمت هایی از برنامه های مختلف، برنامه جدید خود را تکمیل می کنیم. بدین ترتیب در زمان خیلی کمتری کار جدیدی را شروع خواهیم کرد. در حین انجام این کار بسیار باید دقت کرد که به صورت درست محتوای کپی را مطابق میل بر اساس کار جدید، تغییر دهیم. زیرا بیشترین خطا در برنامه در همین جا رخ می دهد و اگر در این مرحله دقت نشود زمان بسیار بیشتری باید صرف رفع ایرادی کنیم که فکر می کنیم درست است!
@armeducation
در یک پروژه که کتابخانه های زیادی لازم است اضافه شود قائدتا هدرهای آنها نیز لازم است ابتدای برنامه include شود.
https://news.1rj.ru/str/armeducation/92
در اینجا می توان تمام این اینکلاد کردن ها را در داخل یک هدر دیگری قرار داد و فقط آن هدر را به ابتدای برنامه اینکلاد کرد. همچنین در صورتی که دیفاین های برنامه هم زیاد باشد می توان در همین هدر قرار داد و باعث خلوت تر صفحه کردن برنامه main شد. این موضوع بیشتر در استفاده از کتابخانه های SMSIS و HAL و... استفاده می شود.
@armeducation
در هدر stdint.h یک سری متغییر به صورت typedef قرار گرفته است که می توان به جای استفاده از
unsigned char
unsigned short int
و ... از آنها استفاده کرد. به عنوان نمونه :
typedef unsigned char uint8_t;
typedef unsigned short int uint16_t;
typedef unsigned int uint32_t;
typedef unsigned __int64 uint64_t;
بدین ترتیب با عنوان مختصر تری می توان متغییرها را به صورت uint8_t و uint16_t و uint16_t و .. تعریف کرد.
@armeducation
This media is not supported in your browser
VIEW IN TELEGRAM
تست عملی رفرش صفحه در ال ای دی 10.1 اینچ با میکروکنترلر LPC1788
با توجه به سخت افزار مربوطه :
https://news.1rj.ru/str/armeducation/101
@armeducation
This media is not supported in your browser
VIEW IN TELEGRAM
تست اولیه تاچ 10.1 اینچ در میکروکنترلر LPC1788 با توجه به روال عملکرد :
https://news.1rj.ru/str/armeducation/89
@armeducation
This media is not supported in your browser
VIEW IN TELEGRAM
تشخیص نقطه لمس شده در تاچ 10.1 اینچ با استفاده از 4 نقطه دریافت شده در ابتدای کالیبراسیون
@armeducation
در نظر بگیرید در یک تاچ، مختصات 4 نقطه خوانده شده به صورت زیر بدست بیاید :
Point0 : X=236, Y=3559
Point1 : X=3905, Y=3531
Point2 : X=179, Y=209
Point3 : X=3918, Y=158
بنابراین با لمس تاچ مختصاتی بدست می آید که در رنج این اعداد است. با چند شرط ساده می توان موقعیت لمس شده را بدست آورد.
بنابراین لمس درست 4 نقطه اولیه برای تشخیص نقاط بعدی مهم می باشد.
@armeducation
در نظر بگیرید هر بار که دستگاهی که دارای یک تاچ باشد به تغذیه متصل شود، نیاز باشد 4 نقطه اولیه برای کالیبراسیون داده شود! برای اولین بار که کالیبراسیون انجام شد، بایستی این نقاط در محلی ذخیره شود تا در دفعات بعد نیازی به انجام این کار نباشد. در اعمال نقاط کالیبراسیون نیز می توان ملاحظاتی را در نظر گرفت تا هر نقطه ای را قبول نکند. زیرا در صورت اشتباه وارد کردن، تشخیص نقاط بعدی درست انجام نمی شود. همچنین یک باتون در قسمت تنظیمات می توان قرار داد تا در صورت نیاز در حین کار وارد کالیبراسیون شود.
@armeducation
نمایش عدد 1 درTFT به صورت 24*16
عدد هگز هر سطر جلوی آن قرار داده شده
در روال نمایش، بیت به بیت یک سطر چک می شود. در صورتی که 1 بود رنگ مورد قرار داده شده در غیر این صورت رنگ پس زمینه .
@armeducation
کاراکتر 1 به صورت هگزادسیمال در آرایه ASCII_16x24 :
const uint16_t ASCII_16x24[] ={
……
/* ‘0’ */
/* ‘1’ */
0x0000, 0x0100, 0x0180, 0x01C0, 0x01F0, 0x0198, 0x0188, 0x0180,
0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180,
0x0180, 0x0180, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
/* ‘2’ */
……
}
این آرایه در نمایش یک کاراکتر فراخوانی می شود :
ASCII_16x24[num*CHAR_H+pos];
@armeducation
در بعضی سمپل ها فقط یک فونت کوچک برای نمایش روی TFT LCD قرار داده شده است. در صورت نیاز بایستی آرایه هگزادسیمال سایر فونت ها (ASCII_8x16 , ASCII_24x32,ASCII_16x24 و ..)را ایجاد کرد و از آن استفاده نمود. در اینجا یک پارامتر بایستی به ورودی تابع نمایش یک کاراکتر اضافه شود و آن هم فونت می باشد :
WriteOneChar(uint16_t x,uint16_t y, uint8_t num, uint16_t PenColor, uint16_t BackColor, uint8_t font)
به جای ورودی فونت به عنوان نمونه می توان موارد از قبل تعریف شده :
#define FONT_8x16 0
#define FONT_16x24 1
را قرار داد و در تابع نمایش یک کاراکتر شرط های مختلف به ازای ورودی فونت های مختلف قرار داد تا از آرایه همان فونت استفاده شود:
void WriteOneChar(uint16_t x, uint16_t y, uint8_t num, uint16_t PenColor, uint16_t BackColor, uint8_t font)
{


if( font==FONT_8x16){
….
}
if( font==FONT_16x24){
…..
}
…..
@armeducation