اطلاعیه

Collapse
No announcement yet.

دریافت و ارسال 9 بیتی (به نتیجه رسید)

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

    دریافت و ارسال 9 بیتی (به نتیجه رسید)

    بسم الله الرحمن الرحیم
    صرفه نظر از هر کمپایلر یا محیط برنامه نویسی همه دوستان می دانند که دریافت وارسال سریال PIC عملاٌ با تنظیمات رجیستر های :
    TXSTA: TRANSMIT STATUS AND CONTROL REGISTER (ADDRESS 98h)
    RCSTA: RECEIVE STATUS AND CONTROL REGISTER (ADDRESS 18h)
    و سایر رجیسترهای دیگر همچون USART Baud Rate Generator(BRG) و سایر موارد دیگر ...
    انجام می شود. چه کاربر به صورت دستی این کار را انجام دهد و چه اینکه کامپایلر این موارد را اتوماتیک برای کاربر منظور کند.
    در تنظیماتی که کاربران برای TXSTA و RCSTA بر روی بیت های ششم و بیت های صفر (اولین بیت) هر دو رجیستر قرار می دهند ؛ برای تعیین حالاتی است که شما به جای ارسال / دریافت 8 بیت ، می خواهید یک بیت توازن یا Parity را توام با 8 بیت ارسال/دریافت کنید که مجموعا میشود : 9 بیت



    یعنی (ارسال / دریافت) 9 بیتی. یا حتی فراتر از آن (ارسال / دریافت) های با تعداد بیت های متفاوت دیگری که همگی شامل بیت توازن یا Parity باشند.

    با احترام و به خلاصه عرض شود که در داخل تمام راهنمای قطعات میکروچیپ آمده است: (متن زیر را از پی دی اف کپی کردم)
    کد:
    In order to select 9-bit transmission, transmit bit TX9
     (TXSTA<6>) should be set and the ninth bit should be written to TX9D (TXSTA<0>). 
    The ninth bit must be written before writing the 8-bit data to the TXREG register. 
    This is because a data write to the TXREG register can result
     in an immediate transfer of the data to the TSR register (if the TSR is empty).
     In such a case, an incorrect ninth data bit may be loaded in the TSR register.
    اما با تنظیم TXSTA=64HEX
    برای ارسال 9 بیت ، بیت توازن به داخل کلمه بعدی می رود ، اگر Parity قبلی برابر 1 باشد . عدد بعدی همیشه با 80HEX جمع می شود. یعنی بیت 7 کلمه بعدی همیشه 1 یک است اگر Parity قبلی یک باشد و به همین ترتیب برای کلمه بعدی تغییر وضعیت به وجود می آید اگر Parity قبلی 1 شده باشد.

    چه نکته ای هست که من نمی دانم و رعایت نمی کنم؟ که به آن دلیل بیت توازن در زمان خودش ارسال نمی شود.
    والسلام علي من اتبع الهدي .... و درود بر کساني که راه هدايت را دنبال مي کنند.

    هوشمندانه بپرسيد...

    #2
    پاسخ : دریافت و ارسال 9 بیتی

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

    کلاً شما میخواید با چه فرمتی بفرستید؟ تعداد بیت های داده، نوع پریتی و تعداد بیت های استپ چند تاست؟
    من چند وقت پیش یه جدولی درست کرده بودم که بدونم برای فرمتهای مختلف در حالتهای دریافت و ارسال چه کارهایی باشد انجام بشه که اینجا میزارم.
    یه نکته ای هم یادمه اذیتم کرد اینکه بیت پریتی یجورایی باید برعکس باشه.
    آدم فکر میکنه برای پریتی زوج اگر '1' ها زوج بودند بیت پریتی باید '1' بشه در حالی که
    برای پریتی زوج اگر تعداد 1 ها زوج باشه، بیت پریتی باید 0 باشه.
    برای پریتی فرد اگر تعداد 1 ها فرد باشه، بیت پریتی باید 0 باشه.



    کد:
    Format                   Transmit                                     Receive
    7E2:| 0| 1| 2| 3| 4| 5| 6| E| S| S|     MSb must be calculated parity. must add a delay of 1 bit-time after tx.      MSb must be cleared
    7O2:| 0| 1| 2| 3| 4| 5| 6| O| S| S|     MSb must be calculated parity. must add a delay of 1 bit-time after tx.      MSb must be cleared
    7N2:| 0| 1| 2| 3| 4| 5| 6| S| S|      MSb must be set                                  MSb must be cleared
    7E1:| 0| 1| 2| 3| 4| 5| 6| E| S|      MSb must be calculated parity                           MSb must be cleared
    7O1:| 0| 1| 2| 3| 4| 5| 6| O| S|      MSb must be calculated parity                           MSb must be cleared
    7N1:| 0| 1| 2| 3| 4| 5| 6| S| .|      MSb must be set                                  cant receive if sent back to back
    
    8E2:| 0| 1| 2| 3| 4| 5| 6| 7| E| S| S|   needs 9 bit mode. 9th bit is calculated parity. One bit-time delay after tx.   needs 9bit mode active. 9th bit is ignored.
    8O2:| 0| 1| 2| 3| 4| 5| 6| 7| O| S| S|   needs 9 bit mode. 9th bit is calculated parity. One bit-time delay after tx.   needs 9bit mode active. 9th bit is ignored.
    8N2:| 0| 1| 2| 3| 4| 5| 6| 7| S| S|     must add a delay of 1 bit-time after tx.                     none
    8E1:| 0| 1| 2| 3| 4| 5| 6| 7| E| S|     needs 9 bit mode. 9th bit is calculated parity.                  needs 9bit mode active. 9th bit is ignored.
    8O1:| 0| 1| 2| 3| 4| 5| 6| 7| O| S|     needs 9 bit mode. 9th bit is calculated parity.                  needs 9bit mode active. 9th bit is ignored.
    8N1:| 0| 1| 2| 3| 4| 5| 6| 7| S|      none                                       none
    
    S:Stop bit, E:Even parity, O:Odd parity

    دیدگاه


      #3
      پاسخ : دریافت و ارسال 9 بیتی

      بسم الله الرحمن الرحیم

      خیلی ممنون از اینکه جنابعالی وقت گذاشتین اما :

      نوشته اصلی توسط freedom_truth
      که "بیت توازن در زمان خودش ارسال نمی شود" متوجه نمیشم. یعنی توازن هر داده با داده بعدی ارسال میشه؟
      بله . در صورتیکه توازن تولید شود این به داخل داده بعدی وارد می شود. به بیانی ساده تر همیشه داده بعدی با عدد 80 هگز جمع می شود. (اگر توازن تولید شده باشد.)

      اون نقل قول دیتاشیت میگه بیت نهم باید قبل از نوشتن داده در TXREG انجام بشه. شما این رو رعایت میکنید؟
      این دقیقا سوال من است که چه تنظیمی باید بر رجیسترها اعمال شود که این اتفاق بیفتد. به هر حال توازن تولید می شود . برای ارسال راهی جز استفاده موکد از سخت افزاری که خود چیپ به آن اختصاص داده است یعنی PORTC.6 & PORTC.7 نیست. ( البته اگر سوال شما دوست خوبم را درست فهمیده باشم.)

      تعداد بیت های داده، نوع پریتی و تعداد بیت های استپ چند تاست؟
      کد:
      Address(1byte) + Command1 (1byte)+ Command2(1byte)+ . . . + Checksum
      مقدار بایت چک سام می تواند هر عملوند منطقی بر گزینه های ارسال شده ی قبل از خودچکسام باشد. مثلا EXOR از تمام بایت هایی که قبل از چکسام ارسال شده است. این تضمینی است بر حذف نویز از باند ارسال و دریافت.
      کد:
      9600,8,E,1
      آدم فکر میکنه برای پریتی . . .
      کاملا با نظرتان موافقم و متوجه این یادآوری خوب و مهم شما هستم.


      من کاملا مطمئن هستم که این مشکل بالاخره با پیگیری و ممارست حل خواهد شد. اما به هر حال افتخاری هست برای من که دوستانی در اینجا پیدا می کنم که در این سطح از تواضع و صدالبته از دانش هستند.

      به دوستی با شما افتخار می کنم.
      والسلام علي من اتبع الهدي .... و درود بر کساني که راه هدايت را دنبال مي کنند.

      هوشمندانه بپرسيد...

      دیدگاه


        #4
        پاسخ : دریافت و ارسال 9 بیتی

        ما مخلصیم برادر.

        نوشته اصلی توسط رضا اصغریان
        بله . در صورتیکه توازن تولید شود این به داخل داده بعدی وارد می شود. به بیانی ساده تر همیشه داده بعدی با عدد 80 هگز جمع می شود. (اگر توازن تولید شده باشد.)
        اینجا یک تناقض هست. شایدم سوء تفاهم. شما فرمودید فرمت شما ‎8,E,1 هست ولی اینجا میگید داده با 80 هگز جمع میشه.
        ‎8,E,1 یعنی 8 بیت داده، یک بیت پریتی زوج و یک بیت استپ. بیت پریتی شما نباید با چیزی جمع بشه. باید در بیت نهم(TX9D) قرار بگیره.
        کد:
        8E1:| 0| 1| 2| 3| 4| 5| 6| 7| E| S|     needs 9 bit mode. 9th bit is calculated parity.


        این دقیقا سوال من است که چه تنظیمی باید بر رجیسترها اعمال شود که این اتفاق بیفتد. به هر حال توازن تولید می شود . برای ارسال راهی جز استفاده موکد از سخت افزاری که خود چیپ به آن اختصاص داده است یعنی PORTC.6 & PORTC.7 نیست. ( البته اگر سوال شما دوست خوبم را درست فهمیده باشم.)
        تنظیم خاصی لازم نیست. مراحل کار اینه:

        1. فعال کردن مد ارسال و دریافت 9بیتی(RX9=1 TX9=1)
        2. محاسبه پریتی زوج و قرار دادن آن در بیت TX9D از رجیستر TXSTA
        3. نوشتن داده 8بیتی در رجیستر TXREG

        نمونه کد C:
        [code=c]#define ODD 1
        #define EVEN 2

        int1 getparity(unsigned int8 c, unsigned int8 parity_type)
        {
        int8 i;
        int8 sum=0;
        for (i=0; i<=7; i++)
        {
        if (bit_test(c,i)) sum+=1;
        }
        if (parity_type==EVEN)
        {
        if(!bit_test(sum,0)) return(TRUE); else return(FALSE); //if lsb is 0, number of '1's is even.
        }
        else
        {
        if(bit_test(sum,0)) return(TRUE); else return(FALSE); //if lsb is 1, number of '1's is odd.
        }
        }

        void putc_8E1(unsigned int8 c)
        {
        if(getparity(c,EVEN)) TX9D=0; else TX9D=1; //for even parity, if number of '1's is even, parity bit is CLEARED.
        putc(c);
        }[/code]

        دیدگاه


          #5
          پاسخ : دریافت و ارسال 9 بیتی

          البته اگر کد باشه بهتر میشه نظر داد.

          دیدگاه


            #6
            پاسخ : دریافت و ارسال 9 بیتی

            بسم الله الرحمن الرحیم

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

            نوشته اصلی توسط freedom_truth
            البته اگر کد باشه بهتر میشه نظر داد.

            سعی می کنم که تا چند روز آینده یک نمونه سورس کد را در اینجا قرار دهم که مرجع مناسبی برای مراجعین بعدی باشد و یک یادگاری از ما بر جای بماند. البته بنده کاربر PICBASIC هستم.
            والسلام علي من اتبع الهدي .... و درود بر کساني که راه هدايت را دنبال مي کنند.

            هوشمندانه بپرسيد...

            دیدگاه


              #7
              پاسخ : دریافت و ارسال 9 بیتی

              مشکل چی بود؟

              دیدگاه


                #8
                پاسخ : دریافت و ارسال 9 بیتی

                بسم الله الرحمن الرحیم

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

                به هر حال از لطف و مساعدت شما freedom_truth عزیز بسیار سپاسگذارم

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

                همانطور که همه می دانند : قلب ارسال سریال ، رجیستری به نام TSR است که 9 بیتی است .



                (دقت بفرمائید ارسال سریال و برای دریافت سریال رجیستر آن PSR است).

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

                TX9D ، بیت صفر از رجیسترهای RCSTA و TXSTA است.

                و یک نکته قضیه این است که شرکت سازنده گفته است :
                این اولویت نوشتن توازن باید در بیت نهم باید قبل از نوشتن دیتا در TXREG باشد . در بررسی متوجه شدم که این دست ما نیست و البته این یک راهنمایی برای تولید کنندگان نرم افزار Compiler کامپایلر است که بدانند این قابلیت را باید در برنامه شان بگنجانند تا معماری سخت افزار رعایت شود.
                اگر آنها این قابلیت را به کامپایلرهایشان اضافه نکنند اینگونه به نظر می رسد که کامپایلر رجیستر ارسال TXSTA بیت صفر و بیت 6 ام را تغییری نمی دهد.

                من چون کاربر PICBASIC هستم شروع کردم به بررسی وضعیت و متوجه شدم که باید حتما خطوط اول و دوم از زیر روال زیر در تعاریف وجود داشته باشند. و این خطوط هستند که بیت های صقر و بیت ششم رجیسترهای RCSTA و TXSTA را کنترل می کنند.

                مطلب بعدی اینکه در PICBASIC تعریف کردن وجود توازن زوج یا فرد (خط چهارم از تعاریف) باعث می شود که کامپایلر ابتدا TX9D را بنویسد و بعد TXREG را بنویسد. اگر غیر از این باشد این اتفاق نمی افتد.

                وقفه های زمانی بین دستورات ارسال سریال ، به درخواست دستگاه گیرنده است و نقشی در ماجرای ماهیت 9بیتی ندارد.

                خلاصه و نتیجه :
                کاربران محیط های دیگر نیز برای ارسال 9 بیتی باید به این دو نکته توجه کنند :
                1) چطوری به کامپایلرشان بفهمانند که دارند 9 بیتی کار می کنند ( برای تاثیر گذاری بر رجیسترهای RCSTA و TXSTA )
                2) تولید توزان با چه دستوری است .

                کد:
                DEFINE HSER_BITS 9  ;Define 9-bit Send/Receive config. should apply!
                DEFINE HSER_CLROERR 1 ;Clear Overflow automatically 
                DEFINE HSER_BAUD 9600 ;Here Baud rate is 9600 
                DEFINE HSER_EVEN 1    'Set ODD Parity
                DEFINE HSER_SPBRG 25 
                
                TRISB=$FF
                TRISC=0
                
                Address VAR BYTE
                Command1 VAR BYTE
                Command2 VAR BYTE
                Command3 VAR BYTE
                Checksum VAR BYTE
                
                Address = $40
                Command1 = $50
                Command2 = $44 
                Command3 = $A5
                
                Checksum = Address ^ Command1 ^ Command2 ^ Command3 ;EXOR of all data
                
                while (PORTB.0 = 1)
                
                HSEROUT [ Address ]
                pause 1
                HSEROUT [ Command1 ]
                pause 1
                HSEROUT [ Command2 ]
                pause 1
                HSEROUT [ Command3 ]
                pause 1
                HSEROUT [ Checksum ]
                PAUSE 1
                
                WEND
                والسلام علي من اتبع الهدي .... و درود بر کساني که راه هدايت را دنبال مي کنند.

                هوشمندانه بپرسيد...

                دیدگاه

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