اطلاعیه

Collapse
No announcement yet.

LCD (بنی آدم اعضای یک پیکرند...!!!)

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

    LCD (بنی آدم اعضای یک پیکرند...!!!)

    سلام به همگی :smile:
    من با یه فرستنده_گیرنده کار میکنم و میخوام اطلاعات دریافتی رو نمایش بدم.دستور نمایش رو تو USART Receiver interrupt نوشتم.32 کاراکتر اول رو کامل نمایش میده،صفحه رو پاک میکنم ،میاد سطروستون(0,0)،اما بعد،هم 3 کاراکتر بعدی رو جا میندازه(نمایش نمیده):sad:و هم تو سطر اول تا 4 کاراکتر رو نشون میده و بقیه اطلاعات از بین میره! :cry:البته سطر دوم رو کامل نشون میده.میشه کمکم کنین؟ میشه بگین آخه چرا؟؟؟ :cry2:
    فقط دو راه برای زندگی کردن وجود دارد.یکی این است که هیچ چیز معجزه نیست.راه دیگر این است که انگار همه چیز معجزه است.
    " انیشتین"

    #2
    پاسخ : LCD (بنی آدم اعضای یک پیکرند...!!!)

    دوست عزیز اگه امکانش هست سورس رو اینجا بزار تا بتونیم کمک کنیم...
    http://ceworld.ir/images/ads/dornablogcom_ads.gif

    دیدگاه


      #3
      پاسخ : LCD (بنی آدم اعضای یک پیکرند...!!!)

      سلام.
      از لطفتون ممنونم. اما میشه بگین منظورتون از سورس چیه؟
      فقط دو راه برای زندگی کردن وجود دارد.یکی این است که هیچ چیز معجزه نیست.راه دیگر این است که انگار همه چیز معجزه است.
      " انیشتین"

      دیدگاه


        #4
        پاسخ : LCD (بنی آدم اعضای یک پیکرند...!!!)

        نوشته اصلی توسط M_E
        سلام.
        از لطفتون ممنونم. اما میشه بگین منظورتون از سورس چیه؟
        همون برنامه ای که نوشتین... خطوط برنامه.
        http://ceworld.ir/images/ads/dornablogcom_ads.gif

        دیدگاه


          #5
          پاسخ : LCD (بنی آدم اعضای یک پیکرند...!!!)

          i
          nterrupt [USART_RXC] void usart_rx_isr(void)
          {
          char status,data;
          status=UCSRA;
          data=UDR;
          test=1;
          if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
          {
          rx_buffer[rx_wr_index]=data;
          cnt++;
          if(cnt==32)
          {
          delay_ms(1000);
          lcd_clear();
          lcd_gotoxy(0,0);
          cnt=0;
          };
          lcd_putchar(rx_buffer[rx_wr_index]);
          if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
          if (++rx_counter == RX_BUFFER_SIZE)
          {
          rx_counter=0;
          strcpy(rx_buffer,empty_buf);
          rx_buffer_overflow=1;
          };
          };
          }
          فقط دو راه برای زندگی کردن وجود دارد.یکی این است که هیچ چیز معجزه نیست.راه دیگر این است که انگار همه چیز معجزه است.
          " انیشتین"

          دیدگاه


            #6
            پاسخ : LCD (بنی آدم اعضای یک پیکرند...!!!)

            فکر میکنم بعد نباشه اگه تاکید کنم تا حالا تجربه ای تو این زمینه نداشتم و این بار اولمه!
            حالا که دارین برنامه رو میبینین،میشه خواهش کنم اگه ممکنه هر جاش که به نظرتون خیلی ناشیانه است،بهم بگین؟
            ببخشید که نامرتبه.هر کارش کردم مرتب نشد!
            یه چیزدیگه!الان دارم تستش میکنم(اون مشکل از بین رفتن کرکترا)،تعدادشون به صورت رندم تغییر میکنه!
            فقط دو راه برای زندگی کردن وجود دارد.یکی این است که هیچ چیز معجزه نیست.راه دیگر این است که انگار همه چیز معجزه است.
            " انیشتین"

            دیدگاه


              #7
              پاسخ : LCD (بنی آدم اعضای یک پیکرند...!!!)

              سلام دوست من
              شما که فقط برنامه مربوط به وقفه USART را گذاشتی
              پس کو برنامه main?
              در ضمن یه سوال دیگه شما با Code wizard کار میکنی؟
              فرزندم در راه است

              دیدگاه


                #8
                پاسخ : LCD (بنی آدم اعضای یک پیکرند...!!!)

                بله با ویزارد کار میکنم.
                کل برنامه؟ oo:
                فقط دو راه برای زندگی کردن وجود دارد.یکی این است که هیچ چیز معجزه نیست.راه دیگر این است که انگار همه چیز معجزه است.
                " انیشتین"

                دیدگاه


                  #9
                  پاسخ : LCD (بنی آدم اعضای یک پیکرند...!!!)

                  #include <mega16.h>
                  #include <delay.h>
                  #include <stdio.h>
                  #include <string.h>
                  #asm
                  .equ __lcd_port=0x18 ;PORTB
                  #endasm
                  #include <lcd.h>

                  #define RXB8 1
                  #define TXB8 0
                  #define UPE 2
                  #define OVR 3
                  #define FE 4
                  #define UDRE 5
                  #define RXC 7

                  #define FRAMING_ERROR (1<<FE)
                  #define PARITY_ERROR (1<<UPE)
                  #define DATA_OVERRUN (1<<OVR)
                  #define DATA_REGISTER_EMPTY (1<<UDRE)
                  #define RX_COMPLETE (1<<RXC)

                  #define RX_BUFFER_SIZE 8
                  char rx_buffer[RX_BUFFER_SIZE],empty_buf[30]="";
                  int cnt=0;

                  #if RX_BUFFER_SIZE<256
                  unsigned char rx_wr_index,rx_rd_index,rx_counter;
                  #else
                  unsigned int rx_wr_index,rx_rd_index,rx_counter;
                  #endif

                  bit rx_buffer_overflow,test=0;
                  interrupt [USART_RXC] void usart_rx_isr(void)
                  {
                  char status,data;
                  status=UCSRA;
                  data=UDR;
                  test=1;
                  if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
                  {
                  rx_buffer[rx_wr_index]=data;
                  cnt++;
                  if(cnt==32)
                  {
                  delay_ms(1000);
                  lcd_clear();
                  lcd_gotoxy(0,0);
                  cnt=0;
                  };
                  lcd_putchar(rx_buffer[rx_wr_index]);
                  if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
                  if (++rx_counter == RX_BUFFER_SIZE)
                  {
                  rx_counter=0;
                  strcpy(rx_buffer,empty_buf);
                  rx_buffer_overflow=1;
                  };
                  };
                  }

                  #ifndef _DEBUG_TERMINAL_IO_
                  #define _ALTERNATE_GETCHAR_
                  #pragma used+
                  char getchar(void)
                  {
                  char data;
                  while (rx_counter==0);
                  data=rx_buffer[rx_rd_index];
                  if (++rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;
                  #asm("cli&quot
                  --rx_counter;
                  #asm("sei&quot
                  return data;
                  }
                  #pragma used-
                  #endif

                  #include <stdio.h>
                  void INQURY(void);
                  void main(void)
                  {
                  int i=0;
                  PORTA=0x00;
                  DDRA=0xFF;
                  PORTB=0x00;
                  DDRB=0xFF;
                  PORTC=0x00;
                  DDRC=0x00;
                  PORTD=0x00;
                  DDRD=0x00;
                  TCCR0=0x00;
                  TCNT0=0x00;
                  OCR0=0x00;
                  TCCR1A=0x00;
                  TCCR1B=0x00;
                  TCNT1H=0x00;
                  TCNT1L=0x00;
                  ICR1H=0x00;
                  ICR1L=0x00;
                  OCR1AH=0x00;
                  OCR1AL=0x00;
                  OCR1BH=0x00;
                  OCR1BL=0x00;
                  ASSR=0x00;
                  TCCR2=0x00;
                  TCNT2=0x00;
                  OCR2=0x00;
                  MCUCR=0x00;
                  MCUCSR=0x00;
                  TIMSK=0x00;
                  UCSRA=0x00;
                  UCSRB=0x98;
                  UCSRC=0x86;
                  UBRRH=0x00;
                  UBRRL=0x2F;
                  SFIOR=0x00;
                  lcd_init(16);
                  #asm("sei&quot

                  for(i=0;i<7;i++)
                  {
                  PORTA.1=1;
                  INQURY();
                  delay_ms(1000);//Timeout of Inqury
                  if(test==1) break;
                  PORTA.1=0;
                  delay_ms(100);
                  };
                  while (1)
                  {
                  };
                  };
                  void INQURY(void)//=========INQURY=========//
                  {
                  delay_ms(10);
                  putchar('A'
                  delay_ms(10);
                  putchar('T'
                  delay_ms(10);
                  putchar('+'
                  delay_ms(10);
                  putchar('B'
                  delay_ms(10);
                  putchar('T'
                  delay_ms(10);
                  putchar('I'
                  delay_ms(10);
                  putchar('N'
                  delay_ms(10);
                  putchar(0x0D);
                  }
                  فقط دو راه برای زندگی کردن وجود دارد.یکی این است که هیچ چیز معجزه نیست.راه دیگر این است که انگار همه چیز معجزه است.
                  " انیشتین"

                  دیدگاه


                    #10
                    پاسخ : LCD (بنی آدم اعضای یک پیکرند...!!!)

                    اصلا میشه خوندش؟چه جوری باید مرتبش کنم؟
                    فقط دو راه برای زندگی کردن وجود دارد.یکی این است که هیچ چیز معجزه نیست.راه دیگر این است که انگار همه چیز معجزه است.
                    " انیشتین"

                    دیدگاه


                      #11
                      پاسخ : LCD (بنی آدم اعضای یک پیکرند...!!!)

                      بله میشه خوند (تقریبا) :mrgreen:
                      شما برنامه فرستنده و گیرنده را با هم گذاشتید؟
                      فرزندم در راه است

                      دیدگاه


                        #12
                        پاسخ : LCD (بنی آدم اعضای یک پیکرند...!!!)

                        مرسی از دلداریتون.به هر حال اگه خونده نمیشه عذر میخوام.
                        نه سوءتفاهم شده!"فرستنده" و "گیرنده" نه،"فرستنده_گیرنده".
                        و این فرستنده_گیرنده که میگم،بلوتوثه!ولی از اونجایی که تا اسم بلوتوث رو میارم همه عقب نشینی میکنن و دیگه کمکم نمیکنن،از من نشنیده بگیرین. :sad:اصلا بیاین به اینکه بلوتوثه فکر نکنیم :cry:.به اینکه من با نمایش اطلاعات دریافتی رویLCD مشکل دارم ،فکر کنیم.
                        فقط دو راه برای زندگی کردن وجود دارد.یکی این است که هیچ چیز معجزه نیست.راه دیگر این است که انگار همه چیز معجزه است.
                        " انیشتین"

                        دیدگاه


                          #13
                          پاسخ : LCD (بنی آدم اعضای یک پیکرند...!!!)

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

                          اطلاعات رو بریز تو یه بافر دیگه و با اون کار کن. امتحان کن ببین جواب میده یا نه! :agree:
                          http://ceworld.ir/images/ads/dornablogcom_ads.gif

                          دیدگاه


                            #14
                            پاسخ : LCD (بنی آدم اعضای یک پیکرند...!!!)

                            نوشته اصلی توسط M_E
                            منو یادتون نره! :cry:
                            سلام دوست من
                            منم مثل شما تا 1 ماه پیش هیچی از USART نمیدونستم ولی به دلایلی مجبور شدم یاد بگیرم و با توجه به اینکه من 50 درصد اطلاعاتم از AVR را از دیتا شیت یاد گرفتم اینم از بقیه مستثنا نبود و شاید باورتون نشه که تو 1 روز کامل یاد گرفتم تا جاییکه ارتباط با کامپیوتره یاد گرفتم به نظر من کار شما 2 تا اشتباه داره :
                            1) استتفاده از code Wizard
                            2) میخواهید فی البداهه برید سراغ کاری که اصلا تا حالا انجام ندادید
                            به همین دلیله که وقتی یه مشکل پیدا میکنید نمیدونید چطور باید حلش کنید چون نمیدونید الان داره چه اتفاقی میافته.
                            خب ببخشید سرتون را درد آوردم.............بریم سراغ اصل مطلب:
                            بهتره شما عملیات نشون دادی رویlcd را در while(1) انجام بدید همونطوریکه بهنام جان فرمودند در وقفه اطلاعات را بخونید و در بدنه اصلی برنامه در while(1)
                            نشون بدید احتمالا باید درست بشه چون جای دیگه برنامه ظاهرا ایراد نداره
                            فرزندم در راه است

                            دیدگاه


                              #15
                              پاسخ : LCD (بنی آدم اعضای یک پیکرند...!!!)

                              این کارو هم انجام دادم.مشکل سر اینکه وقتی تو یه بافر میریزم و تو while نمایش میدم،اگر کاراکتری نمایش بدم،فقط آخرین کاراکتری که دریافت شده رو نشون میده و اگر رشته رو نمایش بدم،هیچی نشون نمیده!
                              منم اول این فکر به ذهنم رسید که منطقی تر هم هست و وقتی دیدم جواب نمیده تو اینتراپت گذاشتم.
                              ببخشید یادم رفت اول باید از راهنماییتون تشکر میکردم. :redface:ممنون!
                              فقط دو راه برای زندگی کردن وجود دارد.یکی این است که هیچ چیز معجزه نیست.راه دیگر این است که انگار همه چیز معجزه است.
                              " انیشتین"

                              دیدگاه

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