اطلاعیه

Collapse
No announcement yet.

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

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

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

    با سلام،

    کشیدن خط از پیکسل قبلی به پیکسل کنونی، زمان میبره، به همین خاطر این برادر واسیلی هم این کار رو نکرده ( توی فیلمش دیدم! ) در هر صورت....
    حالا شما در نظر داشته باش که بین نمونه قبلی و نمونه فعلی، مقدار X فقط یک واحد افزایش داره و تفاوت فقط در مقادیر Y هستش ( نمونه ولتاژ قبلی تا نمونه ولتاژ فعلی )، و این موضوعه که شکل ترسیم شده از موج رو تکه تکه و یا نقطه ای میکنه!
    پس نتیجه گیری اخلاقی این که همیشه شما باید یک خط عمودی در X فعلی از Y قبلی به Y جدید بکشید! ( چی گفتم! oo: ) پس نیازی به تابع کامل رسم خط ندارید. و فقط کافیه که در یک حلقه for ، مقدار Y رو از ولتاژ نمونه قبلی تا ولتاژ نمونه فعلی افزایش داده و نقاطی رو در X فعلی و Y های بدست اومده ست کنید.....
    مادامی که از شخصی یاد میشود، او و افکارش زنده اند ....

    Sh_Nourbakhsh@Yahoo.com

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

    دیدگاه


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

      با سلام،

      درود بر برادر roberty ، چی شد اخوی، به کجا رسیدی؟

      این ورژن اصلاح شده اون اسکوپ قبلیه، یه نگاهی بهش بنداز :

      http://s1.picofile.com/file/7438715799/minOSCOPE.rar.html

      توی دایرکتوری PreparedHEX سه تا هگز هست که بر اساس روتین های تست داخل فایل main.c کامپایل شدن، با پروتئوس لود کن و نتیجه رو در پروتئوس ببین و حتما روتین مربوطه رو در فایل main.c هم یه تریسی بکن ......

      OSC_test1 : موج رو بصورت آنلاین رسم میکنه، همونطور که میبینی، در حالت عادی فرکانس رو نمیشه بیشتر از 250 هرتز گذاشت.

      OSC_test2 : موج رو بافر میکنه و بعد نشون میده، همونطور که مشخصه، میشه تا 1.5 کیلوهرتز رو در حالت عادی دید.

      OSC_test3 : نوع اصلاح شده روتین دوم که دیگه شکل موج منقطع نیست.

      در هر صورت، هنوز خیلی کار داره، نا امید نشی ها، من اینجام ..... :mrgreen:
      مادامی که از شخصی یاد میشود، او و افکارش زنده اند ....

      Sh_Nourbakhsh@Yahoo.com

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

      دیدگاه


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

        نوشته اصلی توسط aivhl
        با سلام،

        درود بر برادر roberty ، چی شد اخوی، به کجا رسیدی؟

        این ورژن اصلاح شده اون اسکوپ قبلیه، یه نگاهی بهش بنداز :

        http://s1.picofile.com/file/7438715799/minOSCOPE.rar.html

        توی دایرکتوری PreparedHEX سه تا هگز هست که بر اساس روتین های تست داخل فایل main.c کامپایل شدن، با پروتئوس لود کن و نتیجه رو در پروتئوس ببین و حتما روتین مربوطه رو در فایل main.c هم یه تریسی بکن ......

        OSC_test1 : موج رو بصورت آنلاین رسم میکنه، همونطور که میبینی، در حالت عادی فرکانس رو نمیشه بیشتر از 250 هرتز گذاشت.

        OSC_test2 : موج رو بافر میکنه و بعد نشون میده، همونطور که مشخصه، میشه تا 1.5 کیلوهرتز رو در حالت عادی دید.

        OSC_test3 : نوع اصلاح شده روتین دوم که دیگه شکل موج منقطع نیست.

        در هر صورت، هنوز خیلی کار داره، نا امید نشی ها، من اینجام ..... :mrgreen:
        سلام شهرام جان....وقتت بخیر

        من موندم این اکابر که شما توش درس خوندی کجاست که اینقدر خوب به آدم درس میدن...!!!! :biggrin:

        واقعا آفرین

        کار رو به آنجا رساندم که تریگر رو به روش نرم افزاری آقای واسیلی پیاده سازی کردم (( داخل تابع مین)) و برای نمایش موج هم از سومین نوع یا همون osc_test که جنابعالی بزرگواری کردید و برای من وقت گذاشتید و برنامه اش رو نوشتید استفاده کردم اما همه چیز برنامه کار میکنه الا نمایش موج.... اینبار اصلا هیچی نشون نمیده...

        خودم مطمئنم مشکل از گیج بازی خودمه.... ولی کجای کار ایراد داره رو نمیدونم.... از طرفی مطمئنم که تبدیلات adc انجام میشه چون مقدارش در گوشه glcd دائما در حال کم و زیاد شدن است:

        فایل برنامه رو به همراه پروتئوس برای شما ارسال میکنم. حجمش 1.1 مگ هست"
        http://uplod.ir/dc82mzbvxl2j/osciloscope_program.rar.htm


        خیلی دقت کردم.... اون جاهایی که شما برای lcd نوکیا 1100 از کلمه white استفاده کرده بودید معادل بود با glcd_clrpixel و black هم معادل بود با glcd_setpixel که عینا بکار بردم....

        برای Xmin و Xmax هم به ترتیب از اعداد 1 و 126 استفاده کردم چون 0 و 127 مال کادربندی بود.

        فقط داخل حلقه while شما یه while دیگه گذاشته بودید که من مجبور شدم بجای اون از if استفاده کنم و اینکه مقدار a2d رو هم همچنان با فرمول
        inv = ((54 *a2d) /177);

        تغییر بدم.... آیا اینکار درسته...؟

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

        خواهشا بزرگواری بفرمایید و نگاهی به کد من بندازید. ببینید اصلا از نظر مفهومی درسته یا بازهم مزخرف نوشتم...؟ :biggrin:


        بینهایت سپاسگذارم.

        دیدگاه


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

          نوشته اصلی توسط roberty
          سلام شهرام جان....وقتت بخیر

          من موندم این اکابر که شما توش درس خوندی کجاست که اینقدر خوب به آدم درس میدن...!!!! :biggrin:

          واقعا آفرین

          کار رو به آنجا رساندم که تریگر رو به روش نرم افزاری آقای واسیلی پیاده سازی کردم (( داخل تابع مین)) و برای نمایش موج هم از سومین نوع یا همون osc_test که جنابعالی بزرگواری کردید و برای من وقت گذاشتید و برنامه اش رو نوشتید استفاده کردم اما همه چیز برنامه کار میکنه الا نمایش موج.... اینبار اصلا هیچی نشون نمیده...

          خودم مطمئنم مشکل از گیج بازی خودمه.... ولی کجای کار ایراد داره رو نمیدونم.... از طرفی مطمئنم که تبدیلات adc انجام میشه چون مقدارش در گوشه glcd دائما در حال کم و زیاد شدن است:

          فایل برنامه رو به همراه پروتئوس برای شما ارسال میکنم. حجمش 1.1 مگ هست"
          http://uplod.ir/dc82mzbvxl2j/osciloscope_program.rar.htm


          خیلی دقت کردم.... اون جاهایی که شما برای lcd نوکیا 1100 از کلمه white استفاده کرده بودید معادل بود با glcd_clrpixel و black هم معادل بود با glcd_setpixel که عینا بکار بردم....

          برای Xmin و Xmax هم به ترتیب از اعداد 1 و 126 استفاده کردم چون 0 و 127 مال کادربندی بود.

          فقط داخل حلقه while شما یه while دیگه گذاشته بودید که من مجبور شدم بجای اون از if استفاده کنم و اینکه مقدار a2d رو هم همچنان با فرمول
          inv = ((54 *a2d) /177);

          تغییر بدم.... آیا اینکار درسته...؟

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

          خواهشا بزرگواری بفرمایید و نگاهی به کد من بندازید. ببینید اصلا از نظر مفهومی درسته یا بازهم مزخرف نوشتم...؟ :biggrin:


          بینهایت سپاسگذارم.
          با سلام،

          خواهش میکنم برادر، شرمندم میکنی .....

          برنامه شما رو دیدم، متاسفانه نتونستم توی کدویژن بازش کنم ( ورژن کدویژن شما چیه؟! )

          چند تا ایراد داشت که تووش دست بردم، کدهای اشتباه رو حذف نکردم، فقط کامنت کردم و کدهای درست رو زیرش نوشتم.
          مشکل اصلی همون while هستش که به if تبدیل کردی و اینکه شما باید به اندازه پیکسل های عرض صفحه نمایش، نمونه برداری کرده و در بافر [newv[x بریزی، در حالی که شما فقط یک نمونه در بافر ریختی.

          به نظرم روش تریگ کردن هم ایراد داره، فکر کنم درست نباشه! چون این متوسط گیری باید در تعدادی نمونه انجام بشه نه یکی مضافا اینکه در جای درستی قرار نگرفته، چونکه در جای فعلی، فقط یک بار انجام میشه، در حالی که قاعدتا باید دینامیک باشه و توی لوپ اصلی برنامه باشه و قبل از اجرای هر رسم موج هم یکبار انجام بشه، در نتیجه مقادیر offset و trigger رو یک مقدار ثابت گذاشتم ( اگر موج رسم شده از محور x بالاتر و یا پائین تر بود، مقدار ثابت offset رو تغییر بده! )، درکل، بعدا خودت اینا رو اصلاحشون کن......

          همینطور بنظرم اومد که روتین readkeys هم باید بهینه بشه ( آخه اسکوپ نیاز به حداکثر سرعت داره! ) یه دستی تووش بردم!

          چون توی کدویژن من به لایبراری glcd ارور میداد، متاسفانه نتونستم برنامه رو تست کنم. لطفا تست کرده و نتیجه رو اعلام کنید.

          http://s1.picofile.com/file/7446790642/8.c.html

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

          Sh_Nourbakhsh@Yahoo.com

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

          دیدگاه


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

            نوشته اصلی توسط aivhl
            با سلام،

            خواهش میکنم برادر، شرمندم میکنی .....

            برنامه شما رو دیدم، متاسفانه نتونستم توی کدویژن بازش کنم ( ورژن کدویژن شما چیه؟! )

            چند تا ایراد داشت که تووش دست بردم، کدهای اشتباه رو حذف نکردم، فقط کامنت کردم و کدهای درست رو زیرش نوشتم.
            مشکل اصلی همون while هستش که به if تبدیل کردی و اینکه شما باید به اندازه پیکسل های عرض صفحه نمایش، نمونه برداری کرده و در بافر [newv[x بریزی، در حالی که شما فقط یک نمونه در بافر ریختی.

            به نظرم روش تریگ کردن هم ایراد داره، فکر کنم درست نباشه! چون این متوسط گیری باید در تعدادی نمونه انجام بشه نه یکی مضافا اینکه در جای درستی قرار نگرفته، چونکه در جای فعلی، فقط یک بار انجام میشه، در حالی که قاعدتا باید دینامیک باشه و توی لوپ اصلی برنامه باشه و قبل از اجرای هر رسم موج هم یکبار انجام بشه، در نتیجه مقادیر offset و trigger رو یک مقدار ثابت گذاشتم ( اگر موج رسم شده از محور x بالاتر و یا پائین تر بود، مقدار ثابت offset رو تغییر بده! )، درکل، بعدا خودت اینا رو اصلاحشون کن......

            همینطور بنظرم اومد که روتین readkeys هم باید بهینه بشه ( آخه اسکوپ نیاز به حداکثر سرعت داره! ) یه دستی تووش بردم!

            چون توی کدویژن من به لایبراری glcd ارور میداد، متاسفانه نتونستم برنامه رو تست کنم. لطفا تست کرده و نتیجه رو اعلام کنید.

            http://s1.picofile.com/file/7446790642/8.c.html

            مرسی ..... :mrgreen:
            درود بر شهرام

            کدویژن من ورژن 2.05.3 هست که کتابخانه های راه اندازی lcd گرافیکی رو هم داره...

            لینک دانلودش رو برای شما میذارم.... در این لینک ویدیوی آموزش نصب این نرم افزار وجود داره... حجمش هم 16 مگ هست:

            http://www.techno-electro.com/21-%D8%AF%D8%A7%D9%86%D9%84%D9%88%D8%AF-%DA%A9%D8%A7%D9%85%D9%BE%D8%A7%DB%8C%D9%84%D8%B1-CodeVisionAVR-2.05.3.html

            فایلی که زحمت درست کردنش رو تقبل فرمودید رو دانلود میکنم و نتیجه رو همین امروز اعلام میکنم.

            بازهم از محبتت سپاسگذارم...

            دیدگاه


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

              جواب داد.... :wow: :applause:

              احسنت به شما داش شهرام...کارت خیلی درسته

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

              دو تا ویدیو از عملکرد پروژه اسیلوسکوپ گذاشتم تا ببینید:

              http://uplod.ir/s4s27idu5rny/osc_new_videos.rar.htm

              اون while که داخل while(1 اصلی بود رو مجبور شدم به do...while تبدیل کنم تا برنامه کار بکنه... آخه اونجوری اصلا روتین داخل while اجرا نمیشد... حتی یه دستور glcd_line هم نوشتم تا ببینم تو پروتئوس خط کشیده میشه که دیدم نشد لذا از do... while استفاده کردم و جواب داد...

              برنامه اینه:
              کد:
              #include <mega32a.h>
              #include <delay.h>
              #include <stdio.h>
              #include <glcd.h>
              // Font used for displaying text
              // on the graphic LCD
              #include <font5x7.h>
              /////
              //// variables
              int i,j,a2d;
              int vdc1=0,vdc2=0;
              int tdc1=0,tdc2=0;
              
              const unsigned char    Xmax =127; 
              const unsigned char    Xmin =1;
              const unsigned char    Ymax =54;  
              const unsigned char    Ymin =1;
              const unsigned char    ADCmax =0xFF;
              
              unsigned char  x = Xmin;
              unsigned char  y = Ymin;
              unsigned char  inv;
              unsigned char  oldv[Xmax];
              unsigned char    newv[Xmax];
              
              unsigned char A[20];
              unsigned char upLimit = 0;
              unsigned char lowLimit = 255;
              unsigned char trigger = 0;
              //unsigned char offset = 0;
              signed char  offset = 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 readkeys (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(30);
                 glcd_clear();
                 ADCSRA=0xf8;
                 SFIOR=0x00;
                 ADMUX=0x60; 
                  
                 glcd_putcharxy( 1, 56, 'v'); 
                 glcd_putcharxy( 66, 56, 't');
                 glcd_putcharxy( 7, 56, '='); 
                 glcd_putcharxy( 72, 56, '='); 
                 for(i=0;i<=54;i+=2){
                 glcd_setpixel(0,i);
                 glcd_setpixel(127,i);
                 }
                 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);
                 glcd_putcharxy (14,55,'5');
                 glcd_outtextxy (80,56,"0.1");
                 for(i=0;i<128;i+=2){
                 glcd_setpixel(i,54);
                 glcd_setpixel(i,0);
                 }
                  
                 // Find the higher voltage level of the input waveform.
                if (upLimit < ADCH) 
                upLimit = ADCH;
                
                // Find the lower voltage level of the input waveform.
                if (lowLimit > ADCH) 
                lowLimit = ADCH; 
                
                if(upLimit != lowLimit)
                trigger = (((upLimit - lowLimit)/2)+ lowLimit); // Find the middle of the wave to be used as trigger.
                else
                trigger = upLimit; 
                ////////////////////////////////////////////////////////////////////////////////////
              while (1)
               {
                 do{
                 a2d=ADCH; 
                  sprintf(A,"%2d",a2d);
                  glcd_outtextxy(110,55,A); 
                  readkeys();
                  offset = -30; // = ADCmax/2 -value
                  trigger = 127;
                
                   //a2d =ADCH;  
                 //inv = ((54 *a2d) /177);
                //offset=120-trigger; 
                
                //if(a2d != trigger){ 
                                     //Trigger!
                   
                  //----------------
                for(x=Xmin; x<Xmax; x++)          
                oldv[x] = newv[x];       //Copy old buffer to new buffer  
                    //----------------
                for(x=Xmin; x<Xmax; x++)
                {       
                   inv= ADCH;                            //ADC read
                   newv[x] = Ymax -(inv *Ymax /ADCmax)+ offset;    //Tune inV to display Y range and save to new buffer          
                  }  
                
                  //----------------
                  for(x=Xmin+1; x<Xmax; x++)
                  {      
                    //Clear previous set pixel
                    if(oldv[x]>oldv[x-1]){    
                     for(y=oldv[x-1]; y<=oldv[x]; y++) 
                     glcd_clrpixel(x, y);
                    }
                    else {
                    for(y=oldv[x];y<=oldv[x-1]; y++)     
                    glcd_clrpixel(x, y);  
                    }   
              
                    //Set current pixel
                    if(newv[x]>newv[x-1]){
                    for(y=newv[x-1]; y<=newv[x]; y++)         
                     glcd_setpixel(x, y);  
                     }
                    else{       
                    for(y=newv[x]; y<=newv[x-1]; y++)          
                    glcd_setpixel(x, y);  
                    }
                    }
                   }
                  while(ADCH !=trigger); 
               
                }
              }
              void readkeys (void)
              {
                 if(PINB ==0xFF)  return;     
                 
                 delay_ms(20);
              
                 switch(PINB)
                 {
                  case(0b11111110):   // kelid 1
                    selectch1();
                    break;  
                  
                  case(0b11111101):   // kelid 2
                    selectch2();
                    break;  
                  
                  case(0b11111011):   // kelid 3
                    selectbothchannels();
                    break;  
                  
                  case(0b11110111):   // kelid 4
                    Lissajous();
                    break;  
                  
                  case(0b11101111):   // kelid 5
                   incvoltdiv();
                   vdc1++;
                     break;  
                  
                  case(0b11011111):   // kelid 6
                   decvoltdiv();
                   vdc2++;      
                    break;  
                  
                  case(0b10111111):   // kelid 7
                    inctimediv();
                    break;  
                  
                  case(0b01111111):   // kelid 8
                    dectimediv();
                    break;  
                 }
              }
              //// 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=0x60;
              }
              //// 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=0x61;
              }
              /// 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=0x60;
              delay_ms(10);
              ADMUX=0x61;
              }
              
              //// 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);
              }
              ADMUX=0x70;
              }
              //// 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>=0){
              glcd_putcharxy (14,55,'5');
              }
              y=5;
              }
              //// 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)
              {
              glcd_putcharxy( 14,55,'2');
              }
              y=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);
              }
              if(tdc1 >=0)
              glcd_outtextxy(80,56,"0.1 ");
              }
              //// 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);
              }   
              if(tdc2>=0)
              glcd_outtextxy(80,56,"0.01");
              }
              واقعا نمیدونستم اگر کمک شما نبود چه خاکی تو این کله پوکم باید میریختم....

              یه چیز دیگه... در مورد تریگر برنامه برادر واسیلی هم حق با شماست...داخل حلقه for هست لیکن حلقه اش هیچی نداره یعنی اینجوی نوشته ( ; ; ) for


              مطابق گفته شما روی تریگر باید بیشتر کار کنم تا موج حرکت نکنه.....اگر جلوی حرکت موج رو هم بتونم بگیرم دیگه میشه گفت پروژه تکمیل شده...البته بازهم چشم امید به کمک شما دارم..

              سپاس از شما

              حمید رابط (( roberty ))

              دیدگاه


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

                با سلام،

                درود بر حمید خان، تبریک میگم برادر ..... :job:

                من هم کدویژن جدید رو نصب کردم، حالا میتونم همپای شما حرکت کنم، این هم برنامه خودت که یه دستی به سر و گوشش کشیدم، یه مقدار تریگ و آفست ثابت داره که بعدا میتونی هر طوری که مایل بودی تغییرش بدی :

                http://s2.picofile.com/file/7447285050/osciloscope_program_2.rar.html

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

                Sh_Nourbakhsh@Yahoo.com

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

                دیدگاه


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

                  بازهم سلام

                  سوال دارم:

                  چرا مقدار آفست باید 30- باشه...؟

                  این خط برنامه رو برای چرا اینگونه نوشتیم..؟

                  newv[x] = Ymax -(inv *Ymax /ADCmax)+ offset;

                  مقدار تریگر رو کجای این برنامه باید بکار ببریم...؟

                  آیا مقدارگیری آرایه newv نباید ربطی به تریگر داشته باشد...؟

                  در ویدیوی نشان داده شده دامنه موج کم هست... انگار موج سینوسی از بالاو پایین قیچی شده... برای رفع این مشکل چه کنم...؟
                  ممنون

                  دیدگاه


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

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

                    سوال دارم:

                    چرا مقدار آفست باید 30- باشه...؟

                    این خط برنامه رو برای چرا اینگونه نوشتیم..؟

                    newv[x] = Ymax -(inv *Ymax /ADCmax)+ offset;

                    مقدار تریگر رو کجای این برنامه باید بکار ببریم...؟

                    آیا مقدارگیری آرایه newv نباید ربطی به تریگر داشته باشد...؟

                    در ویدیوی نشان داده شده دامنه موج کم هست... انگار موج سینوسی از بالاو پایین قیچی شده... برای رفع این مشکل چه کنم...؟
                    ممنون

                    با سلام،

                    توی ورودی ADC میکرو دامنه موج شما چقدره؟ شما یه سخت افزار داری که ممکنه علت قیچی شدن موج همون باشه. پس برای تست، ورودی میکرو رو مستقیم بده به سیگنال ژنراتور و دامنه رو بین صفر تا حداکثر 5 ولت تغییر بده و برنامه رو تست کن ( من مطمئنم که مشکل نرم افزاری نیست ).....

                    مقدار تریگ یا باید دستی داده بشه ( مثلا با یک ولوم ) و یا اینکه خودکار محاسبه بشه ( با متوسط گیری از حدودا 100 تا نمونه یا بیشتر ) که در نهایت یک عدد بدست میاد که شما نمونه برداری اصلی رو با دیدن اون مقدار در ورودی شروع میکنید و نمونه ها رو در آرایه newv میریزید و نشونش میدید.

                    برای اینکه هر دوتایی در مورد یک چیز صحبت کنیم، شما 8c اون ورژن دومی که در پست آخری گذاشتم رو باز کن، توی اون یه بهینه سازی هایی توی نمایش موج انجام دادم تا از کادر خارج نشه، البته کامل نیست!

                    و به این خط توجه کنید :
                    while(ADC_read() !=trigger); //Trigger!

                    تریگ موج فقط و فقط همین یک خطه! به محض رسیدن میکرو به این خط، میکرو صبر میکنه تا عددی رو بعنوان تریگ در ورودی ADC ببینه که من یه عدد ثابت بهش دادم :
                    trigger = 0;

                    و بعدش ادامه میده و نمونه برداری اصلی رو شروع میکنه و اون رو رسم میکنه، حالا ممکنه که شما مقدار trigger رو با ولوم و یا مثل برادر واسیلی با نمونه برداری بدی به میکرو...

                    به این عکس که از اسکوپ پروتئوس در زمان تغییر تریگ گرفتم یه نگاهی بنداز، به اون خط چین افقی که جلوی اون فلش سبز هستش توجه کن، این همون مقدار trigger هستش :



                    و اما آفست برای بالا و پائین بردن موج در راستای افقی هستش، یعنی همون Position توی عکس بالا که آبی اش کردم ( زیر Channel A )، این رو هم یا باید دستی بدی و یا اینکه محاسبه کنی، در این خط ( اون 127 مقدار مورد نظره که یا باید محاسبه بشه یا اینکه مقدار ثابت بهش بدی ) :
                    offset = ADCmax /2 -127;

                    و اما موضوع بعد :
                    newv[x] = (inv *Ymax /ADCmax) +offset;
                    if(newv[x]<Ymin) newv[x] = Ymin;

                    در حالت عادی، شما ADC رو میخونی و به ازای ورودی صفر ولت، عدد صفر میگیری و برای نمایش صفر ولت باید پیکسل 52 رو روشن کنی و به ازای ورودی 5 ولت، عدد 255 میگیری و برای نمایش 5 ولت باید پیکسل 2 رو روشن کنی! دقیقا برعکس اون مقداری که میخونی باید پیکسلی رو روشن کنی! تا اینجا قبول؟

                    اگر مقدار رو همینطوری که میخونی، پیکسلی رو متناظر باهاش روشن کنی، شکل موج برعکس خواهد شد، پس در خط اول باید مقدار نهایی رو از Ymax کم کنیم. ولی اگر سخت افزار شما قبل از ADC موج رو بر عکس میکنه ( که فکر نکنم اینکار رو بکنه، چون توی دو مرحله موج رو Invert کرده )، این رو باید از اون خط اولی حذف کنید تا بشه این :
                    newv[x] = (inv *Ymax /ADCmax) +offset;

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

                    Sh_Nourbakhsh@Yahoo.com

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

                    دیدگاه


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

                      به افتخار استاد شهرام نوربخش یه کف مرتب...!!! :applause: :applause: :applause: :applause: :applause:
                      بازهم جواب داد....اینبار بارهم بهتر از قبل شد :wow:

                      این عکسش.... شکل موج دیگه کاملا عالی شد... هیچ مشکلی هم نداره ....فقط راه میره...!!





                      اینهم یه ویدیوی کوتاه ..ججمش حدود یه مگ هست: حتما دانلود کنید:

                      http://uplod.ir/qglwo4nbpk17/sin_wave.mp4.htm

                      حق با شما بود.... از برنامه دوم یعنی osciloscope program 2 استفاده کردم و همونطوری که عرض کردم اون while که شما ازش صحبت کردید رو به do... while تبدیل کردم و تیکه برنامه نمایش آنلاین مقدار adc رو هم اضافه کردم.... همه چی عالی بود...


                      آقا شهرام....شما واقعا آدم باهوش و مستعدی هستی... احسنت..تکنیک های شما به ذهن کمتر کسی میرسید.

                      قدر خودت رو بدون.


                      بدون کمک شما همون نقطه نقطه های قبلی رو هم نمیتونستم نمایش بدم....
                      برنامه شد این:
                      کد:
                      #include <mega32a.h>
                      #include <delay.h>
                      #include <stdio.h>
                      #include <glcd.h>
                      #include <font5x7.h>
                      //	Constants and Varables
                      //*****************************************************************************
                      #define ADC_8BIT_TYPE		1					//1: ADC = 8bit , 0: ADC = 10bit
                      
                      //--------------------------------------------------
                      const unsigned char    	ADCmax = 0xFF;
                      const unsigned char     Xmin 	= 1;
                      const unsigned char    	Xmax 	= 126;
                      const unsigned char    	Ymin 	= 2;
                      const unsigned char    	Ymax 	= 52;
                      	
                      /////
                      //// variables
                      int i,j,a2d;
                      int vdc1=0,vdc2=0;
                      int tdc1=0,tdc2=0;
                      unsigned char A[20];
                      unsigned char upLimit = 0;
                      unsigned char lowLimit = 255;
                      unsigned char trigger = 0;
                      //unsigned char offset = 0;
                      signed char  offset = 0;
                      //Temp Const.
                      char	Ctemp[16];
                      int	  Itemp;
                      
                      //	Functions Prototype
                      //*****************************************************************************
                      void Initialize(void);
                      void Splash(void);
                      void DrawBorder(void);
                      void DrawAxis(void);
                      void ADC_init(void);
                      void ACH_select(unsigned char channel);
                      unsigned int ADC_read(void);
                      void KEYreader (void);
                      void selectch1(void);
                      void selectch2(void);
                      void selectbothchannels(void);
                      void Lissajous (void);
                      void incvoltdiv (void);
                      void decvoltdiv (void);
                      void inctimediv (void);
                      void dectimediv (void);
                      
                      
                      
                      //	<<< main function >>>
                      //*****************************************************************************
                      void main(void)
                      {
                      	unsigned char  inv;
                      	unsigned char  oldv[Xmax];
                      	unsigned char	newv[Xmax];
                      	unsigned char  x 	= Xmin;
                      	unsigned char  y 	= Ymin;
                      
                      	//----------------
                      	Initialize();
                      	Splash();
                      	glcd_clear();
                      	DrawBorder();
                      	DrawAxis();
                      	ADC_init();
                      	ACH_select(0);
                      
                      	while(1)
                      	{ 
                        offset = ADCmax /2 -127;
                        trigger = 10;
                      
                      		do{	
                           a2d=ADCH; 
                           sprintf(A,"%2d",a2d);
                           glcd_outtextxy(110,55,A);
                      		 for(x=Xmin; x<Xmax; x++)			
                           oldv[x] = newv[x];					//Copy old buffer to new buffer  
                      
                      		//----------------
                      		for(x=Xmin; x<Xmax; x++)
                      		{
                      			inv= ADC_read();																				//ADC read			
                      			newv[x] = Ymax -(inv *Ymax /ADCmax) +offset;						//Tune inV to display Y range and save to new buffer
                      			
                      			if(newv[x]<Ymin) 			
                            newv[x] = Ymin;
                      		}
                      
                      		//----------------
                          delay_ms(200);
                      		DrawAxis();					
                      		for(x=Xmin+1; x<Xmax; x++)
                      		{
                      			//Clear previous set pixel
                      			if(oldv[x]>oldv[x-1]){			
                            for(y=oldv[x-1]; y<=oldv[x];y++)				
                            glcd_clrpixel(x, y);		
                            }
                      			else								 
                            {			
                            for(y=oldv[x];y<=oldv[x-1]; y++)				
                            glcd_clrpixel(x, y);		
                            }
                      
                      			//Set current pixel
                      			if(newv[x]>newv[x-1]){			
                            for(y=newv[x-1]; y<=newv[x]; y++)				
                            glcd_setpixel(x, y);		
                            }
                      			else								 
                            {			
                            for(y=newv[x];y<=newv[x-1]; y++)				
                            glcd_setpixel(x, y);		
                            }
                      		} 
                      
                      		//----------------
                        KEYreader();
                        //delay_ms(200);
                      	}
                        while(ADC_read() !=trigger);//while
                      }	//main
                      }
                      
                      //----------------------------------------------------------
                      //----------------------------------------------------------
                      void Initialize(void)
                      {
                      	//-------------		Graphic LCD initialization
                      	GLCDINIT_t glcd_init_data;
                      	// 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
                      
                      	glcd_init_data.font=font5x7;																// Specify the current font for displaying text
                      	glcd_init_data.readxmem=NULL;																// image data from external memory
                      	glcd_init_data.writexmem=NULL;															// image data to external memory
                      
                      	glcd_init(&glcd_init_data);
                      
                      	//-------------		IO_init
                      	//x8 keys input pins,		input & pullup
                      	DDRB = 0b00000000;
                      	PORTB = 0b11111111;
                      
                      	//Define ADC pins,		input & non-pullup
                      	DDRA = 0b00000000;
                      	PORTA = 0b00000000;
                      }	//Initialize
                      
                      //----------------------------------------------------------
                      void ADC_init(void)
                      {
                      	#if ADC_8BIT_TYPE
                      		#define ADC_VREF_TYPE	0x60
                      	#else
                      		#define ADC_VREF_TYPE  0x00
                      	#endif
                      
                      	ADMUX = ADC_VREF_TYPE & 0xFF;
                      	ADCSRA = 0x83;
                      }	//ADC_init
                      
                      void ACH_select(unsigned char channel)
                      {
                       ADMUX = channel | (ADC_VREF_TYPE & 0xFF);
                      
                       delay_us(10);              //Delay needed for the stabilization of the ADC input voltage
                      }	//ACH_select
                      
                      unsigned int ADC_read(void)
                      {
                       ADCSRA |= 0x40;             //Start the AD conversion
                      
                       while((ADCSRA & 0x10)==0);       //Wait for the AD conversion to complete
                       ADCSRA |= 0x10;
                      
                       #if ADC_8BIT_TYPE
                       	return ADCH;
                       #else
                       	return ADCW;
                      	#endif
                      } //read_adc
                      
                      //----------------------------------------------------------
                      void Splash(void)
                      {
                      	glcd_outtextxyf(0, 0, "DIGITAL OSILLOSCOPE");
                      	glcd_outtextxyf(0, 22, "BY AVR MICOCTRL");
                      	glcd_outtextxyf(0, 45, "HAMID REZA RABET" );
                      
                      	delay_ms(30);
                      }	//Splash
                      
                      void DrawBorder(void)
                      {
                      	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);
                      	}
                      
                      	//----------------
                      	glcd_outtextxy(1, 57, "V = 5.0");
                      	glcd_outtextxy(66, 57, "T = 0.1");
                      }	//DrawBorder
                      
                      void DrawAxis(void)
                      {
                      	for(i=0; i<128; i+=2)
                      	{
                      		glcd_setpixel(i, 54);
                      		glcd_setpixel(i, 0);
                      	}
                      
                      	//----------------
                      	glcd_putcharxy(30, 24, '|');
                      	glcd_putcharxy(92, 24, '|');
                      	
                      	glcd_putcharxy(62, 7, '_');
                      	glcd_putcharxy(62, 35, '_');
                      
                      	glcd_line(1, 27, 126, 27);
                      	glcd_line(64, 2, 64, 52);
                      }	//DrawAxis
                      
                      
                      //----------------------------------------------------------
                      //----------------------------------------------------------
                      void KEYreader(void)
                      {
                      	if(PINB ==0xFF)  			
                        return;
                      	delay_ms(20);
                      
                      	switch(PINB)
                      	{
                      		case(0b11111110):   // Key 1
                      			selectch1();
                      			break;
                      
                      		case(0b11111101):   // Key 2
                      			selectch2();
                      			break;
                      
                      		case(0b11111011):   // Key 3
                      			selectbothchannels();
                      			break;
                      
                      		case(0b11110111):   // Key 4
                      			Lissajous();
                      			break;
                      
                      		case(0b11101111):   // Key 5
                      			incvoltdiv();
                      			vdc1++;
                      			break;
                      
                      		case(0b11011111):   // Key 6
                      			decvoltdiv();
                      			vdc2++;
                      			break;
                      
                      		case(0b10111111):   // Key 7
                      			inctimediv();
                      			break;
                      
                      		case(0b01111111):   // Key 8
                      			dectimediv();
                      			break;
                      	}//switch
                      }	//KEYread
                      //// 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=0x60;
                      }
                      //// 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=0x61;
                      }
                      /// 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=0x60;
                      delay_ms(10);
                      ADMUX=0x61;
                      }
                      
                      //// 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);
                      }
                      ADMUX=0x70;
                      }
                      //// 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>=0){
                      glcd_putcharxy (14,55,'5');
                      }
                      //y=5;
                      }
                      //// 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)
                      {
                      glcd_putcharxy( 14,55,'2');
                      }
                      //y=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);
                      }
                      if(tdc1 >=0)
                      glcd_outtextxy(80,56,"0.1 ");
                      }
                      //// 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);
                      }   
                      if(tdc2>=0)
                      glcd_outtextxy(80,56,"0.01");
                      }
                      اما بازهم سوال دارم:

                      بهتر نیست توابع inctimediv و dectimediv رو حذف کنم...؟ یا اینکه وجودشون لازمه...؟ و باید اونها رو گسترش بدم..؟

                      دوم اینه این تابع رو ببینید:

                      void ADC_init(void)
                      {
                      #if ADC_8BIT_TYPE
                      #define ADC_VREF_TYPE 0x60
                      #else
                      #define ADC_VREF_TYPE 0x00
                      #endif

                      ADMUX = ADC_VREF_TYPE & 0xFF;
                      ADCSRA = 0x83;
                      }

                      من با این نوع برنامه نویسی آشنایی ندارم... مخصوصا با اون if اول این تیکه کد.... میشه یه توضیحی بدید و اینکه منظور از 0x60 و 0x00 چیه...؟


                      دیدگاه


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

                        با سلام،

                        درود بر برادر حمید خان با این پشت کارش :applause: :job:

                        بابا خودت زحمت کشیدی اخوی، اینقدر من رو تحویل نگیر شرمنده میشم

                        واقعا خوشحالم که پروژه ات داره به سر و سامون میرسه، ادامه بده اخوی، من باهاتم، بدون جزئیاتی مثل inctimediv و dectimediv پروژه ات کامل نیست، حتی اگر استادت هم نمیخواد، خودت ادامه بده، بار تجربی خوبی برات داره ......

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

                        میشه یه توضیحی بدید و اینکه منظور از 0x60 و 0x00 چیه...؟
                        به بیت ششم و هفتم از رجیستر ADMUX دقت کن، که مد 8 بیت یا 10 بیت رو میشه باهاش تنظیم کرد. ( جزئیاتش رو در توضیحات اون if ها برات میگم :biggrin: )

                        در ضمن، با مقدار ثابت trigger یازی کن، موج می ایسته ..... :mrgreen:


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

                        Sh_Nourbakhsh@Yahoo.com

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

                        دیدگاه


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

                          نوشته اصلی توسط aivhl
                          با سلام،

                          درود بر برادر حمید خان با این پشت کارش :applause: :job:

                          بابا خودت زحمت کشیدی اخوی، اینقدر من رو تحویل نگیر شرمنده میشم

                          واقعا خوشحالم که پروژه ات داره به سر و سامون میرسه، ادامه بده اخوی، من باهاتم، بدون جزئیاتی مثل inctimediv و dectimediv پروژه ات کامل نیست، حتی اگر استادت هم نمیخواد، خودت ادامه بده، بار تجربی خوبی برات داره ......

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

                          به بیت ششم و هفتم از رجیستر ADMUX دقت کن، که مد 8 بیت یا 10 بیت رو میشه باهاش تنظیم کرد. ( جزئیاتش رو در توضیحات اون if ها برات میگم :biggrin: )

                          در ضمن، با مقدار ثابت trigger بازی کن، موج می ایسته ..... :mrgreen:
                          ممنون شهرام جون

                          در مورد 0x00 و 0x60 دوزاری ام قشنگ افتاد...فهمیدم منظور شما چی بود. با اون کدها این مفهوم رو رسوندید که اگر ADC 8 بیتی باشه یعنی فقط با ADCH کار کنیم باید مقدار هگزادسیمال 0x60 با 0xff اند بشه و در غیر اینصورت باید
                          0xff & 0x00 بشه.

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

                          بازهم از محبت بی دریغ شما سپاسگذارم.

                          دیدگاه


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

                            نوشته اصلی توسط roberty
                            ممنون شهرام جون

                            در مورد 0x00 و 0x60 دوزاری ام قشنگ افتاد...فهمیدم منظور شما چی بود. با اون کدها این مفهوم رو رسوندید که اگر ADC 8 بیتی باشه یعنی فقط با ADCH کار کنیم باید مقدار هگزادسیمال 0x60 با 0xff اند بشه و در غیر اینصورت باید
                            0xff & 0x00 بشه.

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

                            بازهم از محبت بی دریغ شما سپاسگذارم.
                            خواهش میکنم برادر، خوش بگذره ..... :bye
                            مادامی که از شخصی یاد میشود، او و افکارش زنده اند ....

                            Sh_Nourbakhsh@Yahoo.com

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

                            دیدگاه


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

                              سلام دوستان .
                              خوبی انجمن هایی مثل eca اینجا معلوم میشه . هم خودمون از پروژه هامون نتیجه میگیریم هم بقیه استفاده می کنن .

                              اما یه سوال .
                              شما برای نمایش محور x,y چیکار کردید؟
                              مشکل نمایش عکس روی glcd توی codvision2.05.3 رو تونستید حل کنید ؟
                              نرم افزار glcd tools رو اگر دارید دوستان لطف کنید لینک بدید که من هرچی می گردم پیدا نمی کنم .

                              دیدگاه


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

                                خب ...ماهم از مسافرت شمال برگشتیم...پدرمون دراومد از گرما و شرجی...

                                در جواب آقای HAMID باید بگم برای نمایش محور ها کار خاصی لازم نیست... از دستورات glcd_line استفاده کردم... همین

                                و اینکه هرگز نتونستم با دستورات کدویژن عکس BMP رو در glcd نمایش بدم...

                                _______________________________

                                چطوری شهرام جون...؟

                                کد نوشته شده رو برای انتخاب کانال ورودی دستکاری کردم و در قسمتهایی که مربوط به توابع انتخاب کانال ورودی هست یه تغییراتی ایجاد کردم تا شکل موج هم از کانال اول قابل نمایش باشه و هم از کانال دوم....لطفا یه نگاهی بندازید و چک کنید و ببینید درست نوشتم یا خیر:
                                کد:
                                #include <mega32a.h>
                                #include <delay.h>
                                #include <stdio.h>
                                #include <glcd.h>
                                #include <font5x7.h>
                                //	Constants and Varables
                                #define ADC_8BIT_TYPE		1					//1: ADC = 8bit , 0: ADC = 10bit
                                
                                //--------------------------------------------------
                                const unsigned char   ADCmax = 0xFF;
                                const unsigned char   Xmin 	= 1;
                                const unsigned char   Xmax 	= 126;
                                const unsigned char   Ymin 	= 2;
                                const unsigned char   Ymax 	= 52;
                                	
                                /////
                                //// variables
                                int i,j,a2d;
                                int vdc1=0,vdc2=0;
                                int tdc1=0,tdc2=0;
                                unsigned char A[20];
                                unsigned char trigger = 0;
                                signed char  offset = 0;
                                
                                //functions used in this programm
                                void Initialize(void);
                                void picture(void);
                                void DrawBorder(void);
                                void DrawAxis(void);
                                void ADC_init(void);
                                void ACH_select(unsigned char channel);
                                unsigned int ADC_read(void);
                                void KEYreader (void);
                                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)
                                {
                                	unsigned char  inv;
                                	unsigned char  oldv[Xmax];
                                	unsigned char	newv[Xmax];
                                	unsigned char  x 	= Xmin;
                                	unsigned char  y 	= Ymin;
                                	Initialize();
                                	picture();
                                	glcd_clear();
                                	DrawBorder();
                                	DrawAxis();
                                	ADC_init();
                                	ACH_select(0);
                                
                                	while(1)
                                	{ 
                                  offset = ADCmax /2 -127;
                                  trigger = 10;
                                
                                		do{	
                                     a2d=ADCH; 
                                     sprintf(A,"%2d",a2d);
                                     glcd_outtextxy(110,55,A);
                                		 for(x=Xmin; x<Xmax; x++)			
                                     oldv[x] = newv[x];					//copy newv to oldv  
                                
                                		//----------------
                                		for(x=Xmin; x<Xmax; x++)
                                		{
                                			inv= ADC_read();			//ADC read			
                                			newv[x] = Ymax -(inv *Ymax /ADCmax) +offset;
                                			
                                			if(newv[x]<Ymin) 			
                                      newv[x] = Ymin;
                                		}
                                
                                		//----------------
                                    delay_ms(200);
                                		DrawAxis();					
                                		for(x=Xmin+1; x<Xmax; x++)
                                		{
                                			//Clear previous set pixel
                                			if(oldv[x]>oldv[x-1]){			
                                      for(y=oldv[x-1]; y<=oldv[x];y++)				
                                      glcd_clrpixel(x, y);		
                                      }
                                			else								 
                                      {			
                                      for(y=oldv[x];y<=oldv[x-1]; y++)				
                                      glcd_clrpixel(x, y);		
                                      }
                                
                                			//Set current pixel
                                			if(newv[x]>newv[x-1]){			
                                      for(y=newv[x-1]; y<=newv[x]; y++)				
                                      glcd_setpixel(x, y);		
                                      }
                                			else								 
                                      {			
                                      for(y=newv[x];y<=newv[x-1]; y++)				
                                      glcd_setpixel(x, y);		
                                      }
                                		} 
                                
                                		//----------------
                                  KEYreader();
                                  //delay_ms(200);
                                	}
                                  while(ADC_read() !=trigger);//while
                                }	//main
                                }
                                
                                //----------------------------------------------------------
                                //----------------------------------------------------------
                                void Initialize(void)
                                {
                                	//Graphic LCD initialization
                                	GLCDINIT_t glcd_init_data;
                                	// 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
                                
                                	glcd_init_data.font=font5x7;			// Specify the current font for displaying text
                                	glcd_init_data.readxmem=NULL;		// image data from external memory
                                	glcd_init_data.writexmem=NULL;	// image data to external memory
                                
                                	glcd_init(&glcd_init_data);
                                
                                	//-------------		IO_init
                                	//x8 keys input pins,		input & pullup
                                	DDRB = 0b00000000;
                                	PORTB = 0b11111111;
                                
                                	//Define ADC pins,		input & non-pullup
                                	DDRA = 0b00000000;
                                	PORTA = 0b00000000;
                                }	//Initialize
                                
                                //----------------------------------------------------------
                                void ADC_init(void)
                                {
                                	#if ADC_8BIT_TYPE
                                		#define ADC_VREF_TYPE	0x60
                                	#else
                                		#define ADC_VREF_TYPE  0x00
                                	#endif
                                
                                	ADMUX = ADC_VREF_TYPE & 0xFF;
                                	ADCSRA = 0x83;/// ADC start conversation will be done in ADC-read function and prescaler is set on 4
                                }
                                void ACH_select(unsigned char channel)
                                {
                                 ADMUX = channel | (ADC_VREF_TYPE & 0xFF);
                                 delay_us(10);  //delay needed for the stabilization of the ADC input voltage 
                                }       
                                
                                unsigned int ADC_read(void)
                                {
                                 ADCSRA |= 0x40;   //Start the AD conversion
                                
                                 while((ADCSRA & 0x10)==0);    //Wait for the AD conversion to complete
                                 ADCSRA |= 0x10;
                                
                                 #if ADC_8BIT_TYPE
                                 	return ADCH;
                                 #else
                                 	return ADCW;
                                	#endif
                                } 
                                
                                //----------------------------------------------------------
                                void picture(void)
                                {
                                	glcd_outtextxyf(0, 0, "DIGITAL OSILLOSCOPE");
                                	glcd_outtextxyf(0, 22, "BY AVR MICOCTRL");
                                	glcd_outtextxyf(0, 45, "HAMID REZA RABET" );
                                
                                	delay_ms(30);
                                }	
                                
                                void DrawBorder(void)
                                {
                                	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);
                                	}
                                
                                	//----------------
                                	glcd_outtextxy(1, 57, "V = 5.0");
                                	glcd_outtextxy(66, 57, "T = 0.01");
                                }
                                
                                void DrawAxis(void)
                                {
                                	glcd_putcharxy(30, 24, '|');
                                	glcd_putcharxy(92, 24, '|');
                                	
                                	glcd_putcharxy(62, 7, '_');
                                	glcd_putcharxy(62, 35, '_');
                                
                                	glcd_line(1, 27, 126, 27);
                                	glcd_line(64, 2, 64, 52);
                                }
                                //----------------------------------------------------------
                                void KEYreader(void)
                                {
                                	if(PINB ==0xFF)  			
                                  return;
                                	delay_ms(20);
                                	switch(PINB)
                                	{
                                		case(0b11111110):   // Key 1
                                			selectch1();
                                			break;
                                
                                		case(0b11111101):   // Key 2
                                			selectch2();
                                			break;
                                
                                		case(0b11111011):   // Key 3
                                			selectbothchannels();
                                			break;
                                
                                		case(0b11110111):   // Key 4
                                			Lissajous();
                                			break;
                                
                                		case(0b11101111):   // Key 5
                                			incvoltdiv();
                                			vdc1++;
                                			break;
                                
                                		case(0b11011111):   // Key 6
                                			decvoltdiv();
                                			vdc2++;
                                			break;
                                
                                		case(0b10111111):   // Key 7
                                			inctimediv();
                                      tdc1++;
                                			break;
                                
                                		case(0b01111111):   // Key 8
                                			dectimediv();
                                      tdc2++;
                                			break;
                                	}
                                }	
                                //// 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 = ADC_VREF_TYPE & 0xFF;
                                }
                                //// 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 = ADC_VREF_TYPE & 0xFF;
                                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 = ADC_VREF_TYPE & 0xFF;
                                ADMUX = ADMUX & 0x20;
                                }
                                //// 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);
                                }
                                ADMUX=0x70;
                                }
                                //// 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>=0){
                                glcd_putcharxy (14,55,'5');
                                }
                                }
                                //// 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)
                                {
                                glcd_putcharxy( 14,55,'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);
                                }
                                if(tdc1 >=0)
                                glcd_outtextxy(80,56,"0.1 ");
                                }
                                //// 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);
                                }   
                                if(tdc2>=0)
                                glcd_outtextxy(80,56,"0.01");
                                }
                                سپاس از محبتت... :redface:


                                دیدگاه

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