اطلاعیه

Collapse
No announcement yet.

سوالات مربوط به زبان C و کدویژن(در میکرو AVR)

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

    #46
    پاسخ : سوالات مربوط به زبان C و کدویژن(در میکرو AVR)

    نوشته اصلی توسط RubeuS
    خود کامپایلر انواع شیفت را ساپورت میکنه و بدونه اینکه از جزئیات بخواهید باخبر شید براتون انجام میده.(میتونید همه کار کنید) ولی خوب اگر خیلی سطح پایین نگاه کنیم ، این اعدادی که خارج میشن کری ( carry ) هستند و در پردازنده ها یک رجیستر به نام psw هست که وضعیت فلگ های مختلف در اون قرار میگیره.
    تو avr این رجیستر اسمش SREG است که بیت 0 آن کری فلگ میباشد.و تو عمل شیفت اگر بیت خارج شده 1 باشد کری فلگ 1 میشود.
    ممنون

    ولی بذارید اصل قضیه رو بگم :
    ببینید من میخوام تابلو روانم که جاروب سطری هست رو اطلاعاتش رو یک بیت شیفت به چپ یا راست بدم.
    مشکلم اینه که اگه شیفت دادم و یک خارج شد از اونطرف،اون یکی که خارج میشه بره تو کد ماتریس بعدی و باهاش OR بشه !
    یعنی اون بیتی که خارج میشه از عدد اول،وارد عدد دوم بشه .
    * هر گاه خدا بخواهد بنده ای را خوار کند، دانش را از او دور سازد.
    * سخن بگویید تا شناخته شوید، زیرا که انسان در زیر زبان خود پنهان است.
    *بدترین دوست،آ‌ کسی است که برای او به رنج و زحمت افتی.
    حضرت علی(ع)
    آموزش AVR به ساده ترین زبان ممکن : Noise.Blog.IR

    دیدگاه


      #47
      پاسخ : پاسخ : سوالات مربوط به زبان C و کدویژن(در میکر 

      نوشته اصلی توسط RubeuS
      چون کلا برنامتون ایراد داره
      اصلا کلا دیدگاهتون ایراد داره: به نظر میاد شما میخواهید رو سون سگمنت یه سری عدد نشون بدید، بعد چی کار دارید به السیدی؟ قصد دارید یه سری مقدار بریزید رو پورت B ( که فکر میکنم کلا سوویچتونم اشتباهه چون اول بریک میکنید بعد return)
      گاف تاریخی :biggrin:
      ممنون

      دیدگاه


        #48
        پاسخ : سوالات مربوط به زبان C و کدویژن(در میکرو AVR)

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

        ولی بذارید اصل قضیه رو بگم :
        ببینید من میخوام تابلو روانم که جاروب سطری هست رو اطلاعاتش رو یک بیت شیفت به چپ یا راست بدم.
        مشکلم اینه که اگه شیفت دادم و یک خارج شد از اونطرف،اون یکی که خارج میشه بره تو کد ماتریس بعدی و باهاش OR بشه !
        یعنی اون بیتی که خارج میشه از عدد اول،وارد عدد دوم بشه .
        نگفتید طول دیتا آبجکتتون چقدره؟ از نوع char یا int یا long یا ....
        کارای زیادی میشه کرد . مثلا اگر یک بایتی باشه(char ) برای یک شیفت چرخشی به راست :
        کد:
        cRShift(char *output,const char input)
        {
        	*output=( input<<7 ) | ( input >> 1 );	
        }
        
        void main()
        {
        	char y , x=0xa5;
        	cRShift(&y,x);
        	while(1);
        }
        یا به اختصار:
        کد:
        x = (x << 7) | (x >> 1);
        راه اندازی ماژول nrf24l01p برای codevision (ارتباط بیسیم بین دو میکرو) : http://www.eca.ir/forum2/index.php?topic=78587.0
        کوچ کردن از کدویژن به http://www.eca.ir/forum2/index.php?topic=81025.0 : AtmelStudio
        نحوه نوشتن اصولی یک لایبرری و درایور نرم افزاری( بصورت ساده) : http://www.eca.ir/forum2/index.php?topic=81071
        http://www.eca.ir/forum2/index.php?topic=82130.0 سفارش راه انداز ماژول های مختلف توسط اعضای انجمن
        انشالله به زودی تاپیک ها به روز رسانی خواهد شد،

        دیدگاه


          #49
          پاسخ : سوالات مربوط به زبان C و کدویژن(در میکرو AVR)

          نوشته اصلی توسط RubeuS
          نگفتید طول دیتا آبجکتتون چقدره؟ از نوع char یا int یا long یا ....
          کارای زیادی میشه کرد . مثلا اگر یک بایتی باشه(char ) برای یک شیفت چرخشی به راست :
          کد:
          cRShift(char *output,const char input)
          {
          	*output=( input<<7 ) | ( input >> 1 );	
          }
          
          void main()
          {
          	char y , x=0xa5;
          	cRShift(&y,x);
          	while(1);
          }
          یا به اختصار:
          کد:
          x = (x << 7) | (x >> 1);
          ممنون
          دیتا از نوع unsigned char و طول اون 64 هست.

          در ضمن میشه یخورده راجع به آرگومان های ورودی و خروجی در تابع بالا نیز توضیح بدهید ؟

          با تشکر فراوان
          * هر گاه خدا بخواهد بنده ای را خوار کند، دانش را از او دور سازد.
          * سخن بگویید تا شناخته شوید، زیرا که انسان در زیر زبان خود پنهان است.
          *بدترین دوست،آ‌ کسی است که برای او به رنج و زحمت افتی.
          حضرت علی(ع)
          آموزش AVR به ساده ترین زبان ممکن : Noise.Blog.IR

          دیدگاه


            #50
            پاسخ : سوالات مربوط به زبان C و کدویژن(در میکر&#160

            میتونید از تابع زیر استفاده کنید ( که یک استراکچر 64 تایی میگیرد و یک شیفت به راست میدهد و داخل یک استراکچر 64 تایی دیگه میریزد)

            کد:
            void cRShift(struct buff *output,const struct buff *input)
            {
            	int i;
            	output->data[0]=( ( input->data[0] ) >> 1 ) | ( ( input->data[63] ) << 7 );
            	for (i=1 ; i<sizeof(*input) ;i++)
            	{
            		output->data[i]=( ( input->data[i] ) >> 1 ) | ( ( input->data[i-1] ) << 7 );
            	}
            }
            که استراکچر هم اینجوری تعریف کنید:
            کد:
            struct buff 
            {
            	unsigned char data[64];
            };
            یک مثال ازش :
            کد:
            struct buff 
            {
            	unsigned char data[64];
            };
            void cRShift(struct buff *output,const struct buff *input)
            {
            	int i;
            	output->data[0]=( ( input->data[0] ) >> 1 ) | ( ( input->data[63] ) << 7 );
            	for (i=1 ; i<sizeof(*input) ;i++)
            	{
            		output->data[i]=( ( input->data[i] ) >> 1 ) | ( ( input->data[i-1] ) << 7 );
            	}
            }
            
            void main()
            {
            	struct buff x,y;
            	int i;
            	for (i=0;i<64;i++)
            	{
            		x.data[i]=0xAA;
            	}
            // x : 0xAA 0xAA 0xAA ....
            	cRShift(&y,&x);
            	// y : 0x55 0x55 0x55 ....
            	while(1);
            }

            در رابطه با آرگومان ها هم در همین تابع:
            یک اشاره گر به استراکچر میگیرد( اشاره گر output )
            یک اشاره گر دیگر به استراکچر میگیرد که ثابت است و نباید جایی که بهش اشاره میکند، تغییر کند(اشاره گر input )

            برای فراخوانی این تابع باید دو آدرس( & ) استراکچر بش بدیم.

            راه اندازی ماژول nrf24l01p برای codevision (ارتباط بیسیم بین دو میکرو) : http://www.eca.ir/forum2/index.php?topic=78587.0
            کوچ کردن از کدویژن به http://www.eca.ir/forum2/index.php?topic=81025.0 : AtmelStudio
            نحوه نوشتن اصولی یک لایبرری و درایور نرم افزاری( بصورت ساده) : http://www.eca.ir/forum2/index.php?topic=81071
            http://www.eca.ir/forum2/index.php?topic=82130.0 سفارش راه انداز ماژول های مختلف توسط اعضای انجمن
            انشالله به زودی تاپیک ها به روز رسانی خواهد شد،

            دیدگاه


              #51
              پاسخ : سوالات مربوط به زبان C و کدویژن(در میکرو AVR)

              دستوری هست تو C که مثل بسکام یک پورت رو toggle کنه ؟

              دیدگاه


                #52
                پاسخ : سوالات مربوط به زبان C و کدویژن(در میکرو AVR)

                نوشته اصلی توسط navid.h
                دستوری هست تو C که مثل بسکام یک پورت رو toggle کنه ؟
                toggle کردن کل پینهای پورت A
                کد:
                PORTA=~PORTA;
                کلا عملگر ~ به منظور نقیض کردن منطقی ( NOT ) بکار میرود.
                راه اندازی ماژول nrf24l01p برای codevision (ارتباط بیسیم بین دو میکرو) : http://www.eca.ir/forum2/index.php?topic=78587.0
                کوچ کردن از کدویژن به http://www.eca.ir/forum2/index.php?topic=81025.0 : AtmelStudio
                نحوه نوشتن اصولی یک لایبرری و درایور نرم افزاری( بصورت ساده) : http://www.eca.ir/forum2/index.php?topic=81071
                http://www.eca.ir/forum2/index.php?topic=82130.0 سفارش راه انداز ماژول های مختلف توسط اعضای انجمن
                انشالله به زودی تاپیک ها به روز رسانی خواهد شد،

                دیدگاه


                  #53
                  پاسخ : پاسخ : سوالات مربوط به زبان C و کدویژن(در میکر 

                  نوشته اصلی توسط RubeuS
                  میتونید از تابع زیر استفاده کنید ( که یک استراکچر 64 تایی میگیرد و یک شیفت به راست میدهد و داخل یک استراکچر 64 تایی دیگه میریزد)

                  کد:
                  void cRShift(struct buff *output,const struct buff *input)
                  {
                  	int i;
                  	output->data[0]=( ( input->data[0] ) >> 1 ) | ( ( input->data[63] ) << 7 );
                  	for (i=1 ; i<sizeof(*input) ;i++)
                  	{
                  		output->data[i]=( ( input->data[i] ) >> 1 ) | ( ( input->data[i-1] ) << 7 );
                  	}
                  }
                  که استراکچر هم اینجوری تعریف کنید:
                  کد:
                  struct buff 
                  {
                  	unsigned char data[64];
                  };
                  یک مثال ازش :
                  کد:
                  struct buff 
                  {
                  	unsigned char data[64];
                  };
                  void cRShift(struct buff *output,const struct buff *input)
                  {
                  	int i;
                  	output->data[0]=( ( input->data[0] ) >> 1 ) | ( ( input->data[63] ) << 7 );
                  	for (i=1 ; i<sizeof(*input) ;i++)
                  	{
                  		output->data[i]=( ( input->data[i] ) >> 1 ) | ( ( input->data[i-1] ) << 7 );
                  	}
                  }
                  
                  void main()
                  {
                  	struct buff x,y;
                  	int i;
                  	for (i=0;i<64;i++)
                  	{
                  		x.data[i]=0xAA;
                  	}
                  // x : 0xAA 0xAA 0xAA ....
                  	cRShift(&y,&x);
                  	// y : 0x55 0x55 0x55 ....
                  	while(1);
                  }

                  در رابطه با آرگومان ها هم در همین تابع:
                  یک اشاره گر به استراکچر میگیرد( اشاره گر output )
                  یک اشاره گر دیگر به استراکچر میگیرد که ثابت است و نباید جایی که بهش اشاره میکند، تغییر کند(اشاره گر input )

                  برای فراخوانی این تابع باید دو آدرس( & ) استراکچر بش بدیم.
                  با سپاس فراوان

                  فقط اگه بخوام که یه دیتاهای خاصی از آرایه کدها رو فقط شیفت بدم چی ؟(مثلا فقط عضو 4 و 5 و 6 یک واحد شیفت پیدا کنند ! )
                  یکی دیگه هم این که اگه بخوام به جای یک شیفت،چند تا شیفت بدم ؟
                  ممنون میشم اگه بفرمایید که نحوه استفاده من از تابع صحیحه یا نه :

                  کد:
                  x.data[(i*8)+j] = code[(i*8)+j];
                  از آرایه code وارد کردم به آرایه data تابع شما !

                  بعد اینجوری روی پورت نمایشش میدم :

                  کد:
                  PORTC =y.data[(i*8)+j];
                  در واقع y خروجی شیفت داده شده هست. درسته ؟؟؟

                  بسیار سپاسگذارم

                  * هر گاه خدا بخواهد بنده ای را خوار کند، دانش را از او دور سازد.
                  * سخن بگویید تا شناخته شوید، زیرا که انسان در زیر زبان خود پنهان است.
                  *بدترین دوست،آ‌ کسی است که برای او به رنج و زحمت افتی.
                  حضرت علی(ع)
                  آموزش AVR به ساده ترین زبان ممکن : Noise.Blog.IR

                  دیدگاه


                    #54
                    پاسخ : سوالات مربوط به زبان C و کدویژن(در میکرو AVR)

                    برای دستور قدرمطلق یه متغیر در کدوِیژن دچار اشکال شدم و کامپایلر ارور میده و قبول نمیکنه !

                    میخوام قدرمطلق یه متغیر از نوع Float رو بگیرم .. و بریزم تو خود همون متغیر ..

                    من این دستور رو نوشتم :

                    amper = float fabs(amper(

                    اما ارور میده و میگه Undefine symble float


                    حتی کتابخانه Stdlib.h رو هم اضافه کردم ولی افاقه نکرد .

                    لطفا کمک کنید.. خیلی مهمه .. مرسی

                    دیدگاه


                      #55
                      پاسخ : سوالات مربوط به زبان C و کدویژن(در میکرو AVR)

                      try it
                      amper=(float)fabs(amper);

                      دیدگاه


                        #56
                        پاسخ : سوالات مربوط به زبان C و کدویژن(در میکرو AVR)

                        نوشته اصلی توسط amirmufc
                        برای دستور قدرمطلق یه متغیر در کدوِیژن دچار اشکال شدم و کامپایلر ارور میده و قبول نمیکنه !

                        میخوام قدرمطلق یه متغیر از نوع Float رو بگیرم .. و بریزم تو خود همون متغیر ..

                        من این دستور رو نوشتم :

                        amper = float fabs(amper(

                        اما ارور میده و میگه Undefine symble float


                        حتی کتابخانه Stdlib.h رو هم اضافه کردم ولی افاقه نکرد .

                        لطفا کمک کنید.. خیلی مهمه .. مرسی
                        چرا float رو نوشتین؟
                        float رو بر دارین.

                        amper = fabs(amper(

                        دیدگاه


                          #57
                          پاسخ : پاسخ : سوالات مربوط به زبان C و کدویژن(در &#

                          نوشته اصلی توسط ColooP
                          با سپاس فراوان

                          فقط اگه بخوام که یه دیتاهای خاصی از آرایه کدها رو فقط شیفت بدم چی ؟(مثلا فقط عضو 4 و 5 و 6 یک واحد شیفت پیدا کنند ! )
                          یکی دیگه هم این که اگه بخوام به جای یک شیفت،چند تا شیفت بدم ؟
                          ممنون میشم اگه بفرمایید که نحوه استفاده من از تابع صحیحه یا نه :

                          کد:
                          x.data[(i*8)+j] = code[(i*8)+j];
                          از آرایه code وارد کردم به آرایه data تابع شما !

                          بعد اینجوری روی پورت نمایشش میدم :

                          کد:
                          PORTC =y.data[(i*8)+j];
                          در واقع y خروجی شیفت داده شده هست. درسته ؟؟؟

                          بسیار سپاسگذارم
                          بزارید یکم توضیح بدم:
                          buff یک استراکچر است : استراکچر یک ساختمان داده است که خودمون تعریفش میکنیم و ازاون به بعد مثل int یا char یا... ازش استفاده میکنیم(فقط باید قبل از ایجاد یک دیتا آبجکت از یک استراکچر کلمه کلیدی struct استفاده کنیم(البته تو ++C میتونیم نزاریم) )
                          برای مثال کد زیر 64 تا دیتاآبجکت از نوع char ایجاد و اعلان میکند:
                          کد:
                          char x[64];
                          دیدید که ما char را تعریف نکردیم و چون تو سی یک کلمه کلیدی بود مشکلی ایجاد نشد:

                          اما اگر بخواهیم یک دیتا آبجکت 64 تایی char از نوعی که خودمان تعریف میکنیم ، ایجاد و اعلان کنیم:
                          کد:
                          struct buff
                          {
                                char data[64];
                          };
                          کد:
                          struct buff x;
                          -------------------------------------------------------------------------------
                          خوب برای دستیابی به عناصر یک آرایه از یک ایندکس و [] (یا اشارگر)استفاده میکنیم.

                          ولی در حالت دوم که ما یک دیتا آبجکت به اصطلاح ساختاری داریم چه کار باید؟؟(اگر به اون اشاره گر بگیریم که نمیشه چون اشاره گر به 64 بایت گرفتیم.)
                          برای رسیدن به عناصر داخل یک استراکچر باید از عملگر . استفاده کرد، پس دستورهای زیر درصورتی که مقدار ایندکس از 63 تجاوز نکند درست است:
                          کد:
                          x.data[(i*8)+j] = code[(i*8)+j];
                          کد:
                          PORTC =y.data[(i*8)+j];
                          بله در کدی که قرار دادم y خروجی و x ورودی است.


                          در رابطه با شیفت های چندتایی هم من اینارو توضیح دادم تا شما خودتون برید انجامش بدید: برای اینکار خودتون کدی بنویسید و اگر جواب نگرفتید و اشکال داشت ، بهم بگید تا کدتون را نگاه کنم و بگم کجای دیگاه تون اشتباه بوده (میگم دیدگاه چون اکثرا مشکلشون اینه که دیدگاه شون در رابطه با سی اشکال داره).
                          ( اگر دوست ندارید اینجا قرار بدید میتونید خصوصی بزنید.)
                          راه اندازی ماژول nrf24l01p برای codevision (ارتباط بیسیم بین دو میکرو) : http://www.eca.ir/forum2/index.php?topic=78587.0
                          کوچ کردن از کدویژن به http://www.eca.ir/forum2/index.php?topic=81025.0 : AtmelStudio
                          نحوه نوشتن اصولی یک لایبرری و درایور نرم افزاری( بصورت ساده) : http://www.eca.ir/forum2/index.php?topic=81071
                          http://www.eca.ir/forum2/index.php?topic=82130.0 سفارش راه انداز ماژول های مختلف توسط اعضای انجمن
                          انشالله به زودی تاپیک ها به روز رسانی خواهد شد،

                          دیدگاه


                            #58
                            پاسخ : سوالات مربوط به زبان C و کدویژن(در میکرو AVR)

                            سلام خدمت دوستان عزیز.
                            یه کدی نوشتم. کدویژن یه ارور مسخره میده میگه program had no main function :eek:
                            اینم کدش
                            کد:
                            #include <mega32.h>
                            #include <delay.h>
                            #include <stdlib.h>
                            long int s,b,m; 
                            unsigned char chartbl[]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
                            void main (void) { 
                              s=0;
                              b=0;
                              DDRD = 0xff;
                              DDRC = 0xff;
                              TCCR0 = 0x01;
                              TCNT0 = 0x00;
                              OCR0 = 0xC8;
                              TIMSK = 0x02;
                              #asm("sei")
                              while (1){ 
                              PORTC = 0x01;
                              delay_ms (1000);
                              PORTC = 0x02;
                              delay_ms (1000);
                              PORTC = 0x04;
                              delay_ms (1000);
                              PORTC = 0x08;
                              delay_ms (1000);
                              }}
                                 
                            interrupt [TIM0_COMP] void timer0_comp_isr (void)
                            {
                            
                              b++;
                              if (b==40000)
                              {   
                                s++;
                                b=0;  
                                PORTA.0 =~ PORTA.0 ; 
                            }}
                            کسی به این مشکل برنخورده ؟ :angry:

                            دیدگاه


                              #59
                              پاسخ : سوالات مربوط به زبان C و کدویژن(در میکرو AVR)

                              چه جوری میشه از eeprom خوند و توش نوشت.. ؟

                              در واقع من دو تا متغیر تو eeprom تو کدویژن تعریف کردم، و کد بسکامم واسه این قطعه به این شکل زیر هست .. :

                              If Currenteeprom < 0 Then

                              Currenteeprom = 0

                              Writeeeprom Currenteeprom , 10

                              End If

                              تمام قسمت ها درست میشه نوشت به غیر از دستور Writeeepromو readeeprom .. معادل این دو دستور در کدویژن چی هست؟

                              یعنی در واقع من با اون دستور میخوام محتوای Currenteeprom رو ، توی آدرس 10 eeprom بریزم.. حالا این کار به چه روشی انجام میپذیره ؟ اصلا نیاز به نوشتنش توی کدویژن هست؟

                              دیدگاه


                                #60
                                پاسخ : سوالات مربوط به زبان C و کدویژن(در میکرو AVR)

                                سلام
                                یه سوال داشتم در مورد برنامه نویسی ADC.
                                یه برنامه نوشتم در مورد سنسور LM35. یه وقفه 3 ثانیه ای درست کردم که توی وقفه اعمال خوندن ADC رو انجام میده. به یه ایرادی برخورده که وقتی تو پروتئوس اجرا میکم بعد از یه مدتی ارور میده که "result is not written to the ADC register because it has been locked" هر کاری کردم درست نشد.
                                تنظیمات اولین ASCSRA و ADMUX:
                                کد:
                                  ADMUX = 0xC1;   
                                  ADCSRA = 0xA3;
                                و اینم قسمت وقفه:
                                کد:
                                  interrupt [TIM2_COMP] void timer0_comp_isr(void)
                                  { 
                                  a++;
                                    if (a==375)
                                    {  ADCSRA = ADCSRA | 0x40;            
                                      for (i=0;i<=199;i++){
                                      data = ADCW; 
                                      sum =sum+data;
                                      }  
                                      sum = sum/200; 
                                      temp = sum*2.56/1024;
                                      a=0;  
                                      t1 = temp/10;
                                      t2 = temp%10;
                                      } 
                                   }
                                فلگ ADIF هم تغییر دادم اما باز هم نشد . ارور روی قسمت زیر بوجود میاد :
                                کد:
                                      data = ADCW;
                                راه حلی دارید ؟

                                دیدگاه

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