اطلاعیه

Collapse
No announcement yet.

فعال کردن وقفه سریالrx

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

    فعال کردن وقفه سریالrx

    سلام
    این تنظیمات یوزارتمه:
    // USART initialization
    // Communication Parameters: 8 Data, 1 Stop, No Parity
    // USART Receiver: On
    // USART Transmitter: On
    // USART Mode: Asynchronous
    // USART Baud Rate: 9600
    UCSRA=(0<<RXC) | (0<<TXC) | (0<<UDRE) | (0<<FE) | (0<<DOR) | (0<<UPE) | (0<<U2X) | (0<<MPCM);
    UCSRB=(0<<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;
    برای فهموندن اینکه چیزی به میکرو ارسال شده، چه دستوراتی رو باید بنویسم؟
    مثلا می خوام هرچیزیو که Rx دریافت میکنه رو توی رشته ای بریزم:(gets(a ,10
    -----
    راستش میخوام دیتای فرستاده شده از rfid رو تو میکرو دریافت کنم... کدی میخوام که این عمل رو انجام بده..

    [COLOR=#F7ADF7 !important];[/COLOR][COLOR=#006FE0 !important][/COLOR]


    #2
    پاسخ : فعال کردن وقفه سریالrx

    نوشته اصلی توسط vivid83 نمایش پست ها
    سلام
    این تنظیمات یوزارتمه:
    // USART initialization
    // Communication Parameters: 8 Data, 1 Stop, No Parity
    // USART Receiver: On
    // USART Transmitter: On
    // USART Mode: Asynchronous
    // USART Baud Rate: 9600
    UCSRA=(0<<RXC) | (0<<TXC) | (0<<UDRE) | (0<<FE) | (0<<DOR) | (0<<UPE) | (0<<U2X) | (0<<MPCM);
    UCSRB=(0<<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;
    برای فهموندن اینکه چیزی به میکرو ارسال شده، چه دستوراتی رو باید بنویسم؟
    مثلا می خوام هرچیزیو که Rx دریافت میکنه رو توی رشته ای بریزم:(gets(a ,10
    -----
    راستش میخوام دیتای فرستاده شده از rfid رو تو میکرو دریافت کنم... کدی میخوام که این عمل رو انجام بده..

    [COLOR=#F7ADF7 !important];[/COLOR][COLOR=#006FE0 !important][/COLOR]

    سلام
    میتونید با همون کد ویزارد وقفه دریافت سریال رو فعال کنید و همینطور حداکثر دیتای دریافتی رو مشخص کنید.خودش برات کدی مینویسه که دیتا ها رو میریزه تو rx_buffer و بعد میتونی بررسیش کنی.
    من تو لینک زیر برنامه ای برای ماژول sim800 نوشتم میتونی کدش رو بررسی کنی و برای rfid استفاده کنی.
    سلام برنامه زیر رو به کمک کدویزارد کدویژن برای کنترل رله توسط پیامک نوشتم. میکروی استفاده شده atmega16 هستش. portb.0 به رله متصل هست و با ارسال on# فعال و off# غیر فعال میشه. portb.1 رو هم گذاشتم برای وضعیت که به صورت پیشفرض روشنه و در صورت برقرار شدن ارتباط میکرو با sim800 خاموش میشه. از کریستال خارجی 16 مگاهرتز برای اسیلاتور
    [آموزشی] کنترل رله با پیامک توسط sim800l
    [آموزشی] راه اندازی سنسورهای DHT11 و DHT22 با کدویژن
    [آموزشی] مدار عملی اتصال میکروفن خازنی به میکروکنترلر
    [آموزشی] آموزش نحوه راه اندازی میکروهای fmd
    صفحه اینستاگرام : ecdco_ir

    دیدگاه


      #3
      پاسخ : فعال کردن وقفه سریالrx

      تشکر بابت پاسخگویی... اینکه چون مبتدی ام سوالم رو جز جز می پرسم

      نوشته اصلی توسط سید رضا باباتبار نمایش پست ها
      حداکثر دیتای دریافتی
      خب من توی Rfid به 10 بیت که شماره سریال تگ rfid هست نیاز دارم یعنی باید اون receiver buffer در قسمت وقفه ی Rx interrupt رو 10 بذارم؟

      دلیل: ادغام دو پست برای جلوگیری از اسپم


      نوشته اصلی توسط سید رضا باباتبار نمایش پست ها
      .خودش برات کدی مینویسه که دیتا ها رو میریزه تو rx_buffer
      یعنی
      rx_buffer برابره با اون شماره سریال تگ Rfid؟
      مثلا اگه یه کارتی رو به صورت a (که یک رشته ی 10 تایی از اعداد) رو داشته باشم میتونم اینطوری چک کنم ببینم آیا همون کارتیه که الان جلوی Rfid readerعه یا نه؟
      if(
      rx_buffer==a)

      دیدگاه


        #4
        پاسخ : فعال کردن وقفه سریالrx

        اون ۱۰ بیت کدیه که تگ برای ماژول rfid میفرسته اما ماژول طبق استاندارد usart و تو مد ۸ بیتی دیتا رو میفرسته.توصیه میکنم کد های آماده رو بررسی کنید،فکر کنم pdf فارسیش هم موجود باشه.
        [آموزشی] کنترل رله با پیامک توسط sim800l
        [آموزشی] راه اندازی سنسورهای DHT11 و DHT22 با کدویژن
        [آموزشی] مدار عملی اتصال میکروفن خازنی به میکروکنترلر
        [آموزشی] آموزش نحوه راه اندازی میکروهای fmd
        صفحه اینستاگرام : ecdco_ir

        دیدگاه


          #5
          پاسخ : فعال کردن وقفه سریالrx

          من برای RFID اول دستور gets رو استفاده کردم
          تو شبیه سازی جواب داد اما در عمل خیر
          اما استفاده از وقفه سریال
          ماژول RFID بعد از خواندن تگ یه عبارت 10 بایتی برای کد روی کارت 2 بایت قبل از کد کارت و یک بایت هم بعد از 10 بایت دیتا. درست خاطرم نیست بهتره دیتاشیت رو مطالعه کنید.
          شما به راحتی طبق دیتا شیت بایت شروع قبل از 10 بایت دیتا که همیشه ثابته رو تو یک شرط در وقفه سریال تشخیص میدید. با دریافت اون عدد یعنی بعدش قراره دیتا بیاد و اینبار شروع می کنید به ذخیره دیتا ورودی تا کی؟ تا زمانی که بایت پایان که باز ثابت هست رو دریافت کنید. حالا شما شماره کارت رو تو rx_buffer دارید و کپی میکنید تو یه متغیر دیگه و استفاده تون رو میبرید
          نکته: بعد از دریافت باید حتما rx_buffer رو پاک کنید و rx_wr_index که شمارنده تعداد بایت های دریافتی سریال هست رو ریست کنید (صفر).

          دیدگاه


            #6
            پاسخ : فعال کردن وقفه سریالrx

            نوشته اصلی توسط سید رضا باباتبار نمایش پست ها
            اون ۱۰ بیت کدیه که تگ برای ماژول rfid میفرسته اما ماژول طبق استاندارد usart و تو مد ۸ بیتی دیتا رو میفرسته.توصیه میکنم کد های آماده رو بررسی کنید،فکر کنم pdf فارسیش هم موجود باشه.
            راستش کدهای آماده رم دیدم مثل کد زیر :
            [B]char str[/B][B][]={'0','0','0','0','0','0','0','0','0','0'};[/B]

            [B]char card1[]={'0','0','0','1','3','5','4','5','9','8'};[/B]
            [B]char card2[]={'0','0','0','1','1','5','7','1','8','6'};[/B]


            [B]void main(void)[/B]
            [B]{[/B]
            [B] UCSRA=0x00;[/B]
            [B] UCSRB=0x10;[/B]
            [B] UCSRC=0x86;[/B]
            [B] UBRRH=0x00;[/B]
            [B] UBRRL=51;[/B]

            [B] lcd_init(20);[/B]


            [B] while (1)[/B]
            [B] {[/B]
            [B] UCSRB=0x90; [/B]
            [B] gets(str,10); [/B]
            [B] UCSRB=0x00; [/B]


            [B] lcd_clear();[/B]
            [B] lcd_puts(str); [/B]

            [B] if (str[9]==card1[9] && str[8]==card1[8] && str[7]==card1[7] && str[6]==card1[6] && str[5]==card1[5] && str[4]==card1[4] && str[3]==card1[3]){lcd_gotoxy(5,1);lcd_puts("CART 1");delay_ms(1000);} [/B]
            [B] else if (str[9]==card2[9] && str[8]==card2[8] && str[7]==card2[7] && str[6]==card2[6] && str[5]==card2[5] && [/B][B]str[4]==card2[4] && str[3]==card2[3]){lcd_gotoxy(5,1);lcd_puts("CART 2");delay_ms(1000);} [/B]
            [B] else {lcd_gotoxy(0,1);lcd_puts(" Not Card Defined!");}[/B]


            منبعشمhttp://dmf313.ir
            اما اینم با کدویزارد نگفته، ....متوجه نمی شم رجیستر هاشو چطور تعریف کرده


            من ترجیحم اینه که با کدویزاردشم بدونم
            جدیدترین ویرایش توسط vivid83; ۱۹:۳۱ ۱۳۹۶/۰۸/۰۶.

            دیدگاه


              #7
              پاسخ : فعال کردن وقفه سریالrx

              نوشته اصلی توسط saeid_k68 نمایش پست ها
              من برای RFID اول دستور gets رو استفاده کردم
              تو شبیه سازی جواب داد اما در عمل خیر
              اما استفاده از وقفه سریال
              ماژول RFID بعد از خواندن تگ یه عبارت 10 بایتی برای کد روی کارت 2 بایت قبل از کد کارت و یک بایت هم بعد از 10 بایت دیتا. درست خاطرم نیست بهتره دیتاشیت رو مطالعه کنید.
              شما به راحتی طبق دیتا شیت بایت شروع قبل از 10 بایت دیتا که همیشه ثابته رو تو یک شرط در وقدید. با دریافت اون عدد یعنی بعدش قراره دیتا بیاد و اینبار شروع می کنید به ذخیره دیتا ورودی تا کی؟ تا زمانی که بایت پایان که باز ثابت هست رو دریافت کنید. حالا شما شماره کارت رو تو rx_buffer دارید و کپی میکنید تو یه متغیر دیگه و استفاده تون رو میبرید
              نکته: بعد از دریافت باید حتما rx_buffer رو پاک کنید و rx_wr_index که شمارنده تعداد بایت های دریافتی سریال هست رو ریست کنید (صفر).
              مرسی از پاسخ اما:
              در مورد بیت های ارسالی اینو پیدا کردم:
              مدار زیر برای راه انداز ی ماژول به کار گرفته می شود .RS232 در صورت استفاده از استاندارد
              ، در این حالت ، اطلاعات مربوط به شناسه کارت را به شکل یک قاب داده و آسنکرون ارسال می کند . RF01Dبه این ترتیب با هربار کشیدن کارت ،یک بسته 14 بایتی شامل 10 بایت اطلاعات کارت یک بایت شروع ، یک بایت پایانقبل از بایت پایانی ، ارسال می شود . LF و CR دو بایت
              STX 02H DATA )10BYTE( CR 0DH LF 0AH ETX 03H
              متوجه منظورتون از شرط شروع ارسال داده نشدم، اون دو بایت اولیه رو چطور و تو چه شرطی قرار بدم؟

              دلیل: ادغام دو پست برای جلوگیری از اسپم

              نوشته اصلی توسط saeid_k68 نمایش پست ها
              نکته: بعد از دریافت باید حتما rx_buffer رو پاک کنید و rx_wr_index که شمارنده تعداد بایت های دریافتی سریال هست رو ریست کنید (صفر).

              پاسخ

              پاسخ با نقل قول
              اگه ممکنه اینم توضیح بدین

              دیدگاه


                #8
                پاسخ : فعال کردن وقفه سریالrx

                ممنون میشم اگه یکی از دوستان نحوه استفاده ازین وقفه برای خوندن RFid رو توضیح بده.

                دیدگاه


                  #9
                  پاسخ : فعال کردن وقفه سریالrx

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


                  نوشته اصلی توسط vivid83 نمایش پست ها
                  در این حالت ، اطلاعات مربوط به شناسه کارت را به شکل یک قاب داده و آسنکرون ارسال می کند . RF01Dبه این ترتیب با هربار کشیدن کارت ،یک بسته 14 بایتی شامل 10 بایت اطلاعات کارت یک بایت شروع ، یک بایت پایانقبل از بایت پایانی ، ارسال می شود . LF و CR دو بایت
                  STX 02H DATA )10BYTE( CR 0DH LF 0AH ETX 03H
                  اگر توجه کنید قبل از 10 بایت دیتا یک عدد 0D در مبنای هگز میاد بعد کد 10 رقمی و بعد از کد 10 رقمی عدد ثابت هگز 02 میاد
                  خب پس اگر تو تابع وقفه دستوری بنویسیم که اگر 0D اومد بعد از اون دیتایی که میاد رو ذخیره کن و وقتی به 02 هگز رسید دیگه دریافت تمومه و باید بیاید تو برنامه اصلی و ....


                  نوشته اصلی توسط vivid83 نمایش پست ها
                  نکته: بعد از دریافت باید حتما rx_buffer رو پاک کنید و rx_wr_index که شمارنده تعداد بایت های دریافتی سریال هست رو ریست کنید (صفر).
                  اگر بافر رو پاک نکنیم و شمارنده رو صفر نکنیم اطلاعات بعدی که میاد در ادامه اطلاعات دفعه قبلی کپی میشن و ... پس باید هر باز بافر رو پاک کنیم بعد از کارمون تا دیتای بعدی درست دریافت بشه

                  دیدگاه


                    #10
                    پاسخ : فعال کردن وقفه سریالrx

                    نوشته اصلی توسط saeid_k68 نمایش پست ها
                    سلام
                    ببخشید من نتم تموم شده واسه همین دیر میام



                    اگر توجه کنید قبل از 10 بایت دیتا یک عدد 0D در مبنای هگز میاد بعد کد 10 رقمی و بعد از کد 10 رقمی عدد ثابت هگز 02 میاد
                    خب پس اگر تو تابع وقفه دستوری بنویسیم که اگر 0D اومد بعد از اون دیتایی که میاد رو ذخیره کن و وقتی به 02 هگز رسید دیگه دریافت تمومه و باید بیاید تو برنامه اصلی و ....




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


                    برای نوشتن تابعه این شرط ها رو باید روی چی بذارم؟ و اینکه آیا برای اون بافر سایز14 بایت اکیه؟

                    دلیل: ادغام دو پست برای جلوگیری از اسپم

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

                    پاسخ

                    پاسخ با نقل قول
                    {
                    rx_counter=0;
                    rx_buffer_overflow=1;
                    }
                    این تابعیه وقفه ایه که کدویزارد میسازه

                    میشه بگین کارکردش چیه؟

                    دیدگاه

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