اطلاعیه

Collapse
No announcement yet.

کوچ کردن از کدویژن به AtmelStudio

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

    پاسخ : کوچ کردن از کدویژن به AtmelStudio

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

    نوشته اصلی توسط samand
    در ادامه برنامه به 500 برمیگرده:
    کد:
    #include "rtc.h"
    #include "setup.h"
    #include <avr/interrupt.h>
    
    char hour;
    char min;
    char sec;
    
    //This interrupt gets called 500 times a second. It handles the timekeeping
    //and calls the routine responsible for the button interaction (which includes
    //setting up etcetera)
    ISR(TIMER0_COMPA_vect) {
      static unsigned short ticks=500;
      ticks--;  
      if ((ticks&127)==0) btn_tick();
      //If no 500 ticks have passed yet, exit the subroutine.
      if (ticks!=0) return;
      
      //A second has passed.
      ticks=500;
      
      //Adjust sec/min/hour
      sec++;
      if (sec<60) return;
      sec=0; min++;
      if (min<60) return;
      min=0; hour++;
      if (hour<12) return;
      hour=0;
    }
    کد:
    if (ticks!=0) return;
    این میگه اگر مخالف 0 بود از تابع خارج بشو
    اگر مساوی صفر باشه از این دستور رد میشه و
    کد:
    ticks=500;
    ticks برابر با 500 میشه

    کد:
      //Adjust sec/min/hour
      sec++;
      if (sec<60) return;
      sec=0; min++;
      if (min<60) return;
      min=0; hour++;
      if (hour<12) return;
      hour=0;
    این هم که دیگه آسونه
    میگه یکی به sec اضافه کن
    اگر کوچکتر از 60 بود از تابع خارج شو
    اگر مساوی 60 باشه از دستور شرط رد میشه و sec برابر 0 میکنه و یکی به min اضافه میکنه و الی آخر ... بقیه اش دیگه مثل هم هست ...
    موفق باشید
    [b]چگونه همه پایه های میکروکنترلر AVR را PWM کنیم؟
    معرفی نرم افزارEasy 7segment (برای راه اندازی آسانتر 7segment )
    معرفی نرم افزار Codewizard PWM
    با من بیشتر آشنا شوید

    دیدگاه


      پاسخ : کوچ کردن از کدویژن به AtmelStudio

      نوشته اصلی توسط abritco
      ممنون از راهنمایی تون دوست عزیز.
      میشه یه مثال از این کتابخخوانه هم قرار بدید.
      تو init کردن یه مقدار مشکل دارم.
      والا من هم مشکل دارم ... زیاد متوجه نشدم
      ولی یه مثال زده تو خود هدر فایل که میتونه کمکتون کنه
      نوشته اصلی توسط abritco
      یه مشکل دیگه که هست include هاست.
      یه اینکلود داره به نام :
      کد:
      #include "../../../Common/Common.h"
      که اصلا متوجه نمیشم چیه و وقتی کامپایل میکنم ارورو میده.
      بله درسته
      من هم چک کردم دیدم شما درست میگید
      رفتم نگاه کردم دیدم کتابخونه های LUFA برای بردهای شرکت اتمل هست و برای اون دسته بردهایی که USB دارند نوشته شده ...
      من خودم چون با میکروی AT90USB1287 کار میکردم متوجه این مساله نشده بودم ...
      و این فایلی رو هم که براتون گذاشتم کار میکنه ولی تحت شرایط خودش که باید توی یک مسیر خاصی قرار بگیره که اون هدر فایلهای دیگر را اینکلود کنه ...
      بابت این مساله که شما رو هم گمراه کردم عذر خواهی میکنم :redface:
      قصد من کمک کردن بود
      موفق باشید
      [b]چگونه همه پایه های میکروکنترلر AVR را PWM کنیم؟
      معرفی نرم افزارEasy 7segment (برای راه اندازی آسانتر 7segment )
      معرفی نرم افزار Codewizard PWM
      با من بیشتر آشنا شوید

      دیدگاه


        پاسخ : کوچ کردن از کدویژن به AtmelStudio

        نوشته اصلی توسط RubeuS
        با توجه به درخواست جناب سعید دلشاد منور مبنی بر توضیح در رابطه با نحوه ی ارتباط با اینترفیس USART از طریق روش دریافت وقفه یک توضیحات مختصری در این رابطه میدهم:
        قبل از اون در این پست قصد دارم به نحوه نوشتن برنامه ای که در اون از وقفه استفاده شده بپردازم.

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

        قبلش توصیه میکنم برای درک مفهوم پست های زیر را بخونید:
        http://www.eca.ir/forum2/index.php?topic=81025.msg505301#msg505301

        http://www.eca.ir/forum2/index.php?topic=81025.msg505353#msg505353

        خوب چون من تو این تاپیک میخوام بیشتر به نحوه ی برنامه نویسی در محیط اتمل استادیو بپردازم و با فرض اینکه شما دوستان با یه سری اصول توسط برنامه نویسی در محیط کدویژن آشنایید، خیلی مختصر توضیح میدم:
        در اینجا ما فایل هدری به این منظور داریم که باید اینکلود شود:
        کد:
        #include <avr/interrupt.h>
        این هدر توابع خوبی را برای اینکار فراهم میکنند.
        اولین گروه برای فعال و غیر فعال کردن وقفه های سراسری است( صفر و یک کردن فلگ مربوطه ( بیت شماره 7 از رجیستر SREG ) )
        کد:
        sei(); 
        
        cli();
        همون طور که میدونید در کدویژن برای نوشتن روتین یک وقفه از کلمه ی کلیدی interrupt استفاده میشد. ولی اینجا میتونید برای اینکار از تابع ()ISR استفاده کنید.
        چجوری؟
        بتون میگم ... عجله نداشته باشید

        یادتونه تو کدویژن بعد از interrupt چی مینوشتید؟
        اره آفرین... برای مشخص کردن نوع وقفه اسم یا آدرس مربوط به وقفه را در بین دو کروشه مشخص میکردیم.
        برای اینکار در اینجا باید اسم یا آدرس مربوط به وقفه مورد نظر را به عنوان اولین پارامتر به تابع ISR بدید.
        او او ... صبر کنید .. کجا؟ اینجا اسم ها یکم متفاوته!!
        ولی نگران نباشید... برید در فایل هدر مربوط به میکروتون و اسم مربوط به وقفه ی مورد نظرتون رو بدست آورید.
        چی؟ فایل هدر مربوط به میکروتون کجاست؟
        خوب تو پست اول توضیح دادم تو هدر avr/io.h باید بگردید دنبالش .
        من در اینجا هدر مربوط به میکرو مگا32 رو مثال میزنم که هدر مربوطه میشه: avr/iom32.h

        خوب یک قسمتش به صورت کامنت گفته: Interrupt vectors
        من دقیقا دیفاین های زیرش رو براتون میزارم:
        کد:
        /* Interrupt vectors */
        
        /* External Interrupt Request 0 */
        #define INT0_vect_num		1
        #define INT0_vect			_VECTOR(1)
        #define SIG_INTERRUPT0			_VECTOR(1)
        
        /* External Interrupt Request 1 */
        #define INT1_vect_num		2
        #define INT1_vect			_VECTOR(2)
        #define SIG_INTERRUPT1			_VECTOR(2)
        
        /* External Interrupt Request 2 */
        #define INT2_vect_num		3
        #define INT2_vect			_VECTOR(3)
        #define SIG_INTERRUPT2			_VECTOR(3)
        
        /* Timer/Counter2 Compare Match */
        #define TIMER2_COMP_vect_num	4
        #define TIMER2_COMP_vect		_VECTOR(4)
        #define SIG_OUTPUT_COMPARE2		_VECTOR(4)
        
        /* Timer/Counter2 Overflow */
        #define TIMER2_OVF_vect_num		5
        #define TIMER2_OVF_vect			_VECTOR(5)
        #define SIG_OVERFLOW2			_VECTOR(5)
        
        /* Timer/Counter1 Capture Event */
        #define TIMER1_CAPT_vect_num	6
        #define TIMER1_CAPT_vect		_VECTOR(6)
        #define SIG_INPUT_CAPTURE1		_VECTOR(6)
        
        /* Timer/Counter1 Compare Match A */
        #define TIMER1_COMPA_vect_num	7
        #define TIMER1_COMPA_vect		_VECTOR(7)
        #define SIG_OUTPUT_COMPARE1A		_VECTOR(7)
        
        /* Timer/Counter1 Compare Match B */
        #define TIMER1_COMPB_vect_num	8
        #define TIMER1_COMPB_vect		_VECTOR(8)
        #define SIG_OUTPUT_COMPARE1B		_VECTOR(8)
        
        /* Timer/Counter1 Overflow */
        #define TIMER1_OVF_vect_num		9
        #define TIMER1_OVF_vect			_VECTOR(9)
        #define SIG_OVERFLOW1			_VECTOR(9)
        
        /* Timer/Counter0 Compare Match */
        #define TIMER0_COMP_vect_num	10
        #define TIMER0_COMP_vect		_VECTOR(10)
        #define SIG_OUTPUT_COMPARE0		_VECTOR(10)
        
        /* Timer/Counter0 Overflow */
        #define TIMER0_OVF_vect_num		11
        #define TIMER0_OVF_vect			_VECTOR(11)
        #define SIG_OVERFLOW0			_VECTOR(11)
        
        /* Serial Transfer Complete */
        #define SPI_STC_vect_num		12
        #define SPI_STC_vect			_VECTOR(12)
        #define SIG_SPI				_VECTOR(12)
        
        /* USART, Rx Complete */
        #define USART_RXC_vect_num		13
        #define USART_RXC_vect			_VECTOR(13)
        #define SIG_USART_RECV			_VECTOR(13)
        #define SIG_UART_RECV			_VECTOR(13)
        
        /* USART Data Register Empty */
        #define USART_UDRE_vect_num		14
        #define USART_UDRE_vect			_VECTOR(14)
        #define SIG_USART_DATA			_VECTOR(14)
        #define SIG_UART_DATA			_VECTOR(14)
        
        /* USART, Tx Complete */
        #define USART_TXC_vect_num		15
        #define USART_TXC_vect			_VECTOR(15)
        #define SIG_USART_TRANS			_VECTOR(15)
        #define SIG_UART_TRANS			_VECTOR(15)
        
        /* ADC Conversion Complete */
        #define ADC_vect_num		16
        #define ADC_vect			_VECTOR(16)
        #define SIG_ADC				_VECTOR(16)
        
        /* EEPROM Ready */
        #define EE_RDY_vect_num		17
        #define EE_RDY_vect			_VECTOR(17)
        #define SIG_EEPROM_READY		_VECTOR(17)
        
        /* Analog Comparator */
        #define ANA_COMP_vect_num		18
        #define ANA_COMP_vect			_VECTOR(18)
        #define SIG_COMPARATOR			_VECTOR(18)
        
        /* 2-wire Serial Interface */
        #define TWI_vect_num		19
        #define TWI_vect			_VECTOR(19)
        #define SIG_2WIRE_SERIAL		_VECTOR(19)
        
        /* Store Program Memory Ready */
        #define SPM_RDY_vect_num		20
        #define SPM_RDY_vect			_VECTOR(20)
        #define SIG_SPM_READY			_VECTOR(20)
        
        #define _VECTORS_SIZE 84
        شما فقط از دیفاین هایی که آخرش نوشته vect استفاده کنید .

        مثال:
        کدی برای نوشتن روتین وقفه مربوط به سرریز تایمر/کانتر 0 :
        کد:
        ISR(TIMER0_OVF_vect)
        {
        	
        }
        اگه گفتید معادلش تو کدویژن چی بود؟
        آره آفرین . یه چی تو این مایه ها بود:
        کد:
        interrupt[TIM0_OVF] void tim0_ovf_isr()
        {
        	
        	
        	
        }
        اگه میشه توضیح بدید چگونه میتوان یک سنسور مثلا sharp که به واحد آنالوگ به دیجیتال متصل است را با اینتراپت تامیر خواند.

        با تشکر...

        دیدگاه


          پاسخ : کوچ کردن از کدویژن به AtmelStudio

          نوشته اصلی توسط abritco
          سلام.
          میخواستم با i2c کار کنم یه مقدار گشتم ولی چیزی دستگیرم نشد.کسی از کتابخوانه twi تو اتمل استودیو استفاده کرده و میتونه منو راهنمایی کنه.
          میخوام از ds1307 تو کاری استفاده کنم.
          ممنون.
          سلام. پیشنهاد می کنم از کتابخانه آقای fleury استفاده کنید. هم به صورت نرم افزاری و هم به صورت سخت افزاری. بسیار کامل و جامع هست.
          http://homepage.hispeed.ch/peterfleury/i2cmaster.zip

          دیدگاه


            پاسخ : کوچ کردن از کدویژن به AtmelStudio

            نوشته اصلی توسط amirbehzadfar
            اگه میشه توضیح بدید چگونه میتوان یک سنسور مثلا sharp که به واحد آنالوگ به دیجیتال متصل است را با اینتراپت تامیر خواند.

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

            دیدگاه


              پاسخ : کوچ کردن از کدویژن به AtmelStudio

              کد:
              #include <avr/io.h>
              # define F_CPU 8000000UL
              #include "avr/delay.h"
              #include <avr/interrupt.h>
              #define getbit(port,bit) ( ( (port) & (1 << (bit) ) ) >> (bit) )
              
              volatile unsigned char a=0;
              volatile unsigned char b=0;
              volatile unsigned char b1=0;
              
              ISR(TIMER0_COMP_vect)
              {
              	b=b++;
              	PORTA^=(1<<PA0);
              }
              
              int main(void)
              {
              	PORTA=(1<<PA4);
              	DDRA=0xff;
              	DDRB=(1<<PB3);
              	DDRD=(1<<PD5)|(1<<PD4);
              	TCCR0=(1<<CS02)|(1<<COM00);
              	TIMSK=(1<<OCIE0)|(1<<TOIE0);
              	asm ("sei");
              	OCR0=0xa0;
               	while(1)
               	{
              		 PORTB^=(1<<PB3);
              		if (getbit(PIND,2)==1)
              		{
              			PORTD^=(1<<PD5);
               			b=0;
              //			_delay_ms(1000); 
              			while (b<=0x16)
              			{
              				if (b>b1)
              				{
              					b1=b;
              					PORTD^=(1<<PD4);
              				} 
              			}
              				PORTD^=(1<<PD5);
              				if (a==0)
              				{
              					a=a++;
              					TCCR0=(1<<CS02)|(1<<COM00)|(1<<WGM00);
              					PORTA=~(1<<PA4);	
              					PORTA=(1<<PA3);	
              					PORTA=~(1<<PA1);								
              				}
              				else
              				{
              					if (a==1)
              					{
              						a=a++;
              						TCCR0=(1<<CS02)|(1<<COM00)|(1<<WGM01);
              						PORTA=~(1<<PA3);	
              						PORTA=(1<<PA2);	
              					}
              					else
              					{
              						if (a==2)
              						{
              							a=0;
              							TCCR0=(1<<CS02)|(1<<COM00)|(1<<WGM00)|(1<<WGM01);
              							PORTA=~(1<<PA2);	
              							PORTA=(1<<PA1);	
              						}	
              					}
              				}
              		}
               	}
              }
              میشه بگید این برنامه چه موشکلی داره چون بعد از زدن کلید PIND,2 برنامه داخل while نمی مونه و بلافاصله تمام شرط های پایین رو اجرا میکنه چرا؟
              همینطور که در برنامه میبینید من از delay هم استفاده کردم که کار نکرد و بعد از زدن کلید اصلان مکسی رخ نمی داد (delay اتفاق نمی افتادد) ممنون میشم کمک کنید.
              البته این رو هم باید اضافه کنم برنامه داخل خوده اتمل استودیو درست کار می کنه ولی در عمل درست کار نمی کنه

              دیدگاه


                پاسخ : کوچ کردن از کدویژن به AtmelStudio

                یکی از دلایلی که تاخیر نیافتاده میتونه تنظیم اشتباه کلاک باشه
                ----------------------------
                درضمن کد زیر اشتباهه (داخل وقفه تایمر)
                کد:
                b=b++;
                درستش اینه
                کد:
                b++;
                موفق باشید
                امام علی (علیه السلام) : الزکات العلم نشرهُ/ زکات علم نشر آن است

                دیدگاه


                  پاسخ : کوچ کردن از کدویژن به AtmelStudio

                  ممنون از پاسختون مشکل حل شد ایراد از وقفه ovf بود که نوشته نشده بود اما مجوز اجراش داده شده بود بنا براین برنامه بعد از سرریز شدن تایمر زیر روال وقفه رو پیدا نمی کرد و برنامرو دوباره از اول اجرا می کرد
                  کد:
                  	TIMSK=(1<<OCIE0)|(1<<TOIE0);
                  کد:
                  	TIMSK=(1<<OCIE0);

                  دیدگاه


                    پاسخ : کوچ کردن از کدویژن به AtmelStudio

                    سلام.
                    یک حرکت بلعکس نام تاپیک انجام بدیم بد نیست! :mrgreen:
                    کمی مطالعه داشتم و یک حدث هایی هم می زنم ولی برای اطمینان خاطر می پرسم!

                    1) دوستان بفرمایید که pgm_read_byte یعنی چی؟
                    جواب خودم: برای خوندن مقادیر byte از حافظه flash میکرو، حالا درسته یا نه نمی دونم!؟؟؟

                    2) این کد زیر معادلش در کدویژن چی باید استفاده بشه؟
                    کد:
                    B = pgm_read_byte(A);
                    همواره یادمان باشد:
                    1-مردان بزرگ اراده می کنند و مردان کوچک آرزو
                    2-افراد بزرگ، همیشه به دنبال ایده های بزرگند و افراد کوچک به دنبال افراد بزرگ
                    3-همیشه سعی کن آنقدر کامل باشی که بزرگترین تنبیه تو برای دیگران گرفتن خودت از آنها باشد.

                    دیدگاه


                      پاسخ : پاسخ : کوچ کردن از کدویژن به AtmelStudio

                      نوشته اصلی توسط S_Ahmad
                      سلام.
                      یک حرکت بلعکس نام تاپیک انجام بدیم بد نیست! :mrgreen:
                      کمی مطالعه داشتم و یک حدث هایی هم می زنم ولی برای اطمینان خاطر می پرسم!

                      1) دوستان بفرمایید که pgm_read_byte یعنی چی؟
                      جواب خودم: برای خوندن مقادیر byte از حافظه flash میکرو، حالا درسته یا نه نمی دونم!؟؟؟

                      2) این کد زیر معادلش در کدویژن چی باید استفاده بشه؟
                      کد:
                      B = pgm_read_byte(A);
                      درست حدس زدین
                      در کدویژن:
                      کد:
                      B = A;
                      گذشت خصلت مردان است

                      دیدگاه


                        پاسخ : پاسخ : کوچ کردن از کدویژن به AtmelStudio

                        نوشته اصلی توسط S_Ahmad
                        سلام.
                        یک حرکت بلعکس نام تاپیک انجام بدیم بد نیست! :mrgreen:
                        کمی مطالعه داشتم و یک حدث هایی هم می زنم ولی برای اطمینان خاطر می پرسم!

                        1) دوستان بفرمایید که pgm_read_byte یعنی چی؟
                        جواب خودم: برای خوندن مقادیر byte از حافظه flash میکرو، حالا درسته یا نه نمی دونم!؟؟؟

                        2) این کد زیر معادلش در کدویژن چی باید استفاده بشه؟
                        کد:
                        B = pgm_read_byte(A);

                        کد:
                        B = pgm_read_byte(A);
                        دیفاین بالا آدرس دیتاآبجکت رو از شما میخواد ...پس باید اینطور بنویسید :

                        کد:
                        B = pgm_read_byte(&A);
                        تولید کننده تجهیزات برنامه پذیر اتوماسیون صنعتی

                        www.intelart.ir


                        ساخت کنترلر دما PID فازی با AVR [آموزشی]

                        دیدگاه


                          پاسخ : کوچ کردن از کدویژن به AtmelStudio

                          سلام

                          در atmel studio 6 به چه صورت می توان یک متغییر را در یک فایل تعریف و در یک فایل دیگه استفاده کرد؟

                          دیدگاه


                            پاسخ : کوچ کردن از کدویژن به AtmelStudio

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

                            در atmel studio 6 به چه صورت می توان یک متغییر را در یک فایل تعریف و در یک فایل دیگه استفاده کرد؟
                            سلام
                            ساده ترین حالت اینه که یک فایل با پسوند .h تعریف کنید و متغیر هاتونو داخل اون تعریف کنید و در فایل دیگه اون فایل رو اینکلود کنید...
                            تولید کننده تجهیزات برنامه پذیر اتوماسیون صنعتی

                            www.intelart.ir


                            ساخت کنترلر دما PID فازی با AVR [آموزشی]

                            دیدگاه


                              پاسخ : کوچ کردن از کدویژن به AtmelStudio

                              نوشته اصلی توسط امیر راشدی
                              سلام
                              در atmel studio 6 به چه صورت می توان یک متغییر را در یک فایل تعریف و در یک فایل دیگه استفاده کرد؟
                              اگه منظورتون اینه که در یک فایل سورس یک متغیر ایجاد کنی ودر سورس دیگه به اون دسترسی داشته باشی این کار را انجام بده :
                              مثلاً در فایل src1.c متغیری به نام temp ایجاد کردیم و میخواهیم در فایل src2.cبه اون دسترسی داشته باشیم :
                              ابتدا یک هدر فایل برای src1.c میسازیم (مثلاً با نام src1.h) و نام متغییر را این طور توش مینویسیم
                              کد:
                              #ifndef _SRC1_H
                              #define _SRC1_H
                              extern unsigned int temp;
                              #endif
                              حالا این فایل هدر را توی هر دو تا فایل سورس include کن:
                              کد:
                              #inclide "src1.h"
                              و در سورس src1.c متغیرت را تعریف کن:
                              کد:
                              unsigned int temp;
                              و در src2.c از اون استفاده کن:
                              کد:
                              temp +=5;
                              موفق باشید
                              امام علی (علیه السلام) : الزکات العلم نشرهُ/ زکات علم نشر آن است

                              دیدگاه


                                پاسخ : کوچ کردن از کدویژن به AtmelStudio

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

                                مثلا :

                                کد:
                                sprintf(_APP_STRING_BUFFER,"#I%3.1f%3.2f%1.3f%2.1f%1.2f%u",_SP,_Kp,_Ki,_Kd,_EM,_SA);
                                ولی ممکنه که بعضی از مقادیر در طول اجرا تغییر کنند....مثلا _kp که 3 رقم صحیح و 2 رقم اعشاری داره(مثلا 123.1) به یه عدد دیگه مثل 12.5 تغییر کنه...
                                میشه کاری کرد که در هر صورت مقدار تبدیل شده ، عددی با 3 رقم صحیح و 1 رقم اعشاری باشه؟...مثلا اگه مقدار فعلی 12.9 باشه ، داخل رشته تبدیل شده 012.9 بنویسه...میشه اینکارو کرد؟

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

                                www.intelart.ir


                                ساخت کنترلر دما PID فازی با AVR [آموزشی]

                                دیدگاه

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