#include #include #define F_CPU 8000000 #define output(directions,pin) (directions |= pin) // set port direction for output #define set(port,pin) (port |= pin) // set port pin #define clear(port,pin) (port &= (~pin)) // clear port pin #define pin_test(pins,pin) (pins & pin) // test for port pin #define bit_test(byte,bit) (byte & (1 << bit)) // test for bit set #define bit_delay_time 102 // bit delay for 9600 with overhead #define bit_delay() _delay_us(bit_delay_time) // RS232 bit delay #define half_bit_delay() _delay_us(bit_delay_time/2) // RS232 half bit delay #define charge_delay() _delay_us(10) // charge delay 2 #define settle_delay() _delay_us(500) // settle delay #define char_delay() _delay_ms(10) // char delay #define charge_port PORTA #define charge_direction DDRA #define charge_pin (1 << PA3) #define PWM_port PORTA #define PWM_pin (1 << PA6) #define PWM_direction DDRA #define CTC_port PORTB #define CTC_pin (1 << PB2) #define CTC_direction DDRB //pitchresult is for pitch antenna, volumeresult is for volume antenna int main(void) { // // main // static uint16_t pitchup,pitchdown,pitchresult; static uint16_t volumeup,volumedown,volumeresult; // // set clock divider to /1 // CLKPR = (1 << CLKPCE); CLKPR = (0 << CLKPS3) | (0 << CLKPS2) | (0 << CLKPS1) | (0 << CLKPS0); // // initialize output pins // clear(charge_port, charge_pin); output(charge_direction, charge_pin); output(PWM_direction, PWM_pin); output(CTC_direction,CTC_pin); // // init A/D // ADMUX = (0 << REFS1) | (0 << REFS0) // Vcc ref | (1 << ADLAR) // left adjust | (0 << MUX3) | (0 << MUX2) | (1 << MUX1) | (0 << MUX0); // PB4 ADCSRA = (1 << ADEN) // enable | (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0); // prescaler /128 // main loop // while (1) { settle_delay(); set(charge_port, charge_pin); charge_delay(); // // initiate conversion // ADCSRA |= (1 << ADSC); // // wait for completion // while (ADCSRA & (1 << ADSC)) ; // // save result // pitchup = ADC; //ADC is a 16 bit int. // // settle, discharge, and wait 1 // settle_delay(); clear(charge_port, charge_pin); charge_delay(); // // initiate conversion // ADCSRA |= (1 << ADSC); // // wait for completion // while (ADCSRA & (1 << ADSC)) ; // // save result // pitchdown = ADC; // // Calculate result as average // pitchresult = (pitchup + 1023 - pitchdown)/2; OCR0A = ((pitchresult >> 8) & 255); while (1) { settle_delay(); set(charge_port, charge_pin); charge_delay(); // // initiate conversion // ADCSRB |= (1 << ADSC); // // wait for completion // while (ADCSRB & (1 << ADSC)) ; // // save result // volumeup = ADC; //ADC is a 16 bit int. // // settle, discharge, and wait 1 // settle_delay(); clear(charge_port, charge_pin); charge_delay(); // // initiate conversion // ADCSRB |= (1 << ADSC); // // wait for completion // while (ADCSRB & (1 << ADSC)) ; // // save result // volumedown = ADC; // // Calculate result as average // volumeresult = (volumeup + 1023 - volumedown)/2; OCR1AL = volumeresult & 255; OCR1AH = ((volumeresult >> 8) & 255); // set up desired input and output pins in DDR // set up timer 0 CTC TCCR0A = 0<