اگر این فایلSEGGER_DEMO در Keil اضافه شده (در شاخه Application احتمالا)، لطفا حذفش کنید. فایلی که من دادم باید در پروژه ای که گفتید کار می کنه(سمپل اول اگه اشتباه نکنم که توی دی وی دی بوده و مثالها رو اجرا میکنه)، قرار بگیره. متوجه نشدم چرا نام فایلی که من فرستادم رو به GUI_WIDGET_Graph.. تغییر دادید؟؟؟؟!!؟
اینکه گفتید صفحه سفیده یعنی دستور GUI_Init کار نکرده اون هم بعلت اینکه LCD درست کانفیگ نشده
ویرایش توسط mansoory : 17-02-2013 در ساعت 10:13
ویرایش توسط mansoory : 17-02-2013 در ساعت 10:24
ویرایش توسط mzarkoob : 04-04-2014 در ساعت 02:34 دلیل: ادغام
برد lpc1788 سایت و ال سی دی 4.3 اینچ
در این برنامه فولدری به نام سیستم وجود نداره،من فقط از پوشه application حذف کردم و همین برنامه در صورت تغییر ندادنش خطایی نمیده
سلام
پروژه در حد نمایش یک اسلاید کار کرد خلاصه کار هایی که روی سمپل(پست 65) انجام دادم را در دو عکس زیر قرار دادم و در نهایت هم این سمپل را قرار می دهم الان سرعت کم هست خود سمپل رو بعدا آپ میکنم
حال چطور میتوانیم محل نمایش یک پنجره را جابجاکنیم و چطور یک سمپل از پیش ساخته شده رو (مثل کلیومتر) را نمایش دهیم؟؟
برای نمایش دو اسلاید،
دو اسلاید با guibuilder ذرست کردم و نام تابع های همنام موجود در این دو را به صورت دستی تغییر دادم(تا تکراری نباشند که keil خطا دهد)
با note pad یک فایل c. ایجاد و درون ان تابع main task ایجاد کردم و درون حلقه while نام دو تابع آخر موجود در اسلاید را فراخوانی کردم و این سه فایل را دز پوشه application قرار و فراحوانی کردم این دو اسلاید پشت سر هم در lcd نمایشداده میشه.
حال با guibuilder چطور میشود چند اسلاید تولید کرد که اسم تابع های ان ها تکراری نباشد؟
با تاچ در emwine چطور باید کار کرد مثلا ، زدن یک دکمه باعث رفتن به یک اسلاید دیگه شود؟
تاچ رو باید جدا گانه برنامه نویسی کرد؟
ویرایش توسط mzarkoob : 04-04-2014 در ساعت 02:37 دلیل: ادغام
اگر تابعMain یا فایل Main.c را پیدا نکردید می توانید این کد را به فایلتان اضافه کنید:
سلام.کد:#ifndef _WINDOWS #include "HWConf.h" #endif #ifdef __CROSSWORKS_ARM extern void __low_level_init(); // hwconf.c #endif void MainTask(void); // Defined in SEGGERDEMO.c /********************************************************************* * * main */ void main(void) { #ifdef __CROSSWORKS_ARM __low_level_init(); #endif #ifndef _WINDOWS HW_X_Config(); // Initialization of Hardware #endif MainTask(); // emWin application }
کسی تونست lcd رو کانفیگ کنه؟
مشکلی نبود؟
بریم سر قسمت تاچ؟
ویرایش توسط mzarkoob : 04-04-2014 در ساعت 02:41 دلیل: ادغام
دوستان اگه فایل های EMwin پورت شده برای STM32 رو هم داشتید قرار بدید تا ماهم بیائیم تو کار
*** اللّهم عجّل لولیک الفرج ***
مهندس منصوری متاسفانه من موفق نشدم فایل خود segger رو اسفاده کنم چون ظاهرا اون برنامه واسه ال سی دی 4.3 هست ولی ال سی دی من 5 اینچ هست،تا این لحظه فقط برنامه تست داخل دی وی دی خود coreboard رو نصب کردم چون داخل فایل glcd.h تونستم ال سی دی 5 اینچیو انتخاب کنم
فکر نکنم کار خاصی لازم داشته باشه. چون برای Cortex-M4 و Cortex-M3 کتابخانه کامپایل شده توی فولدر Segger شاخه ای که keil نصب شده وجود داره و کاری که شما باید بکنید این دوتاست:
1- راه اندازیSystick برای استفاده emwin:
یه فایل به نام GUI_X.C در شاخه samples وجود داره. اونجا متغیری به نام Time_MS یا OS_Time_MS رو می بینید. باید کاری کنید که هر یک میلی ثانیه یک واحد به اون اضافه بشه. راه مناسب استفاده از systick است.
2- مشخص کردن LCD: باتوجه به توضیحات قبلی
مشکلی بود من درخدمتم
بله مهندس جان،ورژن 5.16 هست،تفاوت فایل همراه دی وی دی با فایلی که تو سایت segger یا LPCWARE هست زیاده،انگار یه جورایی برای COREBOARD تغییر داده شده،اگه دسترسی ندارید بفرمایید براتون بفرستم.ممنون از همکاریتون
سلام
مهندس پورت این rtosر روی میکروهائی مثل 1768 و stm32f103 زیاد به صرفه نیست چون علاوه بر حافظه کم این میکرو ها برای استفاده از اکثر امکانات این سیستم عامل از نظر سرعت هم یه مقدار کم میارن،مخصوصا stm32f103 البته سرعت اجرا به عوامل زیادی بستگی داره.برای میکروهای ذکر شده در بالا بهترین همون ucgui3.98 یا ucgui 4 هستش.
ولی برای میکروهائی مثل 1788 و stm32f407 می شه به راحتی استفاده کرد.برای برد Discovery قبلا پورت شده emwin رو گذاشته بودم.
ایـــــــــران میـــــــکرو ™ - مشاهده یک موضوع - شروع کار با برد Discovery kit for STM32 F4 series - with STM32F407 MCU
_____________________________________
_____________________________________
از دوستان خبری نیست،ظاهرا مهندسین عزیز مشغول کشف emwin هستند،مارو بی نصیب نزارید،فقط اگه میشه از lpc1788 خارج نشید که ثواب داره.ممنون
سلام.
انشالله که همگی ال سی دی رو راه انداخته باشند. امروز درباره راه اندازی تاچ توضیح میدم. فقط قبلش باید یه برنامه کوچک بنویسیم:
قبلا توضیح دادم که باید در تابع MainTask برنامه اصلی نوشته بشه. ولی این الزامی نیست.
در تابع Main هم میشه برنامه رو نوشت:
Includeها رو ببینید. تابع main با اجرای دوتابع شروع میشه . اولی _low_level_init() هست که کارش فراخونی تابعی از CMSIS به نام SystemCoreClockUpdate است. تابع دوم هم کارش اینه که وقفه systick رو راه اندازی می کنه. این وقفه برای اجرای تابع GUI_Delay ضروریه.کد:#include "LPC17xx.h" #include "system_LPC17xx.h" #include "HWConf.h" #include "global.h" //Defines U8,U16,… int main() { int i=0; _low_level_init(); // Updating PLL Settings HW_X_Config(); // Initializing Systick Interrupt.. //Main Program Starts HERE//// GUI_Init(); GUI_DispStringAt("Hello World!",10,10); while(1) { GUI_DispDecAt(i,30,30); i++; if(i>9999) i=0; } }
اصل برنامه با راه اندازیGUI بوسیله دستور GUI_Init شروع میشه. این دستور به نوبه خودش توابع زیر رو فراخوانی میکنه:[PHP]
1- GUI_X_Config()
2- LCD_X_Config()
3- LCD_X_DisplayDriver[/PHP]
درصورتیکه هرکدوم از این توابع درست تعریف نشده باشند خطای کامپایلر خواهیم داشت یا اینکه LCD کار نمیکنه.
تابع اول محلش در فایل GUIConf.c است و کارش اینه که حافظه مجازی رو برای emwin تنظیم می کنه. تابع دوم و سوم برای تعریف و کانفیگ کردن LCD است.
Emwin دستورات متنوعی برای نمایش متن و اعداد داره. پیشنهاد می کنم به فایل راهنما مراجعه کنید. از اینجا به بعد اگر با eclipse یا visual studio کار نکنید به مشکل می خورید. چون تنوع دستورات و شباهت اسامی در emwin خیلی زیاده و نمیشه توابع رو حفظ کرد.
دستور بعد همونطور که از اسمش پیداست برای ترسیم یک متن در مختصات مشخص شده بکار میره. ولی با فونتی که بصورت default در فایل GUIConf.h مشخص شده. خط بعد هم یک عدد صحیح رو درمختصات مشخص شده نشون میده.
اگه همه چیز درست باشه این برنامه باید کار کنه و شما سرعت نمایش اعداد رو خواهید دید.
در پست بعدی تنظیمات تاچ رو توضیح می دهم
ویرایش توسط mansoory : 21-02-2013 در ساعت 12:48
پیکربندی تاچ:
ابتدا باید خودتون تاچ اسکرین رو بصورت مجزا راه اندازی کرده باشید. اگه این مساله رو حل کردید به ادامه توضیحات توجه کنید.:
من از دو فایل Touchpanel.h و Touchpanel.c که در سی دی همراه برد بود استفاده کردم. ضمنا درایور تاچ هم ADS7846 است.
توابع زیر در این فایلها وجود داره:
توابع TP_Init و Read_X و Read_Y و Touchanel_Calibrate برای کانفیگ کردن تاچ استفاده می شود. ضمنا باید پایه ای از میکرو که اینتراپت ADS7846 بهش وصل شده رو هم بدونید. که خیلی مهمه.کد:void TP_Init(void); Coordinate *Read_Ads7846(void); void TouchPanel_Calibrate(void); void DrawCross(uint16_t Xpos,uint16_t Ypos); void TP_DrawPoint(uint16_t Xpos,uint16_t Ypos); uint8_t setCalibrationMatrix( Coordinate * displayPtr,Coordinate * screenPtr,Matrix * matrixPtr); uint8_t getDisplayPoint(Coordinate * displayPtr,Coordinate * screenPtr,Matrix * matrixPtr ); int Read_X(void); int Read_Y(void);
برای تنظیم کردن تاچ، ابتدا در تابع LCD_X_DisplayDriver بعد از دستور _initController باید تاچ رو initialize کنید. می تونید داخل تابع _initController هم این کار رو انجام بدهید.به هرحال بعد از تعریف LCD باید اینکار انجام بشه.
سپس فایل GUI_X_Touch_StoreState.c رو باز کنید.
تابعی به نام TouchTask وجود داره که این تابع وظیفش کنترل دایم تاچ است که کاربر اون رو لمس کرده یا نه؟
بنابراین این تابع باید مرتب فراخوانی بشه. اگر از سیستم عامل استفاده می کنید. این تابع رو بصورت task تعریف کنید.والا باید از وقفه تایمر استفاده کنید و این تابع رو فراخوانی کنید.
داخل تابع بلافاصله پس از دستور while یک متغیر به نام Pressed می بینید که مقداری نداره. این متغیر باید طوری تعریف بشه که با فعال شدن پایه IRQ ADS7846 مقدارش ست بشه. من اینطوری انجامش دادم:
درصورتیکه کاربر تاچ رو لمس کنه پایه IRQ اون صفر میشه. بنابراینPressed=0 خواهد شد.کد:while(1) { Pressed=(LPC_GPIO2->FIOPIN)&(1<<TP_IRQ_PIN_NUM); if(Pressed==0) {
سپس دومتغیر x,y باید با مقادیر خروجی تاچ پر شوند:
خب کار ما تقریبا تمومه. نکته ای که مهمه اینه که مختصات توسط دستور GUI_TOUCH_StoreState به emwin اعلام میشه. درصورتیکه کاربر تاچ رو لمس نکرده باشه مقدار -1 ارسال میشه. شما هر وقت به مقادیر Touch نیاز داشتید می تونید متغیری از نوع GUI_PID_State تعیریف کنید و با دستور GUI_TOUCH_GetState(&xxx( به مقادیر مختصات و اینکه کاربر تاچ رو لمس کرده یا نه دسترسی پیدا کنید...کد:if(Pressed==0) { x = Read_X();// TBD: Insert function which reads current x value y = Read_Y();// TBD: Insert function which reads current y value
اگر فکر میکنید کار تموم شده اشتباه می کنید. فوت کوزه گری مونده: حالا بایدفایل GUI_X_Touch_Analog.c رو باز کنید. Emwin هنوز نمیتونه با تاچ کار کنه. چون مختصات باید به قسمت PID منتقل بشه. این قسمت کارش کنترل و هماهنگی بین تاچ- ماوس و کیبرده و کلا ورودی های emwin است.
در فایل GUI_X_Touch_Analog.c بصورت زیر تغییراتی اعمال کنید:
خب حالا دیگه حله.کد:#include "GUI.h" #include "TouchPanel.h" GUI_PID_STATE tc; void GUI_TOUCH_X_ActivateX(void) { // TP_Init(); } void GUI_TOUCH_X_ActivateY(void) { // TP_Init(); } int GUI_TOUCH_X_MeasureX(void) { // Read_X(); GUI_TOUCH_GetState(&tc); return tc.x; } int GUI_TOUCH_X_MeasureY(void) { GUI_TOUCH_GetState(&tc); return tc.y ; }
در تابع Main پس از GUI_Init دستور GUI_CURSOR_Show() رو قراردهید. خب الان دیگه باید تاچ کار کنه...
برای کالیبره کردن هم یه فایل به نام TouchCalc.c آپ کردم که در واقع از UCGUI کش رفتم. این تابع_ExecCalibration(void) کالیبره رو بعد از GUI_Init بلافاصله فراخوانی کنید تا کالیبراسیون انجام بشه. اگه مقادیر کالیبراسیون رو دارید که کارتون ساده تر میشه وفقط کافیه که مقادیرتون رو توسط دستور GUI_TOUCH_Calibrate بهش اعلام کنید.
مشکلی بود درخدمتتون هستم.فایلهای مربوطه رو ضمیمه کرده ام.
ویرایش توسط mansoory : 21-02-2013 در ساعت 10:45