From 5689393c111224423f3b11a0158fe00b6354b821 Mon Sep 17 00:00:00 2001 From: Stephen Olesen Date: Wed, 1 Jul 2015 18:25:59 -0600 Subject: [PATCH] Replace local DDS with the DDS class. --- AFSK.cpp | 73 ++++++++++++-------------------------------------------- AFSK.h | 10 ++++---- 2 files changed, 19 insertions(+), 64 deletions(-) diff --git a/AFSK.cpp b/AFSK.cpp index 336e055..2e93d60 100644 --- a/AFSK.cpp +++ b/AFSK.cpp @@ -14,62 +14,15 @@ #define PPOOL_SIZE 2 -#define COMPARE_BITS 6 -#define ACCUMULATOR_SIZE 32 -#define ACCUMULATOR_BITS 24 // This is 2^10 bits used from accum -//#undef PROGMEM -//#define PROGMEM __attribute__((section(".progmem.data"))) -const uint8_t PROGMEM sinetable[256] = { - 128,131,134,137,140,143,146,149,152,156,159,162,165,168,171,174, - 176,179,182,185,188,191,193,196,199,201,204,206,209,211,213,216, - 218,220,222,224,226,228,230,232,234,236,237,239,240,242,243,245, - 246,247,248,249,250,251,252,252,253,254,254,255,255,255,255,255, - 255,255,255,255,255,255,254,254,253,252,252,251,250,249,248,247, - 246,245,243,242,240,239,237,236,234,232,230,228,226,224,222,220, - 218,216,213,211,209,206,204,201,199,196,193,191,188,185,182,179, - 176,174,171,168,165,162,159,156,152,149,146,143,140,137,134,131, - 128,124,121,118,115,112,109,106,103,99, 96, 93, 90, 87, 84, 81, - 79, 76, 73, 70, 67, 64, 62, 59, 56, 54, 51, 49, 46, 44, 42, 39, - 37, 35, 33, 31, 29, 27, 25, 23, 21, 19, 18, 16, 15, 13, 12, 10, - 9, 8, 7, 6, 5, 4, 3, 3, 2, 1, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 3, 4, 5, 6, 7, 8, - 9, 10, 12, 13, 15, 16, 18, 19, 21, 23, 25, 27, 29, 31, 33, 35, - 37, 39, 42, 44, 46, 49, 51, 54, 56, 59, 62, 64, 67, 70, 73, 76, - 79, 81, 84, 87, 90, 93, 96, 99, 103,106,109,112,115,118,121,124 -}; - -#define AFSK_SPACE 0 -#define AFSK_MARK 1 +#define AFSK_SPACE 2200 +#define AFSK_MARK 1200 // Timers volatile unsigned long lastTx = 0; volatile unsigned long lastTxEnd = 0; volatile unsigned long lastRx = 0; -#define REFCLK 38400 -//#define REFCLK 31372.54902 -//#define REFCLK (16000000.0/510.0) -//#define REFCLK 31200.0 -// 2200Hz = pow(2,32)*2200.0/refclk -// 1200Hz = pow(2,32)*1200.0/refclk -static const unsigned long toneStep[2] = { - (2200.0/REFCLK)*pow(2,ACCUMULATOR_SIZE), - (1200.0/REFCLK)*pow(2,ACCUMULATOR_SIZE) -}; - -// Set to an arbitrary frequency -void AFSK::Encoder::setFreq(unsigned long freq, byte vol) { - unsigned long newStep = pow(2,32)*freq/REFCLK; - rStep = newStep; // Atomic? (ish) -} - -// This allows a programmatic way to tune the output tones -static const byte toneVolume[2] = { - 255, - 255 -}; - -#define T_BIT ((unsigned int)(REFCLK/1200)) +#define T_BIT ((unsigned int)(9600/1200)) void AFSK::Encoder::process() { // Check what clock pulse we're on @@ -143,9 +96,11 @@ void AFSK::Encoder::process() { if(++bitClock == T_BIT) bitClock = 0; - accumulator += toneStep[currentTone]; - uint8_t phAng = (accumulator >> ACCUMULATOR_BITS); - OCR2B = pgm_read_byte_near(sinetable + phAng)>>(8-COMPARE_BITS); + if(currentTone == 0) { + dds->setFrequency(AFSK_SPACE); + } else { + dds->setFrequency(AFSK_MARK); + } } bool AFSK::Encoder::start() { @@ -157,7 +112,6 @@ bool AFSK::Encoder::start() { return false; } - accumulator = 0; // First real byte is a frame currentBit = 0; lastZero = 0; @@ -170,6 +124,8 @@ bool AFSK::Encoder::start() { currentBytePos = 0; maxTx = 3; sending = true; + dds->setFrequency(0); + dds->on(); return true; } @@ -177,7 +133,7 @@ void AFSK::Encoder::stop() { randomWait = 0; sending = false; done = true; - OCR2B = 0; + dds->off(); } AFSK::Decoder::Decoder() { @@ -365,7 +321,7 @@ bool AFSK::Decoder::read() { void AFSK::Decoder::start() { // Do this in start to allocate our first packet currentPacket = pBuf.makePacket(PACKET_MAX_LEN); - ASSR &= ~(_BV(EXCLK) | _BV(AS2)); +/* ASSR &= ~(_BV(EXCLK) | _BV(AS2)); // Do non-inverting PWM on pin OC2B (arduino pin 3) (p.159). // OC2A (arduino pin 11) stays in normal port operation: @@ -387,7 +343,7 @@ void AFSK::Decoder::start() { PORTC &= ~_BV(0); DIDR0 |= _BV(0); ADCSRB = _BV(ADTS2) | _BV(ADTS1) | _BV(ADTS0); - ADCSRA = _BV(ADEN) | _BV(ADSC) | _BV(ADATE) | _BV(ADIE) | _BV(ADPS2); // | _BV(ADPS0); + ADCSRA = _BV(ADEN) | _BV(ADSC) | _BV(ADATE) | _BV(ADIE) | _BV(ADPS2); // | _BV(ADPS0); */ } AFSK::PacketBuffer::PacketBuffer() { @@ -511,7 +467,8 @@ void AFSK::timer() { decoder.process(ADCH - 128); } -void AFSK::start() { +void AFSK::start(DDS *dds) { afskEnabled = true; + encoder.setDDS(dds); decoder.start(); } diff --git a/AFSK.h b/AFSK.h index 6c4d1dc..13a33f0 100644 --- a/AFSK.h +++ b/AFSK.h @@ -3,6 +3,7 @@ #include #include +#include #define SAMPLERATE 9600 #define BITRATE 1200 @@ -142,7 +143,7 @@ public: packet = 0x0; currentBytePos = 0; } - void setFreq(unsigned long, byte); + void setDDS(DDS *d) { dds = d; } volatile inline bool isSending() volatile { return sending; } @@ -177,10 +178,7 @@ public: unsigned char currentBytePos; volatile unsigned long randomWait; volatile bool done; - // Phase accumulator, 32 bits, we'll use ACCUMULATOR_BITS of it - unsigned long accumulator; - // Current radian step for the accumulator - unsigned long rStep; + DDS *dds; }; class HDLCDecode { @@ -258,7 +256,7 @@ public: } //unsigned long lastTx; //unsigned long lastRx; - void start(); + void start(DDS *); void timer(); Encoder encoder; Decoder decoder;