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





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









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





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

نمایش نتایج: از 1 به 8 از 8
  1. #1
    2013/02/25
    مشهد
    180
    32

    دریافت و ارسال 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. #2
    2006/08/16
    867
    17

    پاسخ : دریافت و ارسال 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. #3
    2013/02/25
    مشهد
    180
    32

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

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

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

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

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

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


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

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

    هوشمندانه بپرسيد...
  4. #4
    2006/08/16
    867
    17

    پاسخ : دریافت و ارسال 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. #5
    2006/08/16
    867
    17

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

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

    مهمان عزیز شما حق دیدن لینک ها را ندارید

    عضویت

  6. #6
    2013/02/25
    مشهد
    180
    32

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

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

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

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

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

    هوشمندانه بپرسيد...
  7. #7
    2006/08/16
    867
    17

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

    مشکل چی بود؟

    مهمان عزیز شما حق دیدن لینک ها را ندارید

    عضویت

  8. #8
    2013/02/25
    مشهد
    180
    32

    پاسخ : دریافت و ارسال 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
    والسلام علي من اتبع الهدي .... و درود بر کساني که راه هدايت را دنبال مي کنند.

    هوشمندانه بپرسيد...
نمایش نتایج: از 1 به 8 از 8

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

  1. ساخت فرمان بازي (موضوع به نتیجه رسید)
    توسط erfan.astinhost در انجمن مدارهای آنالوگ و مدارهای مجتمع
    پاسخ: 4
    آخرين نوشته: 2020/03/20, 12:35
  2. پاسخ: 12
    آخرين نوشته: 2014/12/26, 10:47
  3. تبدیل یک متغیر 16 بیتی به دو تا 8 بیتی برای ارسال با SPI
    توسط mehran.safavy در انجمن میکروکنترلرهای AVR
    پاسخ: 21
    آخرين نوشته: 2014/07/27, 17:00
  4. پاسخ: 1
    آخرين نوشته: 2014/06/07, 23:53
  5. معرفی ماژول فرستنده گیرنده برای ارسال و دریافت یه دیتای 10 بیتی
    توسط اشکان غفارزاده در انجمن ماژول های RF - ISM Band و بلوتوث
    پاسخ: 2
    آخرين نوشته: 2014/04/11, 11:39

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

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

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

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

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