اطلاعیه

Collapse
No announcement yet.

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

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

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

    نوشته اصلی توسط کنجکاو!
    نه!
    چون اولاً که سخت افزار کاملاً با کدویژن جواب داده
    دوماً این برنامه روی پروتئوس هم جواب نداد!

    من دارم به این نتیجه میرسم مشکل از Atmel Studio باشه چون آقا صرامی که از کدشون جواب گرفتن!
    اتمل استودیو که مشکلی نداره...من کدهایی که خودم نوشتم رو داخل پروتئوس تست میکنم درسته ولی در عمل مشکل داره!

    شما فرکانس میکرو رو داخل تنظیمات پروژه دیفاین میکنید؟
    آقای صرامی فکر کنم با winavr نوشتن که داخل make file خودشون اضافه کردند...شما باید توی تنظیمات پروژه دیفاینش کنید...
    اگه جایی از کلاک سیستم بخاد استفاده بشه باید اون مورد دیفاین بشه....
    تولید کننده تجهیزات برنامه پذیر اتوماسیون صنعتی

    www.intelart.ir


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

    دیدگاه


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

      آره فرکانس رو مشخص کردم اول برنامه:
      کد:
      #ifndef F_CPU
      	#define F_CPU 8000000UL
      #endif
      بدبختی اینجاس برنامه رو پروتئوسم اجرا نمیشه برای من!
      برای همینه که میگم احتمالاً مشکل موقع کمپایل بوجود اومده شاید!

      کد آقای صرامی هم روی مگا16 نوشته شده، حالا فردا سعی میکتم با این میکرو هم تست کنم.

      ممنون از توجهت

      «پشتکار» «پشتکار» «پشتکار»

      دیدگاه


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

        نوشته اصلی توسط کنجکاو!
        سلام خدمت دوستان عزیز،
        من یه مشکل اساسی کلاً با راه اندازی USART با ATMEL Studio دارم که کلاً بیزارم کرده ازش :|
        اینقد که من سر usart با اتمل اذیت شدم سر راه انداختن usart همراه با وقفه و dma توی armها اذیت نشدم!
        البته فک کنم بیشتر مشکلم با رشته ها باشه!
        این برنامه مشکلش چطور حل میشه؟
        کد:
        #include <avr/io.h>
        //#include <avr/iom8a.h>
        #include <util/delay.h>
        #include <avr/interrupt.h>[color=red]
        #include "avrlibdefs.h"
        #include "global.h"[/color]
        #include <stdio.h>
        #include <string.h>
        
        /* Global Variables Declaration */
        char rc_data;
        char i = 0;
        
        /* Function Declaration */
        void MicroInit(void);
        void usartSend(const char *strr);
        unsigned char intvalue(char ch);
        
        ISR (USART__RXC_vect)
        {
        	while(!(UCSRA & (1<<RXC)));
        	rc_data = UDR;	
        	UCSRA|=(1<<RXC);
        }
        
        int main(void)
        {
        	/* Local Variables Declaration */
        	unsigned char j;
        	char *m_rx_buffer;
        	
        	MicroInit();
        	
        	sei();
        	
        	usartSend("Test\r\n");
        	_delay_ms(400);
        	
          while(1)
          {
            if (rc_data != 0)
            {
        			usartSend(rc_data);
        				rc_data = 0;
        		}							
        		PORTB = ~PORTB;
        		_delay_ms(200);
          }
        }
        
        void MicroInit(void)
        {
        	/* Ports Configuration */
        	PORTB = 0x00;
        	DDRB = 0x01;
        	PORTC = 0x18;
        	DDRC = 0x08;
        	PORTD = 0x04;
        	DDRD = 0x00;
        	/* USART Initialization */
        	UCSRB = [color=red](0<<TXCIE) [/color]| (1<<TXEN) | [color=red](1<<RXCIE)[/color] | (1<<RXEN);
        	UCSRC = (1<<URSEL) | (1<<UCSZ1) | (1<<UCSZ0) ;
        	UBRRL = 0x19;
        }
        
        void usartSend(const char *strr)
        {
        	while (*strr)
        	{
        		UDR = *strr;
        		strr++;
        		while(!(UCSRA & (1<<TXC)));
        		UCSRA|=(1<<TXC);
        	}	
        }
        همونطور که میبینین در همین کمترین حالتش هم جواب نمیده برنامه!

        - - - - = بعد ویرایش = - - - -
        باودریت میکرو رو 19200 گذاشتم و از یک مگا8ای و کریستال 8مگ استفاده میکنم.
        سلام
        اگه برنامه تون کار می کرد جا تعجب داشت!!!!!( جالبخ تو کدویژن جواب داده )
        دوست عزیز من برنامه شما رو توی winavr کامپایل کردم ، مشکل داشت، مگه توی atmel studio خطا ها رو چک نمیکنین:
        اول از همه خیلی شلوغ کاری سعی کنید ساده تر بنویسید. منم بلد نیستم ها! ولی در کل یه جور بنویسید که اگه سال دیگه هم خوندید خودتون منظورتون رو بفهمید.

        کد:
        main.c:19: warning: 'USART__RXC_vect' appears to be a misspelled signal handler
        main.c: In function 'main':
        main.c:43: warning: passing argument 1 of 'usartSend' makes pointer from integer without a cast
        ۲ تا ایراد :
        ۱- نامی که برای مدیریت وقفه دریافت گذاشتین اشتباهه==> خیلی ریز بشین...
        http://www.nongnu.org/avr-libc/user-manual/group__avr__interrupts.html
        2- شما تابع ارسال رو به صورتی تعریف کردین که آدرس متغییر رو دریافت میکنه و از طریق اون ارسال میکنه اما در عمل دارین خود متغییر رو بهش پاس میدین!
        بقول مرحوم استاد آقازاده این دو تا علی الظاهر هشدار ترجمه می شوند اما رفعشون مهمتر از رفع خطاست!( شادی روحش صلوات ...) برنامه بدون مشکل کامپایل میشه اما در عمل کار نخواهد کرد.
        اصلا چیزی دریافت نمیکنه و بعد هم اگه داده ای بگیره داره عبارت نول رو به خروجی می فرسته...

        دیدگاه


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

          نوشته اصلی توسط punisher.x64
          آقا ممکنه مشکل سخت افزاری باشه؟
          من از کریستال دقیق 11.0592 و باود ریت 9600 استفاده میکنم رشته رو داخل پروتئوس درست ارسال میکنه ولی عملی که تست میکنم نمیتونه کامل ار سال کنه...
          چند رشته که هرکدوم در حدود 70 یا 80 کاراکتر دارند رو باید پشت سر هم ارسال کنه....
          با چی دریافت میکنی؟
          نرم افزار های دریافت کننده محدودیت بافر دارند ، به این نکته توجه داشته باشید.
          درضمن در ارسالهای طولانی بصورت سکشن ،سکشن ارسال کنید تا در طرف گیرنده پردازشگر اشتباه نکنه(مثلاً 50 بایت در هر سکشن و 50میلی ثانیه تاخیر)
          موفق باشید
          امام علی (علیه السلام) : الزکات العلم نشرهُ/ زکات علم نشر آن است

          دیدگاه


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

            نوشته اصلی توسط dostajn
            سلام
            اگه برنامه تون کار می کرد جا تعجب داشت!!!!!( جالبخ تو کدویژن جواب داده )
            دوست عزیز من برنامه شما رو توی winavr کامپایل کردم ، مشکل داشت، مگه توی atmel studio خطا ها رو چک نمیکنین:
            اول از همه خیلی شلوغ کاری سعی کنید ساده تر بنویسید. منم بلد نیستم ها! ولی در کل یه جور بنویسید که اگه سال دیگه هم خوندید خودتون منظورتون رو بفهمید.

            کد:
            main.c:19: warning: 'USART__RXC_vect' appears to be a misspelled signal handler
            main.c: In function 'main':
            main.c:43: warning: passing argument 1 of 'usartSend' makes pointer from integer without a cast
            2 تا ایراد :
            1- نامی که برای مدیریت وقفه دریافت گذاشتین اشتباهه==> خیلی ریز بشین...
            http://www.nongnu.org/avr-libc/user-manual/group__avr__interrupts.html
            2- شما تابع ارسال رو به صورتی تعریف کردین که آدرس متغییر رو دریافت میکنه و از طریق اون ارسال میکنه اما در عمل دارین خود متغییر رو بهش پاس میدین!
            بقول مرحوم استاد آقازاده این دو تا علی الظاهر هشدار ترجمه می شوند اما رفعشون مهمتر از رفع خطاست!( شادی روحش صلوات ...) برنامه بدون مشکل کامپایل میشه اما در عمل کار نخواهد کرد.
            اصلا چیزی دریافت نمیکنه و بعد هم اگه داده ای بگیره داره عبارت نول رو به خروجی می فرسته...
            سلام و ممنون از پاسختون
            در مورد نام وقفه من دقیقاً نامی که توی کتابخونه مگا8 دیفاین شده بود رو کپی کردم و استفاده کردم و اگه همونجا توی تابع وقفه مینوستم UDR = rc_data; جواب میداد.
            در مورد ارسال رشته به تابع هم متوجه نشدم دقیق :|
            اینطور که شما میگید پس چطور اون رشته اول (Test) نمایش داده میشه؟

            «پشتکار» «پشتکار» «پشتکار»

            دیدگاه


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

              نوشته اصلی توسط کنجکاو!
              سلام و ممنون از پاسختون
              در مورد نام وقفه من دقیقاً نامی که توی کتابخونه مگا8 دیفاین شده بود رو کپی کردم و استفاده کردم و اگه همونجا توی تابع وقفه مینوستم UDR = rc_data; جواب میداد.
              در مورد ارسال رشته به تابع هم متوجه نشدم دقیق :|
              اینطور که شما میگید پس چطور اون رشته اول (Test) نمایش داده میشه؟
              سلام نه
              نام همین شکلی هست با یه تفاوت جزیی،آ‌ باید ریزتر بشین( راهنمایی:آ‌نام وکتور رو از برنامه کپی کنید و تو اون آدرس سرچ کنید ببینید هست یانه؟ یه حرف اضافه زدین ... )
              رشته اول ثابته و احتمالا در حافظه میکرو ذخیره میشه و آدرس برگشت داده میشه اما تو حالت دوم شما داده دینامیک دارین و باید مشخص کنید این داده کچا ذخیره شده، چون ما نداریم آدرس رو میایم با یهآ‌& به اول متغییر آدرس رو برای تابع ارسال می کنیم:
              کد:
              [left]
              ISR (USART_RXC_vect)
              *
              *
              *
              usartSend(&rc_data);
              [/left]

              دیدگاه


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

                برنامه خودت را اصلاح کن تا عیبش را بفهمی
                اول تابع ارسال را بهینه کن:
                کد:
                void usartSend(const char *strr)
                {
                	while (*strr)
                	{
                		UDR = *strr++;
                		while(!(UCSRA & (1<<TXC)));
                	}	
                }
                برای وقفه دریافت باید این طور بنویسی(به تعداد underline ها توجه کن!)
                کد:
                ISR (USART_RXC_vect)
                {
                if(!(UCSRA & (_BV(FE) | _BV(PE) | _BV(DOR)))) /* Check data*/
                rc_data = UDR;	
                }
                ولی یک اشکال در کد وقفه بالا هست ؛ شما وقتی دریافت کردید چطور تشخیص میدی؟ باید از Flag استفاده کنی
                کد:
                char Flag=0;
                ISR (USART_RXC_vect)
                {
                if(!(UCSRA & (_BV(FE) | _BV(PE) | _BV(DOR)))) /* Check data*/
                {
                rc_data = UDR;
                Flag=1;	
                }
                }
                حالا با یک شرط کوچولو میتونی دریافت را بفهمی
                کد:
                while(1)
                {
                if(Flag)
                {
                Flag=0;
                // Other Codes
                }
                }
                حالا دیگه مشکلت کجاست؟
                امام علی (علیه السلام) : الزکات العلم نشرهُ/ زکات علم نشر آن است

                دیدگاه


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

                  نوشته اصلی توسط Abbas Sarami
                  برنامه خودت را اصلاح کن تا عیبش را بفهمی
                  اول تابع ارسال را بهینه کن:
                  کد:
                  void usartSend(const char *strr)
                  {
                  	while (*strr)
                  	{
                  		UDR = *strr++;
                  		while(!(UCSRA & (1<<TXC)));
                  	}	
                  }
                  برای وقفه دریافت باید این طور بنویسی(به تعداد underline ها توجه کن!)
                  کد:
                  ISR (USART_RXC_vect)
                  {
                  if(!(UCSRA & (_BV(FE) | _BV(PE) | _BV(DOR)))) /* Check data*/
                  rc_data = UDR;	
                  }
                  ولی یک اشکال در کد وقفه بالا هست ؛ شما وقتی دریافت کردید چطور تشخیص میدی؟ باید از Flag استفاده کنی
                  کد:
                  char Flag=0;
                  ISR (USART_RXC_vect)
                  {
                  if(!(UCSRA & (_BV(FE) | _BV(PE) | _BV(DOR)))) /* Check data*/
                  {
                  rc_data = UDR;
                  Flag=1;	
                  }
                  }
                  حالا با یک شرط کوچولو میتونی دریافت را بفهمی
                  کد:
                  while(1)
                  {
                  if(Flag)
                  {
                  Flag=0;
                  // Other Codes
                  }
                  }
                  حالا دیگه مشکلت کجاست؟
                  کد فکر کنم کار کنه و نیازی به پرچم نیست. چرا؟
                  چون تو تنظیم یوزارت گفته شده که هر گاه دریافت کامل شد وقفه تولید بشه
                  کد:
                  UCSRB = (0<<TXCIE) | (1<<TXEN) | (1<<RXCIE)| (1<<RXEN);

                  دیدگاه


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

                    نوشته اصلی توسط Abbas Sarami
                    با چی دریافت میکنی؟
                    نرم افزار های دریافت کننده محدودیت بافر دارند ، به این نکته توجه داشته باشید.
                    درضمن در ارسالهای طولانی بصورت سکشن ،سکشن ارسال کنید تا در طرف گیرنده پردازشگر اشتباه نکنه(مثلاً 50 بایت در هر سکشن و 50میلی ثانیه تاخیر)
                    موفق باشید
                    سلام عباس جان...
                    با هایپر ترمینال دریافت میکنم...برنامه ای هست که بافرش بیشتر از هایپر باشه؟
                    این قضیه رو نمیدونستم که محدودیت بافر دارند...
                    پس واسه همین بود که توی پروتئوس درست کار میکرد و در عمل اشتباه!

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

                    www.intelart.ir


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

                    دیدگاه


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

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

                      بسیار سپاسگزارم...
                      البته اول مطمئن شو که از محدودیت بافر هست
                      توی گوگل سرچ کن خیلی پیدا میکنی قبلاً هم گفته ام:
                      نوشته اصلی توسط Abbas Sarami
                      این همه ابزار سریال رایگان توی نت
                      فقط یک کمی سرچ نیاز داره
                      http://www.exnol.com/watch-data-flow...serial-watcher
                      http://electronics.stackexchange.com...t-in-windows-8
                      بهتره خودت بنویسی (#C)
                      امام علی (علیه السلام) : الزکات العلم نشرهُ/ زکات علم نشر آن است

                      دیدگاه


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

                        نوشته اصلی توسط dostajn
                        کد فکر کنم کار کنه و نیازی به پرچم نیست. چرا؟
                        چون تو تنظیم یوزارت گفته شده که هر گاه دریافت کامل شد وقفه تولید بشه
                        کد:
                        UCSRB = (0<<TXCIE) | (1<<TXEN) | (1<<RXCIE)| (1<<RXEN);
                        این را که خودم میدونم وقفه پس از دریافت ایجاد میشه (Receive Complete) :eek:

                        اگه دیتا اومد وقفه انجام میشه ، دیتا درون متغیر(یا بافر) ریخته میشه . تا اینجا درست.
                        حالا از کجا تشخیص میدی دیتای جدید در متغیر(یا بافر) ریخته شده؟؟؟؟؟؟؟
                        امام علی (علیه السلام) : الزکات العلم نشرهُ/ زکات علم نشر آن است

                        دیدگاه


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

                          نوشته اصلی توسط Abbas Sarami
                          البته اول مطمئن شو که از محدودیت بافر هست
                          توی گوگل سرچ کن خیلی پیدا میکنی قبلاً هم گفته ام:بهتره خودت بنویسی (#C)
                          احتمالا همون محدودیت بافر باشه... البته اگه بشه به پروتئوس اعتماد کرد!

                          آره...خودمون بنویسیم که بهتره ولی اگه بخوایم کامل باشه و مو لا درزش نره خیلی طول میکشه....
                          این یکی به نظر حرفه ای میاد...هنو وقت نکردم باهاش کار کنم....اگه دوستان ازش نتیجه گرفتن لطفا اعلام کنند :



                          http://sourceforge.net/projects/realterm/
                          تولید کننده تجهیزات برنامه پذیر اتوماسیون صنعتی

                          www.intelart.ir


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

                          دیدگاه


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

                            نوشته اصلی توسط Abbas Sarami
                            این را که خودم میدونم وقفه پس از دریافت ایجاد میشه (Receive Complete) :eek:

                            اگه دیتا اومد وقفه انجام میشه ، دیتا درون متغیر(یا بافر) ریخته میشه . تا اینجا درست.
                            حالا از کجا تشخیص میدی دیتای جدید در متغیر(یا بافر) ریخته شده؟؟؟؟؟؟؟
                            از اینجا:
                            کد:
                              if (rc_data != 0)
                            تو برنامه خودشون دارن چک می کنن ...
                            اگه اطلاعات جدیدی اومده باشه متغییر مخالف صفره==< ارسال میشه و دوباره صفر...
                            در ضمن استفاده از یه متغییر معمولی شایذ باعث بشه متغییر توی optimize کلا از بین بره !!!
                            برنامه realtrem هم من امتحان کردم ازشم راضی ام ولی من اولین باره محدودیت بافر رو می شنوم. ما داریم دیتا رو هشت بیت بیت می فرستیم اون طرف هم نمایش می ده این کجاش بافر میشه؟ سواد زیادی ندارم اما از روی تجربه می گم

                            دیدگاه


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

                              ما داریم دیتا رو هشت بیت بیت می فرستیم اون طرف هم نمایش می ده این کجاش بافر میشه؟ سواد زیادی ندارم اما از روی تجربه می گم
                              دقیقا واسه منم سوال بود ... :eek:
                              تولید کننده تجهیزات برنامه پذیر اتوماسیون صنعتی

                              www.intelart.ir


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

                              دیدگاه


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

                                نوشته اصلی توسط dostajn
                                ولی من اولین باره محدودیت بافر رو می شنوم. ما داریم دیتا رو هشت بیت بیت می فرستیم اون طرف هم نمایش می ده این کجاش بافر میشه؟ سواد زیادی ندارم اما از روی تجربه می گم
                                محدودیت بافر و بحث طول بافر که مشکل آقا مهدی بود (punisher) ربطی به دریافت با وقفه نداشت ... فکر کنم پست ها قاطی شد از این به بعد فقط با نقل قول مینویسم :agree:
                                ---------------------------------------------
                                نوشته اصلی توسط dostajn
                                از اینجا:
                                کد:
                                  if (rc_data != 0)
                                تو برنامه خودشون دارن چک می کنن ...
                                اگه اطلاعات جدیدی اومده باشه متغییر مخالف صفره==< ارسال میشه و دوباره صفر...
                                در ضمن استفاده از یه متغییر معمولی شایذ باعث بشه متغییر توی optimize کلا از بین بره !!!
                                برنامه realtrem هم من امتحان کردم ازشم راضی ام
                                من که هنوز به اصل برنامه نرسیدم و روی اون توضیح بدم و مشکلاتش را بگم
                                طریقه ارسال و دریافت را برای دوستان توضیح دادم نه عملکرد اون برنامه را
                                ولی در مورد دریافت به شکل بافر:
                                استفاده از Flag ، یک استاندارد در دریافت به این شکله.
                                هیچگاه سریال را یک بایت ، یک بایت با وقفه دریافت نمیکنن (بار پردازشی را زیاد میکنه)، یک بافر درنظر میگیرند و درون اون دیتارا نگه میدارند که 2 حالت متداول داره:
                                1- خواندن تا انتهای خط : برای رشته های متنی استفاده میشه و با کرکتر new line پایان میپذیره
                                2- خواندن تا طول دیتای معین : که ممکنه ثابت باشه و یا در پروتکل ارتباطی مشخص شده باشه

                                سوالی بود در خدمتیم

                                موفق باشید



                                امام علی (علیه السلام) : الزکات العلم نشرهُ/ زکات علم نشر آن است

                                دیدگاه

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