اطلاعیه

Collapse
No announcement yet.

مشکل در راه اندازی پورت سریال و LCD در کدویژن

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

    مشکل در راه اندازی پورت سریال و LCD در کدویژن

    سلام

    من می خوام با کدویژن یک LCD 2*16 رو راه بندازم. طبق معمول از کد ویزارد استفاده کردم. همه چیز خوبه الا یه چیز؟ اونم اینه که نمی تونم صفحه LCD رو پاک کنم! برای پاک کردنش دستور lcd_clear رو می نویسم ، اما نمیشه. :angry:

    مشکل دوم در راه اندازی پورت سریال هست. می خوام یک رشته رو از وردوی بخونم ، ولی نمی تونم. مثلا فرض کنیم اسم و فامیل افراد از طریق پورت سریال RS232 داره وارد میکروکنترلر میشه و ما قصد داریم این اسم و فامیل رو که بصورت رشته هست بخونیم و روی LCD نشون بدیم. باید چیکار کنیم؟

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

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

    #2
    پاسخ : مشکل در راه اندازی پورت سریال و LCD در کدویژن

    در مورد اینکه LCD پاک نمی شه خیلی برام جالب و نمی دونم که چرا اما در مورد سریال تا انجا که می دانم فقط دستور GETCHAR داره و دستور جهت دریافت یک کلمه نداره اما من معمولا موقع این جور ارسال ها سیتم رو نسبت به یک یا دو کاراکتر حساس می کنم و تا قبل از ان کاری نداره که چی امده و مثلا فقط پند کاراکتر بعد و یا با حساس کردن به یک کاراکتر دیگه برای اتمام کلمه مشکلم رو حل می کنم . این روش هم خواناتر و هم مطمئن تره.

    دیدگاه


      #3
      پاسخ : مشکل در راه اندازی پورت سریال و LCD در کدویژن

      ممنون از پاسختون

      درباره ی پاک شدن LCD وقتیکه برنامه رو کامپایل می کنم یک Warning میده با این مضمون :
      expression with possibly no effect

      که من نمی دونم یعنی چی؟

      در مورد پورت سریال میشه یه تیکه کد بذارید تا بفهمم که چطور برنامه رو نسبت به یک کاراکتر حساس می کنید؟

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

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

      دیدگاه


        #4
        پاسخ : مشکل در راه اندازی پورت سریال و LCD در کدویژن

        نوشته اصلی توسط مرتضی رحیمی
        ممنون از پاسختون

        درباره ی پاک شدن LCD وقتیکه برنامه رو کامپایل می کنم یک Warning میده با این مضمون :
        expression with possibly no effect

        که من نمی دونم یعنی چی؟

        در مورد پورت سریال میشه یه تیکه کد بذارید تا بفهمم که چطور برنامه رو نسبت به یک کاراکتر حساس می کنید؟
        اینwarning موقعی ایجاد میشه که از توابع اشتباه استفاده کنید.من فکر می کنم شما بعد از lcd_clear از دو تا پرانتز استفاده نکردید.
        احتمال زیاد مشکل همینه .;()lcd_clear
        [img width=477 height=100]http://www.eca.ir/pic/upload/agazade.png[/img]

        دیدگاه


          #5
          پاسخ : مشکل در راه اندازی پورت سریال و LCD در کدویژن

          اینwarning موقعی ایجاد میشه که از توابع اشتباه استفاده کنید.من فکر می کنم شما بعد از lcd_clear از دو تا پرانتز استفاده نکردید.
          بله دوست عزیز ، حق با شما بود.

          یه اشتباه بسیار ساده و پیش پا افتاده بود.

          نظرتون راجع به پورت سریال چیه؟

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

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

          دیدگاه


            #6
            پاسخ : مشکل در راه اندازی پورت سریال و LCD در کدویژن

            برای این که کامند در سریال داشته باشی لازم موارد زیر را انجام بدهید
            1 : تعریف یک متغییر ارایه ای از نوع کاراکتر میزان ارایه را 1.5 تا دو برابر میزان کامند و متعلقات ان قرار دهید .مثل COMMAND_BUFFER[10]
            2 : یک متغییر دیگر تعریف کنید که جهت تعیین شماره ارایه متغییر ارایه می باشد .INDEX_COMMAND_BUFFER
            3 : یک متغییر تعریف می کنیم تا بتوانیم با استفاده از ان تعیین کنیم که کاراکتر دریافتی جزو چه نوع کاراکتر است : بدنه کامند یا ابتدا یا انتهای کامند است و یا اصلا جزو کامند نمی باشد . COMMAND_FLAG
            4 : در وقفه دریافت هر چیزی را که دریافت می کنید در چند شرط قرار می دهید که این شروط از قرار زیر است :

            1: چک می کنید که ایا کاراکتر دریافتی همان کاراکتری است که ما می خواهیم که کامند با ان شروع شود یا کاراکتر دیگری است مثلا ">" . اگر که نبود که هیچ ولی اگر که بود شمارنده بافر رو برابر با صفر می کنیم .INDEX_COMMAND_BUFFER = 0 و همچنین در داخل COMMAND_FLAG = START_COMMAND قرار می دهیم .
            2 : در شرط بعدی چک میکنیم که ایا کاراکتر دریافتی همان کاراکتر پایان است یا نه و همچنین اینکه ایا ما در حالت بدنه کامند هستیم اگر هر دو برقرار باشد در این صورت مقدار INDEX را یکی اضافه کرده و انتهای ارایه را می بندیم. و تابعی را صدا می زنیم که در ان چک می کنیم که کامند مربوطه معتبر است یا نه و قرار با امدنش چه کاری انجام گیرد . و سپس قرار می دهیم COMMAND_FLAG = STOP_COMMAND
            3 : در شرط بعدی چک می کنیم که ایا ما در ابتدا هستیم و اگر هستیم متغیر دریافتی را در INDEX_COMMAND_BUFFER ]COMMAND_BUFF
            قرار می دهیم و INDEX را اضافه می کنیم

            یه برنامه که باهاش یه همچین کاری کردیم را براتون می گزارم .

            دیدگاه


              #7
              پاسخ : مشکل در راه اندازی پورت سریال و LCD در کدویژن

              بسیار عالی بود مهدی جان ، احسنت. :applause: :wow:

              من کاملا متوجه موضوع شدم. حالا که من دارم از دستور getchar() استفاده می کنم می خوام انتهای کامند با کاراکتر Enter مشخص بشه! اما این کاراکتر در عمل هیچ نوع نشانه ای نداره! منظورم اینه که اگر من توسط دستور getchar() کاراکتر A رو بگیرم می تونم چک کنم که جزو کدوم موارد هست. اما برای کاراکتر Enter چه چیزی رو باید دریافت کنم!؟ اگه دستوری باشه که کدهای اسکی رو از بافر سریال استخراج کنه می تونم باهاش به هدفم برسم!

              بدین ترتیب که کد اسکی کاراکتر Enter عدد 13 هست و من با دریافت این عدد مشخص می کنم که انتهای کامند رسیده. حالا اگر بجای کد اسکی 13 مثلا کد اسکی 65 رو دریافت کنم باید با یه دستوری تبدیلش کنم به کاراکتر معادلش که همون حرف A هست.

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

              امیدوارم تونسته باشم منظورمو بخوبی رسونده باشم.

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

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

              دیدگاه


                #8
                پاسخ : مشکل در راه اندازی پورت سریال و LCD در کدویژن

                این سورس کد مربوط به قسمت وقفه دریافت سریال :

                #define Startframe_state 0
                #define Frame_state 1
                #define Flag_number_mp3 3
                #define Endofframe_state 2
                static char State_camand=0,poutput=0,mp3_input_flag=0;
                static unsigned char mp3_FileIndex=0,mp3_NumberOfFile=0,mp3_sec,mp3_min ;
                static char sMMCBuffer[]="---------------------------------------------------------\0";

                // USART1 Receiver interrupt service routine
                interrupt [USART1_RXC] void usart1_rx_isr(void) //MP3 Player
                {
                static unsigned char C=0;
                unsigned char cChar;
                #asm("cli&quot
                poutput=USART1;
                //cChar=getchar_mp3();
                cChar=UDR1;
                if (cChar == '>&#039
                {
                if ((State_camand == Flag_number_mp3) | (State_camand == Frame_state ))
                {
                State_camand = Endofframe_state;
                sMMCBuffer[C]='\0';C=0;
                //flag_TEST_US=1;
                #asm("cli&quot
                mp3AnswerDetect(sMMCBuffer);
                #asm("sei&quot
                }
                }
                if (State_camand == Frame_state) {sMMCBuffer[C++]=cChar;}
                if (cChar == '<&#039 {State_camand = Frame_state;/*sMMCBuffer[0]='\0'*/;C=0;}
                #asm("sei&quot
                }

                دیدگاه


                  #9
                  پاسخ : مشکل در راه اندازی پورت سریال و LCD در کدویژن

                  اینهم مربوط به قسمت اشکار کردن کد ببخشید که دیگه بعتر از این نشد . راستش سرم شلوغه و اینم مربوط به یکی از پروژه هام بود .

                  //************************************************** ***
                  void mp3AnswerDetect(char *sStr)
                  {
                  unsigned char C1,C2=0;

                  TCCR1B=0x00;
                  ADCSRA=0x8f;

                  str[0]=sStr[0];
                  str[1]=sStr[1];
                  str[2]=sStr[2];
                  str[3]=sStr[3];
                  str[4]='\0';
                  //strncpy(str,sStr,4);
                  if (!strcmpf(str,"LIST&quot)
                  {
                  //write_text_f_lcd(3,0,"ok"
                  C2=0;
                  for(C1=5;C1<strlen(sStr);C1++) { mp3_input[C2]=sStr[C1]; C2++;}
                  mp3_input[C2++]='\0';C2=0;
                  mp3_NumberOfFile= atoi(mp3_input);
                  }
                  if (!strcmpf(str,"INFO&quot)
                  {
                  //write_text_f_lcd(3,1,"ok"
                  mp3_input_flag=flag_fi_name;
                  C1=0,C2=0;
                  for(C1=5;C1<strlen(sStr);C1++)
                  {
                  if(sStr[C1] == ',&#039
                  {
                  //C1++;
                  switch (mp3_input_flag)
                  {
                  case flag_fi_name: { mp3_name_file[C2]='\0';C2=0;mp3_input_flag=flag_fi_time_m i;mp3_input[0]='\0';goto next_frame;break;}
                  case flag_fi_time_mi: {mp3_input[C2]='\0';C2=0;mp3_min= atoi(mp3_input);mp3_input_flag=flag_fi_time_se;mp3 _input[0]='\0';goto next_frame;break;}
                  case flag_fi_time_se: {mp3_input[C2]='\0';C2=0;mp3_sec= atoi(mp3_input);mp3_input_flag=flag_fi_index;mp3_i nput[0]='\0';goto next_frame;break;}
                  case flag_fi_index:{ mp3_input[C2]='\0';C2=0;mp3_FileIndex= atoi(mp3_input);mp3_input[0]='\0';mp3_input_flag=flag_nu_file;goto next_frame;break;}
                  case flag_nu_file: { mp3_input[C2]='\0';C2=0;mp3_NumberOfFile= atoi(mp3_input);mp3_input[0]='\0';mp3_input_flag=0;goto next_frame;break;}
                  }
                  }
                  if(C2 < 7)
                  {
                  switch (mp3_input_flag)
                  {
                  case flag_fi_name: { mp3_name_file[C2]=sStr[C1]; C2++; break;}
                  case flag_fi_time_mi: { mp3_input[C2]=sStr[C1]; C2++; break;}
                  case flag_fi_time_se: { mp3_input[C2]=sStr[C1]; C2++; break;}
                  case flag_fi_index: { mp3_input[C2]=sStr[C1]; C2++; break;}
                  case flag_nu_file: { mp3_input[C2]=sStr[C1]; C2++; break;}
                  }
                  }
                  next_frame:
                  }
                  if (mp3_input_flag==flag_nu_file) {mp3_input[C2]='\0';C2=0;mp3_NumberOfFile= atoi(mp3_input);mp3_input[0]='\0';mp3_input_flag=0;}
                  //sMMCBuffer[0]='\0';
                  if (set_mp3_default == 1)
                  {
                  write_text_f_lcd(1,0," "
                  write_text_f_lcd(2,0," "
                  write_text_s_lcd(1,0,mp3_name_file);

                  sprintf(str,"%2d:%2d %3d/%3d",mp3_min,mp3_sec,mp3_FileIndex,mp3_Number OfFile);
                  write_text_s_lcd(2,0,str);

                  }
                  if (set_mp3_default == 255) {set_default();}

                  }
                  State_camand = Startframe_state;
                  //sMMCBuffer[0]='\0';
                  TCCR1B=0x03;
                  ADCSRA=0xCf;
                  }

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

                  امید وارم بدردتون بخوره .
                  اینم از لینکش :
                  http://www.4shared.com/document/ZlN-cprS/SERIAL_COMMAND_.html

                  دیدگاه


                    #10
                    پاسخ : مشکل در راه اندازی پورت سریال و LCD در کدویژن

                    پیشنهاد می کنم که به جای انتر از یک کد اسکی که قابل دیدن است استفاده کنی چون که :
                    1 : در موقع عیب یاب با انیتر به سختی می شه مشکل را دید در صورتی که <, > راحتتر است
                    2 : اگر بخواهی با کامپیوتر بدی بله همان 13 است و به راحتی می تونی در شرطی که '<' مقایسه می کنه عدد مورد نظر رو به هگز قرار دهی ولی اگه بین دو میکرو است این مطمئن تره چون اگر که یکی را به C و یکی رو به بیسیک بنویسی در این صورت همراه اینتر در بیسیک یک سزی کاراکتر میاد که همه چیز رو بباد می ده و کلی سره کار می ری مثل من که یه یک روزی سره کار بودم تا از روش استفاده کردم .

                    دیدگاه


                      #11
                      پاسخ : مشکل در راه اندازی پورت سریال و LCD در کدویژن

                      خیلی ممنونم از لطف شما مهندس

                      حقیقتش انتظار نداشتم که تا این حد راهنمائی و کمک ازتون دریافت کنم. خیلی لطف کردید. :nerd:

                      من خودم به شخصه با بسکام کار می کنم و به تمام توابع پورت سریالش تسلط کامل دارم. اما دارم روی پورت سریال در کدویژن هم کار می کنم. از لطفتون بسیار سپاسگذارم.

                      میرم که با این نمونه ی کدها مشکلم رو حل کنم. :nerd:

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

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

                      دیدگاه

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