اطلاعیه

Collapse
No announcement yet.

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

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

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

    ممنون از شما جناب شهرام...مثل اینکه راه حل شما جواب داد :wow: :applause:

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

    البته نمایش موج یه خورده کند هست.... ویدیو رو ببینید متوجه میشید... تو این ویدیو مخصوصا با پتانسیومتری که برای پورت PORTA.0 هست بازی کردم تا شکل موج بالا و پایین بره.

    http://uploadfa.net/uploads/13404350351.rar

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

    یه چیز دیگه...

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

    کد:
    #include <mega32a.h>
    #include <delay.h>
    // Graphic LCD functions
    #include <glcd.h>
    // Font used for displaying text
    // on the graphic LCD
    #include <font5x7.h>
    int i,j,p,L1,L2,a2d;
    int vdc1=0,vdc2=0;
    unsigned char	Xmax = 127;
    unsigned char	x = 1;
    unsigned char 	inV;
    unsigned char 	oldV[Xmax];
    
    void selectch1(void);
    void selectch2(void);
    void selectbothchannels(void);
    void Lissajous (void);
    void incvoltdiv (void);
    void decvoltdiv (void);
    void inctimediv (void);
    void dectimediv (void);
    
    void main(void)
    {
    // Declare your local variables here
    // Graphic LCD initialization data
    GLCDINIT_t glcd_init_data;
    // Graphic LCD initialization
    // The KS0108 connections are specified in the
    // Project|Configure|C Compiler|Libraries|Graphic LCD menu:
    // DB0 - PORTC Bit 0
    // DB1 - PORTC Bit 1
    // DB2 - PORTC Bit 2
    // DB3 - PORTC Bit 3
    // DB4 - PORTC Bit 4
    // DB5 - PORTC Bit 5
    // DB6 - PORTC Bit 6
    // DB7 - PORTC Bit 7
    // E - PORTD Bit 0
    // RD /WR - PORTD Bit 1
    // RS - PORTD Bit 2
    // /RST - PORTD Bit 3
    // CS1 - PORTD Bit 4
    // CS2 - PORTD Bit 5
    // Specify the current font for displaying text
    glcd_init_data.font=font5x7;
    // No function is used for reading
    // image data from external memory
    glcd_init_data.readxmem=NULL;
    // No function is used for writing
    // image data to external memory
    glcd_init_data.writexmem=NULL;
    glcd_init(&glcd_init_data);
       glcd_outtextxyf(0,0,"DIGITAL OSILLOSCOPE");
       glcd_outtextxyf (0,22,"BY AVR MICOCTRL");
       glcd_outtextxyf (0,45,"HAMID REZA RABET" ); 
       delay_ms(3000);
       glcd_clear();
        ADCSRA=0xff;
       SFIOR=0x00;
       ADMUX=0x40;  
       glcd_putcharxy( 1, 56, 'v'); 
       glcd_putcharxy( 66, 56, 't');
       glcd_putcharxy( 7, 56, '='); 
       glcd_putcharxy( 72, 56, '='); 
       for(i=0;i<=54;i+=2){
       glcd_setpixel(0,i);
       glcd_setpixel(127,i);
       }
    
    while (1)
       { 
    	///// namayesh moj 
    	a2d = ADCW;
    	inV = ((-54 *a2d) /1024) +54;
    	glcd_clrpixel(x, oldV[x]);	//Clear previous set pixel
    	glcd_setpixel(x, inV);			//Set current pixel
    	oldV[x] = inV;
    	x++;
    	if(x>=Xmax)		
      	x = 1;
      /// nayaesh kadr ofoghi
        for(i=0;i<128;i+=2){
       glcd_setpixel(i,54);
       glcd_setpixel(i,0);
       }
       // namayesh mehvar haye ofoghi va amoodi
       glcd_putcharxy( 30, 24, '|');
       glcd_putcharxy( 92, 24, '|');
       glcd_putcharxy( 62, 7, '_');
       glcd_putcharxy( 62, 35, '_');
       glcd_line(0,27,128,27);
       glcd_line(64,0,64,64);
    
       //// kelid 1
       if(PINB.0 ==0){
       delay_ms(20);
       if(PINB.0 ==0)
       selectch1();
       } 
       /// kelid 2
       if(PINB.1 ==0){
       delay_ms(20);
       if(PINB.1 ==0)
       selectch2();
       } 
         /// kelid 3
       if(PINB.2 ==0){
       delay_ms(20);
       if(PINB.2 ==0)
       selectbothchannels();
       } 
       ///kelid 4 
       if(PINB.3 ==0){
       delay_ms(20);
       if(PINB.3 ==0)
       Lissajous();
       }
       //kelid 5
       if(PINB.4 ==0){
       delay_ms(20);
       if(PINB.4 ==0)
       incvoltdiv();
       vdc1++; 
       }
       if(vdc1>3)
       vdc1=3;
       // kelid 6
       if(PINB.5 ==0){
       delay_ms(20);
       if(PINB.5 ==0)
       decvoltdiv();
       vdc2++;
       }
       if(vdc2>3)
       vdc2=3;
       
       /// kelid 7
       if(PINB.6 ==0){
       delay_ms(20);
       if(PINB.6 ==0)
       inctimediv();
       } 
       /// kelid 8
       if(PINB.7 ==0){
       delay_ms(20);
       if(PINB.7 ==0)
       dectimediv();
       }    
    
    } 
    }
    #asm("sei");
    //// entekhab kanal 1
    void selectch1 (void)
    {
    glcd_outtextxyf (2,5,"SEL CH1");
    delay_ms(30);
    for(i=2;i<20;i++){
    for(j=2;j<60;j++)
    glcd_clrpixel(j,i);
    }
    ADMUX=0x00;
    }
    //// entekhab kanal 2
    void selectch2 (void)
    {
    glcd_outtextxyf (2,5,"SEL CH2");
    delay_ms(30);
    for(i=2;i<20;i++){
    for(j=2;j<60;j++)
    glcd_clrpixel(j,i);
    }
    ADMUX=0x01;
    }
    /// entekhab har do kanal
    void selectbothchannels (void)
    {
    glcd_outtextxyf (2,5,"SEL CH1&2");
    delay_ms(30);
    for(i=2;i<20;i++){
    for(j=2;j<62;j++)
    glcd_clrpixel(j,i);
    }
    ADMUX=0x00;
    delay_ms(10);
    ADMUX=0x01;
    }
    //// namayesh lissajous
    void Lissajous (void)
    {
    glcd_outtextxyf (2,5,"Lissajous");
    delay_ms(30);
    for(i=2;i<20;i++){
    for(j=2;j<62;j++)
    glcd_clrpixel(j,i);
    }
    if(ADMUX==0x00)
    L1=ADCW;
    else {
    if(ADMUX==0x01)
    L2=ADCW ;
    }
    }
    //// afzayesh volt division
    void incvoltdiv (void)
    {
    glcd_outtextxyf (2,5,"incvoltdiv");
    delay_ms(30);
    for(i=2;i<20;i++){
    for(j=2;j<62;j++)
    glcd_clrpixel(j,i);
    }
    if(vdc1==1){
    glcd_putcharxy( 12,55,'1');
    }
    if(vdc1==2){
    glcd_putcharxy( 12,55,'2');
    }
    if(vdc1==3){
    glcd_putcharxy (12,55,'5');
    }
    p=p*2;
    }
    //// kahesh volt division
    void decvoltdiv (void)
    {
    glcd_outtextxyf (2,5,"decvoltdiv");
    delay_ms(30);
    for(i=2;i<20;i++){
    for(j=2;j<62;j++)
    glcd_clrpixel(j,i);
    }
    if(vdc2==0 && vdc1==3)
    {
    glcd_putcharxy( 12,55,'2');
    }
    if(vdc2==0 && vdc1==2){
    glcd_putcharxy( 12,55,'1');
    }
    if(vdc2==1 && vdc1==3){
    glcd_putcharxy(12,55,1);
    }
    p=p/2;
    }
    //// afzayesh time division
    void inctimediv (void)
    {
    glcd_outtextxyf (2,5,"inctimediv");
    delay_ms(30);
    for(i=2;i<20;i++){
    for(j=2;j<62;j++)
    glcd_clrpixel(j,i);
    }
    }
    //// kahesh time division
    void dectimediv (void)
    {
    glcd_outtextxyf (2,5,"dectimediv");
    delay_ms(30);
    for(i=2;i<20;i++){
    for(j=2;j<62;j++)
    glcd_clrpixel(j,i);
    }
    }
    فقط یه مشکل به وجود اومد.... تو ویدیو اون هشت تا پوش باتن رو دیدید..؟ اونها برای فرمان دادن به میکرو و نوشتن یک اطلاعات از جمله انتخاب کانالهای ورودی و افزایش و کاهش ولت دیویژن و تایم دیویژن هستن.... تا قبل از این برنامه اونها درست کار میکردن و موج درست نشون داده نمیشد...

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

    دیدگاه


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

      با سلام،

      خوشحالم که مشکل حل شد

      نکته اول، بهتره که پس زمینه اسکوپ ( شامل محورها، نوشته های ثابت مثل V , T , F و غیره ) یه تصویر باشه که بندازیش رو صفحه
      نکته دوم، بهتر بود که از کیپد آنالوگ به جای کیپد دیجیتال استفاده میکردی
      نکته سوم، برای خوندن کلید ها، یه روتین بنویس که خیلی بهینه باشه و سرعت هم بالا باشه و در لوپ اصلی برنامه پورت B رو چک کن ( ناتش رو، یعنی : 0 == PINB~ ) و اگر مساوی صفر بود، اونوقت برو به روتین خوندن کلیدها

      در حال حاضر سرعت خیلی پائینه، حتما آفست ورودی ADC رو سخت افزاری ایجاد کن
      مادامی که از شخصی یاد میشود، او و افکارش زنده اند ....

      Sh_Nourbakhsh@Yahoo.com

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

      دیدگاه


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

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

        خوشحالم که مشکل حل شد

        نکته اول، بهتره که پس زمینه اسکوپ ( شامل محورها، نوشته های ثابت مثل V , T , F و غیره ) یه تصویر باشه که بندازیش رو صفحه
        خیلی دوست دارم اینکار روبکنم... با نرم افزار glcd tools یه تصویر 128*64 درست کردم که دقیقا مشابه تصویر پس زمینه است و خواستم با مقادیر خروجی این نرم افزار که یه ماتریس بزرگ پر از عدد های هگزادسیمال هست کار کنم... اما متاسفانه در کدویژن 2.05.3 مشکلی وجود داره که باعث میشه نتونم تصویر flash رو نمایش بدم...

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

        نکته دوم، بهتر بود که از کیپد آنالوگ به جای کیپد دیجیتال استفاده میکردی
        این قسمت رو ملتفت نمیشم....من هشت تا پوش باتن تعبیه کردم و براشون pull up گذاشتم...

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

        نکته سوم، برای خوندن کلید ها، یه روتین بنویس که خیلی بهینه باشه و سرعت هم بالا باشه و در لوپ اصلی برنامه پورت B رو چک کن ( ناتش رو، یعنی : 0 == PINB~ ) و اگر مساوی صفر بود، اونوقت برو به روتین خوندن کلیدها
        یعنی منظورتون اینه که در حلقه While چک کنم که چه موقع پورت B مقدار NOT اش صفر شده و اگر صفر شد یک تابعی رو فراخوانی کنه کلید ها رو بخونه و این تابعی که قراره کلید رو بخونه خارج حلقه while باشه دیگه ... درست فهمیدم..؟

        نوشته اصلی توسط aivhl
        در حال حاضر سرعت خیلی پائینه، حتما آفست ورودی ADC رو سخت افزاری ایجاد کن
        اگر منظورتون از آفست چیزی هست که با اعمال ولتاژ DC به موج باعث بالا و پایین رفتن موج بشه که خب... من قبلا این سوال رو از خود شما پرسیدم و شما هم جواب دادید.

        http://www.eca.ir/forum2/index.php?topic=62536.msg353631#msg353631

        اون پتانسیومترهایی که در ویدیو باهاشون کار کردم و اون چهارتا IC دقیقا بر اساس این شماتیکی که گذاشته بودم بسته شدند وچون اسیلوسکوپ دوکاناله بود تعدادشون دوبرابر شد.

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

        دیدگاه


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

          با سلام،

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


          در مورد کلید های فعلی هم، بله، همینطور منظورم بود که فرمودید. فقط با یکبار خوندن پورت B قضیه رو فیصله بده ( فقط برای سرعت بالاتر ) مثلا اینطوری :
          unsigned char Keys = 0;

          .
          .
          .

          Keys = ~PINB;
          if(Keys != 0) ReadKeys();


          در ضمن بهتره که ADC رو روی مد 8 بیتی تنظیم کنی و این تغییرات رو در تبدیل کردن عدد خونده شده برای نمایش بدی ( فقط برای سرعت بالاتر ) :
          inV = ADCH;
          inV = inV * 54/255;
          inV = 54 -inV;
          پی نوشت : فرمول تبدیل در ADC تصحیح شد...
          مادامی که از شخصی یاد میشود، او و افکارش زنده اند ....

          Sh_Nourbakhsh@Yahoo.com

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

          دیدگاه


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

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

            کاری که برای اسکن پوش باتن ها روی پورت b فرموده بودید رو انجام دادم... زیاد توفیری نکرد... لذا همون حالت قبلی رو حفظ کردم... ولی با اعمال تغییراتی که در ADC داده بودید وضع خیلی بهتر شد. :applause:

            یه سوال مرتبط با پوش باتن ها دارم.... یه کوچولو کارم راه بیفته برای سایر پوش باتنها هم مشکلم حل میشه


            مشکل اینجاست که برای پوش باتنهای ششم و هفنم میخوام کاری کنم که در پوش باتن ششم (( inc volt div )) اگر یکبار بزنیم در قسمتی از lcd عدد 1 و اگر دوبار بزنیم عدد 2 و اگر سه بار بزنیم عدد 5 ظاهر بشه و برای بارهای بیشتر هم روی عدد 5 بمونه و با کلید هفتم ((dec volt div )) اگر یکبار بزنیم و در lcd 5 ظاهر شده باشه اون 5 بشه 2 و اگر دوبار بزنیم بشه 1 و بیشتر بزنیم همون 1 بمونه...

            اگر 2 ظاهر شده بود با زدن کلید هفتم 1 بشه و همون 1 بمونه و اگر 1 ظاهر شده بود هم همون 1 بمونه.... یعنی روند نمایش اعداد 1 و 2 و 5 با کلید ششم زیاد و با کلید هفتم کم بشه...

            در داخل حلقه این برنامه وجود داره:
            کد:
               //// kelid 1
               if(PINB.0 ==0){
               delay_ms(20);
               if(PINB.0 ==0)
               selectch1();
               } 
               /// kelid 2
               if(PINB.1 ==0){
               delay_ms(20);
               if(PINB.1 ==0)
               selectch2();
               }

            و اینهم تعریف توابع incvoltdiv و decvoltdiv که با زدن کلید های ششم و هفتم اجرا میشن:

            کد:
            //// afzayesh volt division
            void incvoltdiv (void)
            {
            glcd_outtextxyf (2,5,"incvoltdiv");
            delay_ms(30);
            for(i=2;i<20;i++){
            for(j=2;j<62;j++)
            glcd_clrpixel(j,i);
            }
            if(vdc1==1){
            m=1;
            glcd_putcharxy( 12,55,'1');
            }
            if(vdc1==2){
            m=2;
            glcd_putcharxy( 12,55,'2');
            }
            if(vdc1==3){
            m=5 ;
            glcd_putcharxy (12,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(m==1)
            {
            glcd_putcharxy( 12,55,'1');
            m=1;
            }
            if(m==2){
            glcd_putcharxy( 12,55,'1');
            m=1;
            }
            if(m==5){
            glcd_putcharxy(12,55,2);
            m=5;
            }
            
            }
            خواستم از یه متغیر مثل m استفاده کنم ولی جواب نداد....

            امکانش هم نیست که محتوای درج شده در یک قسمت lcd رو بخونم و بر اساس اون کار کنم لذا اینجا گیر کردم و درخواست کمک دارم.






            دیدگاه


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

              با سلام،

              شما اول روتین های خوندن کلیدهات رو اینطوری تغییر بده :

              در ابتدای main :
              unsigned char Keys = 0;

              و بجای خوندن کلیدهای فعلی در main :
              if(PINB != 0xFF) ReadKeys();

              و یک روتین خوندن کلید ها :
              کد:
              void ReadKeys(void)
              {
              	delay_ms(10);
              	
              	switch(PINB)
              	{
              		case 0b11111110:						//PINB.0
              			selectch1();
              			break;
              		
              		case 0b11111101:						//PINB.1
              			selectch2();
              			break;
              		
              		case 0b11111011:						//PINB.2
              			selectbothchannels();
              			break;
              
              		case 0b11110111:						//PINB.3
              			Lissajous();
              			break;
              
              		case 0b11101111:						//PINB.4 
              			incvoltdiv();
              			
              			vdc1++;
              			if(vdc1>3)			vdc1 = 3;
              			break;
              
              		case 0b11011111:						//PINB.5
              			decvoltdiv();
              			
              			vdc2++;
              			if(vdc2>3)			vdc2 = 3;
              			break;
              
              		case 0b10111111:						//PINB.6
              			if			(Tdiv == 1)		Tdiv = 2;
              			else if (Tdiv == 2)		Tdiv = 5;
              			break;
              
              		case 0b01111111:						//PINB.7
              			if			(Tdiv == 5)		Tdiv = 2;
              			else if (Tdiv == 2)		Tdiv = 1;
              			break;
              	}//switch
              
              } //ReadKeys

              البته با یک متغیر Global در ابتدای برنامه :
              unsigned char Tdiv = 1;

              حالا اگر درست منظور شما رو متوجه شده باشم، کاری که میخوای رو کلید های 6 و 7 انجام میدن....

              البته بهتره که اول برنامه، کلید ها رو تعریف کنی و در Case استفاده کنی، مثلا :
              #define Tinc 0b10111111
              #define Tdec 0b01111111

              ولی در کل این روش ها اصولی نیستند و به زودی به بن بست میخوری

              شما باید یک حالت مولتی تسک با تایمر درست کنی و کلیه وقایع و کلید ها رو با اون مدیریت کنی، و تمام توان کاری میکرو رو به خوندن ADC و رسم پیکسل ها بدی، در غیر اینصورت، کار اصلی که رسم موج هست مختل خواهد شد.

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

              Sh_Nourbakhsh@Yahoo.com

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

              دیدگاه


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

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

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

                والله برای من خیلی زور داره که برای یه همچین کار ساده ای با Timer counter کار کنم... چون اونجا کلی رجیستر باید فعال کنیم که خب.... همین الان هم سرعتمون برای نمایش موج بدلیل مشغله کاری میکرو !!! زیاد سریع نیست..


                ببینید.... من مسئله کلید ها رو روی یه پروژه ساده تر پیاده کردم... اینبار یه میکرو داریم که دو تا پوش باتن بهش وصل است و دیتا رو روی یک lcd کاراکتری 2*16 میفرسته...

                برنامه اش اینه:
                کد:
                #include <mega32a.h>
                #include <delay.h>
                // Alphanumeric LCD functions
                #include <alcd.h>
                // Declare your global variables here
                int vdc1=0;
                int vdc2=0;
                int m=0;
                void incvoltdiv(void);
                void decvoltdiv (void);
                void show5 (void);
                void show2 (void);
                void show1 (void);
                void main(void)
                {
                // Alphanumeric LCD initialization
                // Connections are specified in the
                // Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
                // RS - PORTA Bit 0
                // RD - PORTA Bit 1
                // EN - PORTA Bit 2
                // D4 - PORTA Bit 4
                // D5 - PORTA Bit 5
                // D6 - PORTA Bit 6
                // D7 - PORTA Bit 7
                // Characters/line: 16
                lcd_init(16);
                lcd_clear();
                lcd_puts("PB test") ;
                delay_ms(20);
                lcd_clear();
                while (1)
                   {
                   //kelid 5
                   if(PINB.4 ==0){
                   delay_ms(50);
                   if(PINB.4 ==0)
                   incvoltdiv();
                   vdc1++; 
                   }
                   if(vdc1>3)
                   vdc1=3;
                   // kelid 6
                   if(PINB.5 ==0){
                   delay_ms(50);
                   if(PINB.5 ==0)
                   decvoltdiv();
                   vdc2++;
                   }
                   if(vdc2>3)
                   vdc2=3;
                }
                }
                 void incvoltdiv (void)
                {
                if(vdc1==1){
                m=1 ;
                show1();
                }
                ////////
                if(vdc1==2){
                m=2;
                show2();
                }
                /////
                if(vdc1==3){
                m=5 ;
                show5();
                }
                }
                //// kahesh volt division
                void decvoltdiv (void)
                {
                lcd_clear();
                if(m==5)
                {
                m=2;
                show2();
                }
                if(m==2|| m==1){
                m=1;
                show1();
                }
                }
                /////
                /////
                /////
                void show5 (void)
                {
                lcd_gotoxy(0,0);
                lcd_puts("5");
                }
                void show2 (void)
                {
                lcd_gotoxy(0,0);
                lcd_puts("2");
                }
                void show1 (void)
                {
                lcd_gotoxy(0,0);
                lcd_puts("1");
                }

                فایل برنامه و پروتئوس برنامه اینجاست.... با حجم 45 کیلوبایت:
                http://uplod.ir/ndp5ss44jr4h/pb_test.rar.htm


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

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

                یا اگر تابع show2 توسط پوش باتن ششم یا همون روتین تابع incvoltdiv اجرا شده حالا که دومین بار هست که پوش باتن هفتم رو میزنیم چون تابع show2 اجرا شده حالا تابع show1 اجرا بشه...

                یعنی دنبال همچین چیزی هستم:

                if ( show2){

                show1();
                }
                که صد در صد کامپایلر کد ویژن نسبت به همین دو خط بالا ارور invalid expression میگیره...!!

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

                دیدگاه


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

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

                  سواد شما خیلی بیشتر از اکابر هست...!! :biggrin:
                  شما لطف داری برادر، من از اکابر هم اکابرترم ....

                  والله برای من خیلی زور داره که برای یه همچین کار ساده ای با Timer counter کار کنم... چون اونجا کلی رجیستر باید فعال کنیم که خب.... همین الان هم سرعتمون برای نمایش موج بدلیل مشغله کاری میکرو !!! زیاد سریع نیست..
                  شما چاره ای نداری، باید از تایمر ها استفاده کنی، ضمن اینکه بالاخره این میکرو باید به یه دردی بخوره دیگه!!! :mrgreen:

                  یا اگر تابع show2 توسط پوش باتن ششم یا همون روتین تابع incvoltdiv اجرا شده حالا که دومین بار هست که پوش باتن هفتم رو میزنیم چون تابع show2 اجرا شده حالا تابع show1 اجرا بشه...
                  با عرض معذرت، برای این کار بخصوص شما که این روش ها به کل مشکل داره و صحیح نیست.
                  ولی در کل اگر شما در موردی نیاز داشته باشید که اجرا شدن یک روتین یا تابع رو قبل از اجرای یک دستور و یا تابع دیگه متوجه بشید، تنها راه استفاده از Flag هستش که در برنامه نویسی بسیار متداوله، مثلا شما یک فلگ عمومی به اسم Show2Flag تعریف میکنید، اینطوری :
                  unsigned char Show2Flag = 0;

                  و در انتهای اجرای روتین show2 فلگ رو یک میکنید و اون مثال خودتون رو هم اینطوری تغییر میدید :
                  if(Show2Flag)
                  {
                  show1();
                  }

                  و در نهایت در انتهای اجرای روتین show1 و یا هر جای دیگری که لازم بود، مجددا فلگ رو صفر میکنید.

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

                  http://s3.picofile.com/file/7418518816/pb_test_2.rar.html

                  فقط یه نکته این که فکر کنم، کدویژن من با مال شما فرق داره و من نمیتونم پروژه شما رو توی کدویژن باز کنم، برای همین هم یه تغییرات کوچولو در تعاریف LCD و میکرو دادم و خودم یه پروژه دیگه درست کردم، اگر شما هم پروژه من رو نتونستی باز کنی، pb test.c رو ببر توی پروژه ای که خودت درست کردی!

                  در ضمن، یه Keys.h هم نوشتم و به pb test.c اضافه کردم، بهش یه نگاهی بنداز :biggrin:

                  منتظر نتایج کار و نقطه نظراتت هستم اخوی.....

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

                  Sh_Nourbakhsh@Yahoo.com

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

                  دیدگاه


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

                    با سلام،

                    برادر roberty ، نیستی اخوی؟ پروژه تموم شد؟!
                    کجایی؟ یه وقت خدای نکرده مثل این برادر وحیدخان کار دست خودت ندی؟! یه اسکوپ ارزش این چیزا رو نداره ها!!! :mrgreen:

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

                    http://s3.picofile.com/file/7420541498/pb_test_3.rar.html
                    مادامی که از شخصی یاد میشود، او و افکارش زنده اند ....

                    Sh_Nourbakhsh@Yahoo.com

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

                    دیدگاه


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

                      نه شهرام جان... هنوز هستیم و دعاگوی دوستان.

                      بابت برنامه هایی که برای ال سی دی کاراکتری نوشتی ممنونم... ولی بدبختانه رو glcd نمیشه با اون روشی که با استفاده از % رو lcd کاراکتری دیتای متغیر میفرستیم دیتا فرستاد برای همین گیر کرده بودم....


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

                      من برای تابع selectbothchannels اینجوی برنامه نوشتم... نتیجه اش این شد که خطوط صافی که برای یک کانال بودند تبدیل شدند به دو تا خط تیکه تیکه شده ی موازی..!!

                      کد:
                      void selectbothchannels (void)
                      {
                      glcd_outtextxyf (2,5,"SEL CH1&2");
                      delay_ms(30);
                      for(i=2;i<20;i++){
                      for(j=2;j<62;j++)
                      glcd_clrpixel(j,i);
                      }
                      ADMUX=0x60;
                      delay_ms(1);
                      ADMUX=0x61;
                      }
                      فکر کنم بهتر از این نشه کار کرد... چون سرعت میکرو همینجوری هم کم هست... چه برسد به نمایش دو کانال اونهم همزمان... مگر اینکه بشه با رجیستر adcmux یک کارائی کرد... نظر شما چیه...؟

                      دیدگاه


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

                        با سلام،

                        به - به ، رسیدن بخیر، بابا نگران شده بودیم .....

                        این نمایش متغیر به sprintf ربط داره و هیچ فرقی هم نداره که LCD ماراکتریه یا گرافیکی، من بارها و بارها استفاده کردم، یه جای دیگه داره لنگ میزنه!

                        شما اول یه موج سینوسی 50 هرتز رو روی یک کانال نشون بده و کار رو تموم کن بعد برو دو کانالش کن، در غیر اینصورت شدیدا به مشکل میخوری.
                        از پروژه همون برادر واسیلی استفاده کن ( همونی که از سخت افزارش استفاده کردی )، و ایده بگیر.
                        اصول این نیست که همزمان آنالوگ رو بخونی و موج رو نمایش بدی، در این حالت، مشکل سرعت پیش میاد. باید بافر کنی ( حداقل دو برابر عرض صفحه نمایش ) و بعد نمایش بدی.
                        فعلا خوندن و نمایش موج همزمان رو ادامه بده و بعدش که تیکه برنامه های تریگ و اینا رو حل کردی، دوکانالش کن و یعدا یرو سراغ بافر کردن......

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

                        Sh_Nourbakhsh@Yahoo.com

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

                        دیدگاه


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

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

                          به - به ، رسیدن بخیر، بابا نگران شده بودیم .....

                          این نمایش متغیر به sprintf ربط داره و هیچ فرقی هم نداره که LCD ماراکتریه یا گرافیکی، من بارها و بارها استفاده کردم، یه جای دیگه داره لنگ میزنه!

                          شما اول یه موج سینوسی 50 هرتز رو روی یک کانال نشون بده و کار رو تموم کن بعد برو دو کانالش کن، در غیر اینصورت شدیدا به مشکل میخوری.
                          از پروژه همون برادر واسیلی استفاده کن ( همونی که از سخت افزارش استفاده کردی )، و ایده بگیر.
                          اصول این نیست که همزمان آنالوگ رو بخونی و موج رو نمایش بدی، در این حالت، مشکل سرعت پیش میاد. باید بافر کنی ( حداقل دو برابر عرض صفحه نمایش ) و بعد نمایش بدی.
                          فعلا خوندن و نمایش موج همزمان رو ادامه بده و بعدش که تیکه برنامه های تریگ و اینا رو حل کردی، دوکانالش کن و یعدا یرو سراغ بافر کردن......

                          ما رو هم بی خبر نذار ... :mrgreen:
                          دشمنت نگران بشه شهرام جان

                          بابت یادآوری اون دستور sprintf از هدرفایل stdio.h ازت ممنونم....

                          همین الان این پست رو دوباره ویرایش میکنم... چون در نوشتار قبلی همین پست اعلام کرده بودم که بازهم مشکل به وجود اوم ولی الان با برنامه ور رفتم و درستش کردم... دستورات sprintf جواب دادن... الان دیگه میتونم دیتای متغیر رو glcd بفرستم... مزیتش اینه که برای ارسال اون 1 و 2 و 5 میتونم شرط بذارم که چی فرستاده شده... کارم خیلی راه افتاد....

                          انصافا هوش و استعداد شما خیلی خوبه جناب شهرام خان....واقعا آفرین :applause:

                          دیدگاه


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

                            بازهم سلام

                            همونطور که گفتم تونستم با استفاده از دستور sprintf دیتای متغیر رو glcd نمایش بدم ولی الان مشکلم اینه که نمیتونم بررسی کنم که چه عددی بر روی glcd نوشته شده....

                            برای مثال وقتی عدد 5 فرستاده شده در تابع decvoltdiv قصد دارم شرطی رو بذارم که اگر عدد 5 فرستاده شده بود اونرو به 2 و اگر 2 بود اون رو به یک تبدیل کن ولی چیزی نشون داده نمیشه...برنامه رو ببینید:
                            کد:
                            #include <mega32a.h>
                            #include <stdio.h>
                            #include <delay.h>
                            #include <glcd.h>
                            #include <font5x7.h>
                            flash char vdc_number[3]={1,2,5}; /// baraye tavabe incvoltdiv va decvoltdiv
                            flash char tdc_number[4]={1,0.1,0.01,0.001}; /// maghadir zamani baraye tavabeh inctimediv va dectimediv
                            unsigned char A[20];//// baraye sprintf voltdiv
                            unsigned char B[20];//// baraye sprintf timediv
                            unsigned char i,j,L1,L2,a2d,y;
                            unsigned char vdc1=0,vdc2=0;///counter haye vlotdiv
                            unsigned char tdc1=0,tdc2=0; /// counter haye timediv
                            unsigned char  Xmax = 127, x = 1, inv, oldV[Xmax];////baraye namayesh moj
                            void selectch1(void);
                            void selectch2(void);
                            void selectbothchannels(void);
                            void Lissajous (void);
                            void incvoltdiv (void);
                            void decvoltdiv (void);
                            void inctimediv (void);
                            void dectimediv (void);
                            void main(void)
                            {
                            // Declare your local variables here
                            // Graphic LCD initialization data
                            GLCDINIT_t glcd_init_data;
                            // Graphic LCD initialization
                            // The KS0108 connections are specified in the
                            // Project|Configure|C Compiler|Libraries|Graphic LCD menu:
                            // DB0 - PORTC Bit 0
                            // DB1 - PORTC Bit 1
                            // DB2 - PORTC Bit 2
                            // DB3 - PORTC Bit 3
                            // DB4 - PORTC Bit 4
                            // DB5 - PORTC Bit 5
                            // DB6 - PORTC Bit 6
                            // DB7 - PORTC Bit 7
                            // E - PORTD Bit 0
                            // RD /WR - PORTD Bit 1
                            // RS - PORTD Bit 2
                            // /RST - PORTD Bit 3
                            // CS1 - PORTD Bit 4
                            // CS2 - PORTD Bit 5
                            // Specify the current font for displaying text
                            glcd_init_data.font=font5x7;
                            // No function is used for reading
                            // image data from external memory
                            glcd_init_data.readxmem=NULL;
                            // No function is used for writing
                            // image data to external memory
                            glcd_init_data.writexmem=NULL;
                            glcd_init(&glcd_init_data);
                               glcd_outtextxyf(0,0,"DIGITAL OSILLOSCOPE");
                               glcd_outtextxyf (0,22,"BY AVR MICOCTRL");
                               glcd_outtextxyf (0,45,"HAMID REZA RABET" ); 
                               delay_ms(3000); 
                               glcd_clear();
                                ADCSRA=0xff;
                               SFIOR=0x00;
                               ADMUX=0x60;  
                               glcd_putcharxy( 1, 56,'v');                 
                               glcd_putcharxy( 66, 56, 't');
                               glcd_putcharxy( 7, 56, '='); 
                               glcd_putcharxy( 72, 56, '='); 
                               for(i=0;i<=54;i+=2){
                               glcd_setpixel(0,i);
                               glcd_setpixel(127,i);
                               }
                            
                            while (1)
                               { 
                              ///// namayesh moj 
                              a2d = ADCH;
                              inv = ((-54 *a2d) /255) +54;
                              glcd_clrpixel(x, oldV[x]);  //Clear previous set pixel
                              glcd_setpixel(x, inv);      //Set current pixel
                              oldV[x] = inv;
                              x++;
                              if(x>=Xmax)    
                                x = 1;
                                ///namayesh meghdar avalieh voltdivision va timedivision 
                                if (vdc1==0 && vdc2==0){
                                glcd_putcharxy( 17,55,'5');
                                } 
                                if (tdc1==0 && tdc2==0){
                                glcd_putcharxy( 80,55,'1');
                                }
                              /// nayaesh kadr ofoghi
                                for(i=0;i<128;i+=2){
                               glcd_setpixel(i,54);
                               glcd_setpixel(i,0);
                               }
                               // namayesh mehvar haye ofoghi va amoodi
                               glcd_putcharxy( 30, 24, '|');
                               glcd_putcharxy( 92, 24, '|');
                               glcd_putcharxy( 62, 7, '_');
                               glcd_putcharxy( 62, 35, '_');
                               glcd_line(0,27,128,27);
                               glcd_line(64,0,64,64);
                            
                               //// kelid 1
                               if(PINB.0 ==0){
                               delay_ms(20);
                               if(PINB.0 ==0)
                               selectch1();
                               } 
                               /// kelid 2
                               if(PINB.1 ==0){
                               delay_ms(20);
                               if(PINB.1 ==0)
                               selectch2();
                               } 
                                 /// kelid 3
                               if(PINB.2 ==0){
                               delay_ms(20);
                               if(PINB.2 ==0)
                               selectbothchannels();
                               } 
                               ///kelid 4 
                               if(PINB.3 ==0){
                               delay_ms(20);
                               if(PINB.3 ==0)
                               Lissajous();
                               }
                               //kelid 5
                               if(PINB.4 ==0){
                               delay_ms(20);
                               if(PINB.4 ==0)
                               incvoltdiv();
                               vdc1++; 
                               }
                               if(vdc1>3)
                               vdc1=3;
                               // kelid 6
                               if(PINB.5 ==0){
                               delay_ms(20);
                               if(PINB.5 ==0)
                               decvoltdiv();
                               vdc2++;
                               }
                               if(vdc2>3)
                               vdc2=1;
                               
                               /// kelid 7
                               if(PINB.6 ==0){
                               delay_ms(20);
                               if(PINB.6 ==0)
                               inctimediv(); 
                               tdc1++;
                               if(tdc1>3)
                               tdc1=3;
                               } 
                               /// kelid 8
                               if(PINB.7 ==0){
                               delay_ms(20);
                               if(PINB.7 ==0)
                               dectimediv(); 
                               tdc2++;
                               if(tdc2 >3)
                               tdc2=3;
                               }    
                            } 
                            }
                            //// entekhab kanal 1
                            void selectch1 (void)
                            {
                            glcd_outtextxyf (2,5,"SEL CH1");
                            delay_ms(30);
                            for(i=2;i<20;i++){
                            for(j=2;j<60;j++)
                            glcd_clrpixel(j,i);
                            }
                            ADMUX=0x60;
                            }
                            //// entekhab kanal 2
                            void selectch2 (void)
                            {
                            glcd_outtextxyf (2,5,"SEL CH2");
                            delay_ms(30);
                            for(i=2;i<20;i++){
                            for(j=2;j<60;j++)
                            glcd_clrpixel(j,i);
                            }
                            ADMUX=0x61;
                            }
                            /// entekhab har do kanal
                            void selectbothchannels (void)
                            {
                            glcd_outtextxyf (2,5,"SEL CH1&2");
                            delay_ms(30);
                            for(i=2;i<20;i++){
                            for(j=2;j<62;j++)
                            glcd_clrpixel(j,i);
                            }
                            ADMUX=0x60;
                            delay_ms(1);
                            ADMUX=0x61;
                            }
                            
                            //// namayesh lissajous
                            void Lissajous (void)
                            {
                            glcd_outtextxyf (2,5,"Lissajous");
                            delay_ms(30);
                            for(i=2;i<20;i++){
                            for(j=2;j<62;j++)
                            glcd_clrpixel(j,i);
                            }
                            if(ADMUX==0x60)
                            L1=ADCH;
                            else {
                            if(ADMUX==0x61)
                            L2=ADCH ;
                            }
                            }
                            //// 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 || vdc1 ==3){/// agar PB panjom zadeh nashavad ya bish az 2 bar zadeh shavad adad 5 namyesh dadeh shavad
                            sprintf (A,"%2d",vdc_number[2]);
                            glcd_outtextxy ( 12,55,A);
                            }   //baraye baar dovom va bishtar adad 2 be 5 tabdil shavad va digar taghyir nakonad ta decvoltdiv zadeh shavad.
                            //// meghdar z baraye in ast ke bebinam dar zamane ejraye tabeh decvoltdiv che adadi dar glcd namayesh dade shode... agar 5 bood be 2 va agar 2 bood be 1 tabdil shavad
                            else
                            if (B == '2'){
                            sprintf (A,"%2d",vdc_number[2]);/// agar ba ejraye tabeh decvoltdiv meghda B 2 bood bayad beshavad 5
                            glcd_outtextxy ( 12,55,A);
                            }
                            else
                            if(B== '1'){
                            sprintf (A,"&2d",vdc_number[1]);
                            glcd_outtextxy (12,55,A);
                            }
                            
                            } 
                            //// 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 == 3)
                            sprintf(B,"%2d",vdc_number[0]);/// namayesh adad 1
                            glcd_outtextxy( 12,55,B);
                            if(A =='5'){
                            sprintf(B,"%2d",vdc_number[1]);/// namayesh adad 2
                            glcd_outtextxy( 12,55,B);
                            }
                            }
                            //// 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);
                            }
                            y=y*1000; //// chon dar if/else ya switch() nemishe adad float be kar bord leza y*1000 mishavad ...dar insorat 1 haman 0.001 ast
                            if (y == 1){ //// check mi****m ke meghdar y bedast amadeh az tabeh decvlotdiv chist va bar mabnaye on dar glcd adad minevisim.
                            glcd_outtextxy(80,56,"0.01");
                            }
                            if (y == 10) //// 10 haman 0.01 ast chon y*1000 shode.
                            {
                            glcd_outtextxy(80,56,"0.1");
                            }
                            if(y == 100)
                            {
                            glcd_outtextxy(80,56,"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);
                            }
                            switch (tdc1){
                            case 1:
                            sprintf(B,"%2d%",tdc_number[0]);
                            glcd_outtextxy(78,55,B);
                            y=tdc_number[0];
                            break;
                            case 2:
                            sprintf(B,"%2d%",tdc_number[1]);
                            glcd_outtextxy(78,55,B);
                            y=tdc_number[1];
                            break;
                            case 3:
                            sprintf(B,"%2d%",tdc_number[2]);
                            glcd_outtextxy(78,55,B);
                            y=tdc_number[2];
                            break;
                            case 4:
                            sprintf(B,"%2d%",tdc_number[3]);
                            glcd_outtextxy(78,55,B);
                            y=tdc_number[3];
                            break;
                            }
                            }
                            تو این برنامه اون نمایش عدد بر اساس شرطهایی که با چک کردن vdc ها هست انجام میشه ولی وقتی دستوری مثل 'if (A=='5) رو مینویسم و میخوام چک کنم که مقدار متغیری که فرستاده شده بود 5 بود یا خیر این دستور کار نمیکنه....

                            یه مدد برسونید .

                            سپاس.

                            دیدگاه


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

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

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

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

                              مقدار A رو طوری چک کنم...؟

                              دیدگاه


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

                                با سلام،

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

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

                                Sh_Nourbakhsh@Yahoo.com

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

                                دیدگاه

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