اطلاعیه

Collapse
No announcement yet.

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

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

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

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

    ببینید... من با دستور sprintf یک عدد رو به رشته تبدیل کردم به اینصورت...
    کد:
    sprintf (A,"%2d",vdc_number[2]);

    حالا دربرنامه نیازدارم با مقدار A کار کنم.... یعنی بررسی کنم که چه مقداری رو lcd فرستاده شده...میخوام با دستور if(A=='5&#039 کار کنم ولی جواب نمیده... نه اینکه کامپایلر ارور بده.... در عمل جواب نمیده...

    مقدار A رو طوری چک کنم...؟
    نوشته اصلی توسط aivhl
    با سلام،

    آقا من ماموریتم، اینترنت در دسترس نیست و محدودم!

    شما با تمام متغیر ها و اعداد در مد عددی کار کن تا عملیات صحیح و مطمئن انجام بشه و در آخرین لحظه که میخوای روی LCD نشونش بدی، با sprintf بریزش توی char . توجه داشته باش که شما در طول برنامه اسیلوسکوپ با این اعداد کار داری ( برای تنظیمات نمایش ) پس بهتره در تمام احوالات عدد باشن!
    آقا قدر این استاد شهرام رو بدونید، اگر هم نکته ای می گه، داره چند قدم جلوتر رو میبینه، خداییش کارش ایشون @};-

    چون ایشون ماموریتن، من جسارت می کنم و برای این که کارتون راه بیفته در حد دانشم راهنمایی می کنم :redface:

    همینطور که آقای نوربخش هم گفت، باید با اعداد کار کنی، شما اومدی و vdc_number[2] رو ریختی داخل رشته A و بعد می خوای A رو با یک عدد مقایسه کنی، که از دید کامپایلر درسته، اما در عمل کارت غلطه، برای توضیح اینو مد نظر داشته باش که مثلا معادل کاراکتریِ عددِ 5 میشه 35هگز(0x35)
    شما میتونی بنویسی:

    if(vdc_number[2]=='5&#039
    اونچیزی که در دانشگاه یاد میگیرید، "الفبایی" هست برای نوشتن یک "رمان" !!

    دیدگاه


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

      بازهم سلام

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

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

      http://www.8pic.ir/images/yltrsoqabcr2hufiza9.rar

      خودم زیاد راضی نیستم.... شکل موج اصلا و ابدا پیوسته نیست .... این مشکلی هست که باعث نارضایتی میشه وگرنه قشنگ میشه فهمین که دستگاه از فانکشن مقدار میگیره و در گوشه پایین سمت راست glcd هم مقدار adc بصورت دائمی نمایش داده میشه.... ولی همین ناپیوستگی شکل موج کار رو خراب میکنه...!! :cry: :cry:

      دیگر اینکه در ستونهای اول تا پنجم و 20 تا 25 پیکسلهایی که نوشته میشن دیگه پاک نمیشن....!!
      فیلم رو حتما دانلود کنید و تماشا کنید... حجمش 4.8 مگ هست....

      این نوع نمایش موج با چیزی که اون مهندس یونانی (( واسیلی سراسیدیس )) ساخته بود خیلی فرق داره و اصلا به اون کیفیت نیست...!! این ویدیوی اسیلوسکوپ ساخت ایشون هست:
      http://video.techno-electro.com/watch_video.php?v=3b6c86b4f9e6d2945fa8


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

      قطعه کدی که من با راهنمایی آقای "شهرام" در برنامه برای نمایش موج گذاشتم اینه:

      کد:
        a2d = ADCH;
        inv = ((54 *a2d) /255);
        glcd_clrpixel(x, oldv[x]);  //Clear previous set pixel
        glcd_setpixel(x, inv);      //Set current pixel
        oldv[x] = inv; 
        x++;
        if(x>=Xmax)    
          x = 1;

      دیدگاه


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

        با سلام،

        برادر شما یکهو میری، دیگه هم نمیایی، نمیگی ما دلواپس میشیم؟

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

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

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

        Sh_Nourbakhsh@Yahoo.com

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

        دیدگاه


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

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

          برادر شما یکهو میری، دیگه هم نمیایی، نمیگی ما دلواپس میشیم؟
          من دریست نوکرتم شهرام جون...

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

          راستش من نمیخوام توی پروژه ات دخالت کنم و فقط میخوام راهنمائیت کنم تا خودت پروژه ات رو به سرانجام برسونی.
          شما کلا صاحب اختیاری

          تا همینجا هم بدون کمک شما اصلا راه به جایی نداشتم.

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

          شما باید موج رو برای اندازه یک صفحه بافر کنی و بعد نشونش بدی، اینطوری آنلاین نمیشه. ضمن اینکه یه جای کار میلنگه، اینقدرا هم نباید افتضاح باشه.....
          ممکنه درباره " جریان تریگ" توضیح بدید....؟
          بله درسته... من موج رو بصورت آنلاین نشون میدم....اما برای بافری که شما گفتید فکر کنم نیاز به یک ارایه 128 تایی به اندازه پهنای صفحه نمایش باشه و مقادیر ارایه باید همون مقادیر a2d باشن... درسته...؟

          دیدگاه


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

            برای بافری که فرمودید این تیکه برنامه رو نوشتم ولی همونطوری که حدس میزدم جواب نداد.!!!
            کد:
              ///// namayesh moj 
              a2d = ADCH;
              inv = ((54 *a2d) /255);
              for(i=1;i<128;i++){
              pixels[i]=inv;
              } 
              for(i=1;i<128;i++){
              glcd_clrpixel(x, oldv[x]);  //Clear previous set pixel
              glcd_setpixel(x, pixels[i]);      //Set current pixel
              oldv[x] = pixels[i]; 
              x++;
              if(x>=Xmax)    
                x = 1;

            دیدگاه


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

              با سلام،

              ما مخلصیم برادر، هر طور که شما مایل باشید، من در خدمتم.... :mrgreen:

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

              Sh_Nourbakhsh@Yahoo.com

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

              دیدگاه


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

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

                ما مخلصیم برادر، هر طور که شما مایل باشید، من در خدمتم.... :mrgreen:

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

                دیدگاه


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

                  با سلام،

                  برادر، شما این رو یه نگاهی بهش بنداز :

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

                  این رو خیلی فوری-فوتی مخصوص خودت آماده کردم، چیز کاملی نیست ولی به کار میاد :mrgreen:

                  در اصل یه اسکوپ با ADC و مگا 32 به اضافه امکان تغییر آفست موج و تریگ هستش.
                  البته توی پروتئوس کمی بازی در میاره ولی عملا توپ کار میکنه!
                  اگر مسخره بازی در آورد، فرکانس موج ورودی رو از روی فانکشن ژنراتور کم و زیاد کن، درست میشه!!!

                  با ولوم های آفست و تریگ ور برو و نتیجه رو ببین، شکل موج ها رو هم تغییر بده.....
                  مادامی که از شخصی یاد میشود، او و افکارش زنده اند ....

                  Sh_Nourbakhsh@Yahoo.com

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

                  دیدگاه


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

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

                    برادر، شما این رو یه نگاهی بهش بنداز :

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

                    این رو خیلی فوری-فوتی مخصوص خودت آماده کردم، چیز کاملی نیست ولی به کار میاد :mrgreen:

                    در اصل یه اسکوپ با ADC و مگا 32 به اضافه امکان تغییر آفست موج و تریگ هستش.
                    البته توی پروتئوس کمی بازی در میاره ولی عملا توپ کار میکنه!
                    اگر مسخره بازی در آورد، فرکانس موج ورودی رو از روی فانکشن ژنراتور کم و زیاد کن، درست میشه!!!

                    با ولوم های آفست و تریگ ور برو و نتیجه رو ببین، شکل موج ها رو هم تغییر بده.....
                    ممنون که به فکر من هستی و برای من زحمت میکشید

                    این فایل رو دانلود کردم ولی یه چیزی خیلی عجیبه....

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

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

                    شماتیک مدار آقای واسیلی که قبلا هم با هم صحبتش رو کرده بودیم اینه.... دارم دیوونه میشم ...!! :angry: :angry:

                    http://www.serasidis.gr/circuits/AVR_oscilloscope/images/SCHEMATIC.GIF

                    اینجا اصلا هیچ سخت افزاری برای تریگر نیست...خودش هم در توضیح تریگر این پروژه اینطور گفته:

                    This oscilloscope has an automatic trigger. That means, if you have a continuous signal (ex a triagle waveform) the auto trigger will work perfect

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

                    اصلا این تریگر چی هست...؟ برام نامفهومه.

                    دیدگاه


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

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

                      این فایل رو دانلود کردم ولی یه چیزی خیلی عجیبه....

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

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

                      شماتیک مدار آقای واسیلی که قبلا هم با هم صحبتش رو کرده بودیم اینه.... دارم دیوونه میشم ...!! :angry: :angry:

                      http://www.serasidis.gr/circuits/AVR_oscilloscope/images/SCHEMATIC.GIF

                      اینجا اصلا هیچ سخت افزاری برای تریگر نیست...خودش هم در توضیح تریگر این پروژه اینطور گفته:

                      This oscilloscope has an automatic trigger. That means, if you have a continuous signal (ex a triagle waveform) the auto trigger will work perfect

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

                      اصلا این تریگر چی هست...؟ برام نامفهومه.
                      با سلام،

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

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

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

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

                      در فایل main.c این خط کار تریگ رو انجام میده :
                      if(x==Xmin) while(a2dConvert8bit(ACH0) !=TRG); //Trigger!

                      حالا اینکه شما مقدار متغیر TRG رو از کجا بگیری و یا چطوری محاسبه کنی دیگه مهم نیست، من اینجا عددش رو میدم به میکرو :
                      TRG = a2dConvert8bit(ACH7);

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

                      مقدار آفست هم در این خط داده میشه به میکرو :
                      OFS = 120 - a2dConvert8bit(ACH6);

                      و اینجا هم به موجی که در حال ترسیم هست اعمال میشه :
                      inV = Ymax -(inV *Ymax /0xFF) +OFS; //Tune inV to display Y range
                      مادامی که از شخصی یاد میشود، او و افکارش زنده اند ....

                      Sh_Nourbakhsh@Yahoo.com

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

                      دیدگاه


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

                        با سلام مججد خدمت شهرام عزیز.

                        من به آقای واسیلی سراسیدیس ایمیل زدم و ازشون درباره اینکه چجوری موج رو تریگر میکنند سوال کردم ایشون در جواب اینو گفتند:



                        Hello Hamid,


                        I used a trigger but it's based entire in software. Not hardware chip used.
                        The basic idea for triggering is this:


                        1. Take as much samples as your AVR's RAM can with the ADC (Analog to Digital Converter)and find the middle value of the waveform.

                        2. Start again capturing samples but every sample's value must be compared with the middle value you had calculated in step 1.

                        3. See if the value of the captured sample is lower or higher than the middle value.

                        4. If it's higher, start capturing the next 100 samples in to the RAM.
                        I choose 100 samples because I left 100 pixels on LCD for appearing the waveform.

                        5. Print these 100 samples on LCD.

                        6. Start again from step 2.



                        Regards,
                        Vassilis


                        منهم مطابق گفته ایشون عمل کردم و برنامه رو به اینصورت گسترش دادم:
                        کد:
                        #include <mega32a.h>
                        #include <delay.h>
                        #include <stdio.h>
                        #include <glcd.h>
                        
                        // Font used for displaying text
                        // on the graphic LCD
                        #include <font5x7.h>
                        int i,j,a2d,preva2d;
                        int vdc1=0,vdc2=0;
                        int tdc1=0,tdc2=0;
                        signed int maxVoltage=0;
                        unsigned char  Xmax = 127;
                        unsigned char  x = 1;
                        unsigned char  inv,y;
                        unsigned char  oldv[Xmax];
                        unsigned char A[20];
                        unsigned char trigger = 0;
                        unsigned char upLimit = 0;
                        unsigned char lowLimit = 255;
                        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);
                        ///// dar in halghe montazer mimanad ta yek tavdil a2d anjam shavad 
                        	for (i=2; i<15000; i++)
                        		  {
                        			ADCSRA |= (1 << ADSC); // Enable ADC
                        			if(ADIF == 1); // wait until conversion complete.
                        			a2d = ADCH;
                              
                              //// bedast avardan bishtarin va kamtarin meghdar dar har period
                        			if (upLimit < a2d)
                        				upLimit = a2d;
                        
                        			if (lowLimit > a2d)
                        				lowLimit = a2d;                 
                         			maxVoltage = (upLimit * 2);
                              //// meghdar trigger ossilloscope
                        		   if(upLimit != lowLimit)
                        			 trigger = (((upLimit - lowLimit)/2)+ lowLimit); // Find the middle of the wave to be used as trigger.
                        		   else
                        			trigger = upLimit;  
                              }
                           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=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 (14,55,'5');
                           glcd_outtextxy (80,56,"0.1");
                        while (1)
                           {   
                          ///// showing the wave 
                          a2d = ADCH;
                          inv = ((54 *a2d) /177); 
                          for(i=1;i<6;i++){
                          glcd_clrpixel(i,oldv[x]);
                          } 
                          glcd_clrpixel(x, oldv[x]);  //Clear previous set pixel
                          glcd_setpixel(x, inv);    //Set current pixel
                          oldv[x] = inv; 
                          x++;
                          if(x>=Xmax)    
                            x = 1;       
                            //// showing amount of a2d
                            sprintf(A,"%2d",a2d);
                            glcd_outtextxy(110,55,A);
                          /// horizontal cadr
                            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(0,27,128,27);
                           glcd_line(64,0,64,64);
                           readkeys();
                        }
                        }
                        void readkeys (void)
                        {
                           //// key 1
                           if(PINB.0 ==0){
                           delay_ms(20);
                           if(PINB.0 ==0)
                           selectch1();
                           } 
                           /// key 2
                           if(PINB.1 ==0){
                           delay_ms(20);
                           if(PINB.1 ==0)
                           selectch2();
                           } 
                             /// key 3
                           if(PINB.2 ==0){
                           delay_ms(20);
                           if(PINB.2 ==0)
                           selectbothchannels();
                           } 
                           ///key 4 
                           if(PINB.3 ==0){
                           delay_ms(20);
                           if(PINB.3 ==0)
                           Lissajous();
                           }
                           //key 5
                           if(PINB.4 ==0){
                           delay_ms(20);
                           if(PINB.4 ==0)
                           incvoltdiv();
                           vdc1++;
                           }
                           // key 6
                           if(PINB.5 ==0){
                           delay_ms(20);
                           if(PINB.5 ==0)
                           decvoltdiv();
                           vdc2++;
                           }
                           /// key 7
                           if(PINB.6 ==0){
                           delay_ms(20);
                           if(PINB.6 ==0)
                           inctimediv();
                           } 
                           /// key 8
                           if(PINB.7 ==0){
                           delay_ms(20);
                           if(PINB.7 ==0)
                           dectimediv();
                           } 
                        }
                        //// select channel 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;
                        }
                        //// select channel 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;
                        }
                        ///select both channels
                        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;
                        }
                        
                        //// 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;
                        }
                        //// increase 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;
                        }
                        //// decrease 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;
                        inv=inv*2.5;
                        }       
                        //// increase 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 ");
                        }
                        //// decrease 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");
                        }


                        یعنی در اصل این حلقه رو از برنامه برادر واسیلی به تابع مین main اضافه کردم:

                        کد:
                        	for (i=2; i<15000; i++)
                        		  {
                        			ADCSRA |= (1 << ADSC); // Enable ADC
                        			if(ADIF == 1); // wait until conversion complete.
                        			a2d = ADCH;
                              
                              //// bedast avardan bishtarin va kamtarin meghdar dar har period
                        			if (upLimit < a2d)
                        				upLimit = a2d;
                        
                        			if (lowLimit > a2d)
                        				lowLimit = a2d;                 
                         			maxVoltage = (upLimit * 2);
                              //// meghdar trigger ossilloscope
                        		   if(upLimit != lowLimit)
                        			 trigger = (((upLimit - lowLimit)/2)+ lowLimit); // Find the middle of the wave to be used as trigger.
                        		   else
                        			trigger = upLimit;  
                              }
                        حالا سوال پیش اومده برام:

                        در کتب Avr نوشته حداکثر نرخ نمونه برداری ADC برابر 15000 نمونه در ثانیه هست... آیا اون 15000 ای که واسیلی در حلقه FOR گذاشته برای همینه...؟

                        در برنامه ایشون این تیکه کد برای انتظار اتمام عملیات ADC بکار رفته:

                        loop_until_bit_is_set(ADCSRA, ADIF); // wait until conversion complete.

                        نظر به اینکه دستور Loop_until در کدویژن وجود نداره آیا من کار درستی کردم که ADIF رو با یک مقایسه کردم...؟ اگر کارم درست نیست چکار باید بکنم..؟

                        یه سوال خیلی مهم دیگه.... مد کاریADC برای اینکار بایدfree باشه یا single...؟ آخه ایشون منتظر اتمام تبدیل شدند...

                        ایشون با 100 پیکسل کار کردند ولی من باید با 126 پیکسل کار کنم... چطوری میتونم آرایه ای بنویسم که 126 تائی باشه بنویسم و مقادیر رو به سرعت در اون جا بدم ... ؟

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

                        دیدگاه


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

                          برنامه آقای سراسیدیس اینه:

                          کد:
                          /* AVR oscilloscope with 128x64 graphic LCD.
                          
                            AVR: ATmega32 at 16MHz (external crystal).
                            OpAmp: LM358 is connected on PA0 (ADC0).
                          
                            Created by Serasidis Vassilis 
                            Home: http://www.serasidis.gr
                            e-mail: info@serasidis.gr and avrsite@yahoo.gr
                          
                            History:
                            
                            - V2.00 on 14 Mar 2011 by Vassilis Serasidis. 
                             * gLCD library was improved and alphanumeric font was included ('font3x6.h' file).
                          
                          	 * Information about the measured waveform such as Voltage (Vpp) and frequency (kHz) is appeared on LCD.
                          
                          	 * Sampling rate has been increased because sample accuracy reduced to 8-bit instead of 10-bit and 
                              the ADC prescaler reduced from 16 to 4. That gives a much faster sampling rate.
                          
                          	 * RAM requirement has been reduced from ~1200 bytes to 335 bytes. That gives you the chance to use some other
                          	  AVR micro controller with lower RAM than 2kB (firmwares 1.00 and 1.01 need AVRs with 2kB of RAM ).
                          	  
                             * A problem with buttons S3 (PC4 pin) and S7 (PC2 pin) was fixed. 
                          
                            - V1.01 on 26 Jun 2008 by Anantha Narayanan.	Solved a delay issue.   
                            - V1.00 on 03 Aug 2007 by Vassilis Serasidis. Initial version. Only waveform is appeared on LCD.
                          
                            All source code files of "AVR oscilloscope" project are distributed under GPL V3 (General Public License).
                          */
                          
                          #include <avr/io.h>		// include I/O definitions (port names, pin names, etc)
                          #include <avr/interrupt.h>
                          #include "glcd.c"
                          
                          
                          
                          /* define CPU frequency in MHz here if not defined in Makefile */
                          #ifndef F_CPU
                          #define F_CPU 16000000UL
                          #endif
                          
                          #define msUp				1
                          #define msDwn				4   
                          #define YposUp				0
                          #define YposDwn				3
                          #define freeze				2
                          
                          #define AC 					0
                          #define DC 					1
                          #define SQUARE				2
                          #define TRUE				0
                          #define FALSE				1
                          
                          unsigned int dataCounter = 0;
                          unsigned int timeDiv = 0; 
                          unsigned char trigger = 0;
                          unsigned char findZero = 0;
                          unsigned char upLimit = 0;
                          unsigned char lowLimit = 255;
                          unsigned char prevADCvalue = 0;
                          unsigned char voltageType = AC;
                          unsigned char complete = TRUE;
                          unsigned int voltage;
                          unsigned char frequency;
                          unsigned int ADCvalue;
                          unsigned char hex2asciiBuffer[4];
                          
                          signed char Ypos  = 0; 
                          signed char Ypos2  = 0;
                          signed char position = 0;
                          
                          void ADC_init (void);
                          void hex2Ascii(unsigned int data, unsigned char Buffer[4]);
                          
                          
                          int main (void)
                          {
                          
                          	unsigned int i,k;
                          	unsigned long endOfPeriod=0;
                          	unsigned char freqComplete=0;
                          	unsigned int maxVoltage=0;
                          
                          	DDRC = 0b00000000; 
                          	PORTC = 0b11111111;
                          
                          	DDRA = 0b00000000; 
                          
                          	glcdInit();
                          	ADC_init();
                          	createWelcomeScreen();
                          	_delay_ms(4000);
                          	createRaster();
                          	createWave();
                          
                          	for(;;)
                          	{
                          
                          		if (~PINC & (1<<msUp) && (timeDiv <= 120))
                          	  	timeDiv += 1;
                          
                          		if (~PINC & (1<<msDwn) && (timeDiv >= 1))
                          			timeDiv -= 1;
                          
                          
                          		if (~PINC & (1<<YposUp) && (Ypos2 <= 60))
                          	  	Ypos2++;
                          
                          		if (~PINC & (1<<YposDwn) && (Ypos2 >= -60))
                          			Ypos2--;
                          
                          		if (~PINC & (1<<freeze))
                          			while (~PINC & (1<<freeze)); // It freezes the display to watch the wave.
                          		
                          
                          			
                          //--------v
                          // Read 100 samples from analog input.
                          // From these 100 samples we can find the middle of the signal to be used as trigger...
                          // ... the Volts peak-to-peak and the frequency of the measured signal. 
                          
                          		findZero = 0;
                          		upLimit = 0;
                          		lowLimit = 255;
                          		endOfPeriod = 0;
                          		freqComplete = 0;
                          		complete = FALSE;
                          
                          		for (i=2; i<15000; i++)
                          		{
                          			ADCSRA |= (1 << ADSC); // Enable ADC
                          			loop_until_bit_is_set(ADCSRA, ADIF); // wait until conversion complete.
                          			ADCvalue = ADCH;
                          
                          			//------------------------------------------------------v
                          			// Find the end of the first period that is appeared on LCD.
                          			// Th``e beginning of the period is always the first pixel on the left of LCD.
                          
                                //Find the start of the period of the measured waveform. 
                          			if((ADCvalue > trigger) && (prevADCvalue < ADCvalue) && (freqComplete == 0))
                          				freqComplete = 1;
                          			
                          			//If you have found the start of the period, find the rise of the waveform.
                          			if((ADCvalue < trigger) && (prevADCvalue < ADCvalue) && (freqComplete == 1))
                          				freqComplete = 2;
                          
                          			//The next step is to find the start of the next period...
                          			if((ADCuvalue > trigger) && (prevADCvalue < ADCvalue) && (freqComplete == 2))
                          			{
                          				freqComplete = 3; //Wow! we found the end of the first period. 
                          				endOfPeriod = ((23000)/(i/2)); //Calculate the frequency that will be displayed on LCD.	
                          			}
                          			//------------------------------------------------------^
                          
                          			prevADCvalue = ADCvalue; // Get a backup of the current ADC value.
                          
                          			for(k=timeDiv;k>0;k--)  // Make a delay to see on LCD low-frequency waveforms. Normally, the minimum waveform that can be entirely displayed on LCD is 310 Hz. 
                          			{
                          				ADCSRA |= (1 << ADSC);  // Enable ADC
                          				loop_until_bit_is_set(ADCSRA, ADIF); // wait until conversion complete.
                          				ADCvalue = ADCH;
                          			}
                          
                          			if (upLimit < ADCvalue) // Find the higher voltage level of the input waveform.
                          				upLimit = ADCvalue;
                          
                          			if (lowLimit > ADCvalue) // Find the lower voltage level of the input waveform.
                          				lowLimit = ADCvalue;
                          
                          
                          			maxVoltage = (upLimit * 2); // Maximum voltage on ADC pin is calculated from upLimit register (255*2=510 = 5.10V).
                          
                          			if (ADCvalue > 0)
                          			{
                          				voltage = ((upLimit-lowLimit)*2); //Get the Vpp and store it to "voltage" (Volts Peak-to-peak of inputed waveform).
                          				ADCvalue += 5;
                          				ADCvalue /= 5;
                          				ADCvalue += 2;
                          			}else
                          				ADCvalue = 2;
                          			
                          			position = ADCvalue + Ypos2 +5; 
                          			if ((position <= 63) && (position >= 0) && (i<100)) // Adjust Up-Down the wave on LCD.
                          				fillDataLcdBuffer(i,position);
                          			else
                          			if(i<100)
                          				fillDataLcdBuffer(i,0);
                          
                          			if((i>100)&&(freqComplete==3))  //If i>100 and freqComplete=3 that means that our waveform is outside of LCD displaying area.
                          				break; //Do not wait until i=15000. Terminate this loop ("for (i=0; i<15000; i++)")
                          
                          		}
                          
                          		if(upLimit != lowLimit)
                          			trigger = (((upLimit - lowLimit)/2)+ lowLimit); // Find the middle of the wave to be used as trigger.
                          		else
                          			trigger = upLimit;
                          
                          //--------^
                          
                          //--------- Print Volts peak-to-peak and frequency on display -------------
                          
                          		restoreRaster();
                          		createWave();
                          
                          		line=3;          //Show the DC voltage
                          		column=109;
                          		gLCDgotoXY(line,column);
                          		hex2Ascii(maxVoltage,hex2asciiBuffer);
                          		GLCD_WriteChar(hex2asciiBuffer[2]);
                          		sendDataOnLCD(0b01000000); //Print one dot character on LCD (only 1 column length).
                          		sendDataOnLCD(0);
                          		GLCD_WriteChar(hex2asciiBuffer[1]);
                          		GLCD_WriteChar(hex2asciiBuffer[0]);
                          		sendDataOnLCD(0x00);
                          		GLCD_WriteChar('V');
                          
                          		line=4;          //Show the Vpp (Volts peak-to-peak).
                          		column=109;
                          		gLCDgotoXY(line,column);
                          		hex2Ascii(voltage,hex2asciiBuffer);
                          		GLCD_WriteChar(hex2asciiBuffer[2]);
                          		sendDataOnLCD(0b01000000); //Print one dot character on LCD (only 1 column length).
                          		sendDataOnLCD(0);
                          		GLCD_WriteChar(hex2asciiBuffer[1]);
                          		GLCD_WriteChar(hex2asciiBuffer[0]);
                          		sendDataOnLCD(0x00);
                          		GLCD_WriteChar('V');
                          
                          		line=6;          // Go to 6th line on LCD.
                          		column=122; 
                          		gLCDgotoXY(line,column);
                          
                          		if(timeDiv == 0)     // If 'timeDiv' = 0 then the frequency in to the 'endOfPeriod' variable is real.
                          			GLCD_WriteChar(0x5c); // So, print on LCD the "Play" character. '0x5c' is the '\' character ("Play" symbol).
                          		else
                          			GLCD_WriteChar(']'); // If 'timeDiv' is not zero that means we have shrink the waveform. So, print the "Pause" symbol on LCD. 
                          		
                          		if(timeDiv == 0)		 // If 'timeDiv' = 0 then the frequency in to the 'endOfPeriod' variable is real.
                          		{
                          			line=7;        // Go to 7th line and print on LCD the waveform's frequency
                          			column=102;
                          			gLCDgotoXY(line,column);
                          			if(endOfPeriod <10000) // The maximum frequency that can be displayed on LCD is 9999 Hz.
                          			{
                          				gLCDgotoXY(line,column);
                          				hex2Ascii(endOfPeriod,hex2asciiBuffer);
                          				GLCD_WriteChar(hex2asciiBuffer[3]);
                          				GLCD_WriteChar(hex2asciiBuffer[2]);
                          				GLCD_WriteChar(hex2asciiBuffer[1]);
                          				GLCD_WriteChar(hex2asciiBuffer[0]);	
                          			}
                          			
                          		}          // if 'timeDiv' > 0 do not update the frequency. Keep the previous frequency value instead. 
                          
                          //-------------------------------------------------------
                          
                          		dataCounter = 0;
                          		complete = FALSE;
                          		freqComplete = 0;
                          
                          		do //Wait in this loop until you find again the start of the measured waveform.
                          		{
                          			prevADCvalue = ADCvalue;
                          			
                          			ADCSRA |= (1 << ADSC);  // Enable ADC
                          			loop_until_bit_is_set(ADCSRA, ADIF);
                          			ADCvalue = ADCH;
                          
                          			//Find the start of the period of the measured waveform. 
                          			if((ADCvalue > trigger) && (prevADCvalue < ADCvalue) && (freqComplete == 0))
                          				freqComplete = 1;
                          	
                          			//If you have found the start of the period, find the rise of the waveform.
                          			if((ADCvalue < trigger) && (prevADCvalue < ADCvalue) && (freqComplete == 1))
                          				freqComplete = 2;
                          
                          			//The next step is to find the start of the next period...
                          			if((ADCvalue > trigger) && (prevADCvalue < ADCvalue) && (freqComplete == 2))
                          			{
                          				freqComplete = 3; 
                          				complete = TRUE;
                          			}
                          			if(dataCounter > 3000)
                          				complete = TRUE;
                          			dataCounter++;
                          
                          		}while(complete == FALSE);
                          
                          	}	
                          }
                          
                          //===============================================================================
                          // Initializing the Analog to Digital Converter (ADC).
                          //===============================================================================
                          
                          void ADC_init (void)
                          {
                          	ADMUX = 0b01100000;  // PA0 -> ADC0, ADLAR=1 (8-bit)
                          	ADCSRA |= ((1<<ADEN) | (1<<ADSC) | (1<<ADPS1)); // ADC prescaler at 4
                          }
                          
                          
                          //===============================================================================
                          // Function that converts an integer into 4 ASCII-character bytes.
                          // For example if 'data' contains the number "6543" then 
                          //  Buffer[3] = '6' Buffer[2]='5' Buffer[1]='4'  Buffer[0]='3'. 
                          // I know, I could have used the 'itoa' function to do the conversion from integer into ASCII 
                          //  but my function is easier and more convenient to be handled.
                          //===============================================================================
                          void hex2Ascii(unsigned int data, unsigned char Buffer[4])
                          {
                          	Buffer[3] = ((data/1000)+0x30);
                          	data %= 1000;
                          	Buffer[2] = ((data/100)+0x30);
                          	data %= 100;
                          	Buffer[1] = ((data/10)+0x30);
                          	Buffer[0] = ((data%10)+0x30);
                          }
                          و هدرفایل glcd.c که ایشون نوشتن
                          کد:
                          /* As graphic LCD used the DEM128064A model (128x64 pixels).
                          
                            Created by Serasidis Vassilis and finished at 03.Aug.2007
                            Home: http://www.serasidis.gr
                            e-mail: info@serasidis.gr and avrsite@yahoo.gr
                          
                            -- glcd V1.01 : (by Anantha Narayanan at 27.Jun.2008) fixed an optimitation problem with the delay routine.
                            -- glcd V1.00 : (by Vassilis Serasidis at 03.Aug.2007) initial version created 
                          
                            This code is ditributed under GPL v3 (General Public License).
                          */
                          
                          #include "glcd.h"
                          //#include "font5x7.h"
                          #include "font3x6.h"
                          #include <util/delay.h>
                          
                          
                          void glcdInit (void)
                          { 
                          
                          
                           data_port_pins = 0; //DATA Port Low
                           data_port_ddr = 0xff; //Make DATA port output
                          
                           ctrl_port = 0;  //CONTROL Port Low
                           ctrl_port_ddr = 0xff; //Make CONTROL port outputs
                          
                           ctrl_port |= (1<<lcdrst);
                           ctrl_port |= (1<<lcdcs1);  //Enable the CS1 of the display
                           ctrl_port |= (1<<lcdcs2);  //Enable the CS2 of the display
                           ctrl_port &= ~(1<<lcdrs);    //Clear RS \_
                           ctrl_port &= ~(1<<lcdrw);    //Clear RW / Command mode
                          
                            
                           _delay_us(42);
                           data_port = 0b11000000;  //Display start line = 0 (0-63)
                           eStrobe();
                           
                          
                            
                           _delay_us(42);
                              data_port = 0b01000000;  //Set address = 0 (0-63)
                              eStrobe();
                          
                            
                           _delay_us(42);
                              data_port = 0b10111000;  //Set page = 0 (0-7)
                              eStrobe();
                          
                           _delay_us(42);
                            
                              data_port = 0b00111111;  //Display ON
                              eStrobe();
                          
                              ctrl_port &= ~(1<<lcdcs1); //Disable the CS1 of display
                              ctrl_port &= ~(1<<lcdcs2); //Disable the CS2 of display
                          }
                          
                          //====================================================================
                          // create "welcome" screen
                          //====================================================================
                          void createWelcomeScreen (void)
                          { 
                          	unsigned int i;
                          	const char *data = welcomeScreen;
                          	column = 0;
                          	line =0;
                          
                          	gLCDgotoXY(line,column);
                          
                          	for (i = 0; i<1024; i++)
                          		sendDataOnLCD(pgm_read_byte(data++));
                          
                          }
                          //====================================================================
                          // create the raster screen (IS USED)
                          //====================================================================
                          void createRaster (void)
                          { 
                          	unsigned int i;
                          	const char *data = LcdRaster;
                          	column = 0;
                          	line =0;
                          
                          	gLCDgotoXY(line,column);
                          
                          	for (i = 0; i<1024; i++)
                          		sendDataOnLCD(pgm_read_byte(data++));
                          
                          }
                          //====================================================================
                          // (IS USED)
                          //====================================================================
                          void gLCDgotoXY (unsigned char lineData, unsigned char columnData)
                          {
                          	if(columnData < 64)  // If column is at address 0-63...
                          		enable_cs1();   // ...select the first half of LCD
                          	else
                          	{           // ...or else...
                          		enable_cs2();   // ...select the second half of LCD.
                          		columnData-=64;
                          	}
                          
                          	ctrl_port &= ~(1<<lcdrw);  //Clear RW. Command mode
                          	ctrl_port &= ~(1<<lcdrs);  //Clear RS. Command mode
                          
                          	lineData |= 0b10111000;
                          	data_port = lineData;  //Select page (0-7)
                          	eStrobe();
                          		
                          	columnData |= 0b01000000;
                          	data_port = columnData; //Set column address (0-63)
                          	eStrobe();
                          
                          	ctrl_port &= ~(1<<lcdrw);  //Clear RW. 
                          	ctrl_port |= (1<<lcdrs);  //Set RS. write data mode
                          	
                          }
                          
                          //====================================================================
                          //
                          //====================================================================
                          
                          void fillDataLcdBuffer (unsigned char address, unsigned char data)
                          {
                          	dataLcdBuffer[address] = data;
                          }
                          
                          //====================================================================
                          // (IS USED)
                          //====================================================================
                          unsigned char readDataFromLCD (void)
                          {
                          	unsigned char data;
                          
                          	if (column < 64)
                          		enable_cs1();
                          	
                          	if(column >= 64)
                          		gLCDgotoXY(line,column);
                          
                          	data_port_ddr = 0;
                          
                          	ctrl_port |= ((1<<lcdrw)|(1<<lcdrs)); // "DATA SEND" mode
                          	_delay_us(5); 
                          	ctrl_port |= (1<<lcde);
                          	_delay_us(5); 
                          	ctrl_port &= ~(1<<lcde);
                          	_delay_us(5);
                          
                          	ctrl_port |= (1<<lcde);
                          	_delay_us(5); 
                          	data=data_port_pins;
                          	ctrl_port &= ~(1<<lcde);
                          	_delay_us(5);
                          	data_port_ddr = 0xff;
                          
                          	gLCDgotoXY(line,column);
                          	
                          	return data;
                          }
                          
                          //====================================================================
                          // (IS USED)
                          //====================================================================
                          void sendDataOnLCD (unsigned char data)
                          {
                          	if (column < 64)
                          		enable_cs1();
                          	
                          	if(column >= 64)
                          		gLCDgotoXY(line,column);
                          
                          	if(column == 128)
                          	{
                          		column = 0;
                          		line++;
                          
                          		if (line == 8)
                          			line = 0;
                          		gLCDgotoXY(line,column);
                          	}
                          	_delay_us(5);
                          	ctrl_port |= (1<<lcdrs); // "DATA SEND" mode
                          	ctrl_port &= ~(1<<lcdrw); 
                          	data_port = data;
                          	eStrobe();
                          
                          	column++;   // increase column (maximum 128).
                          }
                          
                          //====================================================================
                          // Write the data for 1 waveform to the buffer dataLcdBuffer.
                          //====================================================================
                          void createWave (void)
                          {
                           unsigned char data;
                           unsigned char byte;
                           unsigned char i;
                          
                          	for (i=0; i<100; i++)
                          	{
                          		line=7;
                          		column=0;
                          		byte = 0b10000000;
                          
                          		for(data=dataLcdBuffer[i]; data>7; data-=8)
                          			line--;
                          		
                          		for(;data>0; data--)
                          			byte >>= 1; 
                          
                          		column=i;
                          		gLCDgotoXY(line,column);
                          		data=readDataFromLCD();
                          		dataLcdBackupBuffer[i*2]=line;   //Backup the line position (0-7)
                          		dataLcdBackupBuffer[(i*2)+1]=data; //Backup the data which are on the current LCD possition.
                          
                          		gLCDgotoXY(line,column);
                          		sendDataOnLCD(byte | data);	
                          	}
                          }
                          
                          //====================================================================
                          // 
                          //====================================================================
                          void restoreRaster (void)
                          {
                           unsigned char data, i;
                          
                          	for (i=0; i<100; i++)
                          	{	
                          		column=i;
                          		line = dataLcdBackupBuffer[i*2];
                          		data = dataLcdBackupBuffer[(i*2)+1];
                          		gLCDgotoXY(line,column);		
                          		sendDataOnLCD(data);
                          	}
                          }
                          //====================================================================
                          //
                          //====================================================================
                          void enable_cs1 (void)
                          {
                          	ctrl_port |= (1<<lcdcs1);  //Enable the CS1 of the display
                          	ctrl_port &= ~(1<<lcdcs2);  //Disable the CS2 of the display
                          }
                          
                          //====================================================================
                          //
                          //====================================================================
                          void enable_cs2 (void)
                          {
                          	ctrl_port |= (1<<lcdcs2);  //Enable the CS2 of the display
                          	ctrl_port &= ~(1<<lcdcs1);  //Disable the CS1 of the display
                          }
                          
                          //====================================================================
                          //
                          //====================================================================
                          void eStrobe (void)
                          {
                            _delay_us(5);
                            ctrl_port |= (1<<lcde);  //lcd 'E' pin high
                            _delay_us(5);
                              ctrl_port &= ~(1<<lcde); //lcd 'E' pin low
                            _delay_us(5);
                          }
                          
                          
                          //====================================================================
                          //
                          //====================================================================
                          void GLCD_WriteChar(char charToWrite)
                          {
                          	unsigned char i=0;
                          	for(i = 0; i < 3; i++) 
                          		sendDataOnLCD(pgm_read_byte(&font3x6[((charToWrite - 0x20) * 3) + i]));
                          	sendDataOnLCD(0x00);
                          }

                          دیدگاه


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

                            با سلام،

                            این برادر واسیلی خیلی خوب و کامل توضیح داده، همونطور که من هم اشاره داشتم، داره با متوسط گیری تریگ خودکار انجام میده، جالب اینکه در توضیحاتش الگوریتم کلی کارش رو هم گفته .....

                            حالا شما هم میتونی همینطوری عمل کنی و یا با کیلد و یا ولوم، مقدار تریگ رو دستی به میکرو بدی ( مثل اسکوپ های قدیمی که یه ولوم برای این کار دارن )

                            الان دستم بنده! فردا کدها رو یه نگاهی میندازم ...........

                            و اما در مورد loop_until_bit_is_set ، این دستور نیست، یه ماکرو هستش که معادلش رو اینطوری میتونی با این سه تا ماکرو تعریف کنی ( تویه فایل app_config.h نگاه کنی، تعریف کردم ) :


                            #define _BV(pin) (1<<(pin))
                            #define bit_is_set(port,pin) (port & _BV(pin))
                            #define loop_until_bit_is_set(port, pin) while (!bit_is_set(port,pin));

                            در مورد اون 15000 فعلا تا Trace کد این اخوی واسیلی، نظری ندارم، ولی مد ADC هم تفاوت چندانی نداره، در هر صورت شما باید منتظر اتمام تبدیل ADC بمونی تا مقادیر درست رو نمایش بدی....
                            مادامی که از شخصی یاد میشود، او و افکارش زنده اند ....

                            Sh_Nourbakhsh@Yahoo.com

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

                            دیدگاه


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

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

                              این برادر واسیلی خیلی خوب و کامل توضیح داده، همونطور که من هم اشاره داشتم، داره با متوسط گیری تریگ خودکار انجام میده، جالب اینکه در توضیحاتش الگوریتم کلی کارش رو هم گفته .....

                              حالا شما هم میتونی همینطوری عمل کنی و یا با کیلد و یا ولوم، مقدار تریگ رو دستی به میکرو بدی ( مثل اسکوپ های قدیمی که یه ولوم برای این کار دارن )

                              الان دستم بنده! فردا کدها رو یه نگاهی میندازم ...........

                              و اما در مورد loop_until_bit_is_set ، این دستور نیست، یه ماکرو هستش که معادلش رو اینطوری میتونی با این سه تا ماکرو تعریف کنی ( تویه فایل app_config.h نگاه کنی، تعریف کردم ) :


                              #define _BV(pin) (1<<(pin))
                              #define bit_is_set(port,pin) (port & _BV(pin))
                              #define loop_until_bit_is_set(port, pin) while (!bit_is_set(port,pin));

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

                              در مورد پتانسیومتر (( ولوم)) دیگه نمیشه...چون pcb رو زدم و الان هم پروژه روی اون سوار شده لزا ملزم هستم با روش نرم افزاری کار کنم.
                              تریگر رو که به همین روش راه انداختم.... الان موندم چجوری آرایه 126 تایی رو بنویسم و مقادیر رو در اون قرار بدم . یعنی بجای اون دستورات Set و clear کردن پیکسلها در حلقه While که اون رو هم شما یادمون دادید باید با ارایه اینکار رو بکنم .

                              دیدگاه


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

                                یه ایده به ذهنم رسید...

                                شاید نشه از حرکت موج جلوگیری کرد اما میشه کیفیت نمایش موج رو افزایش داد....

                                ببینید.... برای نمایش موج از این دستورات استفاده کردیم دیگه...:
                                کد:
                                   {   
                                  ///// showing the wave 
                                  a2d=ADCH;
                                  inv = ((54 *a2d) /177); 
                                  for(i=1;i<6;i++){
                                  glcd_clrpixel(i,oldv[x]);
                                  } 
                                  glcd_clrpixel(x, oldv[x]);  //Clear previous set pixel
                                  glcd_setpixel(x, inv);    //Set current pixel
                                  oldv[x] = inv; 
                                  x++;
                                  if(x>=Xmax)    
                                    x = 1;
                                خب.... حالا بجای استفاده از ++X از X+=2 استفاده میکنیم... در عوض با استفاده از دستور glcd_line بین هر پیکسلی که نمایش داده میشه با پیکسل بعدی یک خط رسم میکنیم... یک خط خیلی کوچیک به عرض دو یا سه پیکسل.

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


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

                                اون استادی که من قراره این پروژه رو براش ببرم فرق کدویژن و پروتل رو نمیدونه...!!

                                پس بهتره زیاد خودمون رو خسته نکنیم...

                                لذا جناب شهرام خان ... به عنوان آخرین محبتی که میتونید در حق حقیر انجام بدید کمکی بفرمایید تا بتونم خطوط مورد نظر رو ترسیم کنم.

                                قالب دستور هم اینه:

                                void glcd_line(GLCDX_t x0, GLCDY_t y0, GLCDX_t x1, GLCDY_t y1)


                                Draws a line with the current foreground color, thickness and bit pattern.
                                The current pixel plot position will be updated to the line's ending point coordinates.


                                Parameters:


                                x0 specifies the line's starting point horizontal coordinate
                                y0 specifies the line's starting point vertical coordinate
                                x1 specifies the line's ending point horizontal coordinate
                                y1 specifies the line's ending point vertical coordinate.

                                اینهم اون pdf که عرض کردم:
                                http://ece.ut.ac.ir/circuitlab/20-Scope-2.pdf


                                باز هم از محبت شما ممنونم.

                                دیدگاه

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