اطلاعیه

Collapse
No announcement yet.

[آموزش]راه اندازی سون سگمنت چند دیجیت به سادگی نمایشگرهای کاراکتری

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

    [آموزش]راه اندازی سون سگمنت چند دیجیت به سادگی نمایشگرهای کاراکتری

    سلام

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

    مختصر و مفید می خوام براتون یه سورس رو قرار بدم که به سادگی راه اندازی یه LCD کاراکتری بتونید از سون سگمنت در مدارات خودتون استفاده کنید.

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

    در این سورس تعداد سون سگمنت ها رو در دیفاین تعریف شده می نویسید و رفرش و تمامی اعمال در وقفه تایمر صفر صورت می گیره.

    بنده سورس رو برای چهار عدد سون سگمنت قرار میدم و تغییر در اون بسیار راحت خواهد بود.
    در این برنامه یک کانال ADC خونده میشه و مقادیر به دست امده بر روی چهار عدد سون سگمنت به نمایش در خواهد آمد.

    لازم به ذکره هدف از قرار دادن سورس اشنایی با راه اندازی سون سگمنته نه ADC و نمونه کد صرفا نحوه استفاده از متغیرها رو نشون میده .

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



    کد:
    #include <avr/io.h>
    #include <util/delay.h>
    #include <avr/pgmspace.h>
    #include <avr/interrupt.h>
    
    //*********** Defines *************
    
    const unsigned char UcAlphabet[10] PROGMEM={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
    
    #define DataPort  PORTZ
    #define Digit    4
    
    #define EN_A_S PORTX |= (1<<PORTXY)//xxx1
    #define EN_A_R PORTX &=~ (1<<PORTXY)
    #define EN_B_S PORTX |= (1<<PORTXY)//xx1x
    #define EN_B_R PORTX &=~ (1<<PORTXY)
    #define EN_C_S PORTX |= (1<<PORTXY)//x1xx
    #define EN_C_R PORTX &=~ (1<<PORTXY)
    #define EN_D_S PORTX |= (1<<PORTXY)//1xxx
    #define EN_D_R PORTX &=~ (1<<PORTXY)
    
    //*********** Variables *************
    
    int ICount = 0;
    int IFlag = 0;
    int IFirstDigit = 0; // XXX1
    int ISecondDigit = 0; // XX1X
    int IThirdDigit = 0; // X1XX
    int IFourthDigit = 0; // 1XXX
    
    
    ISR(TIMER0_OVF_vect)
    {
        static int ICountDigit = 0;
        
        PORTX = 0x00;
        DataPort = 0xff;
        
        if (ICountDigit &gt; (Digit-1)) ICountDigit = 0;
    
        switch (ICountDigit)
        {
            case 0:
                EN_A_S;
               DataPort=pgm_read_byte_near(&amp;UcAlphabet[IFirstDigit]);
                //DataPort=pgm_read_byte_near(&amp;UcAlphabet[0]);
            break;
            case 1:
                EN_B_S;
                DataPort=pgm_read_byte_near(&amp;UcAlphabet[ISecondDigit]);
                //DataPort=pgm_read_byte_near(&amp;UcAlphabet[1]);
            break;
            case 2:
                EN_C_S;
                DataPort=pgm_read_byte_near(&amp;UcAlphabet[IThirdDigit]);
                //DataPort=pgm_read_byte_near(&amp;UcAlphabet[2]);
            break;
            case 3:
                EN_D_S;
                DataPort=pgm_read_byte_near(&amp;UcAlphabet[IFourthDigit]);
                //DataPort=pgm_read_byte_near(&amp;UcAlphabet[3]);
            break;
        }
        ICountDigit ++;
            
    }
    
    int main(void)
    {
        
        float    Fdata= 0;
        unsigned int Ivalue = 0;
    
            
        //*************TIMER Init***********    
        TCCR0 = (1&lt;&lt;CS00)|(1&lt;&lt;CS01);//OCS / 64 =125Khz
        TIFR = (1&lt;&lt;TOV0);
        TIMSK = (1&lt;&lt;TOIE0);
        //**************ADC Init************
        ADMUX=(1&lt;&lt;REFS1)|(1&lt;&lt;REFS0);// Selected Chanel 3 and refrence AVCC &amp; ADLAR = 0
        ADCSRA=(1&lt;&lt;ADEN)|(1&lt;&lt;ADPS0)|(1&lt;&lt;ADPS2);//adc enable &amp; selected prescale F_CPU/32
        SFIOR=0x00;
            
        sei();
        _delay_ms(500);
    
        
      while(1)
      {
    
            ADCSRA|=(1&lt;&lt;ADSC);
            while(!(ADCSRA&amp;=~(1&lt;&lt;ADSC)));
            
            Fdata = (float) ADCW / 0.4;
            Ivalue = (unsigned int) Fdata;
            
            IFourthDigit = Ivalue / 1000;
            IThirdDigit = (Ivalue - (IFourthDigit * 1000)) / 100;
            ISecondDigit = (Ivalue - ((IFourthDigit * 1000)+(IThirdDigit * 100))) / 10;
            IFirstDigit = Ivalue - ((IFourthDigit * 1000)+(IThirdDigit * 100)+(ISecondDigit * 10)); 
      }
    }

    امیدوارم مشکل سون سگمنت برای همیشه حل بشه

    موفق و پیروز باشید
    جدیدترین ویرایش توسط سوران آراسته; ۲۰:۱۱ ۱۳۹۵/۱۰/۰۵.
    چرا ناراحتی پاتریک!
    + امروز ی بچه دیدم سرچهارراه گل میفروخت
    - از دیدنش ناراحت شدی؟
    + نه
    پس چی ناراحتت کرده
    + اینکه دیدن اینجور بچه ها انقدر واسم عادی شده که دیگه ناراحتم نمیکنه
    ------------------------------------------------------------------------------------------------------
    تاحالا فکر کردی بیسواد کیه؟- بی سواد یعنی کسی که نمیتونه ذهنیاتش رو عملی کنه!
    ------------------------------------------------------------------------------------------------------
    محصولات

    #2
    پاسخ : [آموزش]راه اندازی سون سگمنت چند دیجیت به سادگی نمایشگرهای کاراکتری

    دادا بیسکام نداری؟!
    حیدر قجا دونیا یالان دونیا دور...

    دیدگاه


      #3
      پاسخ : [آموزش]راه اندازی سون سگمنت چند دیجیت به سادگی نمایشگرهای کاراکتری

      نوشته اصلی توسط MohammadMers
      دادا بیسکام نداری؟!
      شخصا خیلی وقته از بسکام فاصله گرفتم اما فکر نمی کنم تبدیل این کد به بیسیک کاری داشته باشه ...
      چرا ناراحتی پاتریک!
      + امروز ی بچه دیدم سرچهارراه گل میفروخت
      - از دیدنش ناراحت شدی؟
      + نه
      پس چی ناراحتت کرده
      + اینکه دیدن اینجور بچه ها انقدر واسم عادی شده که دیگه ناراحتم نمیکنه
      ------------------------------------------------------------------------------------------------------
      تاحالا فکر کردی بیسواد کیه؟- بی سواد یعنی کسی که نمیتونه ذهنیاتش رو عملی کنه!
      ------------------------------------------------------------------------------------------------------
      محصولات

      دیدگاه


        #4
        پاسخ : [آموزش]راه اندازی سون سگمنت چند دیجیت به سادگی نمایشگرهای کاراکتری

        یعنی واقعا همه اینقدر به راه اندازی سون سگمنت وارد بودن

        :cry2: :cry2: :cry2:
        چرا ناراحتی پاتریک!
        + امروز ی بچه دیدم سرچهارراه گل میفروخت
        - از دیدنش ناراحت شدی؟
        + نه
        پس چی ناراحتت کرده
        + اینکه دیدن اینجور بچه ها انقدر واسم عادی شده که دیگه ناراحتم نمیکنه
        ------------------------------------------------------------------------------------------------------
        تاحالا فکر کردی بیسواد کیه؟- بی سواد یعنی کسی که نمیتونه ذهنیاتش رو عملی کنه!
        ------------------------------------------------------------------------------------------------------
        محصولات

        دیدگاه


          #5
          پاسخ : [آموزش]راه اندازی سون سگمنت چند دیجیت به سادگی نمایشگرهای کاراکتری

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

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

          مختصر و مفید می خوام براتون یه سورس رو قرار بدم که به سادگی راه اندازی یه LCD کاراکتری بتونید از سون سگمنت در مدارات خودتون استفاده کنید.

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

          در این سورس تعداد سون سگمنت ها رو در دیفاین تعریف شده می نویسید و رفرش و تمامی اعمال در وقفه تایمر صفر صورت می گیره.

          بنده سورس رو برای چهار عدد سون سگمنت قرار میدم و تغییر در اون بسیار راحت خواهد بود.
          در این برنامه یک کانال ADC خونده میشه و مقادیر به دست امده بر روی چهار عدد سون سگمنت به نمایش در خواهد آمد.

          لازم به ذکره هدف از قرار دادن سورس اشنایی با راه اندازی سون سگمنته نه ADC و نمونه کد صرفا نحوه استفاده از متغیرها رو نشون میده .

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



          کد:
          #include &lt;avr/io.h&gt;
          #include &lt;util/delay.h&gt;
          #include &lt;avr/pgmspace.h&gt;
          #include &lt;avr/interrupt.h&gt;
          
          //*********** Defines *************
          
          const unsigned char UcAlphabet[10] PROGMEM={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
          
          #define DataPort  PORTZ
          #define Digit    4
          
          
          #define EN_A_S PORTX |= (1&lt;&lt;PORTXY)//xxx1
          #define EN_A_R PORTX &amp;=~ (1&lt;&lt;PORTXY)
          #define EN_B_S PORTX |= (1&lt;&lt;PORTXY)//xx1x
          #define EN_B_R PORTX &amp;=~ (1&lt;&lt;PORTXY)
          #define EN_C_S PORTX |= (1&lt;&lt;PORTXY)//x1xx
          #define EN_C_R PORTX &amp;=~ (1&lt;&lt;PORTXY)
          #define EN_D_S PORTX |= (1&lt;&lt;PORTXY)//1xxx
          #define EN_D_R PORTX &amp;=~ (1&lt;&lt;PORTXY)
          
          
          //*********** Variables *************
          
          int ICount = 0;
          int IFlag = 0;
          int IFirstDigit = 0; // XXX1
          int ISecondDigit = 0; // XX1X
          int IThirdDigit = 0; // X1XX
          int IFourthDigit = 0; // 1XXX
          
          
          ISR(TIMER0_OVF_vect)
          {
          	static int ICountDigit = 0;
          	
          	PORTX = 0x00;
          	DataPort = 0xff;
          	
          	if (ICountDigit &gt; (Digit-1)) ICountDigit = 0;
          
          	switch (ICountDigit)
          	{
          		case 0:
          			EN_A_S;
          		   DataPort=pgm_read_byte_near(&amp;UcAlphabet[IFirstDigit]);
          			//DataPort=pgm_read_byte_near(&amp;UcAlphabet[0]);
          		break;
          		case 1:
          			EN_B_S;
          			DataPort=pgm_read_byte_near(&amp;UcAlphabet[ISecondDigit]);
          			//DataPort=pgm_read_byte_near(&amp;UcAlphabet[1]);
          		break;
          		case 2:
          			EN_C_S;
          			DataPort=pgm_read_byte_near(&amp;UcAlphabet[IThirdDigit]);
          			//DataPort=pgm_read_byte_near(&amp;UcAlphabet[2]);
          		break;
          		case 3:
          			EN_D_S;
          			DataPort=pgm_read_byte_near(&amp;UcAlphabet[IFourthDigit]);
          			//DataPort=pgm_read_byte_near(&amp;UcAlphabet[3]);
          		break;
          	}
          	ICountDigit ++;
          		
          }
          
          int main(void)
          {
          	
          	float    Fdata= 0;
          	unsigned int Ivalue = 0;
          
          		
          	//*************TIMER Init***********	
          	TCCR0 = (1&lt;&lt;CS00)|(1&lt;&lt;CS01);//OCS / 64 =125Khz
          	TIFR = (1&lt;&lt;TOV0);
          	TIMSK = (1&lt;&lt;TOIE0);
          	//**************ADC Init************
          	ADMUX=(1&lt;&lt;REFS1)|(1&lt;&lt;REFS0);// Selected Chanel 3 and refrence AVCC &amp; ADLAR = 0
          	ADCSRA=(1&lt;&lt;ADEN)|(1&lt;&lt;ADPS0)|(1&lt;&lt;ADPS2);//adc enable &amp; selected prescale F_CPU/32
          	SFIOR=0x00;
          		
          	sei();
          	_delay_ms(500);
          
          	
            while(1)
            {
          
          		ADCSRA|=(1&lt;&lt;ADSC);
          		while(!(ADCSRA&amp;=~(1&lt;&lt;ADSC)));
          		
          		Fdata = (float) ADCW / 0.4;
          		Ivalue = (unsigned int) Fdata;
          		
          		IFourthDigit = Ivalue / 1000;
          		IThirdDigit = (Ivalue - (IFourthDigit * 1000)) / 100;
          		ISecondDigit = (Ivalue - ((IFourthDigit * 1000)+(IThirdDigit * 100))) / 10;
          		IFirstDigit = Ivalue - ((IFourthDigit * 1000)+(IThirdDigit * 100)+(ISecondDigit * 10)); 
            }
          }

          امیدوارم مشکل سون سگمنت برای همیشه حل بشه

          موفق و پیروز باشید
          سلام-منم خیلی دوست دارم این پروژه رو درست کنم و بتونم با چهارتا سگمنت راه بندازم با 3تا کلید set/up/down بتونم تنظیم کنم مثل ترموستات چند وقتی با جونم ور میرم با ال سی دی کردم کمی مشکل داشت ولی میخوام با 7سگمن اینکار رو انجام بدم.اگه میشه کدویژن رو هم بزارین . :rolleyes: :rolleyes:
          o_O

          دیدگاه


            #6
            پاسخ : [آموزش]راه اندازی سون سگمنت چند دیجیت به سادگی نمایشگرهای کاراکتری

            خدار و شکر یه نفر پیدا شد

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

            موفق باشید
            چرا ناراحتی پاتریک!
            + امروز ی بچه دیدم سرچهارراه گل میفروخت
            - از دیدنش ناراحت شدی؟
            + نه
            پس چی ناراحتت کرده
            + اینکه دیدن اینجور بچه ها انقدر واسم عادی شده که دیگه ناراحتم نمیکنه
            ------------------------------------------------------------------------------------------------------
            تاحالا فکر کردی بیسواد کیه؟- بی سواد یعنی کسی که نمیتونه ذهنیاتش رو عملی کنه!
            ------------------------------------------------------------------------------------------------------
            محصولات

            دیدگاه


              #7
              پاسخ : [آموزش]راه اندازی سون سگمنت چند دیجیت به سادگی نمایشگرهای کاراکتری

              با سلام و عرض خسته نباشید : مهندس شرمنده اگر فایل کدویژن را برای تازه واردهایی مثل من هم قرار میدادی عالی بود . با تشکر فراوان از تلاش و همت شما @};- @};- @};-

              دیدگاه


                #8
                پاسخ : [آموزش]راه اندازی سون سگمنت چند دیجیت به سادگی نمایشگرهای کاراکتری

                با سلام

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

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

                چرا ناراحتی پاتریک!
                + امروز ی بچه دیدم سرچهارراه گل میفروخت
                - از دیدنش ناراحت شدی؟
                + نه
                پس چی ناراحتت کرده
                + اینکه دیدن اینجور بچه ها انقدر واسم عادی شده که دیگه ناراحتم نمیکنه
                ------------------------------------------------------------------------------------------------------
                تاحالا فکر کردی بیسواد کیه؟- بی سواد یعنی کسی که نمیتونه ذهنیاتش رو عملی کنه!
                ------------------------------------------------------------------------------------------------------
                محصولات

                دیدگاه


                  #9
                  پاسخ : [آموزش]راه اندازی سون سگمنت چند دیجیت به سادگی نمایشگرهای کاراکتری

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

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

                  سعی می کنم در اسرع وقت فایل کدویژن رو برای استفاده دوستان قرار بدم.
                  سلام مهندس خسته نباشید : دستت طلا ، عجله ای نیست ، هر وقت فرصت داشتین فایل را قرار بده. ولی منتظریم یادت نره

                  @};- @};-

                  دیدگاه


                    #10
                    پاسخ : [آموزش]راه اندازی سون سگمنت چند دیجیت به سادگی نمایشگرهای کاراکتری

                    با سلام

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

                    موفق باشید...

                    کد:
                    #include &lt;mega32a.h&gt;
                    #define xtal 8000000
                    #include &lt;delay.h&gt;
                    
                    
                    //*********** Defines *************
                    
                    flash unsigned char UcAlphabet[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
                    
                    #define DataPort  PORTC
                    #define Digit    4
                    
                    #define EN_A_S PORTA |= (1&lt;&lt;PORTA4)//xxx1
                    #define EN_A_R PORTA &amp;=~ (1&lt;&lt;PORTA4)
                    #define EN_B_S PORTA |= (1&lt;&lt;PORTA5)//xx1x
                    #define EN_B_R PORTA &amp;=~ (1&lt;&lt;PORTA5)
                    #define EN_C_S PORTA |= (1&lt;&lt;PORTA6)//x1xx
                    #define EN_C_R PORTA &amp;=~ (1&lt;&lt;PORTA6)
                    #define EN_D_S PORTA |= (1&lt;&lt;PORTA7)//1xxx
                    #define EN_D_R PORTA &amp;=~ (1&lt;&lt;PORTA7)
                    
                    //*********** Variables *************
                    
                    int ICount = 0;
                    int IFirstDigit = 1; // XXX1
                    int ISecondDigit = 0; // XX1X
                    int IThirdDigit = 0; // X1XX
                    int IFourthDigit = 0; // 1XXX
                    
                    
                    interrupt [TIM0_OVF] void timer0_ovf_isr(void)
                    {
                    	static int ICountDigit = 0;
                    	
                    	PORTA = 0x00;
                    	DataPort = 0xff;
                    	
                    	if (ICountDigit &gt; (Digit-1)) ICountDigit = 0;
                    
                    	switch (ICountDigit)
                    	{
                    		case 0:
                    			EN_A_S;
                    		   DataPort = UcAlphabet[IFirstDigit];
                    			//DataPort=UcAlphabet[0];
                    		break;
                    		case 1:
                    			EN_B_S;
                    			DataPort= UcAlphabet[ISecondDigit];
                    			//DataPort=UcAlphabet[1];
                    		break;
                    		case 2:
                    			EN_C_S;
                    			DataPort= UcAlphabet[IThirdDigit];
                    			//DataPort=UcAlphabet[2];
                    		break;
                    		case 3:
                    			EN_D_S;
                    			DataPort= UcAlphabet[IFourthDigit];
                    			//DataPort=UcAlphabet[3];
                    		break;
                    	}
                    	ICountDigit ++;
                    		
                    }
                    
                    
                    void main(void)
                    {
                    
                    
                    DDRA = 0xFF;
                    DDRC = 0xFF;
                    
                    // Timer/Counter 0 initialization
                    // Clock source: System Clock
                    // Clock value: 125.000 kHz
                    // Mode: Normal top=0xFF
                    // OC0 output: Disconnected
                    TCCR0=0x03;
                    TCNT0=0x00;
                    OCR0=0x00;
                    
                    TCCR2=0x02;
                    TIMSK=0x41;
                    
                    
                    
                    while (1)
                       {
                    
                        
                        
                       }
                    }
                    چرا ناراحتی پاتریک!
                    + امروز ی بچه دیدم سرچهارراه گل میفروخت
                    - از دیدنش ناراحت شدی؟
                    + نه
                    پس چی ناراحتت کرده
                    + اینکه دیدن اینجور بچه ها انقدر واسم عادی شده که دیگه ناراحتم نمیکنه
                    ------------------------------------------------------------------------------------------------------
                    تاحالا فکر کردی بیسواد کیه؟- بی سواد یعنی کسی که نمیتونه ذهنیاتش رو عملی کنه!
                    ------------------------------------------------------------------------------------------------------
                    محصولات

                    دیدگاه


                      #11
                      پاسخ : [آموزش]راه اندازی سون سگمنت چند دیجیت به سادگی نمایشگرهای کاراکتری

                      سلام
                      سوران جان ظاهرا یک مقداری کدها به هم ریختن،متوجه شدنشون سخت شده
                      بخاطر همین هم چند تا سوال داشتم که البته همشون بخاطر به هم ریخته شدنشون نیست

                      -#define EN_A_S PORTA |= (1&lt;&lt;PORTA4)//xxx1

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


                      -
                      int IFourthDigit = 0; // 1XXX
                      توی دستور بالا،مقدار اولیه برای متغیر های نمایش داده شده تعریف کردی ؟بعدش مقدار اصلی هرکدوم توی اصل برنامه که توی حلقه while(1) هست باید مشخص شه دیگه؟
                      اونوقت اینطوری که از وقفه استفاده کردی،مشکلی پیش نمیاد؟مثلا برنامه محاسبات رو انجام داده و متغیر اول رو آپدیت کرده،حالا میخاد بقیشونو عدد جدید بریزه توش که وقفه رخ میده،اینطوری عددی که نشون میده اشتباه میشه....نمیشه؟

                      satic int IcountDigit=0

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


                      if (IcountDigit &gt; (Digit-1)) IcountDigit=0

                      دستور بالا رو که کلا متوجه نشدم

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

                      وسوال آخر هم اینکه خیلی فرق میکنه که کلاک تایمر رو روی چی بذاریم؟

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

                      ممنون
                      جدیدترین ویرایش توسط سیدعلی.م; ۰۸:۱۶ ۱۳۹۵/۱۰/۰۶.
                      ................Fx7SAM................

                      دیدگاه


                        #12
                        پاسخ : [آموزش]راه اندازی سون سگمنت چند دیجیت به سادگی نمایشگرهای کاراکتری

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

                        سعی کنید با 3 یا 2 خط دیتا سون سگمنت راه اندازی کنید
                        برای این کار ا ز یه شیفت رجیستر SIPO با تواناساز و یه کانتر ده دهی استفاده کنید

                        با این حرکت تعداد خطوط کمتری از پردازنده اشغال میشه
                        البته حجم برنامه زیاد تغییر نمیکنه و خیلی نمیشه

                        من این کار رو با 1768 کردم و کاملا جواب داد
                        ! Life doesn't get easier , you just get stronger

                        دیدگاه


                          #13
                          پاسخ : [آموزش]راه اندازی سون سگمنت چند دیجیت به سادگی نمایشگرهای کاراکتری

                          نوشته اصلی توسط سیدعلی.م نمایش پست ها
                          سلام
                          سوران جان ظاهرا یک مقداری کدها به هم ریختن،متوجه شدنشون سخت شده
                          بخاطر همین هم چند تا سوال داشتم که البته همشون بخاطر به هم ریخته شدنشون نیست

                          -#define EN_A_S PORTA |= (1&lt;&lt;PORTA4)//xxx1

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


                          -
                          int IFourthDigit = 0; // 1XXX
                          توی دستور بالا،مقدار اولیه برای متغیر های نمایش داده شده تعریف کردی ؟بعدش مقدار اصلی هرکدوم توی اصل برنامه که توی حلقه while(1) هست باید مشخص شه دیگه؟
                          اونوقت اینطوری که از وقفه استفاده کردی،مشکلی پیش نمیاد؟مثلا برنامه محاسبات رو انجام داده و متغیر اول رو آپدیت کرده،حالا میخاد بقیشونو عدد جدید بریزه توش که وقفه رخ میده،اینطوری عددی که نشون میده اشتباه میشه....نمیشه؟

                          satic int IcountDigit=0

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


                          if (IcountDigit &gt; (Digit-1)) IcountDigit=0

                          دستور بالا رو که کلا متوجه نشدم

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

                          وسوال آخر هم اینکه خیلی فرق میکنه که کلاک تایمر رو روی چی بذاریم؟

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

                          ممنون
                          سلام سید جان

                          قبل از هرچیز به خاطر این اشفته بازار ادیتور من یه فایل از برنامه رو قرار میدم. البته یه خورده باید دستکاری بشه چون برای خوندن Sht11 و در نتیجه جلقه while تغییرات جزئی می خواد.

                          خب این خود فایل.

                          حالا توضیحات برنامه شما:
                          1- استفاه از دیفاین ها مزایایی داره: - ویرایش و تغییرات سخت افزاری راحت تر می تونه اعمال بشه. - برنامه خواناتر میشه. این دو مورد خودش کلی ارزش داره.
                          2- در این خط : -int IFourthDigit = 0; // 1XXX درسته مقدار اولیه صفر رو می گیرن و بعد از این هرجا هر مقداری بدی نمایش داده میشه و استفاده از او بینهایت راحت شده.
                          3- استفاده از کلمه کلیدی static برای تعیین کلاس حافظه متغیره که در این جا باعث میشه متغیر با هربار رجوع به وقفه از اخرین مقدار قبلی خودش استفاده کنه.
                          4- در قسمت if (IcountDigit > (Digit-1)) IcountDigit=0 متغیری که مشخص می کنه کدون سگمنت فعال باشه اگر از تعداد سگمنت ها بیشتر شده مجددا صفر بشه و دوباره شروع به رفرش بکنه.
                          5- بله میشه به جای سویچ کیس از if هم استفاده کرد اما چون اینجا صرفا شرط برابری چک میشه بهترین گزینه همین سویچه.
                          6- در مورد کلاک منظورت رو متوجه نمیشم. واضحتر بگو تا راهنمایی کنم
                          چرا ناراحتی پاتریک!
                          + امروز ی بچه دیدم سرچهارراه گل میفروخت
                          - از دیدنش ناراحت شدی؟
                          + نه
                          پس چی ناراحتت کرده
                          + اینکه دیدن اینجور بچه ها انقدر واسم عادی شده که دیگه ناراحتم نمیکنه
                          ------------------------------------------------------------------------------------------------------
                          تاحالا فکر کردی بیسواد کیه؟- بی سواد یعنی کسی که نمیتونه ذهنیاتش رو عملی کنه!
                          ------------------------------------------------------------------------------------------------------
                          محصولات

                          دیدگاه


                            #14
                            پاسخ : [آموزش]راه اندازی سون سگمنت چند دیجیت به سادگی نمایشگرهای کاراکتری

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

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

                            -چرا کلاس مقادیری که باید نشون داده بشن استاتیک نیست؟لازم نیست یعنی؟

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

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

                            دیدگاه


                              #15
                              پاسخ : [آموزش]راه اندازی سون سگمنت چند دیجیت به سادگی نمایشگرهای کاراکتری

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

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

                              چرا تو اینتراپت سویچ کیس داره: تا هر بار با وقوع اینتراپت سگمنت صحیح رفرش بشه.

                              موارد رو ریز بگو تا بتونم دقیق راهنمایی کنم مهندس

                              امیدوارم مفید بوده باشه. موفق باشید
                              چرا ناراحتی پاتریک!
                              + امروز ی بچه دیدم سرچهارراه گل میفروخت
                              - از دیدنش ناراحت شدی؟
                              + نه
                              پس چی ناراحتت کرده
                              + اینکه دیدن اینجور بچه ها انقدر واسم عادی شده که دیگه ناراحتم نمیکنه
                              ------------------------------------------------------------------------------------------------------
                              تاحالا فکر کردی بیسواد کیه؟- بی سواد یعنی کسی که نمیتونه ذهنیاتش رو عملی کنه!
                              ------------------------------------------------------------------------------------------------------
                              محصولات

                              دیدگاه

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