NOTICE توجه: این یک موضوع قدیمی است که آخرین پست ارسالی آن مربوط به 4328 روز قبل است . لطفا فقط پاسخ ها ، سوالات و درخواست های 100 درصد مرتبط را به آن ارسال کنید و برای درخواست ها و سوالات جدید موضوع جدیدی را ایجاد کنید
نمایش نتایج: از 1 به 6 از 6

موضوع: درخواست کمک برای جلوگیری از overwrite شدن اطلاعات در glcd

  1. #1
    کاربر علاقه مند
    تاریخ عضویت
    Aug 2011
    نوشته ها
    77
    تشکر
    46
    تشکر شده 29 بار در 26 پست

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

    خب... فکر کنم توضیحم کامله... خودم هم حدس میزنم راه حل این مشکل یه تکنیک ساده برنامه نویسی باشه... ولی نمیدونم چیکار باید بکنم... لذا از شما درخواست کمک دارم...

    سپاس از محبتتون.

  2. # ADS
    Circuit advertisement
    تاریخ عضویت
    Always
    نوشته ها
    Many
     

  3. #2
    مدیر باز نشسته behnam6500 آواتار ها
    تاریخ عضویت
    Jan 2009
    نوشته ها
    801
    تشکر
    311
    تشکر شده 899 بار در 390 پست

    پیش فرض

    دو کار میتونی بکنی:

    1. رفرش کل lcd و بازسازی اون، که زیاد جالب نیست! دلایلش واضحه.

    2. ذخیره مختصات های شکل موج قبلی و پاک کردن اونا قبل از ترسیم جدید و جایگزین مختصات جدید در ارایه مربوطه. که نسبت به اولی سرعت رفرشت خیی بالاست!

  4. کاربران : 3 تشکر کرده اند از شما behnam6500 برای ارسال این پست سودمند:


  5. #3
    مدیر بخش STM32 sigma-mx آواتار ها
    تاریخ عضویت
    Nov 2009
    نام
    سعید شریفیان
    نوشته ها
    1,421
    تشکر
    804
    تشکر شده 2,520 بار در 978 پست

    پیش فرض

    راه حل های گفته شده توسط آقا بهنام کاملا درسته و من روش دوم رو یکم واضحتر توضیح میدم
    پیاده سازی این روش بسیار آسون هست و من بارها این روش رو بکار بردم . شما کافیه یه بافر داشته باشین . در نتیجه همیشه آخرین اطلاعات Plot شده روی صفحه رو در اختیار دارین . کافیه هر بار قبل از رسم منحنی جدید ( حالا با هر روش رسم مثل پیکسل - خط و ..) یکبار با دیتای بافر که اطلاعات قبلی رو توش داره روی منحنی دوباره رسم کنید منتها نه با پیکسل روشن ، بلکه با پیکسل خاموش ! این سرعت کار شما رو خیلی بالا میبره . در واقع شما همون مسیری رو که رو السیدی رسم کردید الان پاک کردید ..
    در ضمن برای این چرخه رسم و پاک کردن یه اتفاقی هم که میوفته معمولا اینه که با هر بار پاک کردن اگه منحنی از روی محور تون رد بشه ، محور هم همون قسمت ازش پاک میشه ( چون با پیکسل خاموش روش نوشتیم ) . شاید شما بعد از هر بار رسم منحنی یک بار محور ها رو دوباره رسم کنید ولی راه ساده تر و سریعتر اینه که موقع رسم اطلاعات رو از یه if رد کنید که اگه خواست رو محور چیزی رسم کنه ، نکنه یا موقع پاک کردن این شرط رو بزارید که تو X یا Y محور چیزی ننویسه ..... امیدوارم منظور رو رسونده باشم

  6. کاربران : 4 تشکر کرده اند از شما sigma-mx برای ارسال این پست سودمند:


  7. #4
    کاربر علاقه مند
    تاریخ عضویت
    Aug 2011
    نوشته ها
    77
    تشکر
    46
    تشکر شده 29 بار در 26 پست

    پیش فرض

    نقل قول نوشته اصلی توسط sigma-mx نمایش پست ها
    راه حل های گفته شده توسط آقا بهنام کاملا درسته و من روش دوم رو یکم واضحتر توضیح میدم
    پیاده سازی این روش بسیار آسون هست و من بارها این روش رو بکار بردم . شما کافیه یه بافر داشته باشین . در نتیجه همیشه آخرین اطلاعات Plot شده روی صفحه رو در اختیار دارین . کافیه هر بار قبل از رسم منحنی جدید ( حالا با هر روش رسم مثل پیکسل - خط و ..) یکبار با دیتای بافر که اطلاعات قبلی رو توش داره روی منحنی دوباره رسم کنید منتها نه با پیکسل روشن ، بلکه با پیکسل خاموش ! این سرعت کار شما رو خیلی بالا میبره . در واقع شما همون مسیری رو که رو السیدی رسم کردید الان پاک کردید ..
    در ضمن برای این چرخه رسم و پاک کردن یه اتفاقی هم که میوفته معمولا اینه که با هر بار پاک کردن اگه منحنی از روی محور تون رد بشه ، محور هم همون قسمت ازش پاک میشه ( چون با پیکسل خاموش روش نوشتیم ) . شاید شما بعد از هر بار رسم منحنی یک بار محور ها رو دوباره رسم کنید ولی راه ساده تر و سریعتر اینه که موقع رسم اطلاعات رو از یه if رد کنید که اگه خواست رو محور چیزی رسم کنه ، نکنه یا موقع پاک کردن این شرط رو بزارید که تو X یا Y محور چیزی ننویسه ..... امیدوارم منظور رو رسونده باشم
    ممنون از توضیحات شما دو بزرگوار

    تکه برنامه ای که باعث میشد اون مشکل به وجود بیاد این بود:

    کد:
    while (1)
          {  
          a2d = ADCW; 
          p = (a2d)/64;
          for(k=1;k<127;k++){
          glcd_clrpixel(k,p);
          delay_ms(5);
          glcd_setpixel(k,p);
          }
    حالا بفرض که من یک متغیر کمکی به اسم p2 گرفتم...چجوری برنامه اش رو بنویسم...؟

    ایکاش یک نمونه از اون کدهایی که میگفتید کار کردید و تجربه دارید رو میذاشتید تا ایده بگیرم و ازش استفاده کنم...

    چون اینجور موضوعات بیشتر تکنیکی هستند تا علمی و تو کتابها بهش اشاره نشده...

  8. #5
    مدیر بخش STM32 sigma-mx آواتار ها
    تاریخ عضویت
    Nov 2009
    نام
    سعید شریفیان
    نوشته ها
    1,421
    تشکر
    804
    تشکر شده 2,520 بار در 978 پست

    پیش فرض

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

    این تکه برنامه یه مشکل واضح داره ! همونطور که تو پست قبلیم گفتم باید قبل از رسم منحنی جدید ، منحنی قبلی رو پاک کنیم . و به جهت اینکه نیاز داریم در زمان رسم منحنی فعلی ، مختصات منحنی قبلی رو داشته باشیم تا پاکش کنیم نیاز به یک بافر داشتیم . مثلا یک آرایه 0 تا 127 که این مقادیر رو ذخیره کنه ..
    مشکل برنامه شما اینه که در هنگام رسم منحنی جدید ، منحنی قبلی رو پاک نمی کنه ! چون اصلا به مقادیر قبلی دسترسی ندارید ... بلکه شما مقدیر فعلی رو پاک میکنید و دوباره روی همون مینویسید ! خب این اصلا هیچ فایده ای نداره .. اصلا این خط پاک کردن عملا هیچ کاری انجام نمیده !

    نکته بعدی اینکه بهتره برای رسم این چنین منحنی هایی از روش نمونه گیری نقطه ای و سپس رسم استفاده نکنیم .. مشکلات مختلفی نظیر همین مورد رو برامون بوجود میاره .. بهتره اول یک جاروب با ADC از سیگنال به اندازه 127 تا انجام بگیره و نتیجه تو آرایه ذخیره بشه .. حالا با یه حلقه for نتیجه رو رسم کنید .
    یکم در مورد این چیزایی که گفتم فکر کنید اگه نتونستید من یه چند خط کد برای مثال مینویسم
    یا حق

  9. کاربران : 2 تشکر کرده اند از شما sigma-mx برای ارسال این پست سودمند:


  10. #6
    کاربر علاقه مند
    تاریخ عضویت
    Aug 2011
    نوشته ها
    77
    تشکر
    46
    تشکر شده 29 بار در 26 پست

    پیش فرض

    سپاس از پاسخگویی شما جناب " سعید"

    من این برنامه رو نوشتم... سعی کردم از صحبتهای شما ایده بگیرم ولی جواب نداد...!!

    اون قسمت قرمز رنگ برای نمایش شکل موج بکار رفته... خواستم مثلا یه متغیر رزرو به اسم oldp بگیرم و مقادیر قبلی را داخلش بریزم ولی نشد... لذا بازهم به کمک شما نیازمندم.... اگر اصلاحات رو روی همین برنامه انجام بدید که دیگه چه بهتر.

    کد:
    #include <mega32a.h>
    #include <delay.h>
    // Graphic LCD functions
    #include <glcd.h>
    // Font used for displaying text
    // on the graphic LCD
    #include <font5x7.h>
    int i,j,p,L1,L2,a2d,oldp;
    int vdc1=0,vdc2=0;
    int k=0;
    void selectch1(void);
    void selectch2(void);
    void selectbothchannels(void);
    void Lissajous (void);
    void incvoltdiv (void);
    void decvoltdiv (void);
    void inctimediv (void);
    void dectimediv (void);
    
    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:
    // DB0 - PORTC Bit 0
    // DB1 - PORTC Bit 1
    // DB2 - PORTC Bit 2
    // DB3 - PORTC Bit 3
    // DB4 - PORTC Bit 4
    // DB5 - PORTC Bit 5
    // DB6 - PORTC Bit 6
    // DB7 - PORTC Bit 7
    // E - PORTD Bit 0
    // RD /WR - PORTD Bit 1
    // RS - PORTD Bit 2
    // /RST - PORTD Bit 3
    // CS1 - PORTD Bit 4
    // CS2 - PORTD Bit 5
    // 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)
          {
          ///// namayesh moj  
          a2d = ADCW; 
          p = ((-54*a2d)/1024)+54;
         if(p!= oldp)
         {
         oldp=p;
          for(k=1;k<127;k++){
          glcd_clrpixel(k,oldp);
          glcd_setpixel(k,p);
         }
         }

موضوعات مشابه

  1. درخواست برنامه کاربردی visual glcd !
    توسط stabesh در انجمن در خواست نرم افزارو كرك
    پاسخ: 5
    آخرين نوشته: 09-10-2016, 14:04
  2. پاسخ: 22
    آخرين نوشته: 05-04-2015, 02:29
  3. پاسخ: 2
    آخرين نوشته: 07-04-2013, 18:29
  4. Glcd
    توسط naruto در انجمن میکرو کنترلر های 32 بیتی(arm)
    پاسخ: 1
    آخرين نوشته: 24-02-2011, 16:41
  5. Glcd
    توسط naruto در انجمن میکرو کنترلر های 32 بیتی(arm)
    پاسخ: 0
    آخرين نوشته: 24-02-2011, 00:03

مجوز های ارسال و ویرایش

  • شما نمیتوانید موضوع جدیدی ارسال کنید
  • شما امکان ارسال پاسخ را ندارید
  • شما نمیتوانید فایل پیوست کنید.
  • شما نمیتوانید پست های خود را ویرایش کنید
  •