void interrupt() { #ifdef USB_SERIAL_DEBUG serial_handle_tx_isr(); serial_handle_rx_isr(); #endif usb_handle_isr(); }
void serial_putc(uns8 c) { uns8 tx_next; bit my_store_gie; #ifdef SERIAL_IDE_DEBUG return; #endif if ((tx_end == tx_start) && // Nothing in the fifo test_bit(pir1, TXIF)) { // And txreg is empty txreg = c; // then no need for fifo, just send straight out } else { // else put it in the fifo tx_next = tx_end + 1; // get next buffer position if (tx_next == SERIAL_TX_BUFFER_SIZE) { // if we're at the end tx_next = 0; // wrap to the beginning } #ifdef SERIAL_DISCARD_ON_TX_FULL_DURING_INT if ((!intcon.GIE) && (tx_next == tx_start)) { return; } #endif while (tx_next == tx_start) { // wait for clearing // Note, if buffer is full // this will wait for ever // if interrupts are disabled! #ifndef SERIAL_DISCARD_ON_TX_FULL_DURING_INT if (!intcon.GIE) { // we're in an interrupt serial_handle_tx_isr(); // so handle it ourselves } #endif } my_store_gie = intcon.GIE; // store interrupt state kill_interrupts(); // turn off global interrupts tx_buffer[tx_end] = c; // put it in tx_end = tx_next; // move pointer along set_bit(pie1, TXIE); // turn on interrupt for transmitting intcon.GIE = my_store_gie; // restore interrupt state } // -- else put it in the fifo }
// Interrupt routine - - - - - - - - - - void interrupt() { serial_handle_tx_isr(); serial_handle_rx_isr(); }