00001
00002
00003
00004 #include <NCO.h>
00005 #include <inttypes.h>
00006 #include <avr/interrupt.h>
00007 #include <avr/io.h>
00008 #include "WConstants.h"
00009
00010 struct nco_struct nco[NCO_NUM_CHS-1];
00011
00016 void nco_inc(void) {
00017 unsigned char i;
00018 for (i = 0; i < NCO_NUM_CHS; i++) nco_inc_phase_acc(i);
00019 }
00020
00031 void nco_set_freq(unsigned char ch, double freq) {
00032 nco[ch].inc = (unsigned long)(freq * NCO_NUM_PTS * (unsigned long)(NCO_SCALE / NCO_SAMPLING_RATE));
00033 }
00034
00042 void nco_init(void) {
00043 unsigned char i;
00044 for (i = 0; i < NCO_NUM_CHS; i++) {
00045 nco[i].acc.acc_long = 0;
00046 nco[i].inc = 0;
00047 switch(i) {
00048 case 0: nco[i].control = NCO_CH0_CONTROL; break;
00049 case 1: nco[i].control = NCO_CH1_CONTROL; break;
00050 case 2: nco[i].control = NCO_CH2_CONTROL; break;
00051 case 3: nco[i].control = NCO_CH3_CONTROL; break;
00052 }
00053 }
00054 PORTB |= (1<<NCO_DAC_LOAD) | (1<<NCO_DAC_LATCH);
00055 }
00056
00057
00061 #define nco_dac_toggle_latch { PORTB&=~(1<<NCO_DAC_LATCH); PORTB|=(1<<NCO_DAC_LATCH);}
00062
00066 #define nco_dac_toggle_load { PORTB&=~(1<<NCO_DAC_LOAD); PORTB|=(1<<NCO_DAC_LOAD);}
00067
00068
00074 void nco_update(void) {
00075 unsigned char i;
00076 unsigned char addr;
00077 cli();
00078 for (i = 0; i < NCO_NUM_CHS; i++) {
00079 nco_inc_phase_acc(i);
00080 SPDR = nco[i].control;
00081 addr = nco_addr(i);
00082 if (nco_round(i)) {
00083 addr += 1;
00084 addr &= NCO_ADDR_MASK;
00085 }
00086 while((SPSR & (1<<SPIF)) == 0);
00087 SPDR = nco_pts[addr];
00088 while((SPSR & (1<<SPIF)) == 0);
00089 nco_dac_toggle_load;
00090 nco_dac_toggle_latch;
00091 }
00092 sei();
00093 }
00094