اطلاعیه

Collapse
No announcement yet.

مشکل با کد ویژن AVR

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

    مشکل با کد ویژن AVR

    سلام

    من در استفاده از کامپایلر Codevision به یه مشکلی برخوردم! اونم اینه که وقتی دستور زیر رو برای میکروکنترلرم که ATmega8 هست می نویسم کار نمی کنه!

    لطفا کمکم کنید. من در زیر فقط اون خطی از کد رو که کار نمیکنه بهمراه نوع متغیرهام قرار میدم.
    لطفا ببینید چرا کار نمیکنه؟

    کد:
    char flash*s1="MRK"; 
    char Enter=13; 
    printf("lcd%p%c",s1,Enter);

    اَللّهُمَ صَلّ عَلی مُحَمَّد وَ آلِ مُحَمَّد وَ عَجّل الفَرَجَهُم

    {خلاف قوانین}
    [img width=124 height=100]http://mortezark.persiangig.com/image/Web/6_3.PNG[/img]

    #2
    پاسخ : مشکل با کد ویژن AVR

    سلام.........
    اولا لازم نیست برای تعریف متغیر تو حافظه فلش از اشاره گرها استفاده کنی پس او ستاره رو از پشت s1 بردار بعدم نوعش رو بکن int یا unsigned int. توی دستور printf هم p% رو هم عوض کن بکن d% و نهایتا اینکه دستوری به اسم printf نداریم و اصلش sprintf و ارگومان اولش هم باید یه ارایه باشه ارگومان دوم متنی که می خوای نمایش بدی و ارگومان سوم هم متغیر هایی که می خوای بعد از متن به جای اون d% ,c% نمایش بدی و بعد از sprintf یه دستور lcd_puts می زاری و ارگومانش هم ارایه ای که به عنوان ارگومان اول تابع sprintf انتخاب کردی.
    http://www.eca.ir/forum2/index.php/topic,10159.0.html
    Engineering is the art of making what you want from things you can get.
    اموزش DSP ...........................
    http://www.eca.ir/forum2/index.php?topic=29824.0
    http://www.eca.ir/forum2/index.php?topic=32324.0

    دیدگاه


      #3
      پاسخ : مشکل با کد ویژن AVR

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

      ولی نمیشه که! آخه من می خوام یه رشته بفرستم به پورت سریال حالا چطور باید متغیرشو از نوع int تعریف کنم؟

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

      کد کامل رو گذاشتم با شبیه سازیش توی پروتیوس 7.6 ببین می تونی جواب بگیری؟

      من که کچل شدم ولی نتونستم!

      لینک شبیه سازی : http://mortezark.persiangig.com/othe...8%B2%D9%8A.rar

      کد:
      /*****************************************************
      Chip type       : ATtiny2313
      AVR Core Clock frequency: 7.372800 MHz
      Memory model      : Tiny
      External RAM size   : 0
      Data Stack size    : 32
      *****************************************************/
      
      #include <tiny2313.h>
      #include <stdio.h>
      #include <delay.h>
      
      char flash*s="MRK is the best";
      char flash*s1="MRK";
      
      char Enter=13;
      char linefeed=10;
      char st[]="MRK";
      
      void main(void)
      {
      
      // Crystal Oscillator division factor: 1
      #pragma optsize-
      CLKPR=0x80;
      CLKPR=0x00;
      #ifdef _OPTIMIZE_SIZE_
      #pragma optsize+
      #endif
      
      
      PORTA=0x00;
      DDRA=0x00;
      
      PORTB=0x00;
      DDRB=0xff;
      
      PORTD=0x00;
      DDRD=0x00;
      
      // USART initialization
      // Communication Parameters: 8 Data, 1 Stop, No Parity
      // USART Receiver: On
      // USART Transmitter: On
      // USART Mode: Asynchronous
      // USART Baud Rate: 9600
      UCSRA=0x00;
      UCSRB=0x18;
      UCSRC=0x06;
      UBRRH=0x00;
      UBRRL=0x2F;
      
      
      while (1)
         {
         
         if (PIND.4==1) {
         
         printf("cls%c",Enter);
         delay_ms (100);
         
         printf("lcd%p",s1);
         delay_ms (500);
         
         printf("lcd%s",st);
         delay_ms (100);
         
         printf("lcd%p",s1,"%c",Enter);
          
         delay_ms (100);
         
         printf("cursor on 200,5%c",Enter);
             
       }
      
         };
      }
      البته اینم بگم که برنامه تا خط printf("lcd%s",st); کار میکنه ولی همینکه می خوام کد اسکی دکمه ی enter که همون 13 هست رو بفرستم قاطی می کنه،در واقع وقتیکه می خوام دو مقدار بفرستم روی پورت سریال که یکیش رشته هست یکیشم کاراکتر.
      دیگه دارم روانی میشم از دست این زبان C


      اَللّهُمَ صَلّ عَلی مُحَمَّد وَ آلِ مُحَمَّد وَ عَجّل الفَرَجَهُم

      {خلاف قوانین}
      [img width=124 height=100]http://mortezark.persiangig.com/image/Web/6_3.PNG[/img]

      دیدگاه


        #4
        پاسخ : مشکل با کد ویژن AVR

        به نظرم اگه مستقیما با رجیستر های usart کار کنی راحت تره تا با توابع printf,putchar و غیره حالا من یه نگاهی میندازم ببینم چشه
        http://www.eca.ir/forum2/index.php/topic,10159.0.html
        Engineering is the art of making what you want from things you can get.
        اموزش DSP ...........................
        http://www.eca.ir/forum2/index.php?topic=29824.0
        http://www.eca.ir/forum2/index.php?topic=32324.0

        دیدگاه


          #5
          پاسخ : مشکل با کد ویژن AVR

          سلام
          اولا عرض کنم که printf داریم (منظورتون رو نفهمیدم که گفتین نداریم)
          بعدشم شما که میگین می خواین سریال بفرستین چرا میگین int نمیشه تعریف کرد؟؟؟!!!!!!
          شما تمام انواع متغیر ها رو می تونین با سریال بفرستین
          اون چیزی که شما احتمالا اشتباه کردین باهش "نمایش روی lcd" هست که حتما باید کاراکتری باشه
          در ضمن من زیاد دقت نکردم اما فکر کنم گفتین با atmega 8 کار می کنین پس چرا اون بالا نوشتین #include <tiny2313.h>؟؟؟
          Don't hesitate to ask any question ..

          دیدگاه


            #6
            پاسخ : مشکل با کد ویژن AVR

            سلام

            ممنون از هر دو نفر،من توی تاپیک اول اشتباه گفتم،با ATmega8 نبود،با ATTiny2313 هست.
            منم می دونم که میشه هر متغیری به پورت سریال فرستاد ولی منظورم این بود که نمیشه یک رشته رو به متغیری از نوع int نسبت داد.

            ضمنا من اصلا با LCD کاری ندارم اون کلمه ی LCD که بجای آرگومان دستور Printf نوشتم فقط یه رشتست که می تونه هر چیزی باشه.مثلا Reza.

            اصلا کد رو عوض می کنم. :redface:

            اینم کد عوض شده :
            کد:
            /*****************************************************
            Chip type       : ATtiny2313
            AVR Core Clock frequency: 7.372800 MHz
            Memory model      : Tiny
            External RAM size   : 0
            Data Stack size    : 32
            *****************************************************/
            
            #include <tiny2313.h>
            #include <stdio.h>
            #include <delay.h>
            
            char flash*s="MRK is the best";
            char flash*s1="MRK";
            
            char Enter=13;
            char linefeed=10;
            char st[]="MRK";
            
            void main(void)
            {
            
            // Crystal Oscillator division factor: 1
            #pragma optsize-
            CLKPR=0x80;
            CLKPR=0x00;
            #ifdef _OPTIMIZE_SIZE_
            #pragma optsize+
            #endif
            
            
            PORTA=0x00;
            DDRA=0x00;
            
            PORTB=0x00;
            DDRB=0xff;
            
            PORTD=0x00;
            DDRD=0x00;
            
            // USART initialization
            // Communication Parameters: 8 Data, 1 Stop, No Parity
            // USART Receiver: On
            // USART Transmitter: On
            // USART Mode: Asynchronous
            // USART Baud Rate: 9600
            UCSRA=0x00;
            UCSRB=0x18;
            UCSRC=0x06;
            UBRRH=0x00;
            UBRRL=0x2F;
            
            
            while (1)
               {
               
               if (PIND.4==1) {
               
               printf("Ali%c",Enter);
               delay_ms (100);
               
               printf("Reza%p",s1);
               delay_ms (500);
               
               printf("Reza%s",st);
               delay_ms (100);
               
               printf("Reza%p",s1,"%c",Enter);
              
                   
             }
            
               };
            }

            اَللّهُمَ صَلّ عَلی مُحَمَّد وَ آلِ مُحَمَّد وَ عَجّل الفَرَجَهُم

            {خلاف قوانین}
            [img width=124 height=100]http://mortezark.persiangig.com/image/Web/6_3.PNG[/img]

            دیدگاه


              #7
              پاسخ : مشکل با کد ویژن AVR

              سلام .............
              این برنامه رو برای تست نوشتم جواب داد به نحوه تعریف متغییرها دقت کن مثلا متغیر enter که تعریف کردی و مساوی 13 قرار دادی دو تا کاراکتر حساب میشه و باید از ارایه استفاده کنی یا از int استفاده کنی و متغیر رو به عنوان یک عدد در نظر بگیری.نکته دیگه هم اینکه به این پروتئوس زیاد اطمینان نکن مدا رو عملی ببند بهتره.

              #include <tiny2313.h>
              #include <stdio.h>


              flash char *s1="MRK is the best";
              flash char *s="MRK";
              char *linefeed="10";
              char *enter="13";
              void main(){

              UCSRA=0X00;
              UCSRB=0X08;
              UCSRC=0X86;
              UBRRH=0X00;
              UBRRL=47;
              printf("ali=%s",enter);
              printf("reza=%p",s1);
              printf("reza=%s",linefeed);
              printf("reza=%s",linefeed);
              printf("reza=%p",s);
              while(1){

              }
              }
              http://www.eca.ir/forum2/index.php/topic,10159.0.html
              Engineering is the art of making what you want from things you can get.
              اموزش DSP ...........................
              http://www.eca.ir/forum2/index.php?topic=29824.0
              http://www.eca.ir/forum2/index.php?topic=32324.0

              دیدگاه


                #8
                پاسخ : مشکل با کد ویژن AVR

                ممنون از همکاریت مهندس :agree:

                ولی مثل اینکه شما متوجه برنامه من نشدی. من می خوام یه رشته ی دلخواه به پورت سریال بفرستم و در انتهای این رشته کد اسکی دکمه Enter که میشه عدد دسیمال 13 رو هم بفرستم، با این کار وقتیکه بخوام رشته ی بعدی رو بفرستم اون رشته در خط دوم چاپ میشه! درست مثل این میمونه که شما بخوای توی نرم فازار Word یه متن تایپ کنی! در این صورت هرجا که دکمه ی Enter رو بزنی متن های بعداز اون در خط بعدی چاپ میشن،درسته؟

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

                عکس خروجی برنامه ای که من می خوام اینه :



                اما برنامه شما همه ی خروجی هارو در یک خط چاپ می کنه! ضمن اینکه یکی دوتا کاراکتر اضافه هم چاپ می کنه، که عکسش اینه :



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

                اَللّهُمَ صَلّ عَلی مُحَمَّد وَ آلِ مُحَمَّد وَ عَجّل الفَرَجَهُم

                {خلاف قوانین}
                [img width=124 height=100]http://mortezark.persiangig.com/image/Web/6_3.PNG[/img]

                دیدگاه


                  #9
                  پاسخ : مشکل با کد ویژن AVR

                  اینو تست کن
                  #include <tiny2313.h>
                  #include <stdio.h>
                  #include <delay.h>
                  #define enter 0x0d
                  flash char *s1="MRK is the best";
                  flash char *s="MRK";
                  char *linefeed="10";

                  void main(){

                  UCSRA=0X00;
                  UCSRB=0X08;
                  UCSRC=0X86;
                  UBRRH=0X00;
                  UBRRL=47;
                  printf("reza=%p",s1);
                  putchar(enter);
                  printf("reza=%s",linefeed);
                  putchar(enter);
                  printf("reza=%s",linefeed);
                  putchar(enter);
                  printf("reza=%p",s);
                  while(1){

                  }
                  }
                  http://www.eca.ir/forum2/index.php/topic,10159.0.html
                  Engineering is the art of making what you want from things you can get.
                  اموزش DSP ...........................
                  http://www.eca.ir/forum2/index.php?topic=29824.0
                  http://www.eca.ir/forum2/index.php?topic=32324.0

                  دیدگاه


                    #10
                    پاسخ : مشکل با کد ویژن AVR

                    عالی شد پسر! :nice:

                    فقط اگه بشه همچین کاری با دستور Printf هم کرد محشر می شه. یعنی نمیشه؟
                    امکان نداره ، حتما یه قلقی داره،حالا چی ، من یکی نمی دونم،اما همچنان دنبال کشفشم.

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

                    ممنون

                    اَللّهُمَ صَلّ عَلی مُحَمَّد وَ آلِ مُحَمَّد وَ عَجّل الفَرَجَهُم

                    {خلاف قوانین}
                    [img width=124 height=100]http://mortezark.persiangig.com/image/Web/6_3.PNG[/img]

                    دیدگاه


                      #11
                      پاسخ : مشکل با کد ویژن AVR

                      اینم با دستور printf:
                      #include <tiny2313.h>
                      #include <stdio.h>
                      #include <delay.h>
                      #define enter 0x0d
                      flash char *s1="MRK is the best";
                      flash char *s="MRK";
                      char *linefeed="10";

                      void main(){

                      UCSRA=0X00;
                      UCSRB=0X08;
                      UCSRC=0X86;
                      UBRRH=0X00;
                      UBRRL=47;
                      printf("ali=%p%c",s1,enter);
                      printf("reza=%s%c",linefeed,enter);
                      printf("reza1=%s%c",linefeed,enter);
                      printf("reza2=%p",s);
                      while(1){

                      }
                      }

                      و اما نکتش..............
                      از configure project و از برگهc compiler گزینه sprintf رو روی int بزار حله :agree:
                      http://www.eca.ir/forum2/index.php/topic,10159.0.html
                      Engineering is the art of making what you want from things you can get.
                      اموزش DSP ...........................
                      http://www.eca.ir/forum2/index.php?topic=29824.0
                      http://www.eca.ir/forum2/index.php?topic=32324.0

                      دیدگاه


                        #12
                        پاسخ : مشکل با کد ویژن AVR

                        :wow: :applause: :nice:

                        بابا دمت گرم،نکتش واقعا کنکوری بود.
                        خیلی لطف کردی. ممنون از راهنماییات.

                        بنظرم بحث خوبی بود،این ممکنه مشکل خیلی ها باشه در عین اینکه بسادگی رفع میشه ولی خیلی حساس و دقیق باید بود.

                        احسنت.

                        اَللّهُمَ صَلّ عَلی مُحَمَّد وَ آلِ مُحَمَّد وَ عَجّل الفَرَجَهُم

                        {خلاف قوانین}
                        [img width=124 height=100]http://mortezark.persiangig.com/image/Web/6_3.PNG[/img]

                        دیدگاه


                          #13
                          پاسخ : مشکل با کد ویژن AVR

                          سلام مهندس

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

                          اما حالا به یه مشکل جدید برخوردم!

                          می خوام چندین مقدار به قرار زیر به پورت سریال بفرستم اما نمیشه :

                          (printf(mrk %u , %u%c",wait,repeat,enter

                          که مقدار enter مثل دفعه قبل برابره با : define enter 0x0d#

                          ;unsigned char wait=250
                          ;unsigned char repeat=16

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



                          اما هر کاری می کنم نمیشه ، مثل دفعه قبل با گزینه ی printf هم ور رفتم ولی نشد که نشد.
                          حالا که کم اوردم اومدم سراغ شما! اگه می تونی یه نگاهی بنداز ببین چی میگه این کدویژن!؟

                          اَللّهُمَ صَلّ عَلی مُحَمَّد وَ آلِ مُحَمَّد وَ عَجّل الفَرَجَهُم

                          {خلاف قوانین}
                          [img width=124 height=100]http://mortezark.persiangig.com/image/Web/6_3.PNG[/img]

                          دیدگاه


                            #14
                            پاسخ : مشکل با کد ویژن AVR

                            یه نکته ی جالب! :eek:

                            الآن همین کاریو که می خواستم با کدویژن انجام بدم ولی نشد رو توی کامپایلر CCS 4.0 برای میکروکنترلر PIC 16F877 تست کردم،حتی از کد های پیچیده تر هم استفاده کردم که کامل جواب داد!

                            حالا من موندم چرا کدویژن با این کد مشکل داره؟ :question:

                            من کدی که واسه PIC نوشتم به همراه فایل شبیه سازیش با پروتیوس 7.6 رو میذارم که ببینید.



                            کد:
                            #include <16F877.h>
                            #use delay(clock=7372800)
                            #use rs232(uart1, baud=9600)
                            #define use_portb_lcd TRUE
                            #include <lcd.c>
                            
                            
                            char Enter=13;
                            
                            char s[]="MRK";
                            char s1[]="Rahimi";
                            
                            unsigned char x=2;
                            unsigned char i;
                            unsigned char wait1=250;
                            
                            void main() { 
                             lcd_init();
                             while (1) { 
                            
                               if( input(PIN_A0)==1 )
                                {
                                printf("cls%c",Enter);
                                printf("locate 1,1%c",Enter);
                                printf("lcd Morteza%c",Enter);
                                delay_ms (1200);
                            
                                 for (i=1;i<17;i++)
                                  {
                                  printf("shiftlcd right%c",Enter);
                                  delay_ms (250);
                                  }
                                  
                                 printf("shiftlcd left%u,%u%c",250,16,Enter); 
                                 printf("cls%c",Enter);
                                 printf("shiftcursor right 250,16%c",Enter);
                                 delay_ms (4000);
                                 
                                 printf("shiftcursor left%u,%u%c",wait1,16,Enter);
                                 delay_ms (8000);
                                 
                                 printf("locate%u,%u%c",2,x,Enter);
                                 printf("lcd ?%sAli %s%c",s,s1,Enter);
                                 delay_ms (2500);
                                 
                                 printf("Display off%c",Enter);
                                 delay_ms (3000); 
                                 
                                 printf("display on%c",Enter);
                                 printf("cursor blink%c",Enter);
                                 delay_ms (6000);
                                 
                                 printf("Blt off%c",Enter);
                                 delay_ms (2000);
                                 printf("blt on%c",Enter);
                                
                                 printf("locate 1,1%c",Enter);
                                 printf("ch2%c",Enter);
                                     
                                }
                                
                             }
                            }

                            اینم لینک دانلود (کد + فایل شبیه سازی) ==> http://www.persiangig.com/pages/down...8%B2%D9%8A.rar

                            لطفا یه فکری به حال این کدویژن بکنید. من که روانی شدم. :cry2:

                            اَللّهُمَ صَلّ عَلی مُحَمَّد وَ آلِ مُحَمَّد وَ عَجّل الفَرَجَهُم

                            {خلاف قوانین}
                            [img width=124 height=100]http://mortezark.persiangig.com/image/Web/6_3.PNG[/img]

                            دیدگاه


                              #15
                              پاسخ : مشکل با کد ویژن AVR

                              مهندس علی که نیستن.

                              از دوستان کدویژنی کسی نمی دونه که مشکل از کجاست؟ :eek:
                              یعنی ما برنامه نویس کدویژن نداریم اینجا؟ oo:

                              امکان نداره کدویژن کدی رو که بسکام می تونه اجرا کنه ، اجرا نکنه. محاله که C انقدر ضعیف باشه یا کامپایلر باگ داشته باشه. :sad:

                              من تعجب می کنم که از بین این همه مهندس هیچکی تا حالا با این مشکل روبرو نشده! یه آقای ali833 داشتیم که اونم غایبه. پس بقیه چطوری باAVR کار می کنن؟ :question:

                              من که با بسکام کار می کنم. ولی الآن کدویژن لازممه.

                              تورو خدا یه راه حلی پیش پای این حقیر بندازید. :angry:

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

                              من چشم به راهم! :cry2:

                              اَللّهُمَ صَلّ عَلی مُحَمَّد وَ آلِ مُحَمَّد وَ عَجّل الفَرَجَهُم

                              {خلاف قوانین}
                              [img width=124 height=100]http://mortezark.persiangig.com/image/Web/6_3.PNG[/img]

                              دیدگاه

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