Pastebin launched a little side project called VERYVIRAL.com, check it out ;-) Want more features on Pastebin? Sign Up, it's FREE!
Guest

Untitled

By: a guest on Dec 28th, 2012  |  syntax: C  |  size: 3.64 KB  |  views: 52  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. #define F_CPU 8000000UL
  2.  
  3. #include <util/delay.h>
  4. #include <avr/io.h>
  5. #include <avr/interrupt.h>
  6.  
  7. uint8_t i; // temp variable
  8. uint8_t al; // ADC low
  9. uint8_t ah; // ADC high
  10.  
  11. volatile uint8_t timer = 0;
  12.  
  13. uint8_t checksum = 255;
  14.  
  15. int main()
  16. {
  17. cli();
  18.         UBRR0H = 0;
  19.         UBRR0L = 1;
  20.         UCSR0B = 0b00001000;
  21.         ADMUX = 0b01000111; // Select A7
  22.         ADCSRA = 0b11000110; // Enable ADC, single conversion, f/64 = 125kHz
  23.  
  24.         TCCR2A = 0b010; // TOP = OCRA
  25.         TCCR2B = 0b100; // Div 32
  26.         OCR2A = 156;  // 138 = 905Hz interrupts
  27.         TCNT2 = 0;
  28.         TIMSK2 = 0b010; // OCIEA interrupt
  29.  
  30. sei();
  31.        
  32.         i = 0;
  33.  
  34.         UDR0 = 0x00; // Send a NULL to start
  35.  
  36.         for(;;) {
  37.                
  38.                 ADMUX = 0b01000110; // A6
  39.                 ADCSRA = 0b11000110; // Enable ADC, single conversion, f/64 = 125kHz
  40.                 while(!(UCSR0A & 0b00100000)); // Wait for buffer to be empty
  41.                 UDR0 = ah; // High byte first
  42.                 while(!(UCSR0A & 0b00100000)); // Wait for buffer to be empty
  43.                 UDR0 = al; // High byte first
  44.                 while(ADCSRA & 0b01000000); // Wait for conversion to finish (should be done)
  45.                 al = ADCL;
  46.                 ah = ADCH;
  47.                 checksum -= al;
  48.                 checksum -= ah;
  49.                
  50.                 ADMUX = 0b01000101; // A5
  51.                 ADCSRA = 0b11000110; // Enable ADC, single conversion, f/64 = 125kHz
  52.                 while(!(UCSR0A & 0b00100000)); // Wait for buffer to be empty
  53.                 UDR0 = ah; // High byte first
  54.                 while(!(UCSR0A & 0b00100000)); // Wait for buffer to be empty
  55.                 UDR0 = al; // High byte first
  56.                 while(ADCSRA & 0b01000000); // Wait for conversion to finish (should be done)
  57.                 al = ADCL;
  58.                 ah = ADCH;
  59.                                 checksum -= al;
  60.                 checksum -= ah;
  61.  
  62.  
  63.                 ADMUX = 0b01000000; // A0
  64.                 ADCSRA = 0b11000110; // Enable ADC, single conversion, f/64 = 125kHz
  65.                 while(!(UCSR0A & 0b00100000)); // Wait for buffer to be empty
  66.                 UDR0 = ah; // High byte first
  67.                 while(!(UCSR0A & 0b00100000)); // Wait for buffer to be empty
  68.                 UDR0 = al; // High byte first
  69.                 while(ADCSRA & 0b01000000); // Wait for conversion to finish (should be done)
  70.                 al = ADCL;
  71.                 ah = ADCH;
  72.                 checksum -= al;
  73.                 checksum -= ah;
  74.  
  75.                
  76.                 ADMUX = 0b01000001; // A1
  77.                 ADCSRA = 0b11000110; // Enable ADC, single conversion, f/64 = 125kHz
  78.                 while(!(UCSR0A & 0b00100000)); // Wait for buffer to be empty
  79.                 UDR0 = ah; // High byte first
  80.                 while(!(UCSR0A & 0b00100000)); // Wait for buffer to be empty
  81.                 UDR0 = al; // High byte first
  82.                 while(ADCSRA & 0b01000000); // Wait for conversion to finish (should be done)
  83.                 al = ADCL;
  84.                 ah = ADCH;
  85.                 checksum -= al;
  86.                 checksum -= ah;
  87.  
  88.                 ADMUX = 0b01000010; // A2
  89.                 ADCSRA = 0b11000110; // Enable ADC, single conversion, f/64 = 125kHz
  90.                 while(!(UCSR0A & 0b00100000)); // Wait for buffer to be empty
  91.                 UDR0 = ah; // High byte first
  92.                 while(!(UCSR0A & 0b00100000)); // Wait for buffer to be empty
  93.                 UDR0 = al; // High byte first
  94.                 while(ADCSRA & 0b01000000); // Wait for conversion to finish (should be done)
  95.                 al = ADCL;
  96.                 ah = ADCH;
  97.                 checksum -= al;
  98.                 checksum -= ah;
  99.  
  100.                
  101.                 while(!(UCSR0A & 0b00100000)); // Wait for buffer to be empty
  102.                 UDR0 = ah; // High byte first
  103.                 while(!(UCSR0A & 0b00100000)); // Wait for buffer to be empty
  104.                 UDR0 = al; // High byte first
  105.  
  106.                 while(!(UCSR0A & 0b00100000)); // Wait for buffer to be empty
  107.                 UDR0 = checksum; // High byte first
  108.                 checksum = 255;
  109.                
  110.                 while(timer == 0); // Hold here to enforce 900Hz reading rate
  111.                 timer = 0;
  112.  
  113.                 ADMUX = 0b01000111; // A7              
  114.                 ADCSRA = 0b11000110; // Enable ADC, single conversion, f/64 = 125kHz
  115.                 while(!(UCSR0A & 0b00100000)); // Wait for buffer to be empty
  116.                 UDR0 = 0x00; // NULL start
  117.  
  118.                 while(ADCSRA & 0b01000000); // Wait for conversion to finish (should be done)
  119.                 al = ADCL;
  120.                 ah = ADCH;
  121.                 checksum -= al;
  122.                 checksum -= ah;
  123.  
  124.                
  125.                
  126.         }
  127.         return 1;
  128. }
  129.  
  130. ISR(TIMER2_COMPA_vect)
  131. {
  132.         timer=1;
  133. }