Added Crystal Calibration sketch with simple Serial UI. Fixed ddsAccumulator_t type.
This commit is contained in:
		
							parent
							
								
									7c67a704c3
								
							
						
					
					
						commit
						4af33167a0
					
				
							
								
								
									
										2
									
								
								AFSK.cpp
								
								
								
								
							
							
						
						
									
										2
									
								
								AFSK.cpp
								
								
								
								
							| 
						 | 
					@ -121,7 +121,7 @@ bool AFSK::Encoder::start() {
 | 
				
			||||||
  lastZero = 0;
 | 
					  lastZero = 0;
 | 
				
			||||||
  bitPosition = 0;
 | 
					  bitPosition = 0;
 | 
				
			||||||
  bitClock = 0;
 | 
					  bitClock = 0;
 | 
				
			||||||
  preamble = 0b11000; // 6.7ms each, 23 = 153ms
 | 
					  preamble = 0b110000; // 6.7ms each, 23 = 153ms
 | 
				
			||||||
  done = false;
 | 
					  done = false;
 | 
				
			||||||
  hdlc = true;
 | 
					  hdlc = true;
 | 
				
			||||||
  packet = 0x0; // No initial packet, find in the ISR
 | 
					  packet = 0x0; // No initial packet, find in the ISR
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										18
									
								
								DDS.cpp
								
								
								
								
							
							
						
						
									
										18
									
								
								DDS.cpp
								
								
								
								
							| 
						 | 
					@ -40,10 +40,18 @@ void DDS::start() {
 | 
				
			||||||
  // Second, setup Timer1 to trigger the ADC interrupt
 | 
					  // Second, setup Timer1 to trigger the ADC interrupt
 | 
				
			||||||
  // This lets us use decoding functions that run at the same reference
 | 
					  // This lets us use decoding functions that run at the same reference
 | 
				
			||||||
  // clock as the DDS.
 | 
					  // clock as the DDS.
 | 
				
			||||||
  TCCR1B = _BV(CS11) | _BV(WGM13) | _BV(WGM12);
 | 
					  // We use ICR1 as TOP and prescale by 8
 | 
				
			||||||
 | 
					  TCCR1B = _BV(CS10) | _BV(WGM13) | _BV(WGM12);
 | 
				
			||||||
  TCCR1A = 0;
 | 
					  TCCR1A = 0;
 | 
				
			||||||
  ICR1 = ((F_CPU / 8) / refclk) - 1;
 | 
					  ICR1 = ((F_CPU / 1) / refclk) - 1;
 | 
				
			||||||
  //ICR1 = ((F_CPU / 8) / 9600) - 1;
 | 
					#ifdef DDS_DEBUG_SERIAL
 | 
				
			||||||
 | 
					  Serial.print(F("DDS SysClk: "));
 | 
				
			||||||
 | 
					  Serial.println(F_CPU/8);
 | 
				
			||||||
 | 
					  Serial.print(F("DDS RefClk: "));
 | 
				
			||||||
 | 
					  Serial.println(refclk, DEC);
 | 
				
			||||||
 | 
					  Serial.print(F("DDS ICR1: "));
 | 
				
			||||||
 | 
					  Serial.println(ICR1, DEC);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Configure the ADC here to automatically run and be triggered off Timer1
 | 
					  // Configure the ADC here to automatically run and be triggered off Timer1
 | 
				
			||||||
  ADMUX = _BV(REFS0) | _BV(ADLAR) | 0; // Channel 0, shift result left (ADCH used)
 | 
					  ADMUX = _BV(REFS0) | _BV(ADLAR) | 0; // Channel 0, shift result left (ADCH used)
 | 
				
			||||||
| 
						 | 
					@ -56,6 +64,10 @@ void DDS::start() {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void DDS::stop() {
 | 
					void DDS::stop() {
 | 
				
			||||||
  // TODO: Stop the timers.
 | 
					  // TODO: Stop the timers.
 | 
				
			||||||
 | 
					#ifndef DDS_USE_ONLY_TIMER2
 | 
				
			||||||
 | 
					  TCCR1B = 0;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					  TCCR2B = 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Set our current sine wave frequency in Hz
 | 
					// Set our current sine wave frequency in Hz
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										7
									
								
								DDS.h
								
								
								
								
							
							
						
						
									
										7
									
								
								DDS.h
								
								
								
								
							| 
						 | 
					@ -18,10 +18,10 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef SHORT_ACCUMULATOR
 | 
					#ifdef SHORT_ACCUMULATOR
 | 
				
			||||||
#define ACCUMULATOR_BITS      16
 | 
					#define ACCUMULATOR_BITS      16
 | 
				
			||||||
typedef int16_t ddsAccumulator_t;
 | 
					typedef uint16_t ddsAccumulator_t;
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
#define ACCUMULATOR_BITS      32
 | 
					#define ACCUMULATOR_BITS      32
 | 
				
			||||||
typedef int32_t ddsAccumulator_t;
 | 
					typedef uint32_t ddsAccumulator_t;
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// If defined, the timer will idle at 50% duty cycle
 | 
					// If defined, the timer will idle at 50% duty cycle
 | 
				
			||||||
| 
						 | 
					@ -60,6 +60,9 @@ typedef int32_t ddsAccumulator_t;
 | 
				
			||||||
#define DDS_REFCLK_DEFAULT     (62500/4)
 | 
					#define DDS_REFCLK_DEFAULT     (62500/4)
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Output some of the calculations and information about the DDS over serial
 | 
				
			||||||
 | 
					#define DDS_DEBUG_SERIAL
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// When defined, use the 1024 element sine lookup table. This improves phase
 | 
					// When defined, use the 1024 element sine lookup table. This improves phase
 | 
				
			||||||
// accuracy, at the cost of more flash and CPU requirements.
 | 
					// accuracy, at the cost of more flash and CPU requirements.
 | 
				
			||||||
// #define DDS_TABLE_LARGE
 | 
					// #define DDS_TABLE_LARGE
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,152 @@
 | 
				
			||||||
 | 
					#define DDS_REFCLK_DEFAULT 19200
 | 
				
			||||||
 | 
					#define DDS_REFCLK_OFFSET  0
 | 
				
			||||||
 | 
					#define DDS_DEBUG_SERIAL
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <HamShield.h>
 | 
				
			||||||
 | 
					#include <Wire.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					HamShield radio;
 | 
				
			||||||
 | 
					DDS dds;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void setup() {
 | 
				
			||||||
 | 
					  Serial.begin(9600);
 | 
				
			||||||
 | 
					  Wire.begin();
 | 
				
			||||||
 | 
					  radio.initialize();
 | 
				
			||||||
 | 
					  radio.setVHF();
 | 
				
			||||||
 | 
					  radio.setRfPower(0);
 | 
				
			||||||
 | 
					  radio.setFrequency(145050);
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  pinMode(2, OUTPUT);
 | 
				
			||||||
 | 
					  pinMode(3, OUTPUT);
 | 
				
			||||||
 | 
					  pinMode(11, INPUT);
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  dds.start();
 | 
				
			||||||
 | 
					  dds.setFrequency(1200);
 | 
				
			||||||
 | 
					  dds.on();
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  radio.bypassPreDeEmph();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum Sets {
 | 
				
			||||||
 | 
					  SET_REF,
 | 
				
			||||||
 | 
					  SET_TONE,
 | 
				
			||||||
 | 
					  SET_AMPLITUDE
 | 
				
			||||||
 | 
					} setting = SET_TONE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					char freqBuffer[8];
 | 
				
			||||||
 | 
					char *freqBufferPtr = freqBuffer;
 | 
				
			||||||
 | 
					uint16_t lastFreq = 1200;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void loop() {
 | 
				
			||||||
 | 
					  while(Serial.available()) {
 | 
				
			||||||
 | 
					    char c = Serial.read();
 | 
				
			||||||
 | 
					    Serial.print(c);
 | 
				
			||||||
 | 
					    switch(c) {
 | 
				
			||||||
 | 
					      case 'h':
 | 
				
			||||||
 | 
					        Serial.println(F("Commands:"));
 | 
				
			||||||
 | 
					        Serial.println(F("RefClk: u = +10, U = +100, r XXXX = XXXX"));
 | 
				
			||||||
 | 
					        Serial.println(F("        d = -10, D = -100"));
 | 
				
			||||||
 | 
					        Serial.println(F("Radio:  T = transmit, R = receive"));
 | 
				
			||||||
 | 
					        Serial.println(F("Tone:   t XXXX = XXXX Hz"));
 | 
				
			||||||
 | 
					        Serial.println(F("Amp.:   a XXX  = XXX out of 255"));
 | 
				
			||||||
 | 
					        Serial.println(F("DDS:    o = On, O = Off"));
 | 
				
			||||||
 | 
					        Serial.println(F("ie. a 31 = 32/255 amplitude, r38400 sets 38400Hz refclk"));
 | 
				
			||||||
 | 
					        Serial.println("> ");
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					      case 'u':
 | 
				
			||||||
 | 
					        dds.setReferenceClock(dds.getReferenceClock()+10);
 | 
				
			||||||
 | 
					        dds.setFrequency(lastFreq);
 | 
				
			||||||
 | 
					        dds.start();
 | 
				
			||||||
 | 
					        Serial.println(F("RefClk + 10 = "));
 | 
				
			||||||
 | 
					        Serial.println(dds.getReferenceClock());
 | 
				
			||||||
 | 
					        Serial.println("> ");
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					      case 'U':
 | 
				
			||||||
 | 
					        dds.setReferenceClock(dds.getReferenceClock()+100);
 | 
				
			||||||
 | 
					        dds.setFrequency(lastFreq);
 | 
				
			||||||
 | 
					        dds.start();
 | 
				
			||||||
 | 
					        Serial.println(F("RefClk + 100 = "));
 | 
				
			||||||
 | 
					        Serial.println(dds.getReferenceClock());
 | 
				
			||||||
 | 
					        Serial.println("> ");
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					      case 'd':
 | 
				
			||||||
 | 
					        dds.setReferenceClock(dds.getReferenceClock()-10);
 | 
				
			||||||
 | 
					        dds.setFrequency(lastFreq);
 | 
				
			||||||
 | 
					        dds.start();
 | 
				
			||||||
 | 
					        Serial.println(F("RefClk - 10 = "));
 | 
				
			||||||
 | 
					        Serial.println(dds.getReferenceClock());
 | 
				
			||||||
 | 
					        Serial.println("> ");
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					      case 'D':
 | 
				
			||||||
 | 
					        dds.setReferenceClock(dds.getReferenceClock()-100);
 | 
				
			||||||
 | 
					        dds.setFrequency(lastFreq);
 | 
				
			||||||
 | 
					        dds.start();
 | 
				
			||||||
 | 
					        Serial.println(F("RefClk - 100 = "));
 | 
				
			||||||
 | 
					        Serial.println(dds.getReferenceClock());
 | 
				
			||||||
 | 
					        Serial.println("> ");
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					      case 'T':
 | 
				
			||||||
 | 
					        Serial.println(F("Radio transmit"));
 | 
				
			||||||
 | 
					        radio.setModeTransmit();
 | 
				
			||||||
 | 
					        Serial.println("> ");
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					      case 'R':
 | 
				
			||||||
 | 
					        Serial.println(F("Radio receive"));
 | 
				
			||||||
 | 
					        radio.setModeReceive();
 | 
				
			||||||
 | 
					        Serial.println("> ");
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					      case 'r':
 | 
				
			||||||
 | 
					        setting = SET_REF;
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					      case 't':
 | 
				
			||||||
 | 
					        setting = SET_TONE;
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					      case 'a':
 | 
				
			||||||
 | 
					        setting = SET_AMPLITUDE;
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					      case 'o':
 | 
				
			||||||
 | 
					        dds.on();
 | 
				
			||||||
 | 
					        Serial.println("> ");
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					      case 'O':
 | 
				
			||||||
 | 
					        dds.off();
 | 
				
			||||||
 | 
					        Serial.println("> ");
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					      default:
 | 
				
			||||||
 | 
					        if(c >= '0' && c <= '9') {
 | 
				
			||||||
 | 
					          *freqBufferPtr = c;
 | 
				
			||||||
 | 
					          freqBufferPtr++;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        if(c == '\n' && freqBufferPtr != freqBuffer) {
 | 
				
			||||||
 | 
					          *freqBufferPtr = '\0';
 | 
				
			||||||
 | 
					          freqBufferPtr = freqBuffer;
 | 
				
			||||||
 | 
					          uint16_t freq = atoi(freqBuffer);
 | 
				
			||||||
 | 
					          if(setting == SET_REF) {
 | 
				
			||||||
 | 
					            dds.setReferenceClock(freq);
 | 
				
			||||||
 | 
					            dds.setFrequency(lastFreq);
 | 
				
			||||||
 | 
					            dds.start();
 | 
				
			||||||
 | 
					            Serial.print(F("New Reference Clock: "));
 | 
				
			||||||
 | 
					            Serial.println(dds.getReferenceClock());
 | 
				
			||||||
 | 
					          } else if(setting == SET_TONE) {
 | 
				
			||||||
 | 
					            dds.setFrequency(freq);
 | 
				
			||||||
 | 
					            lastFreq = freq;
 | 
				
			||||||
 | 
					            Serial.print(F("New Tone: "));
 | 
				
			||||||
 | 
					            Serial.println(freq);
 | 
				
			||||||
 | 
					          } else if(setting == SET_AMPLITUDE) {
 | 
				
			||||||
 | 
					            dds.setAmplitude((uint8_t)(freq&0xFF));
 | 
				
			||||||
 | 
					            Serial.print(F("New Amplitude: "));
 | 
				
			||||||
 | 
					            Serial.println((uint8_t)(freq&0xFF));
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					          Serial.println("> ");
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ISR(ADC_vect) {
 | 
				
			||||||
 | 
					  TIFR1 = _BV(ICF1);
 | 
				
			||||||
 | 
					  PORTD |= _BV(2);
 | 
				
			||||||
 | 
					  dds.clockTick();
 | 
				
			||||||
 | 
					  PORTD &= ~_BV(2);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Loading…
	
		Reference in New Issue