dtmf timing, sub-khz frequency resolution
This commit is contained in:
parent
176814bc98
commit
45527b826f
|
@ -47,6 +47,7 @@ void setup() {
|
||||||
|
|
||||||
// let the AU ot of reset
|
// let the AU ot of reset
|
||||||
digitalWrite(RESET_PIN, HIGH);
|
digitalWrite(RESET_PIN, HIGH);
|
||||||
|
delay(5); // wait for device to come up
|
||||||
|
|
||||||
Serial.println("beginning radio setup");
|
Serial.println("beginning radio setup");
|
||||||
|
|
||||||
|
@ -73,6 +74,8 @@ void setup() {
|
||||||
Serial.println("changing frequency");
|
Serial.println("changing frequency");
|
||||||
freq = 420000;
|
freq = 420000;
|
||||||
radio.frequency(freq);
|
radio.frequency(freq);
|
||||||
|
Serial.print("new frequency: ");
|
||||||
|
Serial.println(radio.getFrequency());
|
||||||
|
|
||||||
// set RX volume to minimum to reduce false positives on DTMF rx
|
// set RX volume to minimum to reduce false positives on DTMF rx
|
||||||
radio.setVolume1(6);
|
radio.setVolume1(6);
|
||||||
|
@ -88,6 +91,16 @@ void setup() {
|
||||||
|
|
||||||
// set up DTMF
|
// set up DTMF
|
||||||
radio.enableDTMFReceive();
|
radio.enableDTMFReceive();
|
||||||
|
|
||||||
|
/* DTMF timing settings are optional.
|
||||||
|
* These times are set to default values when the device is started.
|
||||||
|
* You may want to change them if you're DTMF receiver isn't detecting
|
||||||
|
* codes from the HamShield (or vice versa).
|
||||||
|
*/
|
||||||
|
radio.setDTMFDetectTime(24); // time to detect a DTMF code, units are 2.5ms
|
||||||
|
radio.setDTMFIdleTime(50); // time between transmitted DTMF codes, units are 2.5ms
|
||||||
|
radio.setDTMFTxTime(60); // duration of transmitted DTMF codes, units are 2.5ms
|
||||||
|
|
||||||
Serial.println("ready");
|
Serial.println("ready");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -145,7 +158,6 @@ void loop() {
|
||||||
dtmf_to_tx = false;
|
dtmf_to_tx = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
delay(20); // make sure the last code is done
|
|
||||||
// done with tone
|
// done with tone
|
||||||
radio.setModeReceive();
|
radio.setModeReceive();
|
||||||
radio.setTxSourceMic();
|
radio.setTxSourceMic();
|
||||||
|
|
|
@ -249,6 +249,9 @@ void HamShield::initialize(bool narrowBand) {
|
||||||
setSQLoThresh(80);
|
setSQLoThresh(80);
|
||||||
setSQOn();
|
setSQOn();
|
||||||
*/
|
*/
|
||||||
|
setDTMFIdleTime(50);
|
||||||
|
setDTMFTxTime(60);
|
||||||
|
setDTMFDetectTime(24);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -447,7 +450,7 @@ void HamShield::softReset() {
|
||||||
|
|
||||||
|
|
||||||
void HamShield::setFrequency(uint32_t freq_khz) {
|
void HamShield::setFrequency(uint32_t freq_khz) {
|
||||||
radio_frequency = freq_khz;
|
radio_frequency = (float) freq_khz;
|
||||||
uint32_t freq_raw = freq_khz << 4; // shift by 4 to multiply by 16 (was shift by 3 in old 1846 chip)
|
uint32_t freq_raw = freq_khz << 4; // shift by 4 to multiply by 16 (was shift by 3 in old 1846 chip)
|
||||||
|
|
||||||
// turn off tx/rx
|
// turn off tx/rx
|
||||||
|
@ -482,6 +485,10 @@ void HamShield::setFrequency(uint32_t freq_khz) {
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t HamShield::getFrequency() {
|
uint32_t HamShield::getFrequency() {
|
||||||
|
return (uint32_t) radio_frequency;
|
||||||
|
}
|
||||||
|
|
||||||
|
float HamShield::getFrequency_float() {
|
||||||
return radio_frequency;
|
return radio_frequency;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -985,13 +992,7 @@ void HamShield::enableDTMFReceive(){
|
||||||
|
|
||||||
HSwriteBitsW(devAddr, A1846S_DTMF_ENABLE_REG, A1846S_DTMF_ENABLE_BIT, 1, 1);
|
HSwriteBitsW(devAddr, A1846S_DTMF_ENABLE_REG, A1846S_DTMF_ENABLE_BIT, 1, 1);
|
||||||
|
|
||||||
HSwriteBitsW(devAddr, A1846S_DTMF_ENABLE_REG, A18462_DTMF_DET_TIME_BIT, A18462_DTMF_DET_TIME_LEN, 24);
|
//HSwriteBitsW(devAddr, A1846S_DTMF_ENABLE_REG, A18462_DTMF_DET_TIME_BIT, A18462_DTMF_DET_TIME_LEN, 24);
|
||||||
|
|
||||||
// idle time
|
|
||||||
HSwriteBitsW(devAddr, A1846S_DTMF_TIME_REG, A1846S_DTMF_IDLE_TIME_BIT, A1846S_DTMF_IDLE_TIME_LEN, 50);
|
|
||||||
|
|
||||||
// tx time
|
|
||||||
HSwriteBitsW(devAddr, A1846S_DTMF_TIME_REG, A1846S_DUALTONE_TX_TIME_BIT, A1846S_DUALTONE_TX_TIME_LEN, 60);
|
|
||||||
|
|
||||||
//HSwriteBitsW(devAddr, 0x57, 0, 1, 1); // send dtmf to speaker out
|
//HSwriteBitsW(devAddr, 0x57, 0, 1, 1); // send dtmf to speaker out
|
||||||
|
|
||||||
|
@ -1000,6 +1001,38 @@ void HamShield::enableDTMFReceive(){
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void HamShield::setDTMFDetectTime(uint16_t detect_time) {
|
||||||
|
if (detect_time > 255) {detect_time = 255;} // maxed out
|
||||||
|
HSwriteBitsW(devAddr, A1846S_DTMF_ENABLE_REG, A18462_DTMF_DET_TIME_BIT, A18462_DTMF_DET_TIME_LEN, detect_time);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t HamShield::getDTMFDetectTime() {
|
||||||
|
HSreadBitsW(devAddr, A1846S_DTMF_ENABLE_REG, A18462_DTMF_DET_TIME_BIT, A18462_DTMF_DET_TIME_LEN, radio_i2c_buf);
|
||||||
|
return radio_i2c_buf[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
void HamShield::setDTMFIdleTime(uint16_t idle_time) {
|
||||||
|
if (idle_time > 63) {idle_time = 63;} // maxed out
|
||||||
|
// idle time is time between DTMF Tone
|
||||||
|
HSwriteBitsW(devAddr, A1846S_DTMF_TIME_REG, A1846S_DTMF_IDLE_TIME_BIT, A1846S_DTMF_IDLE_TIME_LEN, idle_time);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t HamShield::getDTMFIdleTime() {
|
||||||
|
HSreadBitsW(devAddr, A1846S_DTMF_TIME_REG, A1846S_DTMF_IDLE_TIME_BIT, A1846S_DTMF_IDLE_TIME_LEN, radio_i2c_buf);
|
||||||
|
return radio_i2c_buf[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
void HamShield::setDTMFTxTime(uint16_t tx_time) {
|
||||||
|
if (tx_time > 63) {tx_time = 63;} // maxed out
|
||||||
|
// tx time is duration of DTMF Tone
|
||||||
|
HSwriteBitsW(devAddr, A1846S_DTMF_TIME_REG, A1846S_DUALTONE_TX_TIME_BIT, A1846S_DUALTONE_TX_TIME_LEN, tx_time);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t HamShield::getDTMFTxTime() {
|
||||||
|
HSreadBitsW(devAddr, A1846S_DTMF_TIME_REG, A1846S_DUALTONE_TX_TIME_BIT, A1846S_DUALTONE_TX_TIME_LEN, radio_i2c_buf);
|
||||||
|
return radio_i2c_buf[0];
|
||||||
|
}
|
||||||
|
|
||||||
uint16_t HamShield::disableDTMF(){
|
uint16_t HamShield::disableDTMF(){
|
||||||
HSwriteBitsW(devAddr, A1846S_DTMF_ENABLE_REG, A1846S_DTMF_ENABLE_BIT, 1, 0);
|
HSwriteBitsW(devAddr, A1846S_DTMF_ENABLE_REG, A1846S_DTMF_ENABLE_BIT, 1, 0);
|
||||||
}
|
}
|
||||||
|
@ -1223,6 +1256,54 @@ bool HamShield::frequency(uint32_t freq_khz) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool HamShield::frequency(float freq_khz) {
|
||||||
|
|
||||||
|
if((freq_khz >= 134000) && (freq_khz <= 174000)) {
|
||||||
|
setTxBand2m();
|
||||||
|
} else if((freq_khz >= 200000) && (freq_khz <= 260000)) {
|
||||||
|
setTxBand1_2m();
|
||||||
|
} else if((freq_khz >= 400000) && (freq_khz <= 520000)) {
|
||||||
|
setTxBand70cm();
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// convert from float to int
|
||||||
|
uint32_t freq_raw = (uint32_t) (freq_khz * 16); // radio_frequency is accurate to 1/16 kHz
|
||||||
|
radio_frequency = ((float) freq_raw) / 16; // radio_frequency is accurate to 1/16 kHz
|
||||||
|
|
||||||
|
// turn off tx/rx
|
||||||
|
HSwriteBitsW(devAddr, A1846S_CTL_REG, 6, 2, 0);
|
||||||
|
|
||||||
|
// if we're using a 12MHz crystal and the frequency is
|
||||||
|
// 136.5M,409.5M and 455M, then we have to do special stuff
|
||||||
|
if (radio_frequency == 136500 ||
|
||||||
|
radio_frequency == 490500 ||
|
||||||
|
radio_frequency == 455000) {
|
||||||
|
|
||||||
|
// set up AU1846 for funky freq
|
||||||
|
HSwriteWord(devAddr, 0x05, 0x86D3);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
// set up AU1846 for normal freq
|
||||||
|
HSwriteWord(devAddr, 0x05, 0x8763);
|
||||||
|
}
|
||||||
|
|
||||||
|
// send top 16 bits to A1846S_FREQ_HI_REG
|
||||||
|
uint16_t freq_half = (uint16_t) (0x3FFF & (freq_raw >> 16));
|
||||||
|
HSwriteWord(devAddr, A1846S_FREQ_HI_REG, freq_half);
|
||||||
|
// send bottom 16 bits to A1846S_FREQ_LO_REG
|
||||||
|
freq_half = (uint16_t) (freq_raw & 0xFFFF);
|
||||||
|
HSwriteWord(devAddr, A1846S_FREQ_LO_REG, freq_half);
|
||||||
|
|
||||||
|
if (rx_active) {
|
||||||
|
setRX(true);
|
||||||
|
} else if (tx_active) {
|
||||||
|
setTX(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* FRS Lookup Table */
|
/* FRS Lookup Table */
|
||||||
|
|
||||||
bool HamShield::setFRSChannel(uint8_t channel) {
|
bool HamShield::setFRSChannel(uint8_t channel) {
|
||||||
|
|
|
@ -240,7 +240,9 @@ class HamShield {
|
||||||
void safeMode();
|
void safeMode();
|
||||||
|
|
||||||
bool frequency(uint32_t freq_khz);
|
bool frequency(uint32_t freq_khz);
|
||||||
|
bool frequency(float freq_khz);
|
||||||
uint32_t getFrequency();
|
uint32_t getFrequency();
|
||||||
|
float getFrequency_float();
|
||||||
|
|
||||||
// channel mode
|
// channel mode
|
||||||
// 11 - 25kHz channel
|
// 11 - 25kHz channel
|
||||||
|
@ -392,6 +394,12 @@ class HamShield {
|
||||||
// Writing a single DTMF code:
|
// Writing a single DTMF code:
|
||||||
// setDTMFCode(code); // code is a uint16_t from 0x0 to 0xF
|
// setDTMFCode(code); // code is a uint16_t from 0x0 to 0xF
|
||||||
void enableDTMFReceive();
|
void enableDTMFReceive();
|
||||||
|
void setDTMFDetectTime(uint16_t detect_time);
|
||||||
|
uint16_t getDTMFDetectTime();
|
||||||
|
void setDTMFIdleTime(uint16_t idle_time); // idle time is time between DTMF Tone
|
||||||
|
uint16_t getDTMFIdleTime();
|
||||||
|
void setDTMFTxTime(uint16_t tx_time); // tx time is duration of DTMF Tone
|
||||||
|
uint16_t getDTMFTxTime();
|
||||||
uint16_t disableDTMF();
|
uint16_t disableDTMF();
|
||||||
uint16_t getDTMFSample();
|
uint16_t getDTMFSample();
|
||||||
uint16_t getDTMFCode();
|
uint16_t getDTMFCode();
|
||||||
|
@ -480,7 +488,7 @@ class HamShield {
|
||||||
uint16_t radio_i2c_buf[4];
|
uint16_t radio_i2c_buf[4];
|
||||||
bool tx_active;
|
bool tx_active;
|
||||||
bool rx_active;
|
bool rx_active;
|
||||||
uint32_t radio_frequency;
|
float radio_frequency;
|
||||||
/* uint32_t FRS[];
|
/* uint32_t FRS[];
|
||||||
uint32_t GMRS[];
|
uint32_t GMRS[];
|
||||||
uint32_t MURS[];
|
uint32_t MURS[];
|
||||||
|
|
Loading…
Reference in New Issue