You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			66 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C
		
	
			
		
		
	
	
			66 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C
		
	
| #include <avr/io.h>
 | |
| #include <avr/interrupt.h>
 | |
| 
 | |
| #include "adc.h"
 | |
| #include "buffer.h"
 | |
| 
 | |
| volatile buffer_t adc_buf[4];
 | |
| volatile float adc_avrg[4];
 | |
| 
 | |
| 
 | |
| void initADC()
 | |
| {
 | |
|     ADMUX = 1 << REFS0 | 0 << REFS1; //Select external Vref
 | |
| 
 | |
|     //ADC Status Register A
 | |
|     ADCSRA = 1 << ADEN   //Enable ADC
 | |
|              | 1 << ADIE //Enable ISR after conversion complete
 | |
|              //|  1<<ADATE //Freerunning-Mode
 | |
|              //|  1<<ADLAR //2 results bits are left aligned
 | |
|              | 1 << ADPS2 //Set clock-prescaler to 128
 | |
|              | 1 << ADPS1 | 1 << ADPS0;
 | |
|     ADCSRA |= 1 << ADSC; //Start first Conversion for "warmup"
 | |
| }
 | |
| 
 | |
| void set_ADC_Channel(uint8_t adr)
 | |
| {
 | |
|     if (adr < 11)
 | |
|     {
 | |
|         ADMUX &= (0b11110000); //Clear MUX-Address
 | |
|         ADMUX |= adr;          //Set new MUX-Address
 | |
|     }
 | |
| }
 | |
| 
 | |
| ISR(ADC_vect)
 | |
| {
 | |
|     static uint8_t init[4] = {0,0,0,0};
 | |
|     static uint8_t current_channel = 0;
 | |
| 
 | |
|     //TODO write non broken adc code
 | |
| 
 | |
|     //Reading 10bit conversion result
 | |
|     uint16_t ADC_reading = ADCL;        //copy the first LSB bits
 | |
|     ADC_reading |= ADCH << 8;           //copy remaing byte
 | |
|     ADC_reading *= 0.33;
 | |
|     insert_to_buffer(ADC_reading, &adc_buf[current_channel]);
 | |
| 
 | |
|     //if(adc_buf[current_channel].position == BUFFER_SIZE-1){
 | |
|     //    //if(init[current_channel]){
 | |
|     //        //float tmp = (99*adc_avrg[current_channel]) + get_buffer_mean(&adc_buf[current_channel]);
 | |
|     //        //tmp /= 100;
 | |
|     //        adc_avrg[current_channel] = get_buffer_mean(&adc_buf[current_channel]);
 | |
|     //    //}
 | |
|     //    //else{
 | |
|     //    //    adc_avrg[current_channel] = get_buffer_mean(&adc_buf[current_channel]);
 | |
|     //    //    init[current_channel]=0;
 | |
|     //    //}
 | |
|     //}
 | |
| 
 | |
|     current_channel++;
 | |
|     if(current_channel == 4)
 | |
|         current_channel = 0;
 | |
|     set_ADC_Channel(current_channel);
 | |
| 
 | |
|     ADCSRA |= (1 << ADSC); //Start next conversion
 | |
| }
 |