/* * Authors (alphabetical order) * - Andre Bernet * - Andreas Weitl * - Bertrand Songis * - Bryan J. Rentoul (Gruvin) * - Cameron Weeks * - Erez Raviv * - Gabriel Birkus * - Jean-Pierre Parisy * - Karl Szmutny * - Michael Blandford * - Michal Hlavinka * - Pat Mackenzie * - Philip Moss * - Rob Thomson * - Romolo Manfredini * - Thomas Husterer * * opentx is based on code named * gruvin9x by Bryan J. Rentoul: http://code.google.com/p/gruvin9x/, * er9x by Erez Raviv: http://code.google.com/p/er9x/, * and the original (and ongoing) project by * Thomas Husterer, th9x: http://code.google.com/p/th9x/ * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ #include "../../opentx.h" #if defined(FRSKY) void telemetryEnableTx(void) { UCSR0B |= (1 << TXEN0); // enable TX } void telemetryEnableRx(void) { UCSR0B |= (1 << RXEN0); // enable RX UCSR0B |= (1 << RXCIE0); // enable Interrupt } void processSerialData(uint8_t data); extern uint8_t frskyRxBufferCount; // TODO not driver, change name ISR(USART0_RX_vect) { uint8_t stat; uint8_t data; UCSR0B &= ~(1 << RXCIE0); // disable Interrupt sei(); stat = UCSR0A; // USART control and Status Register 0 A /* bit 7 6 5 4 3 2 1 0 RxC0 TxC0 UDRE0 FE0 DOR0 UPE0 U2X0 MPCM0 RxC0: Receive complete TXC0: Transmit Complete UDRE0: USART Data Register Empty FE0: Frame Error DOR0: Data OverRun UPE0: USART Parity Error U2X0: Double Tx Speed PCM0: MultiProcessor Comms Mode */ // rh = UCSR0B; //USART control and Status Register 0 B /* bit 7 6 5 4 3 2 1 0 RXCIE0 TxCIE0 UDRIE0 RXEN0 TXEN0 UCSZ02 RXB80 TXB80 RxCIE0: Receive Complete int enable TXCIE0: Transmit Complete int enable UDRIE0: USART Data Register Empty int enable RXEN0: Rx Enable TXEN0: Tx Enable UCSZ02: Character Size bit 2 RXB80: Rx data bit 8 TXB80: Tx data bit 8 */ data = UDR0; // USART data register 0 if (stat & ((1 << FE0) | (1 << DOR0) | (1 << UPE0))) { // discard buffer and start fresh on any comms error frskyRxBufferCount = 0; } else { processSerialData(data); } cli() ; UCSR0B |= (1 << RXCIE0); // enable Interrupt } void telemetryPortInit() { #if !defined(SIMU) DDRE &= ~(1 << DDE0); // set RXD0 pin as input PORTE &= ~(1 << PORTE0); // disable pullup on RXD0 pin #undef BAUD #define BAUD 9600 #include UBRR0H = UBRRH_VALUE; UBRR0L = UBRRL_VALUE; UCSR0A &= ~(1 << U2X0); // disable double speed operation. // set 8N1 UCSR0B = 0 | (0 << RXCIE0) | (0 << TXCIE0) | (0 << UDRIE0) | (0 << RXEN0) | (0 << TXEN0) | (0 << UCSZ02); UCSR0C = 0 | (1 << UCSZ01) | (1 << UCSZ00); while (UCSR0A & (1 << RXC0)) UDR0; // flush receive buffer // These should be running right from power up on a FrSky enabled '9X. telemetryEnableTx(); // enable FrSky-Telemetry emission frskyTxBufferCount = 0; // TODO not driver code telemetryEnableRx(); // enable FrSky-Telemetry reception #endif } void telemetryTransmitBuffer() { UCSR0B |= (1 << UDRIE0); // enable UDRE0 interrupt } #endif