السن

راه اندازی LCD کاراکتری با STM32 بدون تابع delay

در این نوشته یادمیگیرید چطوری LCD کاراکتری رو با STM32 راه اندازی کنید ، با برنامه ای که در اون تابع تاخیر ( delay ) وجود ندارد . چجوری ؟ با تایمر و DMA میکروکنترلر STM32 ، اینجوری CPU تنها باید عملیات رو آغاز کنه و مثل کد های آردوئینویی از ابتدا تا انتها درگیر کار نیست.

پیوند های این نوشته :

  • آموزش ویدئویی راه اندازی سریع کتابخانه ی lcd کاراکتری با STM32 بدون دیلی با تایمر و DMA در آپارات
  • آموزش ویدئویی نوشتن کتابخانه راه اندازی LCD کاراکتری با STM32 بدون تابع تاخیر و با تایمر و DMA در یوتوب به انگلیسی
  • آموزش فارسی نوشتن کتابخانه راه اندازی LCD کاراکتری 4 بیت و 8 بیت با تایمر و DMA در دوره آموزش پیشرفته STM32F103
  • بارگیری کتابخانه LCD کاراکتری 8 بیت با STM32 با تایمر و DMA از گیت هاب
  • بارگیری کتابخانه LCD کاراکتری 4 بیت با STM32 با تایمر و DMA از گیت هاب

پایه های تغذیه در LCD کاراکتری 

  • پایه ی 1 : زمین .
  • پایه 2 : تغذیه 5 ولت .
  • پایه ی 3 : بسته میشه به سر وسط مقاومت متغیر برای تنظیم کنتراست LCD کاراکتری .
  • پایه ی 15 : آند برای نور پس زمینه بسته میشه به 5 ولت .
  • پایه ی 16 : کاتد برای نور پس زمینه بسته میشه به زمین .

 

چگونگی ارتباط پارالل با LCD کاراکتری 

نخست باید بدونید چجوری باید 1 بایت ( 8 بیت ) رو به LCD کاراکتری بفرستیم. ارتباط با LCD کاراکتری پارالل ( موازی ) هست . یعنی هر هشت تا بیت همزمان روی هشت تا سیم به LCD داده میشه . بر خلاف ارتباط سریال که بیت ها به ترتیب روی یک سیم جابجا میشن.

 

 

برای ارتباط با LCD کاراکتری 11 تا پایه هست:

  • پایه های D0 – D7 نگه دارنده ی بایتی هستند که میخواهیم بنویسیم.
  • پایه ی E برای فعال کردن هر انتقال بایت.
  • پایه ی RS برای مشخص کردن اینکه بایتی که میخواهیم بنویسیم داده RS=1 است یا دستور RS=0 است .
  • پایه ی RW برای مشخص کردن اینکه میخواهیم بنویسیم RW=0 یا بخوانیم RW=1 ، چون ما در این آموزش تنها در LCD بایت مینویسیم همیشه RW=0 است.

 

من تنها در LCD مینویسم و پایه ی RW به زمین بسته میشود . فرستادن هر بایت به LCD چهار گام دارد که زمان بین گام ها نیز در دیتاشیت نوشته شده .

  1. بسته به اینکه دستور یا داده میفرستیم پایه ی RS = 0 or 1 .
  2. پایه ی E یک میشود .
  3. مقدار 8 بیتی را روی 8 پایه ی D0 – D7 میگذاریم.
  4. پایه ی E صفر میشود . 

پس از فرستادن هر بایت به LCD کاراکتری ، نمایشگر به زمانی برای اجرا نیازمند است که برای هر بایت گوناگون است ، برای بیشتر بایتها 43us کافی است.

 

دستورالعمل ها یا instruction code های LCD کاراکتری

  • LCD کاراکتری 11 تا دستورالعمل یا instruction code داره .
  • هر کدوم برای نوشتن یا خوندن بایت در LCD کاراکتری هستند.
  • هر کدوم از دستورالعمل ها برای یک کاری اند ، مثلا برای تنظیمات یا نوشتن در RAM  یا … .
  • در هر دستورالعمل مشخص شده که 8 پایه ی باس پارالل و پایه های RW و RS چه مقداری دارند.

برای راه اندازی LCD تنها به 6 دستورالعمل نیاز هست .

دستورالعمل clear display در lcd کاراکتری

این دستورالعمل که یک بایت با مقدار 1 هست رو تنها یک بار در آغاز راه اندازی بکار گرفتم ، چون زمان لازم برای اجرای آن 1.53ms است و با بقیه جور نیست و بجای آن میتوان در تمام LCD اسپیس نوشت و فرقی ندارد.

دستورالعمل Dispaly و function set و entry mode در lcd کاراکتری

در این سه دستورالعمل ، بیت های D , B , C , DL , N ,F , SH, I/D هر کدوم میتونند صفر یا یک باشند و اینکه صفر یا یک بودن چه تاثیری داره رو در نگاره زیر میبینید.

 

دو دستورالعمل مورد نیاز دیگر مربوط به نوشتن در AC و RAM هستند که در بخش بعدی میگم.

چگونگی نمایش کاراکترها در LCD کاراکتری 

lcd کاراکتری دو یادگاه ( حافظه ) دارد :

  • CGROM :  برای انبار شدن همه ی کاراکتر هایی که میتوانیم نمایش دهیم . در بی برقی هم درونمایه ی این یادگاه ( حافظه ) از بین نمیرود.
  • DDRAM : گزینش کارکتر ها برای نمایش در lcd کاراکتری . در بی برقی درونمایه ی این یادگاه از دست میرود. 

 

یادگاه CGROM در LCD کاراکتری

  • در این یادگاه ( حافظه ) ، همه ی کاراکتر ها انبار شده اند و کاراکتر هایی که در LCD نمایش داده میشوند، از اینجا گزینش میشوند .
  • اگر بخواهیم کاراکتر های مثلا فارسی در LCD نمایش دهیم ، نخست باید همه ی کاراکترهای فارسی را در این یادگاه بنویسیم.
  • هر کاراکتر در یک نشانی 8 بیتی در یادگاه CGROM انبار شده است.
  • نشانی هر کاراکتر در یادگاه CGROM ، کد اسکی آن کاراکتر است ، برای نمونه کاراکتر A در نشانی 65 انبار شده است.

 

 

یادگاه DDRAM در lcd کاراکتری

  • LCD کاراکتری 16×2 به شمار 32 جایگاه کاراکتر دارد ، برای هر کدام از این 32 تا جایگاه، یک خانه ی 8 بیتی در یادگاه DDRAM هست.
  • برای نمونه نشانی 00 در یادگاه DDRAM برای یکمین کاراکتر در سطر یکم در lcd کاراکتری است .
  • اگر بخواهیم کاراکتر A را در یکمین جایگاه از سطر یکم در lcd کاراکتری نمایش دهیم ، باید آدرس کاراکتر A در یادگاه CGROM را که میشود 65 در آدرس 00 در یادگاه DDRAM بنویسیم.

 

 

رجیستر AC یا Address Counter یا شمارنده ی نشانی

  • این رجیستر ، نشانی ای از یادگاه ( حافظه ) CGROM یا DDRAM را که میخواهیم درونمایه ی آنرا بخوانیم یا در آن بنویسیم را نگه میدارد.
  • پس از اینکه در نشانی CGROM / DDRAM نوشتیم یا خواندیم ، مقدار رجیستر AC خودکار یکی زیاد یا کم میشه . خودمون میتونیم شیوه گذاری (تنظیم ) کنیم که زیاد یا کم بشه. 

چگونه در DDRAM نمایشگر کاراکتری بنویسیم

تا اینجا میدانید برای نمایش کاراکترها در LCD کاراکتری باید نشانی آن کاراکتر در یادگاه CGROM را در خانه های DDRAM بنویسیم. چگونه ؟

  1. باید مشخص کنیم که در کجا میخواهیم بنویسیم ، با نوشتن آدرس DDRAM در رجیستر AC یا Address Counter .
  2. باید نشانی کاراکتر در CGROM را که کد اسکی آن کاراکتر هست در DDRAM بنویسیم.

برای هر یک از این دو کار یک دستور وجود دارد. در این دستور ها :

  • AC0 – AC6 بیانگر نشانی خانه ی DDRAM هست که میخواهیم در آن بنویسیم.
  • D0 – D7 بیانگر آن مقدار 8 بیتی هست ( آدرس کاراکتر در CGROM ) که میخواهیم در یادگاه ( حافظه ) DDRAM بنویسیم.

 

 

برای نمونه ، پندارید میخواهیم با آغاز از ستون 4 در سطر یکم ، در نمایشگر بنویسیم STM ، چگونه ؟

  • نشانی هر کاراکتر در یادگاه CGROM ، کد اسکی آن است ، پس نشانی S و T و  M به ترتیب هست 83 و 84 و 77 .
  • به ترتیب باید در نشانی 03 و 04 و 05 در DDRAM بنویسیم 83 و 84 و 77 .
  • یک بار دستور نوشتن در AC و سه بار دستور نوشتن در RAM را اجرا میکنیم. مقدار AC خودکار پس از هر بار نوشتن در RAM زیاد میشود.

 

آغاز به کار LCD کاراکتری

برای آغاز به کار LCD کاراکتری باید چند دستورالعمل رو پشت هم با فاصله های زمانی گفته شده در دیتاشیت اجرا کنیم. در برنامه برای ایجاد فاصله های زمانی بین اینها از تابع delay استفاده کردم ، چون تنها یک بار در ابتدای کد لازمه اجرا بشه و مهم نیست.

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

 

باید با میکروکنترلر بایتها رو در LCD کاراکتری بنویسیم ، و 4 گامی که در نگاره ی زیر میبینید رو برای هر بایت انجام بدیم. 

در آموزش هایی که در اینترنت برای راه اندازی LCD کاراکتری مبینید ، همچین کدی رو برای نوشتن بایتها در LCD بکار میگیرند.

 

  • در این کد CPU باید وضعیت پایه ها رو تغییر بده و سپس در تابع تاخیر صبر کنه تا زمانبندی هم جور بشه.
  • ولی این روش کار با STM32 نیست ، این همون کد آردوئینو هست که افراد میاد روی STM32 هم مینویسند. که اشتباهه.
  • میکروکنترلر STM32 برای کارهای صنعتی و نظامی بکار میره ولی به شرطی که قابلیت های اون رو بکار بگیرید، اگر همون برنامه ی آردوئینو رو میخواهید روی STM32 هم بنویسید ، بهتره از همون AVR استفاده کنید.

 

مشکلی روش آردوئینویی چی هست

  • میکروکنترلر تنها یک CPU داره .
  • اگر بخواهید برای هر قسمت از پروژه ، تمام بار کار رو بر دوش CPU بندازید، کدتون به مشکل برمیخوره.
  • روش آردوئینویی پیاده سازی نرم افزاری هست ، یعنی هر بار که در LCD نوشته میشه ، باید نرم افزاری ( کدی ) رو CPU اجرا کنه و CPU از ابتدای نوشتن در LCD  تا انتها درگیر این کاره.

راه اندازی LCD کاراکتری با STM32 با تایمر و DMA

 

اگر امکانات میکروکنترلر STM32 رو بکار بگیریم. دیگه لازم نیست CPU همه ی کارها رو انجام بده، تنها لازمه عملیات رو آغاز کنه و پس از اون CPU بیکار میشه، چجوری ؟ با تایمر و DMA. اول اینجوری LCD کاراکتری رو به میکرو ببنید .

در این راه اندازی پایه ی E ، پایه ی خروجی کانال تایمر در حالت PWM است و وصعیت 8 پایه ی باس توسط DMA تغییر میکند.

 

 

اینجا میخوام یک قابلیت قدرتمند STM32 رو بهتون بگم که جاهای خیلی مهمتری کاربرد داره ولی LCD کاراکتری فرصتی بهم میده تا این قابلیت رو بهتون بشناسونم و اون قابلیت ساخت باس پارالل با تایمر و DMA هست. چجوری ؟

  • به پایه ی RS و RW فعلا فکر نکنید، چون تنها در آغاز عملیات مقدارشون تغییر میکنه .
  • زمانبندی تغییر پایه ی E  مهمه و تغییر وظعیت 8 پایه ی باس پارالل .
  • برای پایه ی E از کانال 1 تایمر 1 در حالت خروجی PWM استفاده میکنیم.
  • در آغاز هر عملیات داده هایی که باید روی باس 8 بیتی پارالل قرار داده بشه باید توسط CPU آماده بشه و در آرایه ای در یادگاه ( حافظه ) ذخیره بشه.
  • برای تغییر وظعیت 8 پایه ی باس هم میگیم که کانال 2 تایمر 1 به DMA درخواست بده ، که DMA با هر درخواست کانال 2 تایمر داده ها رو از آرایه ای که CPU از قبل آماده کرده به رجیستر BSRR منتقل کنه تا وضعیت پایه های باس عوض بشه.
  • از رجیستر Repetition Counter  تایمر 1 هم استفاده میکنیم که تعداد بایت های انتقالی رو مشخص کنیم.

 

در این روش با بکارگیری تایمر تنظیمات زمانبندی رو انجام میدیم که چه زمانی پایه ی E تغییر کنه و چه زمانی 8 پایه ی باس پارالل تغییر کنند و دیگه نیازی نیست CPU همه ی کارها رو انجام بده ، CPU تنها عملیات رو آغاز میکنه و بعدش بیکار میشه .

 

 

نوشتن این برنامه خیلی نکات ریز داره و آموزش انگلیسی نوشتن این برنامه رو میتونید در یوتوب ببینید و آموزش فارسی نوشتن این کد و همچنین پیاده سازی باس پارالل 4 بیتی در دوره آموزش پیشرفته STM32 هست.

 

  • التراسونیک = فراسدا .
  • فاصله سنج = دوری سنج .
  • جهند = پالس .
  • پیرارونگ = رونگ پیرامونی = مدار جانبی = پریفرال 
  • کارگون = حالت کاری

دیدگاه‌ خود را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

پیمایش به بالا