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

برنامه اینه:
خروجی رجیستر ده بیتی adcw رو ریختم داخل متغیر a2d و با یک تابع ریاضی که معادله اون
p = ((-54*a2d)/1024)+54; هست طوری تنظیم کردم که بیشترین ولتاژ بیفته بالای glcd و کمترین بیفته پایین و عدد 54 هم همون 64 هست که برای نمایش اون v و t پایین glcd ده تا ازش کم کردم و فضا رو برای نمایش مقادیر timedivision و voltdivision گذاشتم. یعنی گفتم a2d حداقل صفر و حداکثر 1024 هست که با قرار گیری این مقدار در فرمول گفته شده عددی بدست میاد که بین 0 تا 54 هست و نقطه نظیر ولتاژ اندازه گیری شده در glcd رو نمایش میده.
خب... فکر کنم توضیحم کامله... خودم هم حدس میزنم راه حل این مشکل یه تکنیک ساده برنامه نویسی باشه... ولی نمیدونم چیکار باید بکنم... لذا از شما درخواست کمک دارم...
سپاس از محبتتون
مدتهاست درگیر ساخت پروژه اسیلوسکوپ هستم و کار پروژه هم تموم شده... یعنی سخت افزارش که کامل شده و نرم افزارش هم قدمهای آخرش رو سپری میکنه....
در برنامه ای که برای نمایش شکل موج بر روی glcd نوشتم مشکلی به وجود میاد و اونهم اینه که وقتی یه موج dc داریم و میخوام نمایشش بدم با تغییر ولتاژش خطی صاف روی glcd نمایش داده میشه ولی خط صاف قبلی که مال قبل از تغییر ولتاژ dc ورودی هست رو نمیتونم پاک کنم و نتیجه اش این میشه که بعد از چند بار تغییر چندین خط روی glcd میفته...یعنی خطوطی که با هربار تغییر ولتاژ ورودی اسیلوسکوپ باید به وجود بیان پاک نمیشن و در کنار خطوط جدید باقی میمونن... در حالیکه باید فقط یک خط نمایش داده بشه که با تغییر ولتاژ ورودی اون خط پاک بشه و خط دیگری در بالا یا پایین اون خط رسم بشه تا اینطور به نظر بیاد که اون خط داره بالا یا پایین میره... اما من نمیتونم اینکار رو بکنم و نتیجه اش این میشه که با تغییر ولتاژ خطوط روی هم میفتند و نتیجه اش میشه این:

برنامه اینه:
کد:
int i,j,p,a2d; void main(void) { // Declare your local variables here // Graphic LCD initialization data GLCDINIT_t glcd_init_data; // Graphic LCD initialization // The KS0108 connections are specified in the // Project|Configure|C Compiler|Libraries|Graphic LCD menu: // Specify the current font for displaying text glcd_init_data.font=font5x7; // No function is used for reading // image data from external memory glcd_init_data.readxmem=NULL; // No function is used for writing // image data to external memory glcd_init_data.writexmem=NULL; glcd_init(&glcd_init_data); glcd_outtextxyf(0,0,"DIGITAL OSILLOSCOPE"); glcd_outtextxyf (0,22,"BY AVR MICOCTRL"); glcd_outtextxyf (0,45,"HAMID REZA RABET" ); delay_ms(3000); glcd_clear(); ADCSRA=0xff; SFIOR=0x00; ADMUX=0x40; glcd_putcharxy( 1, 56, 'v'); glcd_putcharxy( 66, 56, 't'); glcd_putcharxy( 7, 56, '='); glcd_putcharxy( 72, 56, '='); glcd_putcharxy( 30, 24, '|'); glcd_putcharxy( 92, 24, '|'); glcd_putcharxy( 62, 7, '_'); glcd_putcharxy( 62, 35, '_'); glcd_line(0,27,128,27); glcd_line(64,0,64,64); for(i=0;i<128;i+=2){ glcd_setpixel(i,54); glcd_setpixel(i,0); } for(i=0;i<=54;i+=2){ glcd_setpixel(0,i); glcd_setpixel(127,i); } while (1) { a2d = ADCW; p = ((-54*a2d)/1024)+54; for(k=1;k<127;k++){ glcd_clrpixel(k,p); glcd_setpixel(k,p); }
p = ((-54*a2d)/1024)+54; هست طوری تنظیم کردم که بیشترین ولتاژ بیفته بالای glcd و کمترین بیفته پایین و عدد 54 هم همون 64 هست که برای نمایش اون v و t پایین glcd ده تا ازش کم کردم و فضا رو برای نمایش مقادیر timedivision و voltdivision گذاشتم. یعنی گفتم a2d حداقل صفر و حداکثر 1024 هست که با قرار گیری این مقدار در فرمول گفته شده عددی بدست میاد که بین 0 تا 54 هست و نقطه نظیر ولتاژ اندازه گیری شده در glcd رو نمایش میده.
خب... فکر کنم توضیحم کامله... خودم هم حدس میزنم راه حل این مشکل یه تکنیک ساده برنامه نویسی باشه... ولی نمیدونم چیکار باید بکنم... لذا از شما درخواست کمک دارم...
سپاس از محبتتون
دیدگاه