گاهی اوقات دارید با رسپبری پای سر و کله می زنید و نمی دونید رزولوشن واقعی صفحه روی چند در چند تنظیم شده. اگه می خواید سریغ ترین روش رو برای پیدا کردن رزولوشن فعلی که برای نمایشگرتون در رسپبری پای تنظیم شده وارد کردن دستور زیر در ترمینال سریع ترین راه ممکنه:

tvservice -s

خیلی اوقات نتایج حاصل از محاسبات ریاضی برنامه به صورت اعشاری نمایش داده می شوند. مثلا برنامه ساده زیر را در نظر بگیرید که در پایتون نوشته شده است:

a=7
b=8
c=10
average=(a+b+c)/3
print (average)

در حالی که مقدار ذخیره شده در سه متغیر ما همگی اعداد صحیح هستند، اما مقدار میانگین آنها به صورت اعشاری محاسبه و نمایش داده خواهد شد:

8.333333333333334

اگر تمایل دارید که این عدد با اعشار کمتری محاسبه شود کافی است به کمک تابع round کد بالا را به این صورت تغییر دهید:

average=round((a+b+c)/3 , 2)
print (average)

در اینجا نتیجه به نزدیکترین عدد با دو رقم اعشار رند می شود:

8.33

و اگر بخواهید نتیجه هم مانند سه متغیر عدد صحیح باشد کافی است که تعداد رقم اعشار را در round تعیین نکنید:

average=round((a+b+c)/3)
print (average)
8

برای کار با داده ها در پایتون راه های مختلفی وجود دارد که یکی از بهترین آنها کتابخانه pandas است. در این قسمت قصد داریم به صورت پایه ای کاربا این کتابخانه را آموزش بدهیم. قبل از هر کاری لازم است کتابخانه های زیر را نصب کنیم.

Pandas

xlrd

برای شروع بد نیست فایلهای اکسل و csv که برای دانلود گذاشته شده را دانلود کنید تا بتوانید روی آن تمرین کنید. این فایلها شامل اطلاعاتی فرضی درباره 10 کارمند خیالی در یک شرکت خیالی هستند که شامل نام و حقوق ماهانه و درصد مالیات و سابقه کار و رتبه شغلی می شود.

برای شروع لازم است که این فایل را در فولدری که برنامه پایتون را ذخیره می کنید قرار دهید. سپس برای مشاهده محتویات فایل ابتدا آن را به شکل یک دیتافریم در می آوریم و سپس آن را نمایش می دهیم. برای باز کردن این فایل csv به صورت یک دیتافریم pandas از قطعه کد زیر استفاده می کنیم:

import pandas as pd
myfile = 'Salaries.csv'
mydata=pd.read_csv(myfile)
print(mydata)

نتیجه به صورت زیر نمایش داده می شود:

      Name  Salary  Tax %  Experience  Level
0     Ayda      12     10          10      5
1   Peyman       5      5           3      3
2   Farzad       4      5           2      2
3  Behrooz      11     10           7      4
4    Simin       7      5           5      3
5     Mona       5      5           2      3
6    Kaveh       3      5           5      2
7     Sara      30     10          14      6
8    Ehsan       2      5           1      1
9    Shiva       3      5           5      2 

حال اگر فایلی با همان اطلاعات اما با فرمت xlsx که در واقع همان فرمت اکسل است در اختیار داشته باشیم با قطعه کد زیر می توانیم آن را به صورت یک دیتافریم pandas استخراج کنیم:

import pandas as pd
myfile = 'Salaries.xlsx'
mydata=pd.read_excel(myfile)
print(mydata)

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

گاهی اوقات اندازه دیتافریم بزرگ است و برای بررسی اینکه فرمت مناسبی دارد یا نه  کافی است که چند ردیف اول یا آخر آن را نمایش دهیم. برای این کار می توانیم از دستور head() یا tail() استفاده کنیم. در صورتی که درون پرانتز این دستورات هیچ عددی قرار ندهیم 5 سطر را نمایش می دهد. همچنین می توانیم با استفاده از دستور shape ابعاد دیتا فریم را مشاهده کنیم و به کمک دستور info() مشخصات مربوط به دیتافریم را ببینیم. در زیر کدی که این اطلاعات را نمایش می دهد قابل مشاهده است:

import pandas as pd
myfile = 'Salaries.xlsx'
mydata=pd.read_excel(myfile)
print(mydata.head(2))
print(mydata.tail(2))
print(mydata.shape)
print(mydata.info())

خروجی حاصل از اجرای این کد به شکل زیر خواهد بود:

     Name  Salary  Tax %  Experience  Level
0    Ayda      12     10          10      5
1  Peyman       5      5           3      3
    Name  Salary  Tax %  Experience  Level
8  Ehsan       2      5           1      1
9  Shiva       3      5           5      2
(10, 5)
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 10 entries, 0 to 9
Data columns (total 5 columns):
 #   Column      Non-Null Count  Dtype 
---  ------      --------------  ----- 
 0   Name        10 non-null     object
 1   Salary      10 non-null     int64 
 2   Tax %       10 non-null     int64 
 3   Experience  10 non-null     int64 
 4   Level       10 non-null     int64 
dtypes: int64(4), object(1)
memory usage: 424.0+ bytes
None

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

نصب Rust روی ویندوز

بدون دیدگاه

حتما اسم Rust به گوشتون خورده. یک زبان برنامه نویسی جدید که توسط Mozilla به وجود اومده و از لحاظ syntax به زبان C++ شباهت داره اما در زمینه امنیت حافظه ویژگیهای منحصر به فردی داره.

در این مطلب قصد داریم نحوه نصب این نرم افزار رو بر روی ویندوز آموزش بدیم. مراحل نصب خیلی ساده است. قبل از هر چیز باید گزینه مناسب رو از سایت برای نصب دانلود کنید. اسم فایل rustup-init.exe هست. وقتی دانلود شد اون رو اجرا می کنید و منتظر می مونید که مراحل نصب تموم شه.

بعد از پایان نصب برای اینکه اطمینان حاصل کنید که نصب به درستی انجام شده یه پنجره command prompt باز کنید و دستور زیر رو تایپ و اجرا کنید:

rustup

اگه نصب درست انجام شده باشه باید صفحه زیر رو مشاهده کنین:

rustup

حالا دستور زیر رو وارد کنید تا ببینیم toolchain به درستی نصب شده یا نه:

rustup toolchain list

در تصویر زیر می بینیم که نصب به درستی انجام شده:

rustup toolchain list

وقتی rust رو روی کامپیوتر نصب می کنید cargo هم هم زمان نصب می شه که در واقع build tool و package manager زبان rust محسوب می شه. برای اینکه بررسی کنید که cargo هم درست نصب شده یا نه دستور زیر رو اجرا کنید:

cargo

اگه توضیحات زیر رو دیدید خیالتون از نصب cargo هم راحت میشه:

rust cargo

دیدید که مراحل نصب خیلی ساده و سر راسته. در آموزشهای بعدی با برنامه نویسی در زبان rust آشنا می شیم.

LPC1768 تنظیم کلاک

بدون دیدگاه

ممکن است تنظیم کلاک میکروکنترلر LPC1768 برای عده ای از کاربران کمی گیج کننده به نظر برسد. به خصوص زمانی که به ظاهر تنظیمات کلاک به درستی انجام شده اما عملکرد میکروکنترلر قابل پیش بینی نیست. مثلا انتقال اطلاعات توسط UART به درستی انجام نمی شود. بنابراین داشتن درک کامل از چگونگی تنظیم کلاک LPC1768 بسیار حیاتی است.

LPC1768 منابع کلاک

در مرحله اول باید منبع کلاک واحد PLL0 را تعیین کنیم. در واقع کلاک اصلی به PLL0 وارد می شود و سپس فرکانس آن در چند عدد ضرب و تقسیم شده و کلاک پردازنده و سایر قسمتها تعیین می گردد. فرکانس کلاک توصیه شده برای میکروکنترلر LPC1768 از جانب NXP حداکثر 100MHz است و می تواند 3 نوع منبع کلاک مختلف داشته باشد:

• اسیلاتور RC داخلی که مقدار نامی آن 4MHz است و چندان دقیق نیست. این منبع پیش فرض می باشد.
• اسیلاتور خارجی که فرکانس آن می تواند بین 1 تا 24MHz باشد.
• اسیلاتور RTC که فرکانس 1Hz را برای واحد ساعت واقعی و 32KHz را برای PLL0 و CPU و watchdog تولید می کند.

باید دقت کرد که فقط اسیلاتور خارجی برای کار با واحدهای USB و CAN مناسب است. برای انتخاب یکی از این سه منبع از رجیستر CLKSRCSEL استفاده می کنیم. بیتهای 0 و 1 این رجیستر برای انتخاب منبع کلاک استفاده می شوند و سایر بیتها رزرو شده اند. برای انتخاب اسیلاتور داخلی 00 ، اسیلاتور اصلی ( خارجی ) 01 ، اسیلاتور RTC 10 را به بیتهای فوق نسبت می دهیم. اما 11 رزرو شده و نباید این دو بیت را با 11 تنظیم نمود. بنابراین در صورتی که بخواهیم منبع کلاک خارجی را انتخاب کنیم می توانیم از دستور زیر استفاده نماییم:

;LPC_SC->CLKSRCSEL=0X00000001


محدوده فرکانس اسیلاتور اصلی می تواند فرکانس پایین و از 1 تا 20MHz و فرکانس بالا بین 15MHz تا 24MHz باشد. برای انتخاب یکی از این دو محدوده از بیت شماره 4 رجیستر SCS به نام OSCRANGE استفاده می شود. 0 بودن این بیت به معنی انتخاب محدوده فرکانس پایین و 1 بودن آن به معنی انتخاب محدوده فرکانس بالا است.

همچنین برای فعال ساختن اسیلاتور اصلی از بیت 5 رجیستر SCS به نام OSCEN استفاده می شود که با 0 کردن آن اسیلاتور غیرفعال و با 1 کردنش اسیلاتور فعال می شود.

بیت 6 رجیستر SCS نیز فقط خواندنی بوده و 0 بودن آن به معنی آماده نبودن اسیلاتور و 1 بودنش به معنی آماده بودن اسیلاتور می باشد.

سایر بیتهای رجیستر SCS رزرو شده هستند. بنابراین اگر بخواهیم از کریستال خارجی 12MHz به عنوان منبع کلاک استفاده کنیم باید از دستور زیر استفاده نماییم:

;LPC_SC->SCS=0x20

PLL0 تنظیم فرکانس

حالا که منبع کلاک و محدوده آن مشخص شد باید فرکانس کلاک PLL0 را مشخص کنیم. فرکانس خروجی PLL0 طبق رابطه زیر محاسبه می شود:

که:
FCCO: فرکانس PLLCLK یا همان خروجی PLL است. مقدار این فرکانس باید بین 275MHz تا 550MHz باشد.
FIN: فرکانس کلاک ورودی PLL است که باید بین 32KHz تا 50MHz باشد.
N: مقداری است که فرکانس ورودی به آن تقسیم می شود و مقدار آن بین 1 تا 32 می باشد.
M: مقداری است که فرکانس در آن ضرب شده و افزایش می یابد. مقدار آن در فرکانسهای محدوده MHz می تواند بین 6 تا 512 باشد.

برای تنظیم فرکانس مورد نظر باید 4 مرحله زیر به ترتیب انجام شوند:

1- با استفاده از رجیستر PLL0CON واحد PLL0 را فعال کرده و خروجی آن را به سایر واحدها وصل می کنیم.
2- با استفاده از رجیستر PLL0CFG مقادیر ضرب کننده و تقسیم کننده M و N را تنظیم و فرکانس خروجی PLL0 را مشخص می نماییم.
3- مقدار رجیستر PLL0STAT را بررسی می کنیم تا خروجی PLL روی فرکانس دلخواه قفل شده باشد.
4- با استفاده از رجیستر PLL0FEED مقادیر تعیین شده در رجیسترهای PLL0CON و PLL0CFG را اعمال می نماییم.

شرح بیتهای 4 رجیستر بالا به شرح زیر است.

PLL0CON: فقط بیتهای 0 و 1 مورد استفاده قرار می گیرند. با 1 کردن بیت 0 واحد PLL اجازه می یابد روی فرکانس دلخواه قفل شود. با 1 کردن بیت 1 خروجی واحد PLL به سایر واحدها متصل می شود.

PLL0CFG: بیتهای 0 تا 14 این رجیستر مربوط به انتخاب ضرب کننده M هستند. هر مقداری که در این قسمت رجیستر قرار داده شود برابر M-1 است. بیت 15 رزرو شده است. بیتهای 16 تا 23 مربوط به انتخاب تقسیم کننده N هستند. هر مقداری که در این قسمت رجیستر قرار داده شود برابر N-1 است. بیتهای 24 تا 31 نیز رزرو شده اند.

PLL0STAT: این رجیستر وضعیت PLL را برمی گرداند. بیتهای 0 تا 14 نشان دهنده M-1 و بیتهای 16 تا 23 نشان دهنده N-1 هستند. بیت 24 نشان دهنده وضعیت فعال بودن PLL است. بیت 25 اتصال خروجی PLL به سایر واحدها را نشان می دهند. اگر بیت 26 این رجیستر 1 باشد PLL0 روی فرکانس مورد نظر قفل شده است. سایر بیتها رزرو شده اند.

PLL0FEED: با نوشتن مقدار 0xAA و بعد مقدار 0x55 در این رجیستر ، مقادیر رجیسترهای PLL0CON و PLL0CFG اعمال می شوند. در واقع تنظیم این دو رجیستر به تنهایی و بدون نوشتن مقدار 0xAA مقدار 0x55 در PLL0FEED هیچ تغییری در PLL0 ایجاد نخواهد کرد.

یکی از نکاتی که هنگام تعیین فرکانس باید رعایت شود این است که آیا قرار است از USB استفاده شود یا خیر؟ چرا که این واحد به دیوتی سایکل 50% فرکانس 48MHz نیاز دارد. بنابراین اگر بخواهیم از USB استفاده کنیم حتما فرکانس خروجی PLL0 باید مضرب صحیحی از 48MHz باشد.

همچنین باید توجه کرد که با انتخاب N کوچک ، M نیز کوچک خواهد بود و PLL0 با ثبات تر عمل خواهد نمود.

PLL0 مثال تنظیم فرکانس

اکنون با یک مثال نحوه محاسبات N و M را بررسی می کنیم.

فرض می کنیم که کریستال خارجی ما 10MHz است، از USB استفاده نمی کنیم و می خواهیم فرکانس کلاک پردازنده 100MHz باشد.

ابتدا با جابه جایی پارامترهای رابطه محاسبه فرکانس PLL0 آن را به شکل زیر بازنویسی می کنیم:

می دانیم که FIN برابر 10MHz است. برای اینکه FCCO مضرب صحیحی از 100MHz باشد و ضمنا بین 275MHz و 550MHz باشد می توانیم دو عدد 400MHz و 300MHz را در نظر بگیریم که از بین این دو 300MHz مناسب تر است چرا که انرژی کمتری مصرف می شود. با انتخاب این عدد و انتخاب N=1 ( کوچکترین عدد صحیح ممکن ) مقدار M برابر 15 خواهد بود. باید توجه نمود که مقادیر باید به نحوی انتخاب شوند که M عددی صحیح باشد.

بنابراین مقداری که باید در رجیستر PLL0CFG نوشته شود 0x0E خواهد بود. چرا که M-1=14 و N-1=0 .

تنظیم کلاک سایر واحدها

کلاک خروجی PLL که همان PLLCLK نامیده می شود کلاک سه بخش مختلف را تامین می کند:

1- کلاک پردازنده یا CCLK
2- کلاک USB یا USBCLK
3- کلاک لوازم جانبی یا PCLK

برای تنظیم فرکانس کلاک پردازنده باید خروجی PLL0 را بر یک عدد بین 1 تا 256 تقسیم نمود. این کار با استفاده از بیتهای 0 تا 7 رجیستر CCLKCFG انجام می شود که CCLKSEL نامیده می شود و مقداری که در آن می ریزیم باید 1 واحد کمتر از عدد تقسیم کننده باشد. برای واضح شدن این مطلب مثال قبل را در نظر می گیریم. با توجه به اینکه می خواستیم CCLK برابر 100MHz باشد و FCCO برابر 300MHz بود بنابراین عدد تقسیم کننده باید برابر 3 باشد و در نتیجه CCLKSEL را با دستور زیر برابر 2 تنظیم می کنیم:

;LPC_SC->CCLKCFG=0x00000002

برای تنظیم کلاک USB یا USBCLK روش مشابهی وجود دارد که روی رجیستر USBCLKCFG اعمال می شود. بیتهای 0 تا 3 که USBSEL نامیده می شود عدد تقسیم کننده FCCO را تعیین می کند که باید باز هم با 1 واحد جمع شود.

تنظیم کلاک لوازم جانبی نیز با استفاده از رجیسترهای PCLKSEL1 و PCLKSEL0 انجام می شود.

در صورتی که نخواهیم USB را با استفاده از خروجی PLL0 راه اندازی کنیم می توانیم کلاک آن را از PLL1 تامین نماییم. در این صورت خروجی PLL0 خود به خود از USB قطع می شود.

PLL0 مراحل راه اندازی

در پایان مراحل کامل راه اندازی PLL0 شرح داده می شود:

1- اگر PLL0 متصل است آن را با یک توالی PLL0FEED قطع می کنیم.
2- PLL0 را با یک توالی PLL0FEED غیر فعال می کنیم.
3- در صورت لزوم CCLKSEL را تغییر می دهیم تا عملیات بدون استفاده از PLL0 تسریع شود.
4- در صورت لزوم CLKSRCSEL برای تعیین منبع کلاک تنظیم می کنیم.
5- PLL0CFG را برای تعیین فرکانس کلاک خروجی PLL0 تنظیم می کنیم و آن را با یک توالی PLL0FEED اعمال می نماییم. توجه شود که PLL0CFG فقط زمانی قابل تغییر است که PLL0 غیرفعال شده باشد.
6- PLL0 را با یک توالی PLL0FEED فعال می کنیم
7- تقسیم کننده کلاک پردازنده یعنی CCLKSEL را با تنظیم CCLKCFG تغییر می دهیم. این کار حتما باید قبل از اتصال PLL0 انجام شود.
8- با بررسی بیت 26 رجیستر PLL0STAT مطمئن می شویم که فرکانس PLL0 قفل شده است. در بعضی فرکانسهای مرج PLL0 ممکن است این بیت 1 نشود. بنابراین می توان یک زمان ثابت نیز برای تثبیت شدن فرکانس خروجی در نظر گرفت و پس از گذشت آن زمان به مرحله بعد رفت.
9- واحد PLL0 را با یک توالی PLL0FEED به واحدهای دیگر وصل می کنیم.

برنامه

در مثال زیر می خواهیم نحوه برنامه نویسی مطالب فوق را نمایش دهیم.

فرض می کنیم که کریستال 12MHz را به عنوان منبع کلاک به کار برده ایم و می خواهیم فرکانس کلاک پردازنده 72MHz باشد. همچنین از USB استفاده نکرده و فرکانس کلاک لوازم جانبی هم مقدار پیش فرض یک چهارم فرکانس پردازنده است.

#include "lpc17xx.h"
	
	int main()
	{
		LPC_SC ->SCS=0x00000020;			//چون از کریستال 12 مگاهرتز استفاده می کنیم 
		while ((LPC_SC->SCS & (1<<6)) == 0);	// صبر می کنیم تا اسیلاتور آماده شود 
		LPC_SC->CCLKCFG   =0x00000003;		// تقسیم کننده پردازنده اصلی را برابر 4 در نظر می گیریم
		LPC_SC->CLKSRCSEL =0x00000001;		// اسیلاتور خارجی را به عنوان منبع کلاک تعیین می کنیم
		LPC_SC->PLL0CFG =0x0000000B;		// N=1 , M=12 => FCCO=288MHz 
		LPC_SC->PLL0CON   = 0x01;			//  را فعال می کنیم PLL0
		LPC_SC->PLL0FEED  = 0xAA;			//  را اعمال می کنیم PLL0 تنظیمات
		LPC_SC->PLL0FEED  = 0x55;
		while (!(LPC_SC->PLL0STAT & (1<<26)));	//   قفل شود PLL0 صبر می کنیم تا فرکانس 
		LPC_SC->PLL0CON   = 0x03;			//  را فعال و وصل می کنیم PLL0  
		LPC_SC->PLL0FEED  = 0xAA;			//  را اعمال می کنیم PLL0 تنظیمات
		LPC_SC->PLL0FEED  = 0x55;
		LPC_SC->PCLKSEL0  = 0x00000000;		// لوازم جانبی به صورت پیش فرض با فرکانس 
		LPC_SC->PCLKSEL0  = 0x00000000;		// یک چهارم کلاک پردازنده کار می کنند
	}

در مطلب بعدی خواهیم دید که چگونه همه تنظیمات فوق به وسیله configuration wizard به راحتی قابل انجام است.

آشنایی با LCD کاراکتری

کسانی که با میکروکنترلر کار کردند حتما با LCD کاراکتری هم آشنا هستند. در کامپایلرهای مختلف معمولا کتابخانه های آماده برای استفاده از این نوع نمایشگرها وجود داره. اما اگه قصد داشته باشیم خودمون این نمایشگرها رو راه اندازی کنیم باید چکار کنیم؟ مثلا اگه چه راهی وجود داره اگه بخوایم برای یه میکروکنترلر دارای پردازنده ARM که کتابخونه ای براش نوشته نشده برنامه بنویسیم و خروجیها رو روی LCD کاراکتری نمایش بدیم ؟
در این مطلب نحوه راه اندازی LCD کاراکتری 16×2 توضیح داده شده.

پایه های LCD کاراکتری

عملکرد پایه های LCD کاراکتری از 1 تا 16 در شکل زیر دیده می شن:

پایه 1 به زمین و پایه 2 معمولا به 5 ولت متصل و کنتراست LCD با اتصال پایه 3 به سر وسط یک پتانسیومتر تنظیم می شه. پایه 4 یا همون RS اگه بالا باشه LCD در حالت داده قرار می گیره، یعنی اطلاعاتی که روی پایه های D0 تا D7 قرار می گیره برای LCD به معنی کد کاراکترهایی هستند که باید نمایش داده بشن. اما اگه پایه RS پایین باشه LCD در حالت دستوری قرار می گیره. یعنی با قراردادن کد مناسب روی پایه های D0 تا D7 می شه دستوراتی مثل پاک کردن صفحه نمایش رو انجام داد.
پایه 5 اگه high باشه LCD در حالت خواندن و اگه low باشه در حالت نوشتن قرار می گیره. اکثرا نیازی به خوندن وضعیت LCD نداریم و معمولا می شه این پایه رو به زمین وصل کنیم.
پایه های 15 و 16 هم به ترتیب پایه تغذیه و زمین LED نور پس زمینه هستند ام باید یه مقاومت مناسب مثلا 390 اهم برای راه اندازی نور پس زمینه استفاده بشه.
راه اندازی LCD کاراکتری در دو حالت 8 بیتی و 4 بیتی امکان پذیره. در مد 4 بیتی فقط پایه های D4 تا D7 مورد استفاده قرار می گیرند.

راه اندازی LCD کاراکتری در حالت 8 بیتی

1- پایه E رو high می کنیم.
2- پایه RS رو low می کنیم.
3- عدد 0011100 رو روی پایه های D0 تا D7 قرار می دیم. طوری که رقم سمت چپ باید به D7 و رقم سمت راست به D0 اعمال بشه.
4- بعد پایه E رو به مدت حداقل 500nS low می کنیم و بعد دوباره high می کنیم.
5- بعد عدد 00001100 رو مثل مرحله 3 روی پایه های داده قرار می دیم.
6- مثل مرحله 4 پایه E رو low و high می کنیم.

با اعمال دستورات بالا LCD آماده کار می شه. اولین دستوری که به LCD داده شد حالت کاری رو مشخص می کنه که در اینجا نمایشگر 2 ردیفی، نحوه اتصال 8 بیتی و فونت 7×5 پیکسلی انتخاب شدند. در واقع هر بیت نشان دهنده یک وضعیت می تونه باشه که با رجوع به دیتاشیت می تونین به راحتی عملکرد هر بیت رو پیدا کنین.
دستور دوم هم نمایشگر رو روشن، cursor رو خاموش و چشمک زن رو هم خاموش می کنه. اگه بخوایم cursor دیده بشه بیت مربوط به D1 رو 1 می کنیم و اگه بخوایم چشمک زن رو هم فعال کنیم بیت مربوط به D0 رو 1 می کنیم.
حالا LCD آماده دریافت اطلاعات از میکروکنترلر هست. برای این کار مراحل زیر رو انجام می دیم.

1- پایه RS رو high می کنیم.
2- کد اسکی کاراکتر دلخواه رو روی پایه های D0 تا D7 قرار می دیم. مثلا برای نمایش حرف K عدد 01001011 رو روی باس داده قرار می دیم.
3- بعد پایه E رو به مدت حداقل 500nS low می کنیم و بعد دوباره high می کنیم.

در این مرحله کاراکتر K روی صفحه نمایش ظاهر می شه.
عیب روش 8 بیتی اینه که مجبوریم 4 پایه میکروکنترلر رو بیشتر از حالت 4 بیتی به LCD متصل کنیم. به همین علت روش راه اندازی LCD کاراکتری به روش 4 بیتی در اینجا به طور کامل توضیح داده شده.

راه اندازی LCD کاراکتری به روش 8 بیتی قبلا توضیح داده شد. گفتیم که برای آزاد کردن 4 تا پایه میکروکنترلر می تونیم از روش راه اندازی 4 بیتی استفاده کنیم.
در این روش مراحل راه اندازی اولیه LCD کمی طولانی تره و برای فرستادن کد اسکی به نمایشگر هم به دو مرحله احتیاج داریم. بنابراین این روش از روش 8 بیتی کند تر عمل می کنه اما با توجه به سرعت میکروکنترلرهای امروزی در عمل به مشکلی بر نمی خوریم.

در روش 4 بیتی پایه های D0 تا D3 استفاده نمی شن و به طور کلی در مدار به جایی متصلشون نمی کنیم. اتصال بقیه پایه ها مثل روش 8 بیتی هست.

راه اندازی LCD کاراکتری به روش 4 بیتی

ابتدا تغذیه LCD رو وصل می کنیم و 100mS صبر می کنیم. بعد مراحل زیر رو به ترتیب انجام می دیم:

1- پایه E رو high می کنیم
2- پایه RS رو low می کنیم
3- عدد 0011 رو روی پایه های D4 تا D7 قرار می دیم. طوری که رقم سمت چپ به D7 و رقم سمت راست به D4 اعمال بشه.
4- پایه E رو به مدت حداقل 500nS low می کنیم و بعد دوباره high می کنیم.
5- به مدت 50mS صبر می کنیم.
6- عدد 0011 رو روی باس داده قرار می دیم.
7- پایه E رو به مدت حداقل 500nS low می کنیم و بعد دوباره high می کنیم.
8- به مدت 100uS صبر می کنیم.
9- عدد 0011 رو روی باس داده قرار می دیم.
10- پایه E رو به مدت حداقل 500nS low می کنیم و بعد دوباره high می کنیم.
11- به مدت 100uS صبر می کنیم.
12- عدد 0010 رو روی باس داده قرار می دیم.
13- پایه E رو به مدت حداقل 500nS low می کنیم و بعد دوباره high می کنیم.
14- به مدت 100uS صبر می کنیم.
15- عدد 0010 رو روی باس داده قرار می دیم.
16- پایه E رو به مدت حداقل 500nS low می کنیم و بعد دوباره high می کنیم.
17- عدد 1000 رو روی باس داده قرار می دیم.
18- پایه E رو به مدت حداقل 500nS low می کنیم و بعد دوباره high می کنیم.
19- به مدت 100uS صبر می کنیم.
20- عدد 0000 رو روی باس داده قرار می دیم.
21- پایه E رو به مدت حداقل 500nS low می کنیم و بعد دوباره high می کنیم.
22- عدد 1000 رو روی باس داده قرار می دیم.
23- پایه E رو به مدت حداقل 500nS low می کنیم و بعد دوباره high می کنیم.
24- به مدت 100uS صبر می کنیم.
25- عدد 0000 رو روی باس داده قرار می دیم.
26- پایه E رو به مدت حداقل 500nS low می کنیم و بعد دوباره high می کنیم.
27- عدد 0001 رو روی باس داده قرار می دیم.
28- پایه E رو به مدت حداقل 500nS low می کنیم و بعد دوباره high می کنیم.
29- به مدت 3mS صبر می کنیم.
30- عدد 0000 رو روی باس داده قرار می دیم.
31- پایه E رو به مدت حداقل 500nS low می کنیم و بعد دوباره high می کنیم.
32- عدد 0110 رو روی باس داده قرار می دیم.
33- پایه E رو به مدت حداقل 500nS low می کنیم و بعد دوباره high می کنیم.
34- به مدت 100uS صبر می کنیم.
35- عدد 0000 رو روی باس داده قرار می دیم.
36- پایه E رو به مدت حداقل 500nS low می کنیم و بعد دوباره high می کنیم.
37- به مدت 100uS صبر می کنیم.
38- عدد 1100 رو روی باس داده قرار می دیم.
39- پایه E رو به مدت حداقل 500nS low می کنیم و بعد دوباره high می کنیم.
40- به مدت 100uS صبر می کنیم.

با پایان این مراحل LCD آماده نوشتنه. از ابتدای مرحله 15 تا آخر مرحله 19 مربوط به تنظیم حالت کاری LCD در نمایشگر 2 ردیفی، نحوه اتصال 4 بیتی و فونت 7×5 پیکسلی هست. از ابتدای مرحله 20 تا آخر مرحله 24 صفحه نمایشگر خاموش می شه. از ابتدای مرحله 25 تا آخر مرحله 29 دستور پاک کردن صفحه نمایش صادر می شه. از ابتدای مرحله 30 تا آخر مرحله 34 نحوه افزایش شاخص مکان نما مشخص می شه که در اینجا با تایپ هر کاراکتر یکی به اون اضافه می شه. و بالاخره از ابتدای مرحله 35 تا آخر مرحله 40 نمایشگر روشن می شه، cursor خاموش و چشمک زن هم غیر فعال می شه.
حالا LCD آماده دریافت کد اسکی کاراکترهاست. برای نمایش هر کاراکتر مراحل زیر رو انجام می دیم:

1- پایه RS رو high می کنیم.
2- 4 بیت سمت چپ کد اسکی رو روی باس داده قرار می دیم. مثلا 0100 رو برای حرف K
3- پایه E رو به مدت حداقل 500nS low می کنیم و بعد دوباره high می کنیم.
4- 4 بیت سمت راست کد اسکی رو روی باس داده قرار می دیم. مثلا 1011 رو برای حرف K
5- پایه E رو به مدت حداقل 500nS low می کنیم و بعد دوباره high می کنیم.

در اینجا اگه همه مراحل درست انجام شده باشه باید حرف K روی LCD ظاهر بشه.

اگه قصد دارید کار با میکروکنترلر LPC1768 رو که از خانواده ARM Cortex-M3 هست شروع کنید، احتمالا این آموزش که توسط کاراکیت براتون تدارک دیده شده بدردتون می خوره.
برای شروع یک فولدر در محل دلخواه ایجاد کنید و نام متناسب با پروژه رو بهش اختصاص بدید. بعد نرم افزار Keil رو باز کنید و طبق شکل زیر روی منوی Project برید و روی New uVision Project کلیک کنید و پروژه رو با نام دلخواه در فولدری که ایجاد کردید ذخیره کنید.

بلافاصله پنجره ای باز می شه و از شما می خواد که تراشه مورد نظر رو انتخاب کنید. ابتدا مثل شکل زیر نام NXP رو که سازنده میکروکنترلر LPC1768 هست انتخاب کنید.

حالا از فهرستی که باز شده میکروکنترلر LPC1768 رو پیدا و انتخاب کنید. دقت کنید که با انتخاب میکروکنترلر در کادر سمت راست مشخصات مربوط به اون نوشته می شه.

با کلیک روی دکمه ok نرم افزار مثل شکل پایین از شما می پرسه که آیا باید فایل استارت آپ رو اضافه کنه یا نه که شما yes رو انتخاب می کنین.

حالا پروژه شما ایجاد شده و شما باید فایلهای مورد نیاز رو به پروژه تون اضافه کنید. قبل از هر کاری باید دو تا فایل ضروری رو توی فولدر پروژه کپی کنید. اولی system_LPC17xx.c و دومی core_cm3.c هست.

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

حالا منوی File رو باز کنید و با استفاده از گزینه New یک فایل جدید بوجود بیارید. این فایل فعلا به فرمت متن یا text هست.

بنابراین دوباره منوی File رو باز کنید و با کلیک روی گزینه Save as فایل رو در محل فولدر پروژه و با نام مناسب و پسوند .c ذخیره کنید. مثلا می تونید اسمش رو main.c بگذارید.

با اینکه فایلها در محل فولدر پروژه ایجاد شدند اما هنوز به خود پروژه اضافه نشدند. به همین علت در این مرحله باید طبق شکل زیر روی آیکن File extensions کلیک کنید تا فایلها رو به پروژه اضافه کنید.

با کلیک روی دکمه Add files فایلهای مورد نیاز رو به پروژه تون اضافه کنید.


اگه این مرحله درست انجام شده باشه فایلهاتون در قسمت راست دیده می شه. حالا با کلیک روی دکمه OK عمل اضافه کردن فایلهای مورد نیاز به پایان می رسه.

حالا موقع اونه که تنظمات پروژه رو انجام بدیم. برای اینکار روی آیکن Target Options کلیک کنید.

پنجره ای باز می شه که چند تا لبه داره و به صورت پیش فرض لبه Target فعال هست. در این لبه اول مقدار کریستال متصل به میکروکنترلر رو تنظیم کنید. بعد اگه برای پروگرام میکرو از بوتلودر استفاده می کنید آدرس ابتدای حافظه رو در محل IROM1 به 0x2000 تغییر بدید

بعد از انجام این تنظیمات روی لبه Output کلیک کنید و طبق شکل زیر چک گزینه Create HEX File رو بذارید تا موقع کامپایل برنامه فایل HEX تولید بشه و بتونید اون رو روی میکرو پروگرام کنید. با کلیک روی دکمه OK کار تنظیمات پروژه به پایان می رسه و می تونید کدنویسیتون رو شروع کنید.

قبل از هر کاری طبق شکل زیر فایل هدر #include “lpc17xx.h” رو معرفی کنید. سایر فایلها و کتابخونه های مورد نیاز رو هم می تونید بعدا زیر همین خط اضافه کنید. بلوک تابع اصلی یا main رو هم طبق همین شکل اضافه کنید و حتما می دونید که متن برنامه اصلی داخل آکولادهای همین تابع نوشته می شه. نکته آخر اینه که بعد از آکولاد پایانی تابع اصلی main چند تا Enter بزنید و چند تا خط خالی ایجاد کنید تا موقع کامپایل برنامه با خطا مواجه نشید.

ضمن عرض تبریک بابت ایجاد و تنظیم موفقیت آمیز پروژه ، می تونید برنامه نویسی رو شروع کنید! تنها نکته ای که بد نیست بهش اشاره بشه اینه که روال ایجاد پروژه برای سایر میکروکنترلرهای خانواده ARM هم مشابه همین فرایندی هست که توضیح داده شد. اگه دقت کرده باشید فقط چند مرحله از مراحلی که توضیح داده شد منحصر به LPC1768 بود و با طی کردن مراحل مشابه می شه برای سایر میکروکنترلرهای ARM هم پروژه جدید در Keil ایجاد کرد.