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
بیشتر موارد با کپی کردن قسمت هایی از برنامه های مختلف، برنامه جدید خود را تکمیل می کنیم. بدین ترتیب در زمان خیلی کمتری کار جدیدی را شروع خواهیم کرد. در حین انجام این کار بسیار باید دقت کرد که به صورت درست محتوای کپی را مطابق میل بر اساس کار جدید، تغییر دهیم. زیرا بیشترین خطا در برنامه در همین جا رخ می دهد و اگر در این مرحله دقت نشود زمان بسیار بیشتری باید صرف رفع ایرادی کنیم که فکر می کنیم درست است!
@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
Forwarded from armeducation (Mahdi Zarkoob)
نحوه نمایش در TFT LCD ها به صورت پیکسلی می باشد. رنگ هرپیکسل یک عدد دو بایتی است. برای پاک کردن کل صفحه همه پیکسل ها تغییر می کند. بنابراین سرعت رفرش پردازنده مهم است.
@armeducation
Forwarded from armeducation (Mahdi Zarkoob)
مجموعه فیلم های آموزشی میکروکنترلرهای ARM :
—------------------------------—
آموزش کاربردی زبان C در میکروکنترلرهای ARM :
http://goo.gl/PoYFu1
تاپیک در فروم ایران میکرو :
http://goo.gl/hKvO0J
—------------------------------—
آموزش مقدماتی میکروکنترلر LPC1788 :
https://goo.gl/l4MmGP
تاپیک :
https://goo.gl/JEo7f9
—------------------------------—
آموزش پیشرفته میکروکنترلر LPC1788 :
https://goo.gl/kKt72J
تاپیک :
https://goo.gl/qccMOi
—------------------------------—
آموزش مقدماتی میکروکنترلر LPC1768 ورژن جدید :
http://goo.gl/vBlK6N
تاپیک :
http://goo.gl/FVaEnI
—------------------------------—
آموزش تکمیلی و پیشرفته میکروکنترلر LPC1768 :
http://goo.gl/YHLD0J
تاپیک :
http://goo.gl/HnLQAH
—------------------------------—

@armeducation
در برنامه نویسی لازم است در مواقعی از تابع تاخیر استفاده شود. مثلا بین هر ارسال در ال سی دی کاراکتری یا ارسال روی ماژول sim900 و زیروال وقفه و ... (هر چند این موارد می تواند بدون تاخیر delay هم انجام داد) این delay میتواند یک تاخیر دقیق یا تخمینی (تاخیر کیلویی !) باشد. حال در نظر بگیرید برنامه را به میکروی دیگری با سرعت بیشتر یا کمتر منتقل کرده اید. طبیعتا تاخیر کیلویی متناسب با سرعت آن پردازنده عمل می کند و این ممکن است کار را خراب کند. استفاده از تاخیر دقیق با systemtick
https://news.1rj.ru/str/armeducation/201
باعت می شود با تنظیم کلاک در ابتدا زمان تاخیر تغییر نکند.
@armeducation
تاخیر تخمینی که با تغییر عدد در حلقه for زمان تاخیر را می توان تغییر داد ،می تواند بدین صورت باشد:
void delay_ms (uint32_t Time)
{
uint32_t i;

i = 0;
while (Time--) {
for (i = 0; i < 16666; i++);
}
}
عدد 16666 برای کلاک 100 مگاهرتز زمان حدود یک میلی ثانیه را تاخیر ایجاد خواهد کرد. با یک تایمر می توان این عدد را دقیق انتخاب کرد :
https://news.1rj.ru/str/armeducation/238
این مدل تاخیر باعث اتلاف زمان پردازنده در مواردی که پردازنده بایستی کارهای دیگری را به صورت polling انجام دهد، خواهد شد.
@armeducation
Forwarded from armeducation (Mahdi Zarkoob)
با ارائه نظرات، پیشنهادات و انتقادات ، باعث دلگرمی ما باشید و هم باعث بهبود مطالب آموزشی.
ادمین:
@mzarkoob
با سپاس
@armeducation
نحوه استفاده از تاخیر delay با استفاده از systemtick شرح داده شده در :
https://news.1rj.ru/str/armeducation/200
بدین صورت می باشد :
void SysTick_Handler (void)
{
SysTickCnt++;
}
/*******/
void Delay (unsign
ed long tick)
{
unsigned long systickcnt;

systickcnt = SysTickCnt;
while ((SysTickCnt - systickcnt) < tick);
}
/*-----------------------------------*/
/*-----------------------------------*/
int main(void)
{
SysTick_Config(SystemFrequency/1000 - 1);
while (1)
{
//......
printf("www.armeducation.ir");
Delay (1000);
}
}
@armeducation
در صورتی که بخواهید وسایل جانبی مانند ال سی دی کاراکتری،گرافیکی، ایتوپرام خارجی ، spi flash و .... را راه اندازی کنید تفاوتی در عملکرد وجود ندارد که لزوما این راه اندازی با رجیستر باشد یا توابع cmsis یا توابع HAL. بنابراین این سوال که کتابخانه ای می خواهم برای راه اندازی این موارد حتما با HAL یا .. ، مناسب نیست. در هر صورت بایستی کتابخانه ای اد شود و از توابع آن برای راه اندازی استفاده شود. حال اگر در کتابخانه این وسیله، از توابع cmsis یا توابع HAL استفاده شده باشد بایستی این کتابخانه ها هم به پروژه اد شود.
@armeducation
Forwarded from armeducation (Mahdi Zarkoob)
در صورتی که مطالب آموزشی کانال را مفید می دانید شما معرف کانال به سایر دوستان خود باشید. 👇👇👇
با سپاس
@armeducation
یکی از مراحل انجام کار بعد از راه اندازی اولیه پریفرال ها و اجرای الگوریتم به کد، رفع ایرادات برنامه ( دیباگ) است. با رعایت کردن اصولی می توان جلوی بعضی ایرادات ساده را گرفت.
- در پست قبلی :
https://news.1rj.ru/str/armeducation/245
یکی از موارد ایجاد باگ، کپی نادرست ذکر شد.
- در پیکربندی یک پریفرال تنظیماتی هم که به صورت پیش فرض انجام شده، نیز قرار دهید. به عنوان نمونه پاور در سریال 0 در lpc1768 به صورت پیش فرض فعال است. ولی در سریال 2 فعال نیست. در صورتی که این تنظیم را در سریال 0 قرار ندهیم و بخواهیم در کاری سریال 0 را به 2 تغییر دهیم، فراموش می کنیم پاور را فعال نکرده ایم!
- تمام تنظیمات شامل کلاک و پاور، تنظیمات پایه، تنظیمات خود پریفرال تنظیمات زیرروال وقفه در یک جا قرار دهیم که در صورت نیاز به آن در برنامه دیگری با یک کپی بتوان همه تنظیمات را منتقل کرد و چیزی جا نمانده باشد.
- اینیشالیز به صورت درست انجام شده باشد و سایر را تنظیمات را تغییر ندهد :
https://news.1rj.ru/str/armeducation/177
به این ترتیب یک تنظیم انجام شده، سایر تنظیمات در آن رجیستر را بهم نمی زند.
- در نظر بگیرید بیت 0 رجیستری را به این صورت ست کرده باشید :
LPC_SC->EXTMODE = 1«0;
حال اگر همین قسمت را بخواهیم توسعه دهیم برای بیت 1 و .. :
LPC_SC->EXTMODE = 1«1;
به این ترتیب با ست شدن بیت 1، بیت 0 که قبلا ست شده بود ریست می شود! در حالی که اگر از اول به جای= از |= استفاده کرده بودیم در توسعه چنین خطایی ایجاد نمی شد.

👈 با دیباگ کردن از روی برد می توان به بسیاری از خطاها با تطبیق عمل انجام شده با چیزی که در ذهن بوده و پیاده سازی شده، پی برد. به این نکته توجه داشته باشید که گاهی دیباگ و رفع ایراد ممکن است بیش از زمان انجام اصل کار زمان ببرد!
@armeducation
مواردی که به عنوان نکات انجام کار و ... ذکر می شود(و گاها ساده به نظر میرسد!) نتیجه تجربیاتی هست که بارها و بارها برای بنده اتفاق افتاده و شاهد مواجه شدن دیگران با این موارد نیز بوده ام. به عنوان نمونه آخر از فن آموزان، در کاری لازم بود USART1 را به USART2 تبدیل کنند تا در برد قابل استفاده باشد. فقط یک جا انداختن تبدیل نکردن USART1 را به USART2 و در نتیجه کارنکردن برنامه، باعث معطلی و اتلاف زمان بی مورد شده بود.
@armeducation