📄 uartsw2_8c-source.html
字号:
00155 00156 <span class="comment">// set the start bit</span>00157 <span class="preprocessor"> #ifdef UARTSW_INVERT</span>00158 <span class="preprocessor"></span> sbi(<a class="code" href="uartsw2conf_8h.html#a2">UARTSW_TX_PORT</a>, <a class="code" href="uartsw2conf_8h.html#a4">UARTSW_TX_PIN</a>);00159 <span class="preprocessor"> #else</span>00160 <span class="preprocessor"></span> cbi(<a class="code" href="uartsw2conf_8h.html#a2">UARTSW_TX_PORT</a>, <a class="code" href="uartsw2conf_8h.html#a4">UARTSW_TX_PIN</a>);00161 <span class="preprocessor"> #endif</span>00162 <span class="preprocessor"></span> <span class="comment">// schedule the next bit</span>00163 outb(OCR2, inb(TCNT2) + UartswBaudRateDiv);00164 <span class="comment">// enable OC2 interrupt</span>00165 sbi(TIMSK, OCIE2);00166 }00167 <span class="comment"></span>00168 <span class="comment">//! gets a byte (if available) from the uart receive buffer</span><a name="l00169"></a><a class="code" href="uartsw2_8c.html#a15">00169</a> <span class="comment"></span>u08 <a class="code" href="uartsw_8c.html#a15">uartswReceiveByte</a>(u08* rxData)00170 {00171 <span class="comment">// make sure we have a receive buffer</span>00172 <span class="keywordflow">if</span>(uartswRxBuffer.<a class="code" href="structstruct__cBuffer.html#o1">size</a>)00173 {00174 <span class="comment">// make sure we have data</span>00175 <span class="keywordflow">if</span>(uartswRxBuffer.<a class="code" href="structstruct__cBuffer.html#o2">datalength</a>)00176 {00177 <span class="comment">// get byte from beginning of buffer</span>00178 *rxData = <a class="code" href="group__buffer.html#ga2">bufferGetFromFront</a>(&uartswRxBuffer);00179 <span class="keywordflow">return</span> TRUE;00180 }00181 <span class="keywordflow">else</span>00182 {00183 <span class="comment">// no data</span>00184 <span class="keywordflow">return</span> FALSE;00185 }00186 }00187 <span class="keywordflow">else</span>00188 {00189 <span class="comment">// no buffer</span>00190 <span class="keywordflow">return</span> FALSE;00191 }00192 }00193 <a name="l00194"></a><a class="code" href="uartsw2_8c.html#a16">00194</a> <span class="keywordtype">void</span> <a class="code" href="uartsw_8c.html#a16">uartswTxBitService</a>(<span class="keywordtype">void</span>)00195 {00196 <span class="keywordflow">if</span>(UartswTxBitNum)00197 {00198 <span class="comment">// there are bits still waiting to be transmitted</span>00199 <span class="keywordflow">if</span>(UartswTxBitNum > 1)00200 {00201 <span class="comment">// transmit data bits (inverted, LSB first)</span>00202 <span class="preprocessor"> #ifdef UARTSW_INVERT</span>00203 <span class="preprocessor"></span> <span class="keywordflow">if</span>( !(UartswTxData & 0x01) )00204 <span class="preprocessor"> #else</span>00205 <span class="preprocessor"></span> <span class="keywordflow">if</span>( (UartswTxData & 0x01) )00206 <span class="preprocessor"> #endif</span>00207 <span class="preprocessor"></span> sbi(<a class="code" href="uartsw2conf_8h.html#a2">UARTSW_TX_PORT</a>, <a class="code" href="uartsw2conf_8h.html#a4">UARTSW_TX_PIN</a>);00208 <span class="keywordflow">else</span>00209 cbi(<a class="code" href="uartsw2conf_8h.html#a2">UARTSW_TX_PORT</a>, <a class="code" href="uartsw2conf_8h.html#a4">UARTSW_TX_PIN</a>);00210 <span class="comment">// shift bits down</span>00211 UartswTxData = UartswTxData>>1;00212 }00213 <span class="keywordflow">else</span>00214 {00215 <span class="comment">// transmit stop bit</span>00216 <span class="preprocessor"> #ifdef UARTSW_INVERT</span>00217 <span class="preprocessor"></span> cbi(<a class="code" href="uartsw2conf_8h.html#a2">UARTSW_TX_PORT</a>, <a class="code" href="uartsw2conf_8h.html#a4">UARTSW_TX_PIN</a>);00218 <span class="preprocessor"> #else</span>00219 <span class="preprocessor"></span> sbi(<a class="code" href="uartsw2conf_8h.html#a2">UARTSW_TX_PORT</a>, <a class="code" href="uartsw2conf_8h.html#a4">UARTSW_TX_PIN</a>);00220 <span class="preprocessor"> #endif</span>00221 <span class="preprocessor"></span> }00222 <span class="comment">// schedule the next bit</span>00223 outb(OCR2, inb(OCR2) + UartswBaudRateDiv);00224 <span class="comment">// count down</span>00225 UartswTxBitNum--;00226 }00227 <span class="keywordflow">else</span>00228 {00229 <span class="comment">// transmission is done</span>00230 <span class="comment">// clear busy flag</span>00231 UartswTxBusy = FALSE;00232 <span class="comment">// disable OC2 interrupt</span>00233 cbi(TIMSK, OCIE2);00234 }00235 }00236 <a name="l00237"></a><a class="code" href="uartsw2_8c.html#a17">00237</a> <span class="keywordtype">void</span> <a class="code" href="uartsw_8c.html#a17">uartswRxBitService</a>(<span class="keywordtype">void</span>)00238 {00239 <span class="comment">// this function runs on either:</span>00240 <span class="comment">// - a rising edge interrupt</span>00241 <span class="comment">// - Timer 0 output compare</span>00242 <span class="keywordflow">if</span>(!UartswRxBusy)00243 {00244 <span class="comment">// UART was not previously busy,</span>00245 <span class="comment">// this must be is a start bit</span>00246 00247 <span class="comment">// disable INT2 interrupt</span>00248 cbi(GICR, INT2);00249 <span class="comment">// schedule data bit sampling 1.5 bit periods from now</span>00250 outb(OCR0, inb(TCNT0) + UartswBaudRateDiv + UartswBaudRateDiv/2);00251 <span class="comment">// clear OC0 interrupt flag</span>00252 sbi(TIFR, OCF0);00253 <span class="comment">// enable OC0 interrupt</span>00254 sbi(TIMSK, OCIE0);00255 <span class="comment">// set busy flag</span>00256 UartswRxBusy = TRUE;00257 <span class="comment">// reset bit counter</span>00258 UartswRxBitNum = 0;00259 <span class="comment">// reset data</span>00260 UartswRxData = 0;00261 }00262 <span class="keywordflow">else</span>00263 {00264 <span class="comment">// start bit has already been received</span>00265 <span class="comment">// we're in the data bits</span>00266 00267 <span class="comment">// shift data byte to make room for new bit</span>00268 UartswRxData = UartswRxData>>1;00269 00270 <span class="comment">// sample the data line</span>00271 <span class="preprocessor"> #ifdef UARTSW_INVERT</span>00272 <span class="preprocessor"></span> <span class="keywordflow">if</span>( !(inb(<a class="code" href="uartsw2conf_8h.html#a7">UARTSW_RX_PORTIN</a>) & (1<<<a class="code" href="uartsw2conf_8h.html#a8">UARTSW_RX_PIN</a>)) )00273 <span class="preprocessor"> #else</span>00274 <span class="preprocessor"></span> <span class="keywordflow">if</span>( (inb(<a class="code" href="uartsw2conf_8h.html#a7">UARTSW_RX_PORTIN</a>) & (1<<<a class="code" href="uartsw2conf_8h.html#a8">UARTSW_RX_PIN</a>)) )00275 <span class="preprocessor"> #endif</span>00276 <span class="preprocessor"></span> {00277 <span class="comment">// serial line is marking</span>00278 <span class="comment">// record '1' bit</span>00279 UartswRxData |= 0x80;00280 }00281 00282 <span class="comment">// increment bit counter</span>00283 UartswRxBitNum++;00284 <span class="comment">// schedule next bit sample</span>00285 outb(OCR0, inb(OCR0) + UartswBaudRateDiv);00286 00287 <span class="comment">// check if we have a full byte</span>00288 <span class="keywordflow">if</span>(UartswRxBitNum >= 8)00289 {00290 <span class="comment">// save data in receive buffer</span>00291 <a class="code" href="group__buffer.html#ga5">bufferAddToEnd</a>(&uartswRxBuffer, UartswRxData);00292 <span class="comment">// disable OC0 interrupt</span>00293 cbi(TIMSK, OCIE0);00294 <span class="comment">// clear INT2 interrupt flag</span>00295 sbi(GIFR, INTF2);00296 <span class="comment">// enable INT interrupt</span>00297 sbi(GICR, INT2);00298 <span class="comment">// clear busy flag</span>00299 UartswRxBusy = FALSE;00300 }00301 }00302 }00303 00304 <a class="code" href="a2d_8c.html#a10">SIGNAL</a>(SIG_INTERRUPT2)00305 {00306 <span class="comment">// run RxBit service routine</span>00307 <a class="code" href="uartsw_8c.html#a17">uartswRxBitService</a>();00308 }</pre></div><hr size="1"><address style="align: right;"><small>Generated on Sun Oct 29 03:41:08 2006 for Procyon AVRlib by <a href="http://www.doxygen.org/index.html"><img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.2 </small></address></body></html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -