اطلاعیه

Collapse
No announcement yet.

ساخت کامند برای avr

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

    ساخت کامند برای avr

    سلام خدمت همه ی دوستان.
    من به زبون سی کار میکنم و میخوام برنامه ای بنوسیم که مثلا وقتی دستور ADC1? از طریق پورت سریال به میکرو ارسال شد ، میکرو مقدار ADC.1 را برگردونه.
    خودم با تابع scanf متن را از پورت سریال میگیرم و با تابع strstrf با مقدار مورد نظر خودم مقایسه میکنم. در کل جواب میده ولی یک مشکل وجود داره و اونم اینه که مثلا باید هفت هشت بار دستور ADC1? را وارد کنم تا مقدار ADC.1 را برگردونه.
    مشکل چیه به نظرتون؟
    ممنون میشم راهنمایی کنید.

    #2
    پاسخ : ساخت کامند برای avr

    لطفا نمونه کد رو قرار بدین تا بتونیم بررسی کنیم.
    چرا ناراحتی پاتریک!
    + امروز ی بچه دیدم سرچهارراه گل میفروخت
    - از دیدنش ناراحت شدی؟
    + نه
    پس چی ناراحتت کرده
    + اینکه دیدن اینجور بچه ها انقدر واسم عادی شده که دیگه ناراحتم نمیکنه
    ------------------------------------------------------------------------------------------------------
    تاحالا فکر کردی بیسواد کیه؟- بی سواد یعنی کسی که نمیتونه ذهنیاتش رو عملی کنه!
    ------------------------------------------------------------------------------------------------------
    محصولات

    دیدگاه


      #3
      پاسخ : ساخت کامند برای avr


      //constant definition for usart interrupt receiver
      //write down these after header included
      #define DATA_REGISTER_EMPTY (1<<UDRE)
      #define RX_COMPLETE (1<<RXC)
      #define FRAMING_ERROR (1<<FE)
      #define PARITY_ERROR (1<<UPE)
      #define DATA_OVERRUN (1<<DOR)
      #define RX_BUFFER_SIZE 64
      char rx_buffer[RX_BUFFER_SIZE];
      #if RX_BUFFER_SIZE <= 64
      unsigned char rx_wr_index=0,rx_rd_index=0;
      #else
      unsigned int rx_wr_index=0,rx_rd_index=0;
      #endif
      #if RX_BUFFER_SIZE < 64
      unsigned char rx_counter=0;
      #else
      unsigned int rx_counter=0;
      #endif


      void FUNCTION(unsigned char command[64])
      {

      }



      //receiver interrupt func,put it outside of main func
      interrupt [USART_RXC] void usart_rx_isr(void)
      {
      char status,data;
      status=UCSRA;
      data=UDR;
      if(data=='\r')
      {
      sprintf(received_command,"%s",rx_buffer);
      FUNCTION(&received_command);
      memset(&data,0,sizeof(data));
      memset(received_command,0,sizeof(received_command));
      memset(rx_buffer,0,sizeof(rx_buffer));
      rx_wr_index=0;
      rx_counter =0;
      rx_buffer_overflow=0;
      }
      else if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
      {
      rx_buffer[rx_wr_index++]=data;


      #if RX_BUFFER_SIZE == 64
      if (++rx_counter == 0) rx_buffer_overflow=1;
      #else
      if (rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
      if (++rx_counter == RX_BUFFER_SIZE)
      {
      rx_counter=0;
      rx_buffer_overflow=1;
      }
      #endif
      }
      }



      //usart definition ,put it inside of main func
      //receiver interrupt enabled
      UCSRA=(0<<RXC) | (0<<TXC) | (0<<UDRE) | (0<<FE) | (0<<DOR) | (0<<UPE) | (0<<U2X) | (0<<MPCM);
      UCSRB=(1<<RXCIE) | (0<<TXCIE) | (0<<UDRIE) | (1<<RXEN) | (1<<TXEN) | (0<<UCSZ2) | (0<<RXB8) | (0<<TXB8);
      UCSRC=(1<<URSEL) | (0<<UMSEL) | (0<<UPM1) | (0<<UPM0) | (0<<USBS) | (1<<UCSZ1) | (1<<UCSZ0) | (0<<UCPOL);
      UBRRH=0x00;
      UBRRL=0x33;



      با این تغییرات تو کانفیگ سریال میکرو دگ نیاز نیس که همیشه میکرو رو معطل دریافت کاراکتر از سریال بکنی
      اینطوری میکرو همزمان با کارای روتینش کاراکترهای تایپ شده رو دریافت میکنه و در متغیر received_command قرار میده
      هربار ک کاراکتری تایپ میشه،به آخر متغیر received_command میچسبه
      این کار تا جاییکه کلید enter زده نشده ادامه داره
      بعد از فشردن enter کامند ارسال شده به تابع FUNCTION فرستاده میشه،همزمان با این کار تمام متغیرهای اینتراپت دریافت سریال ریست و برای دریافت کامند بعدی آماده میشن
      حالا تو تابع FUNCTION هرکار دوست داری میتونی با آخرین کامندی که فرستادی بکنی
      برای مقایسه کامندت با مقادیر از پیش تعیین شده بهتره از تابع strcmp استفاده کنی
      راستی تعداد کاراکتری که توی هر کامند میتونی بفرستی روی 64 تنظیم شده،میتونی تغییرش بدی
      جدیدترین ویرایش توسط ardeshir74; ۰۲:۴۳ ۱۳۹۵/۰۹/۱۵.

      دیدگاه


        #4
        پاسخ : ساخت کامند برای avr

        نوشته اصلی توسط سوران آراسته نمایش پست ها
        لطفا نمونه کد رو قرار بدین تا بتونیم بررسی کنیم.
        کد:
        char txt[];
        scanf("%s",txt);
        if(strstrf(txt,"READY")){printf("YES\r\n");}
        یا با وقفه ها به صورت زیر
        کد:
        if(strstrf(rx_buffer,"READY")){printf("YES\r\n");}
        دلیل: ادغام دو پست برای جلوگیری از اسپم

        نوشته اصلی توسط ardeshir74 نمایش پست ها

        //constant definition for usart interrupt receiver
        //write down these after header included
        #define DATA_REGISTER_EMPTY (1<<UDRE)
        #define RX_COMPLETE (1<<RXC)
        #define FRAMING_ERROR (1<<FE)
        #define PARITY_ERROR (1<<UPE)
        #define DATA_OVERRUN (1<<DOR)
        #define RX_BUFFER_SIZE 64
        char rx_buffer[RX_BUFFER_SIZE];
        #if RX_BUFFER_SIZE <= 64
        unsigned char rx_wr_index=0,rx_rd_index=0;
        #else
        unsigned int rx_wr_index=0,rx_rd_index=0;
        #endif
        #if RX_BUFFER_SIZE < 64
        unsigned char rx_counter=0;
        #else
        unsigned int rx_counter=0;
        #endif


        void FUNCTION(unsigned char command[64])
        {

        }



        //receiver interrupt func,put it outside of main func
        interrupt [USART_RXC] void usart_rx_isr(void)
        {
        char status,data;
        status=UCSRA;
        data=UDR;
        if(data=='\r')
        {
        sprintf(received_command,"%s",rx_buffer);
        FUNCTION(&received_command);
        memset(&data,0,sizeof(data));
        memset(received_command,0,sizeof(received_command));
        memset(rx_buffer,0,sizeof(rx_buffer));
        rx_wr_index=0;
        rx_counter =0;
        rx_buffer_overflow=0;
        }
        else if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
        {
        rx_buffer[rx_wr_index++]=data;


        #if RX_BUFFER_SIZE == 64
        if (++rx_counter == 0) rx_buffer_overflow=1;
        #else
        if (rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
        if (++rx_counter == RX_BUFFER_SIZE)
        {
        rx_counter=0;
        rx_buffer_overflow=1;
        }
        #endif
        }
        }



        //usart definition ,put it inside of main func
        //receiver interrupt enabled
        UCSRA=(0<<RXC) | (0<<TXC) | (0<<UDRE) | (0<<FE) | (0<<DOR) | (0<<UPE) | (0<<U2X) | (0<<MPCM);
        UCSRB=(1<<RXCIE) | (0<<TXCIE) | (0<<UDRIE) | (1<<RXEN) | (1<<TXEN) | (0<<UCSZ2) | (0<<RXB8) | (0<<TXB8);
        UCSRC=(1<<URSEL) | (0<<UMSEL) | (0<<UPM1) | (0<<UPM0) | (0<<USBS) | (1<<UCSZ1) | (1<<UCSZ0) | (0<<UCPOL);
        UBRRH=0x00;
        UBRRL=0x33;



        با این تغییرات تو کانفیگ سریال میکرو دگ نیاز نیس که همیشه میکرو رو معطل دریافت کاراکتر از سریال بکنی
        اینطوری میکرو همزمان با کارای روتینش کاراکترهای تایپ شده رو دریافت میکنه و در متغیر received_command قرار میده
        هربار ک کاراکتری تایپ میشه،به آخر متغیر received_command میچسبه
        این کار تا جاییکه کلید enter زده نشده ادامه داره
        بعد از فشردن enter کامند ارسال شده به تابع FUNCTION فرستاده میشه،همزمان با این کار تمام متغیرهای اینتراپت دریافت سریال ریست و برای دریافت کامند بعدی آماده میشن
        حالا تو تابع FUNCTION هرکار دوست داری میتونی با آخرین کامندی که فرستادی بکنی
        برای مقایسه کامندت با مقادیر از پیش تعیین شده بهتره از تابع strcmp استفاده کنی
        راستی تعداد کاراکتری که توی هر کامند میتونی بفرستی روی 64 تنظیم شده،میتونی تغییرش بدی
        هنوز تستش نکردم ولی بسیار ممنونم!!!!!!!!!!!!!!!!!!!!!!!!

        دیدگاه

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