اطلاعیه

Collapse
No announcement yet.

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

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

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

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

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

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

    _______________________________

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

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

    درود بیکران بر همه دوستان، مخصوصا حمید خان، رسیدن بخیر برادر، خوش گذشته که انشا الله ؟؟؟
    ( من رو ببخشید، دیروز حالم زیاد خوب نبود، امروز در خدمتم اخوی :bye )

    اولین اقدام برای انتخاب کانال و ایناها، دوکاناله کردن اسکوپ فعلی هستش که در مرحله بعد، انتخاب یکی از کانال ها و یا هر دو رو میشه اضافه کرد و در مرحله بعدش هم لیساژور و این چیزاست.....

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

    http://s1.picofile.com/file/7453230107/osciloscope_program_3.rar.html

    ( ضمنا، مقدار استک رو در کدویژن به 728 تغییر بدید! )
    مادامی که از شخصی یاد میشود، او و افکارش زنده اند ....

    Sh_Nourbakhsh@Yahoo.com

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

    دیدگاه


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

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

      درود بیکران بر همه دوستان، مخصوصا حمید خان، رسیدن بخیر برادر، خوش گذشته که انشا الله ؟؟؟
      ( من رو ببخشید، دیروز حالم زیاد خوب نبود، امروز در خدمتم اخوی :bye )

      اولین اقدام برای انتخاب کانال و ایناها، دوکاناله کردن اسکوپ فعلی هستش که در مرحله بعد، انتخاب یکی از کانال ها و یا هر دو رو میشه اضافه کرد و در مرحله بعدش هم لیساژور و این چیزاست.....

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

      http://s1.picofile.com/file/7453230107/osciloscope_program_3.rar.html

      ( ضمنا، مقدار استک رو در کدویژن به 728 تغییر بدید! )
      علیک سلام داش شهرام....شمال خیلی گرم بود... جای شما خالی...

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

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

      برنامه اش اینه که فرق زیادی هم با برنامه ای که شما قبلا محبت کردید نداره... یه جورایی همونه:
      کد:
      #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(3000);
      }	
      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");
      }

      مقدار استک رو هم تغییر دادم...

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


      دیدگاه


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

        با سلام،

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

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

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

        Sh_Nourbakhsh@Yahoo.com

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

        دیدگاه


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

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

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

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

          لطفا کد من رو بررسی کن و همینطور وظیفه هر کلید رو هم بگو تا شروع کنیم ..... :mrgreen:
          سلام

          آره ...درسته... :redface: :mrgreen:یکی از چیزهایی که من نتونستم اجراشون کنم همین نمایش " همزمان " هردو کانال هست. ولی برای نمایش کانالها بصورت جداگانه ...خوب خوشبختانه تونستم نمایششون بدم !! :icon_razz:

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

          کلید اول: انتخاب کانال یک

          کلید دوم : انتخاب کانال دو

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

          کلید چهارم : نمایش لیساژور بصورت toggle یعنی یه بار بزنیم لیساژور و بار دوم به حالت عادی برگرده.

          کلید پنجم : افزایش ولت دیویژن

          کلید ششم: کاهش ولت دیویژن

          کلید هفتم : افزایش تایم دیویژن

          کلید هشتم : کاهش تایم دیویژن.

          دیدگاه


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

            با سلام،

            درود بر برادر حمیدرضا خان، به این ورژن نگاهی بنداز، توصیه من اینه که این کد بعنوان پایه برای ادامه ماجرا و تکمیل مراحل بعدی باشه :

            http://s1.picofile.com/file/7454329779/osciloscope_program_4.rar.html

            کلید ها رو تقریبا همونطوری که مد نظر شما بود در نظر گرفتم :

            کلید یک : خاموش و روشن کردن کانال یک
            کلید دو : خاموش و روشن کردن کانال دو
            کلید سه : خاموش و روشن کردن مد لیساژور

            کلید چهار : افزایش شاخص Vdiv
            کلید پنج : کاهش شاخص Vdiv

            کلید شش : افزایش شاخص Tdiv
            کلید هفت : کاهش شاخص Tdiv

            کلید هشت : انتخاب یکی از کانالها برای سورس تریگر

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

            Sh_Nourbakhsh@Yahoo.com

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

            دیدگاه


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

              سلام آقا شهرام

              برنامه رو دیدم...خیلی جالب و قوی نوشته شده... پروتئوسش قشنگ بود...!!

              یه سوال...معنی این خط چیه...؟

              Ch1dFlag = Ch1dFlag ? 0 : 1;

              دیدگاه


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

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

                برنامه رو دیدم...خیلی جالب و قوی نوشته شده... پروتئوسش قشنگ بود...!!

                یه سوال...معنی این خط چیه...؟

                Ch1dFlag = Ch1dFlag ? 0 : 1;
                با سلام،

                مرسی برادر، از تعریفت متشکرم .... :nice:

                این خط معادلش اینه :

                if(Ch1dFlag)
                Ch1dFlag = 0;
                else
                Ch1dFlag = 1;

                پی نوشت : Sprintf رو هم در کدویژن بزار روی float .....
                مادامی که از شخصی یاد میشود، او و افکارش زنده اند ....

                Sh_Nourbakhsh@Yahoo.com

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

                دیدگاه


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

                  سلام جناب شهرام...

                  " کم پیدا " شدی برادر...!! نیستی...!!

                  پروژه رو بردم دانشگاه پیش استادم.... به گفته ایشون تا به این لحظه نمره ام از 17 نمره حدود 13 هست....

                  اشکالی که شما در مودر تریگر از پروژه گرفتید رو استادم هم گرفت...!!! لذا باید روی تریگر و لیساژور کار کنم... از طرفی استادم درخواست اضافه کردن تابعی برای add کردن دو سیگنال رو هم اعلام کرده ....برای ولت دیویژن و تایم دیویژن هم اعلام کرده باید دامنه سیگنال در مقادیر 2 و 4 و 1/2 و 1/4 ضرب شود تا با خود سیگنال در حالت عادی بشود 5حالت....همین پنج حالت برای حالت تایم دیویژن هم باید باشه.....

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

                  برای تابع لیساژور و نمایش اون بصورت toggle یه کانتر گذاشتم و مقدارش با هر بار زدن دکمه سوم یکی اضافه میشه.... در برنامه چک میشه که مقدار زده شده زوج هست یا فرد....اگر زوج هست که خب....نمایش موجها به همون صورت اولیه ادامه پیدا میکنه و اگر هم فرد هست نمایش موج قطع میشه و میره برای نمایش لیساژور...البته روتینی برای نمایش لیساژور ندارم ولی فکر میکنم چون دوتا بافر رو داریم تو همون حلقه های for بجای اینکه X پهنای صفحه نمایش باشه باید مقادیر یکی از کانالها باشه و y هم مقادیر کانال دیگر.

                  یه مشکل ساده دیگر در تابع showpar بود که میخوام وقتی رو مد لیساژور بریم زیر صفحه فقط بنویسه lissajous ولی ظاهرا این تابع تو حلقه اصلی برنامه است و در هنگامی که برنامه در مد لیساژور هست باعث overwrite شدن نوشته ها میشه....حداقل تو پروتئوس که اینگونه بود.

                  محبت کنید و برنامه رو یه نگاهی بندازید و ببینید چجوریه:


                  کد:
                  //-----------------------------------------------------------------------------
                  // Copyright:   HAMID REZA RABET
                  // Author:     HAMID REZA RABET
                  // Remarks:    
                  // known Problems: none
                  // Version:    1.0.0
                  // Description:  DIGITAL OSILLOSCOPE TEST..........
                  //								 
                  //								 
                  //-----------------------------------------------------------------------------
                  
                  //	Include Headers
                  //*****************************************************************************
                  #include <mega32a.h>
                  #include <delay.h>
                  #include <stdio.h>
                  #include <glcd.h>
                  #include <font5x7.h>
                  
                  //--------------------------------------------------
                  //#include "OSCOP.h"
                  
                  
                  //	Constants and Varables
                  //*****************************************************************************
                  #define ADC_8BIT_TYPE		1					//1: ADC = 8bit , 0: ADC = 10bit
                  
                  #define OSC_CH1			0					//ADC0 for oscope. channel.1
                  #define OSC_CH2			1					//ADC1 for oscope. channel.2
                  
                  //----------------
                  #define Keys_PIN		PINB
                  
                  //--------------------------------------------------
                  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;
                  	
                  //----------------
                  unsigned char  				oldv1[Xmax];
                  unsigned char	  			  newv1[Xmax];
                  
                  unsigned char  				oldv2[Xmax];
                  unsigned char	  				newv2[Xmax];
                  
                  //----------------
                  unsigned char					TrigFlag = OSC_CH1;
                  
                  unsigned char				  Ch1dFlag = 1;
                  unsigned char					Ch2dFlag = 0;
                  
                  //----------------
                  unsigned char 					trigger = 0;
                  signed char  					offset = 0;
                  
                  //----------------
                  unsigned char				  VdivID = 6;
                  unsigned char					TdivID = 0;
                  unsigned char          lsj_counter=0;
                  
                  //Division factor
                  static flash float 				DIVfactor[5] = {0.25,0.5,1, 2, 4,};
                  
                  
                  //Temp Const.
                  char				Ctemp[48];
                  int					Itemp;
                  
                  
                  //	Functions Prototype
                  //*****************************************************************************
                  void Initialize(void);
                  
                  //----------------
                  void Splash(void);
                  
                  void DrawBorder(void);
                  void ShowPar(void);
                  void DrawAxis(void);
                  
                  //----------------
                  void ADC_init(void);
                  void ACH_select(unsigned char channel);
                  unsigned int ADC_read(void);
                  
                  //----------------
                  void BufferChannels(void);
                  void DrawChannels(void);
                  
                  //----------------
                  void KEYread (void);
                  void lissajous (void);
                  
                  //	<<< main function >>>
                  //*****************************************************************************
                  void main(void)
                  {
                  	Initialize();
                  	Splash();
                  	glcd_clear();
                  
                  	//----------------
                  	DrawBorder();
                  	DrawAxis();
                  
                  	//----------------
                  	ADC_init();
                  	ACH_select(0);
                  
                  	//-------- main loop!!!
                  	while(1)
                  	{ 
                    offset = ADCmax /2 -127;
                    trigger = 10;
                  
                  		ACH_select(TrigFlag);					//Select oscope. channel.x for trigger source
                  		while(ADC_read() !=trigger);		  //Trigger!
                  
                  		//---------------- 
                  		BufferChannels();
                  		DrawAxis();
                      if ((lsj_counter) %2 == 1)
                      lissajous();
                      else
                  		DrawChannels();
                  
                  		//----------------
                    KEYread();
                    //delay_ms(200);
                  	}//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(&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, 18, "WITH AVR MICOCTRL");
                  	glcd_outtextxyf(0, 36, "BY: HAMID REZA RABET" );
                  
                  	delay_ms(2000);
                  }	//Splash
                  
                  void DrawBorder(void)
                  {
                  	unsigned char	i;
                  	
                  	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);
                  	}
                  
                  	//----------------
                  	ShowPar();
                  }	//DrawBorder
                  
                  void DrawAxis(void)
                  {
                  	unsigned char	i;
                  
                  	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 ShowPar(void)
                  {
                  	if ((lsj_counter) %2 == 1) {
                    glcd_outtextxy(2,56,"lissajous");
                    }
                    else
                    sprintf(Ctemp, "Vd:%3.1f ", DIVfactor[VdivID]);
                  	glcd_outtextxy(1, 57, Ctemp);
                  
                  	sprintf(Ctemp, "Td:%3.1f ", DIVfactor[TdivID]);
                  	glcd_outtextxy(49, 57, Ctemp);
                  
                  	sprintf(Ctemp, "Tr:C%01d ", TrigFlag);
                  	glcd_outtextxy(97, 57, Ctemp);
                  }	//ShowPar
                  
                  
                  //----------------------------------------------------------
                  void BufferChannels(void)
                  {
                  	unsigned char  	inv1;
                  	unsigned char  	inv2;
                  
                  	unsigned char  	x;
                  
                  	//------------			Copy old buffer to new buffer - OSC_CH1
                  	for(x=Xmin; x<Xmax; x++)
                  	{
                  		oldv1[x] = newv1[x];			//OSC_CH1
                  		oldv2[x] = newv2[x];			//OSC_CH2
                  	}//for x
                  
                  	//------------			Read and Tune inV1 and inV2 to display Y range and save to new buffer
                  	for(x=Xmin; x<Xmax; x++)
                  	{
                  		ACH_select(OSC_CH1);			inv1 = ADC_read();						//Read OSC_CH1
                  		ACH_select(OSC_CH2);			inv2 = ADC_read();						//Read OSC_CH2
                  					
                  		newv1[x] = Ymax -(inv1 *Ymax /ADCmax) +offset;					//Tune OSC_CH1
                  		newv2[x] = Ymax -(inv2 *Ymax /ADCmax) +offset;					//Tune OSC_CH2
                  		
                  		if(newv1[x]<Ymin) 				newv1[x] = Ymin;
                  		if(newv2[x]<Ymin) 				newv2[x] = Ymin;
                  	}//for x
                  }	//BufferChannels
                  
                  void DrawChannels(void)
                  {
                  	//static unsigned char				Ch1cFlag = 1;
                  	//static unsigned char				Ch2cFlag = 1;
                  
                  	unsigned char  		x;
                  	unsigned char  		y;
                  
                  	//------------			Draw CH1 and CH2 waves
                  	for(x=Xmin+1; x<Xmax; x++)
                  	{
                  		//------------			Clear previous set pixel - OSC_CH1
                  		//if(Ch1cFlag)
                  		{
                  			if(oldv1[x]>oldv1[x-1]){			
                        for(y=oldv1[x-1]; y<=oldv1[x]; 	 y++)				
                        glcd_clrpixel(x, y);		
                        }
                  			else									
                         {			
                         for(y=oldv1[x];y<=oldv1[x-1]; y++)				
                         glcd_clrpixel(x, y);		
                         }
                  
                  			//Ch1cFlag = 0;
                  		}
                  			
                  		//------------			Set current pixel - OSC_CH1
                  		if(Ch1dFlag)
                  		{
                  			if(newv1[x]>newv1[x-1])
                        {			
                        for(y=newv1[x-1]; y<=newv1[x]; 	 y++)				
                        glcd_setpixel(x, y);		
                        }
                  			else									 
                        {			
                        for(y=newv1[x];  y<=newv1[x-1]; y++)				
                        glcd_setpixel(x, y);		
                        }
                  			
                  			//Ch1cFlag = 1;
                  		}//if Ch1dFlag
                  
                  		//-------------------------------------------------------
                  		//------------			Clear previous set pixel - OSC_CH2
                  		//if(Ch2cFlag)
                  		{
                  			if(oldv2[x]>oldv2[x-1]){			
                        for(y=oldv2[x-1]; y<=oldv2[x]; 	 y++)				
                        glcd_clrpixel(x, y);		
                        }
                  			else									 
                        {			
                        for(y=oldv2[x];	 y<=oldv2[x-1]; y++)				
                        glcd_clrpixel(x, y);		
                        }
                  
                  			//Ch2cFlag = 0;
                  		}
                  	
                  		//------------			Set current pixel - OSC_CH2
                  		if(Ch2dFlag)
                  		{
                  			if(newv2[x]>newv2[x-1]){			
                        for(y=newv2[x-1]; y<=newv2[x]; 	 y++)				
                        glcd_setpixel(x, y);		
                        }
                  			else									
                         {			
                         for(y=newv2[x];  y<=newv2[x-1]; y++)				
                         glcd_setpixel(x, y);		
                         }
                  
                  			//Ch2cFlag = 1;
                  		}//if Ch2dFlag
                  	}//for x
                  }	//DrawChannels
                  
                  
                  //----------------------------------------------------------
                  void KEYread(void)
                  {
                  	if(Keys_PIN ==0xFF)  			
                    return;
                  	
                  	//----------------
                  	delay_ms(20);
                  
                  	switch(Keys_PIN)
                  	{
                  		case(0b11111110):   // Key 1			- Channel.1 ON/OFF
                  			Ch1dFlag = Ch1dFlag ? 0 : 1;
                  			break;
                  
                  		case(0b11111101):   // Key 2			- Channel.2 ON/OFF
                  			Ch2dFlag = Ch2dFlag ? 0 : 1;
                  			break;
                  
                  		case(0b11111011):   // Key 3			- Lissajous ON/OFF 
                      lsj_counter ++;
                        lissajous();
                  			break;
                  
                  		case(0b11110111):   // Key 4			- Volt division increment
                  			if(VdivID<4)			VdivID++;
                  			break;
                  
                  		case(0b11101111):   // Key 5			- Volt division decrement
                  			if(VdivID>0)			VdivID--;
                  			break;
                  
                  		case(0b11011111):   // Key 6			- Time division increment
                  			if(TdivID<4)			TdivID++;
                  			break;
                  
                  		case(0b10111111):   // Key 7			- Time division decrement
                  			if(TdivID>0)			TdivID--;
                  			break;
                  
                  		case(0b01111111):   // Key 8			- Select channel.x for trigger source
                  			TrigFlag = TrigFlag ? OSC_CH1 : OSC_CH2;
                  			break;
                  	}//switch
                  
                  	ShowPar();
                  }	//KEYread
                  void lissajous (void)
                  {
                  glcd_clear();
                  DrawBorder();
                  DrawAxis();
                  }

                  دیدگاه


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

                    سلام جناب شهرام

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

                    برای لیساژرو دوتا آرایه جدید به اسم newv3 و oldv3 گرفتم .... newv3 برابر باقیمانده تقسیم newv1 بر newv2 است.

                    برنامه هم اینه:
                    کد:
                    #include <mega32a.h>
                    #include <delay.h>
                    #include <stdio.h>
                    #include <glcd.h>
                    #include <font5x7.h>
                    
                    //--------------------------------------------------
                    //#include "OSCOP.h"
                    
                    
                    //  Constants and Varables
                    //*****************************************************************************
                    #define ADC_8BIT_TYPE    1          //1: ADC = 8bit , 0: ADC = 10bit
                    
                    #define OSC_CH1      0          //ADC0 for oscope. channel.1
                    #define OSC_CH2      1          //ADC1 for oscope. channel.2
                    
                    //----------------
                    #define Keys_PIN    PINB
                    
                    //--------------------------------------------------
                    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;
                      
                    //----------------
                    unsigned char          oldv1[Xmax];
                    unsigned char            newv1[Xmax];
                    
                    unsigned char          oldv2[Xmax];
                    unsigned char            newv2[Xmax];
                    
                    unsigned char          oldv3[Xmax]; /// for lissajous
                    unsigned char            newv3[Xmax];
                    
                    //----------------
                    unsigned char          TrigFlag = OSC_CH1;
                    
                    unsigned char          Ch1dFlag = 1;
                    unsigned char          Ch2dFlag = 0;
                    
                    //----------------
                    unsigned char           trigger = 0;
                    signed char            offset = 0;
                    
                    //----------------
                    unsigned char          VdivID = 6;
                    unsigned char          TdivID = 0;
                    unsigned char          lsj_counter=0;
                    
                    //Division factor
                    static flash float         DIVfactor[5] = {0.25,0.5,1, 2, 4,};
                    
                    
                    //Temp Const.
                    char        Ctemp[48];
                    int          Itemp;
                    
                    
                    //  Functions Prototype
                    //*****************************************************************************
                    void Initialize(void);
                    
                    //----------------
                    void Splash(void);
                    
                    void DrawBorder(void);
                    void ShowPar(void);
                    void DrawAxis(void);
                    
                    //----------------
                    void ADC_init(void);
                    void ACH_select(unsigned char channel);
                    unsigned int ADC_read(void);
                    
                    //----------------
                    void BufferChannels(void);
                    void DrawChannels(void);
                    
                    //----------------
                    void KEYreader (void);
                    void lissajous (void);
                    
                    //  <<< main function >>>
                    //*****************************************************************************
                    void main(void)
                    {
                      Initialize();
                      Splash();
                      glcd_clear();
                      ADC_init();
                      ACH_select(0);
                    
                      //-------- main loop!!!
                      while(1)
                      { 
                      offset = ADCmax /2 -127;
                      trigger = 10;
                    
                        ACH_select(TrigFlag);          //Select oscope. channel.x for trigger source
                        while(ADC_read() !=trigger);      //Trigger!
                        KEYreader();
                        //----------------  
                        if((lsj_counter %2) == 1)
                        lissajous();
                        else{
                        glcd_clear();
                        BufferChannels();
                        DrawAxis();
                        DrawChannels();
                        ShowPar();
                        
                        }
                      //delay_ms(200);
                      }//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(&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, 18, "WITH AVR MICOCTRL");
                      glcd_outtextxyf(0, 36, "BY: HAMID REZA RABET" );
                    
                      delay_ms(2000);
                    }  //Splash
                    
                    void DrawBorder(void)
                    {
                      unsigned char  i;
                      
                      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);
                      }
                    }  //DrawBorder
                    
                    void DrawAxis(void)
                    {
                      unsigned char  i;
                    
                      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 ShowPar(void)
                    {
                      if ((lsj_counter) %2 == 1) {
                      glcd_outtextxy(2,56,"lissajous");
                      }
                      else
                      sprintf(Ctemp, "Vd:%3.1f ", DIVfactor[VdivID]);
                      glcd_outtextxy(1, 57, Ctemp);
                    
                      sprintf(Ctemp, "Td:%3.1f ", DIVfactor[TdivID]);
                      glcd_outtextxy(49, 57, Ctemp);
                    
                      sprintf(Ctemp, "Tr:C%01d ", TrigFlag);
                      glcd_outtextxy(97, 57, Ctemp);
                    }  //ShowPar
                    
                    
                    //----------------------------------------------------------
                    void BufferChannels(void)
                    {
                      unsigned char    inv1;
                      unsigned char    inv2;
                    
                      unsigned char    x;
                    
                      //------------      Copy old buffer to new buffer - OSC_CH1
                      for(x=Xmin; x<Xmax; x++)
                      {
                        oldv1[x] = newv1[x];      //OSC_CH1
                        oldv2[x] = newv2[x];      //OSC_CH2
                      }//for x
                    
                      //------------      Read and Tune inV1 and inV2 to display Y range and save to new buffer
                      for(x=Xmin; x<Xmax; x++)
                      {
                        ACH_select(OSC_CH1);      inv1 = ADC_read();            //Read OSC_CH1
                        ACH_select(OSC_CH2);      inv2 = ADC_read();            //Read OSC_CH2
                              
                        newv1[x] = Ymax -(inv1 *Ymax /ADCmax) +offset;          //Tune OSC_CH1
                        newv2[x] = Ymax -(inv2 *Ymax /ADCmax) +offset;          //Tune OSC_CH2
                        
                        if(newv1[x]<Ymin)         newv1[x] = Ymin;
                        if(newv2[x]<Ymin)         newv2[x] = Ymin;
                      }//for x   
                      for(x=Xmin; x<Xmax; x++)
                      { 
                      if(newv2[x]==0)
                      break;
                      else
                      newv3[x]= newv1[x]% newv2[x];
                      }// second for X 
                      for(x=Xmin; x<Xmax; x++){ 
                      oldv3[x]=newv3[x];
                      }
                      
                    }  //BufferChannels
                    
                    void DrawChannels(void)
                    {
                      //static unsigned char        Ch1cFlag = 1;
                      //static unsigned char        Ch2cFlag = 1;
                    
                      unsigned char      x;
                      unsigned char      y; 
                    
                      //------------      Draw CH1 and CH2 waves
                      for(x=Xmin+1; x<Xmax; x++)
                      {
                        //------------      Clear previous set pixel - OSC_CH1
                        //if(Ch1cFlag)
                        {
                          if(oldv1[x]>oldv1[x-1]){      
                          for(y=oldv1[x-1]; y<=oldv1[x];   y++)        
                          glcd_clrpixel(x, y);    
                          }
                          else                  
                           {      
                           for(y=oldv1[x];y<=oldv1[x-1]; y++)        
                           glcd_clrpixel(x, y);    
                           }
                    
                          //Ch1cFlag = 0;
                        }
                          
                        //------------      Set current pixel - OSC_CH1
                        if(Ch1dFlag)
                        {
                          if(newv1[x]>newv1[x-1])
                          {      
                          for(y=newv1[x-1]; y<=newv1[x];   y++)        
                          glcd_setpixel(x, y);    
                          }
                          else                   
                          {      
                          for(y=newv1[x];  y<=newv1[x-1]; y++)        
                          glcd_setpixel(x, y);    
                          }
                          
                          //Ch1cFlag = 1;
                        }//if Ch1dFlag
                    
                        //-------------------------------------------------------
                        //------------      Clear previous set pixel - OSC_CH2
                        //if(Ch2cFlag)
                        {
                          if(oldv2[x]>oldv2[x-1]){      
                          for(y=oldv2[x-1]; y<=oldv2[x];   y++)        
                          glcd_clrpixel(x, y);    
                          }
                          else                   
                          {      
                          for(y=oldv2[x];   y<=oldv2[x-1]; y++)        
                          glcd_clrpixel(x, y);    
                          }
                    
                          //Ch2cFlag = 0;
                        }
                      
                        //------------      Set current pixel - OSC_CH2
                        if(Ch2dFlag)
                        {
                          if(newv2[x]>newv2[x-1]){      
                          for(y=newv2[x-1]; y<=newv2[x]; y++)        
                          glcd_setpixel(x, y);    
                          }
                          else                  
                           {      
                           for(y=newv2[x];  y<=newv2[x-1]; y++)        
                           glcd_setpixel(x, y);    
                           }
                    
                          //Ch2cFlag = 1;
                        }//if Ch2dFlag
                      }//for x
                    }  //DrawChannels
                    
                    
                    //----------------------------------------------------------
                    void KEYreader(void)
                    {
                      if(Keys_PIN ==0xFF)        
                      return;
                      
                      //----------------
                      delay_ms(20);
                    
                      switch(Keys_PIN)
                      {
                        case(0b11111110):   // Key 1      - Channel.1 ON/OFF
                          Ch1dFlag = Ch1dFlag ? 0 : 1;
                          break;
                    
                        case(0b11111101):   // Key 2      - Channel.2 ON/OFF
                          Ch2dFlag = Ch2dFlag ? 0 : 1;
                          break;
                    
                        case(0b11111011):   // Key 3      - Lissajous ON/OFF 
                        lsj_counter ++;
                          lissajous();
                          break;
                    
                        case(0b11110111):   // Key 4      - Volt division increment
                          if(VdivID<4)     
                           VdivID++;
                          break;
                    
                        case(0b11101111):   // Key 5      - Volt division decrement
                          if(VdivID>0)      
                           VdivID--;
                          break;
                    
                        case(0b11011111):   // Key 6      - Time division increment
                          if(TdivID<4)      
                           TdivID++;
                          break;
                    
                        case(0b10111111):   // Key 7      - Time division decrement
                          if(TdivID>0)      
                           TdivID--;
                          break;
                    
                        case(0b01111111):   // Key 8      - Select channel.x for trigger source
                          TrigFlag = TrigFlag ? OSC_CH1 : OSC_CH2;
                          break;
                      }//switch
                    
                      ShowPar();
                    }  //KEYread
                    void lissajous (void)
                    { 
                      unsigned char   x;
                      unsigned char   y; 
                      glcd_clear();
                      DrawBorder();
                      DrawAxis();
                      
                      for(x=Xmin+1;x<Xmax;x++)
                      if(oldv3[x]>oldv3[x-1]){
                      for(y=oldv3[x-1];y<=oldv3[x];y++)
                      glcd_clrpixel(x,y);
                      }
                      
                      else{
                      for(y=oldv3[x];y<=oldv3[x-1];y++)
                      glcd_clrpixel(x,y);
                      } //end else
                      /////////////////
                      if(Ch2dFlag )
                      {
                      if(newv3[x]>newv3[x-1])
                      {
                      for(y=newv3[x-1];y<=newv3[x];y++)
                      glcd_setpixel(x,y);
                      }
                      /////////////////
                      else
                      for(y=newv3[x];y<=newv3[x-1];y++)
                      glcd_setpixel(x,y);
                      }//end if 
                      glcd_outtextxy(4,56,"lissajous");  
                    }

                    دیدگاه


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

                      با سلام،

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

                      یه تغییرات اساسی تویه برنامه اسکوپ دادم و لیساژور رو هم بهش اضافه کردم، هنوز باید بهینه بشه، قسمت های تیون کردن موج برای صفحه نمایش خیلی کار داره و تریگ اتوماتیک رو هم که هنوز شما ندادی اخوی! :mrgreen:

                      فعلا این رو یه نگاهی بهش بنداز، نظرت رو بده تا اگر خدا بخواد، ادامه بدیم :

                      http://s3.picofile.com/file/7470217846/osciloscope_program_5.rar.html

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

                      Sh_Nourbakhsh@Yahoo.com

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

                      دیدگاه


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

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

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

                        یه تغییرات اساسی تویه برنامه اسکوپ دادم و لیساژور رو هم بهش اضافه کردم، هنوز باید بهینه بشه، قسمت های تیون کردن موج برای صفحه نمایش خیلی کار داره و تریگ اتوماتیک رو هم که هنوز شما ندادی اخوی! :mrgreen:

                        فعلا این رو یه نگاهی بهش بنداز، نظرت رو بده تا اگر خدا بخواد، ادامه بدیم :

                        http://s3.picofile.com/file/7470217846/osciloscope_program_5.rar.html

                        به به به....داش شهرام گل...!! دشمنت کسالت داشته باشه ایشالله...!!

                        ما کی هستیم که شما شرمنده ی ما بشی آخه...؟؟؟؟ :biggrin:

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

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



                        خوشحال شدم برگشتی...

                        دیدگاه


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

                          درود بر شهرام گرامی

                          برنامه رو دانلود و RUN کردم ....در پروتئوس مشکلی نداشت. ولی بعد از پروگرام شدن میکرو هنگ میکرد که جسارتا فکر کردم باید حلقه ای که داخل while(1 هست یه خورده جابجا بشه لذا اون حلقه رو با دستور do...while دستکاری کردم و ردیف شد

                          یعنی اینجوری :
                          کد:
                          	while(1)
                          	{ 
                            offset = ADCmax /2 -127;
                            trigger = 10;
                          
                          		ACH_select(TrigFlag);
                              do{								//Select oscope. channel.x for trigger source
                          		
                          
                          		//----------------
                          		BufferChannels();
                          
                          		if(LSJdFlag)				
                              	DrawLissajous();
                          		else									
                              DrawChannels();
                          
                          		DrawAxis();
                          
                          		//----------------
                            KEYreads();
                            //delay_ms(200);
                          	}//while 
                            while(ADC_read() !=trigger);	
                            }

                          تنها تغییری که تو برنامه دادم همین بود....کلیت برنامه هم اینه:

                          کد:
                          #include "OSCOP.h"
                          //	Constants and Varables
                          //*****************************************************************************
                          unsigned char  			oldv1[Xmax];
                          unsigned char	  			newv1[Xmax];
                          
                          unsigned char  			oldv2[Xmax];
                          unsigned char	  			newv2[Xmax];
                          
                          //----------------
                          unsigned char	  		TrigFlag = OSC_CH1;
                          
                          unsigned char				Ch1dFlag = 1;
                          unsigned char				Ch2dFlag = 0;
                          
                          unsigned char				Ch1cFlag = 0;
                          unsigned char				Ch2cFlag = 0;
                          
                          unsigned char				LSJdFlag = 0;
                          
                          //----------------
                          unsigned char 				trigger = 0;
                          signed char  				offset = 0;
                          
                          //----------------
                          unsigned char  			VdivID = 6;
                          unsigned char				TdivID = 0;
                          
                          
                          //Temp Const.
                          char						Ctemp[48];
                          int							Itemp;
                          
                          
                          //	Functions Prototype
                          //*****************************************************************************
                          void Initialize(void);
                          
                          //----------------
                          void Splash(void);
                          
                          void DrawBorder(void);
                          void ShowPar(void);
                          void DrawAxis(void);
                          
                          //----------------
                          void ADC_init(void);
                          void ACH_select(unsigned char channel);
                          unsigned int ADC_read(void);
                          
                          //----------------
                          void BufferChannels(void);
                          
                          void DrawChannels(void);
                          void DrawLissajous(void);
                          
                          //----------------
                          void KEYreads (void);
                          
                          
                          //	<<< main function >>>
                          //*****************************************************************************
                          void main(void)
                          {
                          	Initialize();
                          
                          	Splash();
                          	glcd_clear();
                          	delay_ms(500);
                          
                          	//----------------
                          	DrawBorder();
                          	DrawAxis();
                          
                          	//----------------
                          	ADC_init();
                          	ACH_select(0);
                          
                          	//-------- main loop!!!
                          	while(1)
                          	{ 
                            offset = ADCmax /2 -127;
                            trigger = 10;
                          
                          		ACH_select(TrigFlag);
                              do{								//Select oscope. channel.x for trigger source
                          		
                          
                          		//----------------
                          		BufferChannels();
                          
                          		if(LSJdFlag)				
                              	DrawLissajous();
                          		else									
                              DrawChannels();
                          
                          		DrawAxis();
                          
                          		//----------------
                            KEYreads();
                            //delay_ms(200);
                          	}//while 
                            while(ADC_read() !=trigger);	
                            }					//Trigger!
                          }	//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(&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)
                          {
                          	unsigned char xy;
                          	
                          	glcd_outtextxyf(4, 5, "Digital Oscilloscope");
                          	glcd_outtextxyf(4, 20, "With AVR Micro.");
                          	glcd_outtextxyf(4, 50, "By: Hamid Reza Rabet" );
                          
                          	delay_ms(2000);
                          
                          	glcd_setfillf(FPwhite, 0);
                          	for(xy=30; xy>0; xy-=2)
                          	{
                          		glcd_bar(xy, xy, DISPLAY_WIDTH-xy, DISPLAY_HEIGHT-xy);
                          		glcd_rectangle(xy, xy, DISPLAY_WIDTH-xy, DISPLAY_HEIGHT-xy);
                          	}
                          }	//Splash
                          
                          void DrawBorder(void)
                          {
                          	unsigned char	i;
                          	
                          	for(i=0; i<=Oscope_Width; i+=2)
                          	{
                          		glcd_setpixel(i, Oscope_Height);
                          		glcd_setpixel(i, 0);
                          	}
                          
                          	//----------------
                          	for(i=0; i<=Oscope_Height; i+=2)
                          	{
                          		glcd_setpixel(0, i);
                          		glcd_setpixel(Oscope_Width, i);
                          	}
                          
                          	//----------------
                          	ShowPar();
                          }	//DrawBorder
                          
                          void DrawAxis(void)
                          {
                          	glcd_setlinestyle(1, 0xFF);
                          
                          	//----------------
                          	// XY lines
                          	glcd_line(Xmin, Oscope_Height/2, Xmax, Oscope_Height/2);
                          	glcd_line(Oscope_Width/2, Ymin, Oscope_Width/2, Ymax);
                          	
                          	// Y Guides
                          	glcd_line(Oscope_Width/2 -3, Oscope_Height/2 -13, Oscope_Width/2 +3, Oscope_Height/2 -13);
                          	glcd_line(Oscope_Width/2 -3, Oscope_Height/2 +13, Oscope_Width/2 +3, Oscope_Height/2 +13);
                          
                          	// X Guides
                          	glcd_line(Oscope_Width/2 -23, Oscope_Height/2 -3, Oscope_Width/2 -23, Oscope_Height/2 +3);	
                          	glcd_line(Oscope_Width/2 +23, Oscope_Height/2 -3, Oscope_Width/2 +23, Oscope_Height/2 +3);
                          }	//DrawAxis
                          
                          void ShowPar(void)
                          {
                          	sprintf(Ctemp, "Vd:%3.1f ", DIVfactor[VdivID]);
                          	glcd_outtextxy(1, DISPLAY_HEIGHT-7, Ctemp);
                          
                          	sprintf(Ctemp, "Td:%3.1f ", DIVfactor[TdivID]);
                          	glcd_outtextxy(49, DISPLAY_HEIGHT-7, Ctemp);
                          
                          	sprintf(Ctemp, "Tr:C%01d ", TrigFlag);
                          	glcd_outtextxy(97, DISPLAY_HEIGHT-7, Ctemp);
                          }	//ShowPar
                          
                          
                          //----------------------------------------------------------
                          void BufferChannels(void)
                          {
                          	unsigned char  	x;
                          
                          	//------------			Copy old buffer to new buffer - OSC_CH1
                          	for(x=Xmin; x<Xmax; x++)
                          	{
                          		oldv1[x] = newv1[x];			//OSC_CH1
                          		oldv2[x] = newv2[x];			//OSC_CH2
                          	}//for x
                          
                          	//------------			Read and Tune inV1 and inV2 to display Y range and save to new buffer
                          	for(x=Xmin; x<Xmax; x++)
                          	{
                          		ACH_select(OSC_CH1);			newv1[x] = ADC_read();				//Read OSC_CH1
                          		ACH_select(OSC_CH2);			newv2[x] = ADC_read();				//Read OSC_CH2
                          	}//for x
                          }	//BufferChannels
                          
                          void DrawChannels(void)
                          {
                          	unsigned char  x;
                          
                          	//------------			Tune input values to display dimensions - OSC_CH1 &OSC_CH2
                          	for(x=Xmin; x<Xmax; x++)
                          	{
                          		newv1[x] = Ymax -(newv1[x] *Ymax /ADCmax) +offset;				//Tune OSC_CH1
                          		newv2[x] = Ymax -(newv2[x] *Ymax /ADCmax) +offset;				//Tune OSC_CH2
                          		
                          		if(newv1[x]<Ymin) 				newv1[x] = Ymin;
                          		if(newv2[x]<Ymin) 				newv2[x] = Ymin;
                          
                          		if(newv1[x]>Ymax) 				newv1[x] = Ymax;
                          		if(newv2[x]>Ymax) 				newv2[x] = Ymax;
                          	}//for x
                          
                          	//------------			Draw CH1 and CH2 waves
                          	for(x=Xmin+1; x<Xmax; x++)
                          	{
                          		//------------			Set/Clear pixels - OSC_CH1
                          		if(Ch1cFlag)				{glcd_clrline(x, oldv1[x-1]-10, x, oldv1[x]-10);}			//Clear previous set pixel
                          		if(Ch1dFlag)				{glcd_setline(x, newv1[x-1]-10, x, newv1[x]-10);}			//Set current pixel
                          
                          		//------------			Set/Clear pixels - OSC_CH2
                          		if(Ch2cFlag)				{glcd_clrline(x, oldv2[x-1]-10, x, oldv2[x]-10);}			//Clear previous set pixel
                          		if(Ch2dFlag)				{glcd_setline(x, newv2[x-1]-10, x, newv2[x]-10);}			//Set current pixel
                          	}//for x
                          
                          	//----------------------------------------------------------
                          	Ch1cFlag = Ch1dFlag ? 1 : 0;
                          	Ch2cFlag = Ch2dFlag ? 1 : 0;
                          }	//DrawChannels
                          
                          void DrawLissajous(void)
                          {
                          	const signed char						Xofset = 5;
                          	const signed char						Yofset = 5;
                          	
                          	unsigned char  						i;
                          
                          	//------------			Tune input values to display dimensions
                          	for(i=Xmin; i<Xmax; i++)
                          	{
                          		newv1[i] = (newv1[i] *Xmax /ADCmax) +Xofset;							//Tune X
                          		newv2[i] = (newv2[i] *Ymax /ADCmax) +Yofset;							//Tune Y
                          
                          		if(newv1[i]<Xmin) 				newv1[i] = Xmin;
                          		if(newv2[i]<Ymin) 				newv2[i] = Ymin;
                          
                          		if(newv1[i]>Xmax) 				newv1[i] = Xmax;
                          		if(newv2[i]>Ymax) 				newv2[i] = Ymax;
                          	}//for i
                          
                          	//------------			Draw Lissajous wave
                          	for(i=Xmin+1; i<Xmax; i++)
                          	{
                          		//------------			Clear previous set pixel - LSJ
                          		glcd_clrline(oldv1[i-1], oldv2[i-1], oldv1[i], oldv2[i]);
                          	
                          		//------------			Set current pixel - LSJ
                          		glcd_setline(newv1[i-1], newv2[i-1], newv1[i], newv2[i]);
                          	}//for i
                          }	//DrawLissajous
                          
                          
                          //----------------------------------------------------------
                          void KEYreads(void)
                          {
                          	if(Keys_PIN ==0xFF)  			
                            return;
                          	
                          	//----------------
                          	delay_ms(100);
                          
                          	switch(Keys_PIN)
                          	{
                          		case(0b11111110):   // Key 1			- Channel.1 ON/OFF
                          			Ch1dFlag = Ch1dFlag ? 0 : 1;
                          			break;
                          
                          		case(0b11111101):   // Key 2			- Channel.2 ON/OFF
                          			Ch2dFlag = Ch2dFlag ? 0 : 1;
                          			break;
                          
                          		case(0b11111011):   // Key 3			- Lissajous ON/OFF
                          			if(LSJdFlag)
                          			{
                          				LSJdFlag = 0;
                          				
                          				Ch1dFlag = 1;
                          				Ch2dFlag = 0;
                          			}
                          			else
                          			{
                          				LSJdFlag = 1;
                          
                          				Ch1dFlag = 0;
                          				Ch2dFlag = 0;				
                          			}
                          
                          			//----------------
                          			glcd_clear();
                          			DrawBorder();
                          			break;
                          
                          		case(0b11110111):   // Key 4			- Volt division increment
                          			if(VdivID<11)			VdivID++;
                          			break;
                          
                          		case(0b11101111):   // Key 5			- Volt division decrement
                          			if(VdivID>0)			VdivID--;
                          			break;
                          
                          		case(0b11011111):   // Key 6			- Time division increment
                          			if(TdivID<11)			TdivID++;
                          			break;
                          
                          		case(0b10111111):   // Key 7			- Time division decrement
                          			if(TdivID>0)			TdivID--;
                          			break;
                          
                          		case(0b01111111):   // Key 8			- Select channel.x for trigger source
                          			TrigFlag = TrigFlag ? OSC_CH1 : OSC_CH2;
                          			break;
                          	}//switch
                          
                          	ShowPar();
                          }	//KEYread
                          مشکلی که وجود داره عدم نمایش یک منحنی تمیز و دقیق برای لیساژور هست....بدنه منحنی به سرعت (( در حد چند پیکسل )) بالا و پایین میره که فکر کنم علتش همون فقدان تریگر هست...

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

                          برای افزایش و کاهش voltdiv و timediv هم فکر کنم باید توحلقه های for توابع Draw channels دستکاری بشه...یعنی کاری کنیم که سیگنال نمایش داده شده در راستای افقی و عمودی یا کش داده بشه یا فشرده

                          بشه و چون دستورات setline و clrline دوتا پارامتر " سطر" و " ستون " دارند روی همین حساب اینگونه فکر کردم. البته همین حالتی که الان برای نمایش موجها وجود داره رو باید به عنوان حالتی که voltdiv وtimediv برابر 1و 1 هستند در نظر بگیریم و موج رو نسبت به این حالت فشرده یا کشیده تر بکنیم.




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

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

                          دیدگاه


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

                            بازهم سلام

                            برای افزایش و کاهش ولت دیویژن و تایم دیویژن به فکرم زد که مقادیری که با sprintf در پایین glcd نمایش میدیم رو در حلقه های for تابع drawchannels اعمال کنم ولی جالب نشد...!!

                            این کدش هست:
                            کد:
                            #include "OSCOP.h"
                            //	Constants and Varables
                            //*****************************************************************************
                            unsigned char  			oldv1[Xmax];
                            unsigned char	  			newv1[Xmax];
                            
                            unsigned char  			oldv2[Xmax];
                            unsigned char	  			newv2[Xmax];
                            
                            //----------------
                            unsigned char	  		TrigFlag = OSC_CH1;
                            
                            unsigned char				Ch1dFlag = 1;
                            unsigned char				Ch2dFlag = 0;
                            
                            unsigned char				Ch1cFlag = 0;
                            unsigned char				Ch2cFlag = 0;
                            
                            unsigned char				LSJdFlag = 0;
                            
                            //----------------
                            unsigned char 				trigger = 0;
                            signed char  				offset = 0;
                            
                            //----------------
                            unsigned char  			VdivID = 6;
                            unsigned char				TdivID = 0;
                            
                            //----------------
                            
                            unsigned char        m;
                            unsigned char        n;
                            //Temp Const.
                            char						Ctemp[48];
                            
                            
                            //	Functions Prototype
                            //*****************************************************************************
                            void Initialize(void);
                            
                            //----------------
                            void Splash(void);
                            
                            void DrawBorder(void);
                            void ShowPar(void);
                            void DrawAxis(void);
                            
                            //----------------
                            void ADC_init(void);
                            void ACH_select(unsigned char channel);
                            unsigned int ADC_read(void);
                            
                            //----------------
                            void BufferChannels(void);
                            
                            void DrawChannels(void);
                            void DrawLissajous(void);
                            
                            //----------------
                            void KEYreads (void);
                            
                            
                            //	<<< main function >>>
                            //*****************************************************************************
                            void main(void)
                            {
                            	Initialize();
                            
                            	Splash();
                            	glcd_clear();
                            	delay_ms(500);
                            
                            	//----------------
                            	DrawBorder();
                            	DrawAxis();
                            
                            	//----------------
                            	ADC_init();
                            	ACH_select(0);
                            
                            	//-------- main loop!!!
                            	while(1)
                            	{ 
                              offset = ADCmax /2 -127;
                              trigger = 10;
                            
                            		ACH_select(TrigFlag);
                                do{								//Select oscope. channel.x for trigger source
                            		
                            
                            		//----------------
                            		BufferChannels();
                            
                            		if(LSJdFlag)				
                                	DrawLissajous();
                            		else									
                                DrawChannels();
                            
                            		DrawAxis();
                            
                            		//----------------
                              KEYreads();
                              //delay_ms(200);
                            	}//while 
                              while(ADC_read() !=trigger);	
                              }					//Trigger!
                            }	//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(&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)
                            {
                            	unsigned char xy;
                            	
                            	glcd_outtextxyf(4, 5, "Digital Oscilloscope");
                            	glcd_outtextxyf(4, 20, "With AVR Micro.");
                            	glcd_outtextxyf(4, 50, "By: Hamid Reza Rabet" );
                            
                            	delay_ms(2000);
                            
                            	glcd_setfillf(FPwhite, 0);
                            	for(xy=30; xy>0; xy-=2)
                            	{
                            		glcd_bar(xy, xy, DISPLAY_WIDTH-xy, DISPLAY_HEIGHT-xy);
                            		glcd_rectangle(xy, xy, DISPLAY_WIDTH-xy, DISPLAY_HEIGHT-xy);
                            	}
                            }	//Splash
                            
                            void DrawBorder(void)
                            {
                            	unsigned char	i;
                            	
                            	for(i=0; i<=Oscope_Width; i+=2)
                            	{
                            		glcd_setpixel(i, Oscope_Height);
                            		glcd_setpixel(i, 0);
                            	}
                            
                            	//----------------
                            	for(i=0; i<=Oscope_Height; i+=2)
                            	{
                            		glcd_setpixel(0, i);
                            		glcd_setpixel(Oscope_Width, i);
                            	}
                            
                            	//----------------
                            	ShowPar();
                            }	//DrawBorder
                            
                            void DrawAxis(void)
                            {
                            	glcd_setlinestyle(1, 0xFF);
                            
                            	//----------------
                            	// XY lines
                            	glcd_line(Xmin, Oscope_Height/2, Xmax, Oscope_Height/2);
                            	glcd_line(Oscope_Width/2, Ymin, Oscope_Width/2, Ymax);
                            	
                            	// Y Guides
                            	glcd_line(Oscope_Width/2 -3, Oscope_Height/2 -13, Oscope_Width/2 +3, Oscope_Height/2 -13);
                            	glcd_line(Oscope_Width/2 -3, Oscope_Height/2 +13, Oscope_Width/2 +3, Oscope_Height/2 +13);
                            
                            	// X Guides
                            	glcd_line(Oscope_Width/2 -23, Oscope_Height/2 -3, Oscope_Width/2 -23, Oscope_Height/2 +3);	
                            	glcd_line(Oscope_Width/2 +23, Oscope_Height/2 -3, Oscope_Width/2 +23, Oscope_Height/2 +3);
                            }	//DrawAxis
                            
                            void ShowPar(void)
                            {
                            	sprintf(Ctemp, "Vd:%3.1f ", DIVfactor[VdivID]);
                            	glcd_outtextxy(1, DISPLAY_HEIGHT-7, Ctemp);
                            
                            	sprintf(Ctemp, "Td:%3.1f ", DIVfactor[TdivID]);
                            	glcd_outtextxy(49, DISPLAY_HEIGHT-7, Ctemp);
                            
                            	sprintf(Ctemp, "Tr:C%01d ", TrigFlag);
                            	glcd_outtextxy(97, DISPLAY_HEIGHT-7, Ctemp); 
                              
                              m = VdivID;
                              n = TdivID;
                            }	//ShowPar
                            
                            
                            //----------------------------------------------------------
                            void BufferChannels(void)
                            {
                            	unsigned char  	x;
                            
                            	//------------			Copy old buffer to new buffer - OSC_CH1
                            	for(x=Xmin; x<Xmax; x++)
                            	{
                            		oldv1[x] = newv1[x];			//OSC_CH1
                            		oldv2[x] = newv2[x];			//OSC_CH2
                            	}//for x
                            
                            	//------------			Read and Tune inV1 and inV2 to display Y range and save to new buffer
                            	for(x=Xmin; x<Xmax; x++)
                            	{
                            		ACH_select(OSC_CH1);			newv1[x] = ADC_read();				//Read OSC_CH1
                            		ACH_select(OSC_CH2);			newv2[x] = ADC_read();				//Read OSC_CH2
                            	}//for x
                            }	//BufferChannels
                            
                            void DrawChannels(void)
                            {
                            	unsigned char  x;
                            
                            	//------------			Tune input values to display dimensions - OSC_CH1 &OSC_CH2
                            	for(x=Xmin; x<Xmax; x++)
                            	{
                            		newv1[x] = Ymax -(newv1[x] *Ymax /ADCmax) +offset;				//Tune OSC_CH1
                            		newv2[x] = Ymax -(newv2[x] *Ymax /ADCmax) +offset;				//Tune OSC_CH2
                            		
                            		if(newv1[x]<Ymin) 				newv1[x] = Ymin;
                            		if(newv2[x]<Ymin) 				newv2[x] = Ymin;
                            
                            		if(newv1[x]>Ymax) 				newv1[x] = Ymax;
                            		if(newv2[x]>Ymax) 				newv2[x] = Ymax;
                            	}//for x
                            
                            	//------------			Draw CH1 and CH2 waves
                            	for(x=Xmin+1; x<Xmax; x++)
                            	{
                            		//------------			Set/Clear pixels - OSC_CH1
                            		if(Ch1cFlag)				{glcd_clrline(x/m, oldv1[x-1]-10, x/m, oldv1[x]-10);}			//Clear previous set pixel
                            		if(Ch1dFlag)				{glcd_setline(x/m, newv1[x-1]-10, x/m, newv1[x]-10);}			//Set current pixel
                            
                            		//------------			Set/Clear pixels - OSC_CH2
                            		if(Ch2cFlag)				{glcd_clrline(x/m, oldv2[x-1]-10, x/m, oldv2[x]-10);}			//Clear previous set pixel
                            		if(Ch2dFlag)				{glcd_setline(x/m, newv2[x-1]-10, x/m, newv2[x]-10);}			//Set current pixel
                            	}//for x
                            
                            	//----------------------------------------------------------
                            	Ch1cFlag = Ch1dFlag ? 1 : 0;
                            	Ch2cFlag = Ch2dFlag ? 1 : 0;
                            }	//DrawChannels
                            
                            void DrawLissajous(void)
                            {
                            	const signed char						Xofset = 5;
                            	const signed char						Yofset = 5;
                            	
                            	unsigned char  						i;
                            
                            	//------------			Tune input values to display dimensions
                            	for(i=Xmin; i<Xmax; i++)
                            	{
                            		newv1[i] = (newv1[i] *Xmax /ADCmax) +Xofset;							//Tune X
                            		newv2[i] = (newv2[i] *Ymax /ADCmax) +Yofset;							//Tune Y
                            
                            		if(newv1[i]<Xmin) 				newv1[i] = Xmin;
                            		if(newv2[i]<Ymin) 				newv2[i] = Ymin;
                            
                            		if(newv1[i]>Xmax) 				newv1[i] = Xmax;
                            		if(newv2[i]>Ymax) 				newv2[i] = Ymax;
                            	}//for i
                            
                            	//------------			Draw Lissajous wave
                            	for(i=Xmin+1; i<Xmax; i++)
                            	{
                            		//------------			Clear previous set pixel - LSJ
                            		glcd_clrline(oldv1[i-1], oldv2[i-1], oldv1[i], oldv2[i]);
                            	
                            		//------------			Set current pixel - LSJ
                            		glcd_setline(newv1[i-1], newv2[i-1], newv1[i], newv2[i]);
                            	}//for i
                            }	//DrawLissajous
                            
                            
                            //----------------------------------------------------------
                            void KEYreads(void)
                            {
                            	if(Keys_PIN ==0xFF)  			
                              return;
                            	
                            	//----------------
                            	delay_ms(100);
                            
                            	switch(Keys_PIN)
                            	{
                            		case(0b11111110):   // Key 1			- Channel.1 ON/OFF
                            			Ch1dFlag = Ch1dFlag ? 0 : 1;
                            			break;
                            
                            		case(0b11111101):   // Key 2			- Channel.2 ON/OFF
                            			Ch2dFlag = Ch2dFlag ? 0 : 1;
                            			break;
                            
                            		case(0b11111011):   // Key 3			- Lissajous ON/OFF
                            			if(LSJdFlag)
                            			{
                            				LSJdFlag = 0;
                            				
                            				Ch1dFlag = 1;
                            				Ch2dFlag = 0;
                            			}
                            			else
                            			{
                            				LSJdFlag = 1;
                            
                            				Ch1dFlag = 0;
                            				Ch2dFlag = 0;				
                            			}
                            
                            			//----------------
                            			glcd_clear();
                            			DrawBorder();
                            			break;
                            
                            		case(0b11110111):   // Key 4			- Volt division increment
                            			if(VdivID<11)			VdivID++;
                            			break;
                            
                            		case(0b11101111):   // Key 5			- Volt division decrement
                            			if(VdivID>0)			VdivID--;
                            			break;
                            
                            		case(0b11011111):   // Key 6			- Time division increment
                            			if(TdivID<11)			TdivID++;
                            			break;
                            
                            		case(0b10111111):   // Key 7			- Time division decrement
                            			if(TdivID>0)			TdivID--;
                            			break;
                            
                            		case(0b01111111):   // Key 8			- Select channel.x for trigger source
                            			TrigFlag = TrigFlag ? OSC_CH1 : OSC_CH2;
                            			break;
                            	}//switch
                            
                            	ShowPar();
                            }	//KEYread

                            دیدگاه


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

                              با سلام،

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

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

                              http://s3.picofile.com/file/7476778923/osciloscope_program_6.rar.html

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

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

                              Sh_Nourbakhsh@Yahoo.com

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

                              دیدگاه


                                #75
                                پاسخ : درخواست کمک برای اطلاعات در glcd

                                سلام اخوی . خوبی؟
                                دیگه این فایل اسکوپ رو ادامه نمیدی؟
                                اقا میشه محبت کنید فایل های کتابخانه ای که تو سورس سری osciloscope program 6 گذاشتی برام ایمیل کنی؟
                                soheilaezzi@yahoo.com
                                اگر هم برای فروش گذاشتی .. ازت میخرم فایلهارو ...
                                یه محبت کن بهم ایمیل بزن..
                                ممنون

                                دیدگاه

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