اطلاعیه

Collapse
No announcement yet.

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

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    درخواست کمک برای جلوگیری از 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
    پاسخ : درخواست کمک برای جلوگیری از overwrite شدن اطلاعات در glcd

    درود!
    با این توضیحتون:
    ...ولی خط صاف قبلی که مال قبل از تغییر ولتاژ dc ورودی هست رو نمیتونم پاک کنم و نتیجه اش این میشه که...
    خب مشکل کاملا واضحه، 2تا راه حل به ذهن میرسه که اول راه حل غیر معقول رو میگم :mrgreen:
    1- اولین راه حل اینه که هر دفعه بعد از اندازه گیری ولتاژ بیایید و صفحه رو ریفرش کنید(lcd_clear) که خب...
    2- اما ایده بهتری که به ذهن تراوش می کنه اینه که قبل از رسم خط ولتاژ بعدی بیایید و دقیقا در محل خط قبلی یک خط نامرئی چاپ کنید!! منظور همون چاپ کردن کاراکتر Space هستش، اینجوری خب محل خط قبلی پاک می شه
    این شد همون تکنیک ساده برنامه نویسی که شما دنبالش بودی :nerd:
    اونچیزی که در دانشگاه یاد میگیرید، "الفبایی" هست برای نوشتن یک "رمان" !!

    دیدگاه


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

      شما در حلقه اصلی برنامه بدون توجه به مقدار قبلی و فعلی p اون پیکسل رو پاک و سپس ست میکنی (تا اینجاش که حداقل اون پاک کردنه اضافیه!)
      شما برای اصلاح برنامه مقدار قبلی p رو تو یه متغیر دیگه مثلا pprev نگه داری کن. اول حلقه چک کن اگه مقدار فعلی p با pprev فرق داشت اونوقت 1- پیکسل pprev رو پاک کن 2- پیکسل p رو روشن کن. اگرک فرق نداشت که یعنی اصلا نیاز نیست روی ال سی دی چیزی دست بخوره
      لازم به ذکره که برنامه شما برای تبدیل شدن به اسیلوسکوپ راه زیادی داره. موفق باشی

      دیدگاه


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

        آهان!
        جناب mojalan درست می فرمایند، حقیقتش من کامل کدتون رو نخوندم :redface:
        اما با این حال شما باز هم خط قبلی رو پاک نمی کنید، ایراد برنامتون اینجاست:

        glcd_clrpixel(k,p);
        glcd_setpixel(k,p);

        شما دقیقا پیکسل فعلی رو اول پاک می کنید، بعدش همون پیکسل رو ست می کنید!
        اینم راه حل اولیه:


        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);
        }
        اونچیزی که در دانشگاه یاد میگیرید، "الفبایی" هست برای نوشتن یک "رمان" !!

        دیدگاه


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

          ممنون از محبتتون

          مقداردهی اولیه oldp چطور باید انجام بشه تا طوری نشه که مقدار p دائما با oldp برابر بشه...؟ من تو اینش گیر کردم...!! چون اگر از دستور oldp=p استفاده کنم که خب.... هیچی عوض نمیشه... فقط اسم p رو به oldp تغییر دادم...

          شما گفتید مقدار قبلی p رو بریز تو oldp ... این در حالیه که مقدار p ممکنه دائما تغییر کنه (( ورودی سینوسی باشه )) حالا من این (( مقدار قبلی p )) رو چجوری بدست بیارم که بعد بریزمش تو oldp و با مقدار p جدید مقایسه اش کنم...؟


          به نظر میاد این وسط عامل (( زمان )) خیلی تعیین کننده است... میشه با delay کاری کرد درست بشه...؟

          دیدگاه


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

            نوشته اصلی توسط roberty
            ممنون از محبتتون

            مقداردهی اولیه oldp چطور باید انجام بشه تا طوری نشه که مقدار p دائما با oldp برابر بشه...؟ من تو اینش گیر کردم...!! چون اگر از دستور oldp=p استفاده کنم که خب.... هیچی عوض نمیشه... فقط اسم p رو به oldp تغییر دادم...

            شما گفتید مقدار قبلی p رو بریز تو oldp ... این در حالیه که مقدار p ممکنه دائما تغییر کنه (( ورودی سینوسی باشه )) حالا من این (( مقدار قبلی p )) رو چجوری بدست بیارم که بعد بریزمش تو oldp و با مقدار p جدید مقایسه اش کنم...؟


            به نظر میاد این وسط عامل (( زمان )) خیلی تعیین کننده است... میشه با delay کاری کرد درست بشه...؟
            جسارتا برداشتتون از کد اشتباهه
            چون اگر از دستور oldp=p استفاده کنم که خب.... هیچی عوض نمیشه... فقط اسم p رو به oldp تغییر دادم...
            ما از p یک کپی به نام oldP برمی داریم و هر دفعه چک میشه اگه مقدار ولتاژ تغییر کرده بود اونوقت خط ولتاژ رسم میشه
            شما برنامه رو تست کردید و برای DC جواب نگرفتید؟
            مقدار p ممکنه دائما تغییر کنه (( ورودی سینوسی باشه ))
            آهان! آره دیگه، کدی که شما نوشتید فقط برای رسم ولتاژ DC به کار میاد، چون حلقه for میاد و در راستای محور x میره جلو، به ازای مقدار ثابت p که میشه DC
            برای رسم ولتاژهای متغیر برنامتون باید هنوز کاملتر بشه

            اونچیزی که در دانشگاه یاد میگیرید، "الفبایی" هست برای نوشتن یک "رمان" !!

            دیدگاه


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

              نوشته اصلی توسط ☺بابابرقی☺
              ما از p یک کپی به نام oldP برمی داریم و هر دفعه چک میشه اگه مقدار ولتاژ تغییر کرده بود اونوقت خط ولتاژ رسم میشه
              شما برنامه رو تست کردید و برای DC جواب نگرفتید؟
              خیر جواب نگرفتم....

              اون تیکه برنامه رو دقیقا با همون چیزی که شما نوشتید عوض کردم ولی فرقی نکرد....

              یعنی اینجوری نوشتم:
              کد:
              #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,oldp,L1,L2,a2d;
              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)
              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);
                 }
              
                 {
              حتی با خودم گفتم شاید کمی زمان بخواد تا مقدار p عوض بشه لذا این کد رو جایگزین همون حلقه کردم...
              کد:
               a2d = ADCW; 
                 p = ((-54*a2d)/1024)+54; 
                 oldp=p; 
                 for(k=1;k<127;k++){
                 glcd_setpixel(k,p); 
                 }
                 delay_ms(1);  
                 if(p!= oldp)
                 { 
                 
                 for(k=1;k<127;k++){
                 glcd_clrpixel(k,oldp);
                 oldp=p;
                 }
                 for(k=1;k<127;k++){
                 glcd_setpixel(k,p);
                 } 
                 }
              با هریک از این دو کد میکرو رو پروگرم کردم... ولی با تغییر ولتاژ توسط پتانسیومتر نصب شده روی برد فقط تعداد خطوط زیاد میشه و بعد از یه مدت کل glcd پر از خطوط موازی میشه و دیگه هیچ فضایی باقی نمیمونه.... :cry: :cry:

              اینهم تمام برنامه ای که نوشتم بصورت کامل :
              کد:
              #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,oldp,L1,L2,a2d;
              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)
                 { 
               a2d = ADCW; 
                 p = ((-54*a2d)/1024)+54; 
                 oldp=p; 
                 for(k=1;k<127;k++){
                 glcd_setpixel(k,p); 
                 }
                 delay_ms(1);  
                 if(p!= oldp)
                 { 
                 
                 for(k=1;k<127;k++){
                 glcd_clrpixel(k,oldp);
                 oldp=p;
                 }
                 for(k=1;k<127;k++){
                 glcd_setpixel(k,p);
                 } 
                 }
                    //// kelid 1
                 if(PINB.0 ==0){
                 delay_ms(20);
                 if(PINB.0 ==0)
                 selectch1();
                 } 
                 /// kelid 2
                 if(PINB.1 ==0){
                 delay_ms(20);
                 if(PINB.1 ==0)
                 selectch2();
                 } 
                   /// kelid 3
                 if(PINB.2 ==0){
                 delay_ms(20);
                 if(PINB.2 ==0)
                 selectbothchannels();
                 } 
                 ///kelid 4 
                 if(PINB.3 ==0){
                 delay_ms(20);
                 if(PINB.3 ==0)
                 Lissajous();
                 }
                 //kelid 5
                 if(PINB.4 ==0){
                 delay_ms(20);
                 if(PINB.4 ==0)
                 incvoltdiv();
                 vdc1++; 
                 }
                 if(vdc1>3)
                 vdc1=3;
                 // kelid 6
                 if(PINB.5 ==0){
                 delay_ms(20);
                 if(PINB.5 ==0)
                 decvoltdiv();
                 vdc2++;
                 }
                 if(vdc2>3)
                 vdc2=3;
                 
                 /// kelid 7
                 if(PINB.6 ==0){
                 delay_ms(20);
                 if(PINB.6 ==0)
                 inctimediv();
                 } 
                 /// kelid 8
                 if(PINB.7 ==0){
                 delay_ms(20);
                 if(PINB.7 ==0)
                 dectimediv();
                 }    
              
              } 
              }
              #asm("sei");
              //// entekhab kanal 1
              void selectch1 (void)
              {
              glcd_outtextxyf (2,5,"SEL CH1");
              delay_ms(30);
              for(i=2;i<20;i++){
              for(j=2;j<60;j++)
              glcd_clrpixel(j,i);
              }
              ADMUX=0x00;
              }
              //// entekhab kanal 2
              void selectch2 (void)
              {
              glcd_outtextxyf (2,5,"SEL CH2");
              delay_ms(30);
              for(i=2;i<20;i++){
              for(j=2;j<60;j++)
              glcd_clrpixel(j,i);
              }
              ADMUX=0x01;
              }
              /// entekhab har do kanal
              void selectbothchannels (void)
              {
              glcd_outtextxyf (2,5,"SEL CH1&2");
              delay_ms(30);
              for(i=2;i<20;i++){
              for(j=2;j<62;j++)
              glcd_clrpixel(j,i);
              }
              ADMUX=0x00;
              delay_ms(10);
              ADMUX=0x01;
              }
              //// namayesh lissajous
              void Lissajous (void)
              {
              glcd_outtextxyf (2,5,"Lissajous");
              delay_ms(30);
              for(i=2;i<20;i++){
              for(j=2;j<62;j++)
              glcd_clrpixel(j,i);
              }
              if(ADMUX==0x00)
              L1=ADCW;
              else {
              if(ADMUX==0x01)
              L2=ADCW ;
              }
              }
              //// afzayesh volt division
              void incvoltdiv (void)
              {
              glcd_outtextxyf (2,5,"incvoltdiv");
              delay_ms(30);
              for(i=2;i<20;i++){
              for(j=2;j<62;j++)
              glcd_clrpixel(j,i);
              }
              if(vdc1==1){
              glcd_putcharxy( 12,55,'1');
              }
              if(vdc1==2){
              glcd_putcharxy( 12,55,'2');
              }
              if(vdc1==3){
              glcd_putcharxy (12,55,'5');
              }
              p=p*2;
              }
              //// kahesh volt division
              void decvoltdiv (void)
              {
              glcd_outtextxyf (2,5,"decvoltdiv");
              delay_ms(30);
              for(i=2;i<20;i++){
              for(j=2;j<62;j++)
              glcd_clrpixel(j,i);
              }
              if(vdc2==0 && vdc1==3)
              {
              glcd_putcharxy( 12,55,'2');
              }
              if(vdc2==0 && vdc1==2){
              glcd_putcharxy( 12,55,'1');
              }
              if(vdc2==1 && vdc1==3){
              glcd_putcharxy(12,55,1);
              }
              p=p/2;
              }
              //// afzayesh time division
              void inctimediv (void)
              {
              glcd_outtextxyf (2,5,"inctimediv");
              delay_ms(30);
              for(i=2;i<20;i++){
              for(j=2;j<62;j++)
              glcd_clrpixel(j,i);
              }
              }
              //// kahesh time division
              void dectimediv (void)
              {
              glcd_outtextxyf (2,5,"dectimediv");
              delay_ms(30);
              for(i=2;i<20;i++){
              for(j=2;j<62;j++)
              glcd_clrpixel(j,i);
              }
              }

              دیدگاه


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

                نوشته اصلی توسط roberty
                خیر جواب نگرفتم....
                .
                .
                حتی با خودم گفتم شاید کمی زمان بخواد تا مقدار p عوض بشه لذا این کد رو جایگزین همون حلقه کردم...
                کد:
                 a2d = ADCW; 
                   p = ((-54*a2d)/1024)+54; 
                   oldp=p; 
                   for(k=1;k<127;k++){
                   glcd_setpixel(k,p); 
                   }
                   delay_ms(1);  
                   if(p!= oldp)
                   { 
                   
                   for(k=1;k<127;k++){
                   glcd_clrpixel(k,oldp);
                   oldp=p;
                   }
                   for(k=1;k<127;k++){
                   glcd_setpixel(k,p);
                   } 
                   }
                :angry: :angry:
                این کد که اشتباهه، همون اول میاد و oldp=p; و بعدش چک می کنه if(p!= oldp) ا :angry:

                لطفا فایل پروژه CV به همراه شبیه سازی پروتئوس رو قرار بدید تا بیشتر بررسی بشه
                اونچیزی که در دانشگاه یاد میگیرید، "الفبایی" هست برای نوشتن یک "رمان" !!

                دیدگاه


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

                  نوشته اصلی توسط ☺بابابرقی☺
                  :angry: :angry:
                  این کد که اشتباهه، همون اول میاد و oldp=p; و بعدش چک می کنه if(p!= oldp) ا :angry:

                  لطفا فایل پروژه CV به همراه شبیه سازی پروتئوس رو قرار بدید تا بیشتر بررسی بشه
                  خب این همون مشکلی بود که من عرض کردم و شما بمن گفتید که اصلا برداشتم اشتباهه...!!


                  وگرنه من کاری رو کردم که شما گفتید...

                  این کد CV به همراه پروتوس....فقط در برنامه یه delay به مدت 3000 میلی ثانیه هست که اگر خواستید تو پروتئوس نتیجه رو سریع ببینید این 3000 رو به 3 کاهش بدید.


                  http://uploadkon.ir/?file=b10fbf757ec07628b58a80dc38ad613f.rar

                  دیدگاه


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

                    نوشته اصلی توسط roberty
                    خب این همون مشکلی بود که من عرض کردم و شما بمن گفتید که اصلا برداشتم اشتباهه...!!


                    وگرنه من کاری رو کردم که شما گفتید...

                    این کد CV به همراه پروتوس....فقط در برنامه یه delay به مدت 3000 میلی ثانیه هست که اگر خواستید تو پروتئوس نتیجه رو سریع ببینید این 3000 رو به 3 کاهش بدید.


                    http://uploadkon.ir/?file=b10fbf757ec07628b58a80dc38ad613f.rar
                    نه عزیز، اون کد شما با حرف من فرق داشت، داخل کدی که من گذاشتم، اول چک میکنه اگر p!= oldp اونوقت ازش کپی می گیره
                    بگذریم
                    در مورد فایلتون، امکان بررسی و کامپایل پروژتون رو ندارم:
                    1- عکسا رو حذف کنید لطفا از داخلش(دو تا عکسه که یه مگ جا گرفته :mrgreen
                    2- پروتئوس رو اجرا می کنم، روی lcd شکل های عجیب غریبی رسم می کنه،اگه قطعه خاصی داخل پروئوس اضافه یا اصلاح کردید که پلود کنید لطفا
                    3- این دوتا هدر رو هم پلود کنید: glcd.h font5x7.h (داخل پوشه نصب CV هستش)
                    اونچیزی که در دانشگاه یاد میگیرید، "الفبایی" هست برای نوشتن یک "رمان" !!

                    دیدگاه


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

                      نوشته اصلی توسط ☺بابابرقی☺
                      نه عزیز، اون کد شما با حرف من فرق داشت، داخل کدی که من گذاشتم، اول چک میکنه اگر p!= oldp اونوقت ازش کپی می گیره
                      بگذریم
                      در مورد فایلتون، امکان بررسی و کامپایل پروژتون رو ندارم:
                      1- عکسا رو حذف کنید لطفا از داخلش(دو تا عکسه که یه مگ جا گرفته :mrgreen
                      2- پروتئوس رو اجرا می کنم، روی lcd شکل های عجیب غریبی رسم می کنه،اگه قطعه خاصی داخل پروئوس اضافه یا اصلاح کردید که پلود کنید لطفا
                      3- این دوتا هدر رو هم پلود کنید: glcd.h font5x7.h (داخل پوشه نصب CV هستش)
                      ممنون از توجهتون.
                      پس مقدار اولیه ای که oldp باید بگیره چی هست..؟ و اینکه داخل حلقه while باید مقدار اولیه بگیره یا خارج آن...؟

                      بله... شکلهای عجیب و غریب بپروتئوس برای منهم هست... کلا همینطوره...باید glcd در واقعیت بسته بشه که اونهم فکر نکنم برای شما امکانش باشه..

                      من با کدویژن 2.05.3 که توابع مخصوص برای کار با انواع glcd رو داره کار میکنم.

                      دیدگاه


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

                        نوشته اصلی توسط roberty
                        ممنون از توجهتون.
                        پس مقدار اولیه ای که oldp باید بگیره چی هست..؟ و اینکه داخل حلقه while باید مقدار اولیه بگیره یا خارج آن...؟

                        بله... شکلهای عجیب و غریب بپروتئوس برای منهم هست... کلا همینطوره...باید glcd در واقعیت بسته بشه که اونهم فکر نکنم برای شما امکانش باشه..

                        من با کدویژن 2.05.3 که توابع مخصوص برای کار با انواع glcd رو داره کار میکنم.
                        مقدار اولیش خیلی مهم نیست، اگه شما بهش مقدار ندید، خود کامپایلر صفر در نظر می گیره که مناسب کار ماست. مقادیر بعدی مهمه که از ADC دریافت می کنه.

                        - یعنی تو عمل lcd درست نشون میده؟ پس یا نوع lcd رو درست داخل پروتئوس امتحان نکردید و یا این که یکی از پایه ها رو اشتباه وصل کردید که احتمال دوم قوی تره به نظرم
                        اونچیزی که در دانشگاه یاد میگیرید، "الفبایی" هست برای نوشتن یک "رمان" !!

                        دیدگاه


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

                          نوشته اصلی توسط ☺بابابرقی☺
                          مقدار اولیش خیلی مهم نیست، اگه شما بهش مقدار ندید، خود کامپایلر صفر در نظر می گیره که مناسب کار ماست. مقادیر بعدی مهمه که از ADC دریافت می کنه.

                          - یعنی تو عمل lcd درست نشون میده؟ پس یا نوع lcd رو درست داخل پروتئوس امتحان نکردید و یا این که یکی از پایه ها رو اشتباه وصل کردید که احتمال دوم قوی تره به نظرم
                          باشه... متغیر oldp رو بصورت global تعریف کردم ولی بازهم نشد... برنامه رو ببینید:

                          #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);
                          }
                          }

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

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

                          در ضمن تنها lcd با چیپست ks0108 با 128*64 پیکسل در پروتوس که CS1&2 آنها active high باشه همین مدل هست. بقیه با چیپست توشیبا و غیره هستن.پ

                          ترتیب اتصال پایه های glcd به میکرو در وسط برنامه نوشته شده و توسط خود codewizsrd تولید شده و من هم PCB ام رو بر اساس همین اتصالات درست کردم و فایل پروتئوس رو نیز همینطور.

                          پ.ن : ازت ممنونم جناب " بابابرقی" که روز جمعه برای من وقت گذاشتی و به سوالاتم پاسخ دادی.

                          دیدگاه


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

                            نوشته اصلی توسط roberty
                            باشه... متغیر oldp رو بصورت global تعریف کردم ولی بازهم نشد... برنامه رو ببینید:
                            .
                            .
                            .
                            با چندبار چرخوندن پتانسیومتر مربوطه کل صفحه پر از خطوط افقی میشه...!!! :cry: :cry:

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

                            در ضمن تنها lcd با چیپست ks0108 با 128*64 پیکسل در پروتوس که CS1&2 آنها active high باشه همین مدل هست. بقیه با چیپست توشیبا و غیره هستن.پ

                            ترتیب اتصال پایه های glcd به میکرو در وسط برنامه نوشته شده و توسط خود codewizsrd تولید شده و من هم PCB ام رو بر اساس همین اتصالات درست کردم و فایل پروتئوس رو نیز همینطور.

                            پ.ن : ازت ممنونم جناب " بابابرقی" که روز جمعه برای من وقت گذاشتی و به سوالاتم پاسخ دادی.
                            با چندبار چرخوندن پتانسیومتر مربوطه کل صفحه پر از خطوط افقی میشه...!!!
                            یک سوال!
                            اگر پتانسیومتر رو نچرخونید، درست رسم میشه؟ یعنی ولتاژ ثابت باشه، یک خط ثابت فقط رسم میشه؟(می خوام ببینم کلیت برنامتون و ADC و محاسبات و اینا درسته یا نه؟)
                            پ.ن : ازت ممنونم جناب " بابابرقی" که روز جمعه برای من وقت گذاشتی و به سوالاتم پاسخ دادی.
                            خواهش می کنم، به نظرم خوبه آدم تا تواناییش رو داره اگر کاری از دستش برمیاد برای بقیه انجام بده، بعدشم تا حالا که کار خاصی نکردم، فقط تاپیک پر کردم :mrgreen:
                            اونچیزی که در دانشگاه یاد میگیرید، "الفبایی" هست برای نوشتن یک "رمان" !!

                            دیدگاه


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

                              با سلام،

                              من هر وقت که لازم باشه که شکل موج اعمال شده به ADC رو ببینم، از این قطعه کد استفاده میکنم :
                              کد:
                              //Simple oscilloscope! ,	Max. duration : 215uS/Pixel @16MHz xtal
                              void Oscope(unsigned char inV)
                              {
                              	static unsigned char 				x;
                              	static unsigned char 				oldV[N11_SIZE_X];
                              
                              	N11_SetPixel(x, oldV[x]>>2, WHITE);	//Clear previous set pixel
                              	N11_SetPixel(x, inV>>2, 		BLACK);	//Set current pixel
                              	
                              	oldV[x] = inV;
                              	
                              	x++;
                              	if(x>=N11_SIZE_X)			x = 0;
                              }	//Oscope

                              البته، بصورت سخت افزاری به ورودی ADC مقدار 2.5 ولت آفست میدم....

                              این قطعه کد رو بر اساس کد شما تغییر دادم، استفاده کنید و نتیجه رو اعلام کنید :
                              کد:
                              unsigned char		Xmax = 128;
                              unsigned char		x = 0;
                              unsigned char 	inV;
                              unsigned char 	oldV[Xmax];
                              
                              .
                              .
                              .
                              .
                              
                              
                              while(1)
                              {
                              	///// namayesh moj 
                              	a2d = ADCW;
                              	inV = ((-54 *a2d) /1024) +54;
                              
                              	glcd_clrpixel(x, oldV[x]);	//Clear previous set pixel
                              	glcd_setpixel(x, inV);			//Set current pixel
                              
                              	oldV[x] = inV;
                              	
                              	x++;
                              	if(x>=Xmax)			x = 0;
                              }

                              اول اون تعاریف متغیرها رو در ابتدای برنامه و یا ابتدای روتین main قرار بدید و بعدش هم روتین لوپ اصلی یا while رو با این روتین while عوض کنید.


                              مادامی که از شخصی یاد میشود، او و افکارش زنده اند ....

                              Sh_Nourbakhsh@Yahoo.com

                              http://s2.picofile.com/file/7170362468/_Wall_e_.jp

                              دیدگاه

                              لطفا صبر کنید...
                              X