diff --git a/ADF7021.cpp b/ADF7021.cpp index 1f78a23..4def500 100644 --- a/ADF7021.cpp +++ b/ADF7021.cpp @@ -20,7 +20,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ - + #include "Config.h" #if defined(ENABLE_ADF7021) @@ -283,7 +283,7 @@ void CIO::ifConf(MMDVM_STATE modemState, bool reset) m_RX_F_divider = floor(divider + 0.5); ADF7021_RX_REG0 = (uint32_t) 0b0000; - + #if defined(BIDIR_DATA_PIN) ADF7021_RX_REG0 |= (uint32_t) 0b01001 << 27; // mux regulator/receive #else @@ -292,7 +292,7 @@ void CIO::ifConf(MMDVM_STATE modemState, bool reset) ADF7021_RX_REG0 |= (uint32_t) m_RX_N_divider << 19; // frequency; ADF7021_RX_REG0 |= (uint32_t) m_RX_F_divider << 4; // frequency; - + if( div2 == 1U ) divider = m_frequency_tx / (ADF7021_PFD / 2U); else @@ -369,7 +369,7 @@ void CIO::ifConf(MMDVM_STATE modemState, bool reset) ADF7021_REG3 = ADF7021_REG3_DSTAR; ADF7021_REG10 = ADF7021_REG10_DSTAR; - + // K=32 ADF7021_REG4 = (uint32_t) 0b0100 << 0; // register 4 ADF7021_REG4 |= (uint32_t) 0b001 << 4; // mode, GMSK @@ -386,10 +386,10 @@ void CIO::ifConf(MMDVM_STATE modemState, bool reset) ADF7021_REG2 |= (uint32_t) (m_dstarDev / div2) << 19; // deviation ADF7021_REG2 |= (uint32_t) 0b001 << 4; // modulation (GMSK) break; - + case STATE_DMR: // Dev: +1 symb 648 Hz, symb rate = 4800 - + ADF7021_REG3 = ADF7021_REG3_DMR; ADF7021_REG10 = ADF7021_REG10_DMR; @@ -413,7 +413,7 @@ void CIO::ifConf(MMDVM_STATE modemState, bool reset) ADF7021_REG2 |= (uint32_t) 0b111 << 4; // modulation (RC 4FSK) #endif break; - + case STATE_YSF: // Dev: +1 symb 900 Hz, symb rate = 4800 @@ -440,7 +440,7 @@ void CIO::ifConf(MMDVM_STATE modemState, bool reset) ADF7021_REG2 |= (uint32_t) 0b111 << 4; // modulation (RC 4FSK) #endif break; - + case STATE_P25: // Dev: +1 symb 600 Hz, symb rate = 4800 @@ -467,7 +467,7 @@ void CIO::ifConf(MMDVM_STATE modemState, bool reset) ADF7021_REG2 |= (uint32_t) 0b111 << 4; // modulation (RC 4FSK) #endif break; - + case STATE_NXDN: // Dev: +1 symb 350 Hz, symb rate = 2400 @@ -494,7 +494,7 @@ void CIO::ifConf(MMDVM_STATE modemState, bool reset) ADF7021_REG2 |= (uint32_t) 0b111 << 4; // modulation (RC 4FSK) #endif break; - + default: break; } @@ -531,7 +531,7 @@ void CIO::ifConf(MMDVM_STATE modemState, bool reset) ADF7021_REG2 |= (uint32_t) 0b110001 << 7; // PA AD7021_control_word = ADF7021_REG2; Send_AD7021_control(); - + // TEST DAC (14) #if defined(TEST_DAC) AD7021_control_word = 0x0000001E; @@ -567,7 +567,7 @@ void CIO::ifConf(MMDVM_STATE modemState, bool reset) // 3FSK/4FSK DEMOD (13) AD7021_control_word = ADF7021_REG13; Send_AD7021_control(); - + #if defined(TEST_TX) PTT_pin(HIGH); AD7021_control_word = ADF7021_TX_REG0; @@ -607,7 +607,7 @@ void CIO::ifConf2(MMDVM_STATE modemState) ADF7021_REG3 = ADF7021_REG3_DSTAR; ADF7021_REG10 = ADF7021_REG10_DSTAR; - + // K=32 ADF7021_REG4 = (uint32_t) 0b0100 << 0; // register 4 ADF7021_REG4 |= (uint32_t) 0b001 << 4; // mode, GMSK @@ -624,10 +624,10 @@ void CIO::ifConf2(MMDVM_STATE modemState) ADF7021_REG2 |= (uint32_t) (m_dstarDev / div2)<< 19; // deviation ADF7021_REG2 |= (uint32_t) 0b001 << 4; // modulation (GMSK) break; - + case STATE_DMR: // Dev: +1 symb 648 Hz, symb rate = 4800 - + ADF7021_REG3 = ADF7021_REG3_DMR; ADF7021_REG10 = ADF7021_REG10_DMR; @@ -647,7 +647,7 @@ void CIO::ifConf2(MMDVM_STATE modemState) ADF7021_REG2 |= (uint32_t) (m_dmrDev / div2) << 19; // deviation ADF7021_REG2 |= (uint32_t) 0b111 << 4; // modulation (RC 4FSK) break; - + case STATE_YSF: // Dev: +1 symb 900 Hz, symb rate = 4800 @@ -670,7 +670,7 @@ void CIO::ifConf2(MMDVM_STATE modemState) ADF7021_REG2 |= (uint32_t) (m_ysfDev / div2) << 19; // deviation ADF7021_REG2 |= (uint32_t) 0b111 << 4; // modulation (RC 4FSK) break; - + case STATE_P25: // Dev: +1 symb 600 Hz, symb rate = 4800 @@ -740,7 +740,7 @@ void CIO::ifConf2(MMDVM_STATE modemState) // IF coarse cal (5) AD7021_control_word = ADF7021_REG5; Send_AD7021_control2(); - + // Delay for coarse IF filter calibration delay_IFcal(); @@ -754,7 +754,7 @@ void CIO::ifConf2(MMDVM_STATE modemState) ADF7021_REG2 |= (uint32_t) 0b110001 << 7; // PA AD7021_control_word = ADF7021_REG2; Send_AD7021_control2(); - + // TEST DAC (14) AD7021_control_word = 0x0000000E; Send_AD7021_control2(); @@ -778,7 +778,7 @@ void CIO::ifConf2(MMDVM_STATE modemState) // 3FSK/4FSK DEMOD (13) AD7021_control_word = ADF7021_REG13; Send_AD7021_control2(); - + // TEST MODE (disabled) (15) AD7021_control_word = 0x000E000F; Send_AD7021_control2(); @@ -788,7 +788,7 @@ void CIO::ifConf2(MMDVM_STATE modemState) void CIO::interrupt() { uint8_t bit = 0U; - + if (!m_started) return; @@ -850,7 +850,7 @@ void CIO::interrupt() even = ADF7021_EVEN_BIT; } } - + // we sample the RX bit at rising TXD clock edge, so TXD must be 1 and we are not in tx mode if (!m_tx && clk == 1U && !m_duplex) { if(RXD_pin()) @@ -860,7 +860,7 @@ void CIO::interrupt() m_rxBuffer.put(bit, m_control); } - + if (torx_request == true && even == ADF7021_EVEN_BIT && m_tx && clk == 0U) { // that is absolutely crucial in 4FSK, see datasheet: // enable sle after 1/4 tBit == 26uS when sending MSB (even == false) and clock is low @@ -881,14 +881,15 @@ void CIO::interrupt() // last tranmittted bit is always the even bit // since the current bit is a transitional "don't care" bit, never transmitted even = !ADF7021_EVEN_BIT; - } + } m_watchdog++; m_modeTimerCnt++; + m_int1counter++; if(m_scanPauseCnt >= SCAN_PAUSE) m_scanPauseCnt = 0U; - + if(m_scanPauseCnt != 0U) m_scanPauseCnt++; } @@ -897,7 +898,7 @@ void CIO::interrupt() void CIO::interrupt2() { uint8_t bit = 0U; - + if(m_duplex) { if(RXD2_pin()) bit = 1U; @@ -906,6 +907,8 @@ void CIO::interrupt2() m_rxBuffer.put(bit, m_control); } + + m_int2counter++; } #endif diff --git a/CalDMR.cpp b/CalDMR.cpp index 8977b22..d952eb1 100644 --- a/CalDMR.cpp +++ b/CalDMR.cpp @@ -53,7 +53,8 @@ CCalDMR::CCalDMR() : m_transmit(false), m_state(DMRCAL1K_IDLE), m_dmr1k(), -m_audioSeq(0) +m_audioSeq(0), +m_count(0) { ::memcpy(m_dmr1k, VOICE_1K, DMR_FRAME_LENGTH_BYTES + 1U); } @@ -72,6 +73,17 @@ void CCalDMR::process() case STATE_DMRDMO1K: dmrdmo1k(); break; + case STATE_INTCAL: + // Simple interrupt counter for board diagnostics (TCXO, connections, etc) + // Not intended for precise interrupt frequency measurements + m_count++; + if (m_count >= CAL_DLY_LOOP) { + m_count = 0U; + uint16_t int1, int2; + io.getIntCounter(int1, int2); + DEBUG3("Counter INT1/INT2:", int1 >> 1U, int2); + } + break; default: break; } diff --git a/CalDMR.h b/CalDMR.h index 33fec17..8748093 100644 --- a/CalDMR.h +++ b/CalDMR.h @@ -47,6 +47,7 @@ class CCalDMR { DMRCAL1K m_state; uint8_t m_dmr1k[DMR_FRAME_LENGTH_BYTES + 1U]; uint8_t m_audioSeq; + uint32_t m_count; }; #endif diff --git a/CalRSSI.cpp b/CalRSSI.cpp index 0859cf4..11af51d 100644 --- a/CalRSSI.cpp +++ b/CalRSSI.cpp @@ -51,7 +51,7 @@ void CCalRSSI::process() if (m_navg >= 6U) { uint16_t ave = m_accum / 6U; - + uint8_t buffer[6U]; buffer[0U] = (m_max >> 8) & 0xFFU; buffer[1U] = (m_max >> 0) & 0xFFU; diff --git a/Debug.h b/Debug.h index c98da19..445e11a 100644 --- a/Debug.h +++ b/Debug.h @@ -36,7 +36,7 @@ #define DEBUG1(a) #define DEBUG2(a,b) #define DEBUG2I(a,b) -#define DEBUG3(a,b,c) +#define DEBUG3(a,b,c) serial.writeDebug((a),(b),(c)) #define DEBUG4(a,b,c,d) #define DEBUG5(a,b,c,d,e) diff --git a/Globals.h b/Globals.h index 419417c..8bfacd2 100644 --- a/Globals.h +++ b/Globals.h @@ -47,7 +47,8 @@ enum MMDVM_STATE { STATE_RSSICAL = 96, STATE_CWID = 97, STATE_DMRCAL = 98, - STATE_DSTARCAL = 99 + STATE_DSTARCAL = 99, + STATE_INTCAL = 100 }; const uint8_t MARK_SLOT1 = 0x08U; diff --git a/IO.cpp b/IO.cpp index 53d689b..00521aa 100644 --- a/IO.cpp +++ b/IO.cpp @@ -17,7 +17,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ - + #include "Config.h" #include "Globals.h" #include "IO.h" @@ -37,10 +37,12 @@ m_scanEnable(false), m_scanPauseCnt(0U), m_scanPos(0U), m_ledValue(true), -m_watchdog(0U) +m_watchdog(0U), +m_int1counter(0U), +m_int2counter(0U) { Init(); - + CE_pin(HIGH); LED_pin(HIGH); PTT_pin(LOW); @@ -165,7 +167,7 @@ void CIO::process() } setRX(false); } - + if(m_modemState_prev == STATE_DSTAR) scantime = SCAN_TIME; else if(m_modemState_prev == STATE_DMR) @@ -402,3 +404,11 @@ uint32_t CIO::getWatchdog() { return m_watchdog; } + +void CIO::getIntCounter(uint16_t &int1, uint16_t &int2) +{ + int1 = m_int1counter; + int2 = m_int2counter; + m_int1counter = 0U; + m_int2counter = 0U; +} diff --git a/IO.h b/IO.h index 0159184..b8e5a7e 100644 --- a/IO.h +++ b/IO.h @@ -47,6 +47,12 @@ #define SCAN_TIME 1920 #define SCAN_PAUSE 20000 +#if defined(DUPLEX) +#define CAL_DLY_LOOP 96100U +#else +#define CAL_DLY_LOOP 106000U +#endif + extern uint32_t m_frequency_rx; extern uint32_t m_frequency_tx; extern uint32_t m_pocsag_freq_tx; @@ -70,7 +76,7 @@ class CIO { void CE_pin(bool on); bool RXD_pin(void); bool CLK_pin(void); - + #if defined(BIDIR_DATA_PIN) void RXD_pin_write(bool on); #endif @@ -90,7 +96,7 @@ class CIO { #if defined(DUPLEX) void interrupt2(void); #endif - + #if defined(BIDIR_DATA_PIN) void Data_dir_out(bool dir); #endif @@ -108,6 +114,7 @@ class CIO { void setLoDevYSF(bool ysfLoDev); void resetWatchdog(void); uint32_t getWatchdog(void); + void getIntCounter(uint16_t &int1, uint16_t &int2); void selfTest(void); // RF interface API @@ -162,6 +169,8 @@ class CIO { MMDVM_STATE m_Modes[5]; bool m_ledValue; volatile uint32_t m_watchdog; + volatile uint16_t m_int1counter; + volatile uint16_t m_int2counter; }; diff --git a/MMDVM_HS.cpp b/MMDVM_HS.cpp index cf15140..3c08431 100644 --- a/MMDVM_HS.cpp +++ b/MMDVM_HS.cpp @@ -123,7 +123,7 @@ void loop() if (m_pocsagEnable && (m_modemState == STATE_POCSAG || pocsagTX.busy())) pocsagTX.process(); - if (m_calState == STATE_DMRCAL || m_calState == STATE_DMRDMO1K) + if (m_calState == STATE_DMRCAL || m_calState == STATE_DMRDMO1K || m_calState == STATE_INTCAL) calDMR.process(); #if defined(SEND_RSSI_DATA) diff --git a/MMDVM_HS.ino b/MMDVM_HS.ino index ebf4adc..7d55012 100644 --- a/MMDVM_HS.ino +++ b/MMDVM_HS.ino @@ -118,7 +118,7 @@ void loop() if (m_pocsagEnable && (m_modemState == STATE_POCSAG || pocsagTX.busy())) pocsagTX.process(); - if (m_calState == STATE_DMRCAL || m_calState == STATE_DMRDMO1K) + if (m_calState == STATE_DMRCAL || m_calState == STATE_DMRDMO1K || m_calState == STATE_INTCAL) calDMR.process(); #if defined(SEND_RSSI_DATA) diff --git a/SerialPort.cpp b/SerialPort.cpp index 335c72c..e6738a0 100644 --- a/SerialPort.cpp +++ b/SerialPort.cpp @@ -212,7 +212,7 @@ uint8_t CSerialPort::setConfig(const uint8_t* data, uint8_t length) { if (length < 13U) return 4U; - + bool ysfLoDev = (data[0U] & 0x08U) == 0x08U; bool simplex = (data[0U] & 0x80U) == 0x80U; @@ -231,7 +231,7 @@ uint8_t CSerialPort::setConfig(const uint8_t* data, uint8_t length) MMDVM_STATE modemState = MMDVM_STATE(data[3U]); - if (modemState != STATE_IDLE && modemState != STATE_DSTAR && modemState != STATE_DMR && modemState != STATE_YSF && modemState != STATE_P25 && modemState != STATE_NXDN && modemState != STATE_POCSAG && modemState != STATE_DSTARCAL && modemState != STATE_DMRCAL && modemState != STATE_DMRDMO1K && modemState != STATE_RSSICAL) + if (modemState != STATE_IDLE && modemState != STATE_DSTAR && modemState != STATE_DMR && modemState != STATE_YSF && modemState != STATE_P25 && modemState != STATE_NXDN && modemState != STATE_POCSAG && modemState != STATE_DSTARCAL && modemState != STATE_DMRCAL && modemState != STATE_DMRDMO1K && modemState != STATE_INTCAL && modemState != STATE_RSSICAL) return 4U; if (modemState == STATE_DSTAR && !dstarEnable) return 4U; @@ -278,7 +278,7 @@ uint8_t CSerialPort::setConfig(const uint8_t* data, uint8_t length) m_nxdnEnable = nxdnEnable; m_pocsagEnable = pocsagEnable; - if (modemState == STATE_DMRCAL || modemState == STATE_DMRDMO1K || modemState == STATE_RSSICAL) { + if (modemState == STATE_DMRCAL || modemState == STATE_DMRDMO1K || modemState == STATE_RSSICAL || modemState == STATE_INTCAL) { m_dmrEnable = true; m_modemState = STATE_DMR; m_calState = modemState; @@ -319,7 +319,7 @@ uint8_t CSerialPort::setConfig(const uint8_t* data, uint8_t length) io.setLoDevYSF(ysfLoDev); - if (!m_firstCal || (modemState != STATE_DMRCAL && modemState != STATE_DMRDMO1K && modemState != STATE_RSSICAL)) { + if (!m_firstCal || (modemState != STATE_DMRCAL && modemState != STATE_DMRDMO1K && modemState != STATE_RSSICAL && modemState != STATE_INTCAL)) { if(m_dstarEnable) io.ifConf(STATE_DSTAR, true); else if(m_dmrEnable) @@ -339,7 +339,7 @@ uint8_t CSerialPort::setConfig(const uint8_t* data, uint8_t length) io.printConf(); #endif - if (modemState == STATE_DMRCAL || modemState == STATE_DMRDMO1K || modemState == STATE_RSSICAL) + if (modemState == STATE_DMRCAL || modemState == STATE_DMRDMO1K || modemState == STATE_RSSICAL || modemState == STATE_INTCAL) m_firstCal = true; return 0U; @@ -356,7 +356,7 @@ uint8_t CSerialPort::setMode(const uint8_t* data, uint8_t length) if (modemState == m_modemState) return 0U; - if (modemState != STATE_IDLE && modemState != STATE_DSTAR && modemState != STATE_DMR && modemState != STATE_YSF && modemState != STATE_P25 && modemState != STATE_NXDN && modemState != STATE_POCSAG && modemState != STATE_DSTARCAL && modemState != STATE_DMRCAL && modemState != STATE_DMRDMO1K && modemState != STATE_RSSICAL) + if (modemState != STATE_IDLE && modemState != STATE_DSTAR && modemState != STATE_DMR && modemState != STATE_YSF && modemState != STATE_P25 && modemState != STATE_NXDN && modemState != STATE_POCSAG && modemState != STATE_DSTARCAL && modemState != STATE_DMRCAL && modemState != STATE_DMRDMO1K && modemState != STATE_RSSICAL && modemState != STATE_INTCAL) return 4U; if (modemState == STATE_DSTAR && !m_dstarEnable) return 4U; @@ -371,7 +371,7 @@ uint8_t CSerialPort::setMode(const uint8_t* data, uint8_t length) if (modemState == STATE_POCSAG && !m_pocsagEnable) return 4U; - if (modemState == STATE_DMRCAL || modemState == STATE_DMRDMO1K || modemState == STATE_RSSICAL) { + if (modemState == STATE_DMRCAL || modemState == STATE_DMRDMO1K || modemState == STATE_RSSICAL || modemState == STATE_INTCAL) { m_dmrEnable = true; tmpState = STATE_DMR; m_calState = modemState; @@ -589,7 +589,7 @@ void CSerialPort::process() case MMDVM_CAL_DATA: if (m_calState == STATE_DMRCAL || m_calState == STATE_DMRDMO1K) { err = calDMR.write(m_buffer + 3U, m_len - 3U); - } else if (m_calState == STATE_RSSICAL) { + } else if (m_calState == STATE_RSSICAL || m_calState == STATE_INTCAL) { err = 0U; } if (err == 0U) { @@ -1129,12 +1129,11 @@ void CSerialPort::writeRSSIData(const uint8_t* data, uint8_t length) #endif #if defined(ENABLE_DEBUG) - void CSerialPort::writeDebug(const char* text) { if (!m_debug) return; - + uint8_t reply[130U]; reply[0U] = MMDVM_FRAME_START; @@ -1154,7 +1153,7 @@ void CSerialPort::writeDebugI(const char* text, int32_t n1) { if (!m_debug) return; - + uint8_t reply[130U]; reply[0U] = MMDVM_FRAME_START; @@ -1180,7 +1179,7 @@ void CSerialPort::writeDebug(const char* text, int16_t n1) { if (!m_debug) return; - + uint8_t reply[130U]; reply[0U] = MMDVM_FRAME_START; @@ -1198,12 +1197,13 @@ void CSerialPort::writeDebug(const char* text, int16_t n1) writeInt(1U, reply, count, true); } +#endif void CSerialPort::writeDebug(const char* text, int16_t n1, int16_t n2) { if (!m_debug) return; - + uint8_t reply[130U]; reply[0U] = MMDVM_FRAME_START; @@ -1225,11 +1225,12 @@ void CSerialPort::writeDebug(const char* text, int16_t n1, int16_t n2) writeInt(1U, reply, count, true); } +#if defined(ENABLE_DEBUG) void CSerialPort::writeDebug(const char* text, int16_t n1, int16_t n2, int16_t n3) { if (!m_debug) return; - + uint8_t reply[130U]; reply[0U] = MMDVM_FRAME_START; @@ -1285,6 +1286,4 @@ void CSerialPort::writeDebug(const char* text, int16_t n1, int16_t n2, int16_t n writeInt(1U, reply, count, true); } - #endif - diff --git a/SerialPort.h b/SerialPort.h index bbfb7a6..b1fa6b7 100644 --- a/SerialPort.h +++ b/SerialPort.h @@ -56,10 +56,10 @@ class CSerialPort { void writeDebug(const char* text); void writeDebug(const char* text, int16_t n1); void writeDebugI(const char* text, int32_t n1); - void writeDebug(const char* text, int16_t n1, int16_t n2); void writeDebug(const char* text, int16_t n1, int16_t n2, int16_t n3); void writeDebug(const char* text, int16_t n1, int16_t n2, int16_t n3, int16_t n4); #endif + void writeDebug(const char* text, int16_t n1, int16_t n2); private: uint8_t m_buffer[256U]; @@ -76,7 +76,7 @@ class CSerialPort { uint8_t setMode(const uint8_t* data, uint8_t length); void setMode(MMDVM_STATE modemState); uint8_t setFreq(const uint8_t* data, uint8_t length); - + // Hardware versions void beginInt(uint8_t n, int speed); int availableInt(uint8_t n); @@ -85,4 +85,3 @@ class CSerialPort { }; #endif - diff --git a/version.h b/version.h index 47dc04b..cdfedd9 100644 --- a/version.h +++ b/version.h @@ -24,8 +24,8 @@ #define VER_MAJOR "1" #define VER_MINOR "4" -#define VER_REV "11" -#define VERSION_DATE "20181028" +#define VER_REV "12" +#define VERSION_DATE "20181104" #if defined(ZUMSPOT_ADF7021) #define BOARD_INFO "ZUMspot"