tag:blogger.com,1999:blog-8516057646005806683.post2855056845760635775..comments2023-04-07T18:39:50.976+08:00Comments on Cooper Maa: 5.1) USART TransmitterCooper Maahttp://www.blogger.com/profile/14597993167511073460noreply@blogger.comBlogger3125tag:blogger.com,1999:blog-8516057646005806683.post-76069426861670655422012-07-24T01:47:42.586+08:002012-07-24T01:47:42.586+08:00超級清楚!!! 謝謝~~~~~超級清楚!!! 謝謝~~~~~Sven Wanghttps://www.blogger.com/profile/15916872892211480651noreply@blogger.comtag:blogger.com,1999:blog-8516057646005806683.post-17125049688164057572012-07-23T14:14:15.695+08:002012-07-23T14:14:15.695+08:00以這行而言:
UBRR0H = (unsigned char)(baud_setting >...以這行而言:<br /><br />UBRR0H = (unsigned char)(baud_setting >> 8);<br /><br />(baud_setting >> 8) 是右移 8 個位元。假如 baud_setting 是:<br /><br /> 0000 0001 0000 1111<br /><br />右移 8 個位元之後,結果將會是:<br /><br /> 0000 0000 0000 0001<br /><br />然後結果會轉成 unsigned char 變成只有一個 byte:<br /><br /> 0000 00001<br /><br />UBRR0H 跟 UBRR0L 這兩個暫存器是用來設定 baud rate 的<br />(見這裏的說明 http://coopermaa2nd.blogspot.tw/2011/07/5-usart.html)<br /><br />公式是: <br /><br /> ubbr 設定值 = (F_CPU/16/baud rate) – 1<br /><br />舉例:<br /><br />假如要設成 9600,那麼根據公式:<br /><br /> (16000000/16/9600) – 1<br /><br />得 103,所以:<br /><br /> UBRR0H = (unsigned char) (103 >> 8);<br /> UBRR0L = (unsigned char) 103;<br /><br />得 UBRR0L 是 103,而 UBRR0H 則是 0 (因為 103 右移 8 個位元後結果為 0)<br /><br />一般情況下,UBRR0H 通常都是 0,但是在某些 baud rate 設定下,公式算出來的結果會超過一個位元組(超過 255 ),這時光靠 UBRR0L 就不夠表示,所以就會用到 UBRR0H。<br /><br />比如 2400 的 baud rate,根據公式<br /><br /> (16000000/16/2400) – 1<br /><br />得 416,所以:<br /><br /> UBRR0H = (unsigned char) (416 >> 8);<br /> UBRR0L = (unsigned char) 416;<br /><br />得 UBRR0H 為 0000 0001 (416 右移 8 個位元後結果為 1)<br /><br />而 UBRR0L 則為 160 (1010 0000),因為 416 轉成 unsighed char 後,超過 256 的部份就被截掉了<br /><br />希望可以解答你的疑惑Cooper Maahttps://www.blogger.com/profile/14597993167511073460noreply@blogger.comtag:blogger.com,1999:blog-8516057646005806683.post-90716481687166134552012-07-22T18:47:26.808+08:002012-07-22T18:47:26.808+08:00Cooper好~~~
請問
UBRR0H = (unsigned char)(baud_setti...Cooper好~~~<br /><br />請問<br />UBRR0H = (unsigned char)(baud_setting >> 8);<br />UBRR0L = (unsigned char)baud_setting;<br /><br />這兩行的語法還有意思是什麼?<br />這部分我不太了解....請Cooper幫忙解答~~<br />謝謝~~~Sven Wanghttps://www.blogger.com/profile/15916872892211480651noreply@blogger.com