ورود به حساب ثبت نام جدید فراموشی کلمه عبور
برای ورود به حساب کاربری خود، نام کاربری و کلمه عبورتان را در زیر وارد کرده و روی «ورود به سایت» کلیک کنید.





اگر فرم ورود برای شما نمایش داده نمیشود، اینجا را کلیک کنید.









اگر فرم ثبت نام برای شما نمایش داده نمی‌شود، اینجا را کلیک کنید.









اگر فرم بازیابی کلمه عبور برای شما نمایش داده نمی‌شود، اینجا را کلیک کنید.





کاربران برچسب زده شده

صفحه 1 از 2 12 آخرین
نمایش نتایج: از 1 به 10 از 15
  1. #1
    2007/02/18
    109
    9

    نحوه خواندن USART بوسیله وقفه

    سلام
    من یه پروژه RS485 دارم . که یه اسلیو و یه مستر داره .
    من تونستم از طریق دستور gets به آسونی مقادیر فرستاده شده از اسلیو را بخونم .
    کد:
    while (1)
       {
       gets(a,10); 
       lcd_clear();
       lcd_puts(a);   
       }
       };

    اما این نحو خوندن زیاد صحیح نیست و درست تر اینه که بشه از طریق اینتراپت مقادیر دریافت شده را خوند. سعی کردم از ویزارد خود کدویژن استفاده کنم و مقادیر را بخونم . اما دریافتی ها صحیح نیستن .مقادیر عدد هستند . که این اعداد درست نمایش داده نمی شن . گاهی فقط دهگان عدد میاد گاهی فقط یکان گاهی هم کدهای اسکی نامربوط .
    کد:
    // USART Receiver interrupt service routine
    interrupt [USART_RXC] void usart_rx_isr(void)
    {
    char status,data;
    status=UCSRA;
    data=UDR;
    if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
      {
      rx_buffer[rx_wr_index++]=data;
    #if RX_BUFFER_SIZE == 256
      // special case for receiver buffer size=256
      if (++rx_counter == 0)
       {
    #else
      if (rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
      if (++rx_counter == RX_BUFFER_SIZE)
       {
       rx_counter=0;
    #endif
       rx_buffer_overflow=1;
       }
      }
      
       lcd_clear();    
       lcd_gotoxy(0,0);
       lcd_puts(rx_buffer);    
    //   gets(a,10); 
    //   lcd_puts(a);    
    }
    از دوستان کسی کد بهتری برای خوندن ورودی ها توسط اینتراپت سراغ داره؟
  2. #2
    2007/11/21
    ایران - تهران
    352
    2
    mrh

    پاسخ : نحوه خواندن USART بوسیله وقفه

    سلام. در برنامه های زیر که یکی برای master و سه تا هم برای 3 slave هست به صورت وقفه ای s وقتی ادرسشو دریافت کرد دو بایت رو برای m ارسال میکنه. در sها از usart 9 بیتی استفاده شده است.
    شرمنده لطفا بقیه توضیحات رو خودتون از برنامه ها استخراج کنید.
    http://wdl.persiangig.com/pages/download/?dl=http://altium.persiangig.com/u11.rar
    بگذارعشق خاصیت تو باشد نه رابطه خاص تو باکسی
    موفقيت پيش رفتن است نه به نقطه ي پايان رسيدن
    نلسون ماندلا
  3. #3
    2007/02/18
    109
    9

    پاسخ : نحوه خواندن USART بوسیله وقفه

    سلام . ممنون از راه حلتون این 2 روزه تمام وقتمو گذاشتم راههای مختلف و برنامه های مختلفو دیدم بیشترشون اشکال داشت همینجوری الکی یه راه ساده به نظرم رسید انجام دادم و اتفاقا خیلی راحت جواب گرفتم ! اینجا می گم شما هم ببنید شاید اشکالی داشته باشه که از چشم من پنهان باشه.
    می دونید که برای عملکردن وقفه USART باید UCSRB=0x90 تنظیم شه باشه . در واقع بیت شماره 8 باید 1 باشه تا وقفه فعال باشه .
    اما در این حالت دستور gets کار نمی کنه برای اینکه gets اجرا بشه باید وقفه غیر فعال باشه . به نظرم رسید خوب می شه اول وقفه فعال باشه و به محض عملکردن وقفه اونو غیر فعال کرد و از دستور gets استفاده کرد و بعد از خوندن اطلاعات باس ، دوباره وقفه را فعال کرد ! این روش به خوبی جواب داد . کدشو می زارم :

    کد:
    unsigned char a[8];
    interrupt [USART_RXC] void usart_rx_isr(void)
    {
    UCSRB=0x10;
    gets(a,8);
    lcd_clear(); 
    lcd_puts(a); 
    //delay_ms(100);
    UCSRB=0x90;
    }

    اینجوری از یه دستور استاندارد استفاده کردم و اصلا درگیر جزییات نشدم ! حالا تا نظر شما چی باشه !
  4. #4
    2011/12/01
    79
    0

    پاسخ : نحوه خواندن USART بوسیله وقفه

    سلام .

    من یه پروژه دارم در مورد ارتباط کامپیوتر با میکرو از طریق پورت سریال.

    کامپیوتر به میکرو دستور میده مثلا" اگه کد 00000001 به میکرو فرستاده شد PORTA.1=1 و اگه کد 00000010 فرستاده شد PORTA.2=1 بشه.همین.

    سخت افزار مشکلی ندارم. تنظیمات usart 9600 start bit=1 stop bit 1 parity=none

    از وقفه باید استفاده کنم.

    ممنون میشم اگه راهنمایی بفرمایید.
  5. #5
    2011/12/01
    79
    0

    پاسخ : نحوه خواندن USART بوسیله وقفه

    نقل قول نوشته اصلی توسط babak_9051

    کامپیوتر به میکرو دستور میده مثلا" اگه کد 00000001 به میکرو فرستاده شد PORTA.1=1 و اگه کد 00000010 فرستاده شد PORTA.2=1 بشه.همین.
    برنامه سنگینیه؟!!
    فقط همین قسمت برنامه رو مشکل دارم. از اساتید خواهش میکنم کمک کنن./
  6. #6
    2009/03/05
    تهران
    334
    4

    پاسخ : نحوه خواندن USART بوسيله وقفه

    اگه داري با اينتراپت کار مي کني ديگه با دستور gets چي کار داري؟ اينجا data=UDR اطلاعات data رو بالت بالت بخون بريز تو يه اريه
    اگه مي خواي بدون اينتراپت کار کني به نظر من با دستور getchar کار کن مثل بالا بايت بايت بگير بريز تو اريه.فقط نکته اگه ديتايي تو حالت بدون اينتراپت رو خط نباشه و از دستور getchar استفاده کني بزنامه ات تو while getchar گير مي کنه تا اطلاعات بياد،البته مي توني با يه or کردن اين حاتشو از بين ببري
    تو اين جهان 7 ميلياردي من معني ندارد و اگه تو اين دنيا فقط 1 نفر وجود داشت باز هم من معني نداشت
  7. #7
    2011/12/01
    79
    0

    پاسخ : نحوه خواندن USART بوسيله وقفه

    نقل قول نوشته اصلی توسط sey22
    اگه داري با اينتراپت کار مي کني ديگه با دستور gets چي کار داري؟ اينجا data=UDR اطلاعات data رو بالت بالت بخون بريز تو يه اريه
    اگه مي خواي بدون اينتراپت کار کني به نظر من با دستور getchar کار کن مثل بالا بايت بايت بگير بريز تو اريه.فقط نکته اگه ديتايي تو حالت بدون اينتراپت رو خط نباشه و از دستور getchar استفاده کني بزنامه ات تو while getchar گير مي کنه تا اطلاعات بياد،البته مي توني با يه or کردن اين حاتشو از بين ببري
    سلام.

    ممنون که جواب دادین.
    من می خوام از وقفه استفاده کنم.

    وقتی با codevizard تنظیم ات رو انجام میدم یه سری کد میده./ میشه یه توضیحی بدین و بگید کجا باید دیتا رو بخونم و مقایسه کنم؟ خواهش میکنم دقیق و واضح بفرمایید . خیلی گیرم. :sad:ً




  8. #8
    2009/10/21
    تهران
    2,528
    227

    پاسخ : نحوه خواندن USART بوسیله وقفه

    وقتی با کدویزارد برنامه رو برای استفاده از وقفه سریال ایجاد میکنید برای دریافت دو تابع میسازه

    interrupt [USART_RXC] void usart_rx_isr(void)
    و
    char getchar(void)

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

    if (++rx_wr_index0 == RX_BUFFER_SIZE0) rx_wr_index0=0;
    if (++rx_counter0 == RX_BUFFER_SIZE0)
    {
    rx_counter0=0;
    rx_buffer_overflow0=1;
    };
  9. #9
    2009/03/05
    تهران
    334
    4

    پاسخ : نحوه خواندن USART بوسيله وقفه

    متغيير [i]save يک اريه است
    interrupt [USART_RXC] void usart1_rx_isr(void){
    char status,data;
    status=UCSRA;
    data=UDR1;
    ==================================>>>> >>>> شما مي توني همينجا اطلاعات رو برداري مثلا ;Save+i)=data(* بعد با هر بار ريختن i++ تا هرجندتا که خواستي بريز تو ارايه مثلا save بعد يا همين جا يا هر حاي برنامه ات اطلاعات اين ارايه رو بخون
    }

    if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
    {
    rx_buffer[rx_wr_index++]=data;
    #if RX_BUFFER_SIZE == 256
    // special case for receiver buffer size=256
    if (++rx_counter == 0)
    {
    #else
    if (rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
    if (++rx_counter == RX_BUFFER_SIZE1)
    {
    rx_counter=0;
    #endif
    rx_buffer_overflow=1;
    }
    }
    }
    تو اين جهان 7 ميلياردي من معني ندارد و اگه تو اين دنيا فقط 1 نفر وجود داشت باز هم من معني نداشت
  10. #10
    2009/03/05
    تهران
    334
    4

    پاسخ : نحوه خواندن USART بوسيله وقفه

    متغيير
    نقل قول نوشته اصلی توسط sey22
    interrupt [USART_RXC] void usart1_rx_isr(void){
    char status,data;
    status=UCSRA;
    data=UDR1;
    ==================================>>>> >>>> شما مي توني همينجا اطلاعات رو برداري مثلا ;Save[i] =data بعد با هر بار ريختن i++ تا هرجندتا که خواستي بريز تو ارايه مثلا save بعد يا همين جا يا هر حاي برنامه ات اطلاعات اين ارايه رو بخون
    }

    if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
    {
    rx_buffer[rx_wr_index++]=data;
    #if RX_BUFFER_SIZE == 256
    // special case for receiver buffer size=256
    if (++rx_counter == 0)
    {
    #else
    if (rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
    if (++rx_counter == RX_BUFFER_SIZE1)
    {
    rx_counter=0;
    #endif
    rx_buffer_overflow=1;
    }
    }
    }
    تو اين جهان 7 ميلياردي من معني ندارد و اگه تو اين دنيا فقط 1 نفر وجود داشت باز هم من معني نداشت
صفحه 1 از 2 12 آخرین
نمایش نتایج: از 1 به 10 از 15

موضوعات مشابه

  1. کار با وقفه USART
    توسط ahmp در انجمن میکروکنترلرهای AVR
    پاسخ: 12
    آخرين نوشته: 2019/08/28, 18:57
  2. دریافت کاراکتر از وقفه usart و ارسال ش با وقفه spi
    توسط davoud.arabee در انجمن برنامه نویسی و اینترفیس
    پاسخ: 5
    آخرين نوشته: 2016/04/01, 21:42
  3. مشکل در وقفه usart
    توسط vahidabedi در انجمن میکروکنترلرهای AVR
    پاسخ: 13
    آخرين نوشته: 2015/09/24, 22:34
  4. ایجاد وقفه بوسیله پایه ریست
    توسط hamed65 در انجمن ATMEL
    پاسخ: 1
    آخرين نوشته: 2015/05/20, 22:35
  5. ارسال 10 bit بوسیله usart در atmega 32
    توسط O.M.I.D در انجمن میکروکنترلرهای AVR
    پاسخ: 10
    آخرين نوشته: 2011/06/27, 21:14

کلمات کلیدی این موضوع

علاقه مندي ها (Bookmarks)

علاقه مندي ها (Bookmarks)

مجوز های ارسال و ویرایش

  • شما نمیتوانید موضوع جدیدی ارسال کنید
  • شما امکان ارسال پاسخ را ندارید
  • شما نمیتوانید فایل پیوست کنید.
  • شما نمیتوانید پست های خود را ویرایش کنید
  •