#define F_CPU 8000000UL #include #include #include uint8_t i; // temp variable uint8_t al; // ADC low uint8_t ah; // ADC high volatile uint8_t timer = 0; uint8_t checksum = 255; int main() { cli(); UBRR0H = 0; UBRR0L = 1; UCSR0B = 0b00001000; ADMUX = 0b01000111; // Select A7 ADCSRA = 0b11000110; // Enable ADC, single conversion, f/64 = 125kHz TCCR2A = 0b010; // TOP = OCRA TCCR2B = 0b100; // Div 32 OCR2A = 156; // 138 = 905Hz interrupts TCNT2 = 0; TIMSK2 = 0b010; // OCIEA interrupt sei(); i = 0; UDR0 = 0x00; // Send a NULL to start for(;;) { ADMUX = 0b01000110; // A6 ADCSRA = 0b11000110; // Enable ADC, single conversion, f/64 = 125kHz while(!(UCSR0A & 0b00100000)); // Wait for buffer to be empty UDR0 = ah; // High byte first while(!(UCSR0A & 0b00100000)); // Wait for buffer to be empty UDR0 = al; // High byte first while(ADCSRA & 0b01000000); // Wait for conversion to finish (should be done) al = ADCL; ah = ADCH; checksum -= al; checksum -= ah; ADMUX = 0b01000101; // A5 ADCSRA = 0b11000110; // Enable ADC, single conversion, f/64 = 125kHz while(!(UCSR0A & 0b00100000)); // Wait for buffer to be empty UDR0 = ah; // High byte first while(!(UCSR0A & 0b00100000)); // Wait for buffer to be empty UDR0 = al; // High byte first while(ADCSRA & 0b01000000); // Wait for conversion to finish (should be done) al = ADCL; ah = ADCH; checksum -= al; checksum -= ah; ADMUX = 0b01000000; // A0 ADCSRA = 0b11000110; // Enable ADC, single conversion, f/64 = 125kHz while(!(UCSR0A & 0b00100000)); // Wait for buffer to be empty UDR0 = ah; // High byte first while(!(UCSR0A & 0b00100000)); // Wait for buffer to be empty UDR0 = al; // High byte first while(ADCSRA & 0b01000000); // Wait for conversion to finish (should be done) al = ADCL; ah = ADCH; checksum -= al; checksum -= ah; ADMUX = 0b01000001; // A1 ADCSRA = 0b11000110; // Enable ADC, single conversion, f/64 = 125kHz while(!(UCSR0A & 0b00100000)); // Wait for buffer to be empty UDR0 = ah; // High byte first while(!(UCSR0A & 0b00100000)); // Wait for buffer to be empty UDR0 = al; // High byte first while(ADCSRA & 0b01000000); // Wait for conversion to finish (should be done) al = ADCL; ah = ADCH; checksum -= al; checksum -= ah; ADMUX = 0b01000010; // A2 ADCSRA = 0b11000110; // Enable ADC, single conversion, f/64 = 125kHz while(!(UCSR0A & 0b00100000)); // Wait for buffer to be empty UDR0 = ah; // High byte first while(!(UCSR0A & 0b00100000)); // Wait for buffer to be empty UDR0 = al; // High byte first while(ADCSRA & 0b01000000); // Wait for conversion to finish (should be done) al = ADCL; ah = ADCH; checksum -= al; checksum -= ah; while(!(UCSR0A & 0b00100000)); // Wait for buffer to be empty UDR0 = ah; // High byte first while(!(UCSR0A & 0b00100000)); // Wait for buffer to be empty UDR0 = al; // High byte first while(!(UCSR0A & 0b00100000)); // Wait for buffer to be empty UDR0 = checksum; // High byte first checksum = 255; while(timer == 0); // Hold here to enforce 900Hz reading rate timer = 0; ADMUX = 0b01000111; // A7 ADCSRA = 0b11000110; // Enable ADC, single conversion, f/64 = 125kHz while(!(UCSR0A & 0b00100000)); // Wait for buffer to be empty UDR0 = 0x00; // NULL start while(ADCSRA & 0b01000000); // Wait for conversion to finish (should be done) al = ADCL; ah = ADCH; checksum -= al; checksum -= ah; } return 1; } ISR(TIMER2_COMPA_vect) { timer=1; }