/* * AVR DDS 2tone generator * * Created: 2013/05/21 15:17:49 * Author: www.henteko.org */ #include #include #include #include #define cbi(addr,bit) addr &= ~(1<> 8; // division 256 phe2 += delta2; // phase accumulator pos2 = phe2 >> 8; // division 256 if(delta1 == delta2) PORTA = sinewave[pos1]; else PORTA = (sinewave[pos1] + sinewave[pos2]) >> 1; // averaging } //---------------------------------------------------------------- // main routine // --------------------------------------------------------------- int main() { unsigned long freq1, freq2; // DDS output frequency[Hz] unsigned char sw0_state, sw1_state, sw2_state; unsigned int tim; unsigned char intflag; // interrupt enable flag DDRA = 0b11111111; // 8bit DDS output DDRB = 0b11111000; // PB0,1,2 SW input PORTB = 0b00000111; // pull up TCCR0A = 1; // CTC0 enable TCCR0B = 0b00000001; // Timer0 prescaler 1/1 TIMSK = _BV(OCIE0A); // Timer0 compare match A interrupt Enabled OCR0A = 199; // clock 20MHz sampling 100kHz 20000000/160000=200(-1) = 199 sw0_state = sw1_state = sw2_state = 0; tim = 0; intflag = 0; phe1 = phe2 = 0; freq1 = DEF_LOW; // default upside frequency freq2 = DEF_HIGH; // default downside frequency sei(); intflag = 1; sbi(PORTB, PB3); while(1) { delta1 = freq1 * ACCU / SF; delta2 = freq2 * ACCU / SF; // Low frequency increment if(bit_is_clear(PINB, PB1)) { sw0_state = 1; delay_ms(10); } if(sw0_state && bit_is_set(PINB, PB1)) { sw0_state = 0; freq2 += FREQ_STEP; if(freq2 > MAX) freq2 = MIN; } // High frequency increment if(bit_is_clear(PINB, PB2)) { sw1_state = 1; delay_ms(10); } if(sw1_state && bit_is_set(PINB, PB2)) { sw1_state = 0; freq1 += FREQ_STEP; if(freq1 > MAX) freq1 = MIN; } // signal on/off if(bit_is_clear(PINB, PB0)) { sw2_state = 1; delay_ms(10); tim++; } if(sw2_state && bit_is_set(PINB, PB0)) { sw2_state = 0; tim = 0; if(intflag) { cli(); intflag = 0; cbi(PORTB, PB3); } else { sei(); intflag = 1; sbi(PORTB, PB3); } } // reset frequency (low 700Hz, high 2100Hz) if(tim > 100) { sw2_state = 0; tim = 0; freq1 = DEF_LOW; freq2 = DEF_HIGH; } } }