Próbuję zrobić układ mierzący napięcie w zakresie 0-5V i wysyłający wynik na COMa.
Napięcie odniesienia ustawiłem na wew. AREF i do pinu ADC1 podłączyłem dzielnik napięcia z dwoma rezystorami 330, więc jeśli dobrze myślę to 5V/2=2.5 i (2.5/2.56)*255=249 i taki wynik powinno mi wysyłać na coma a wynik jaki otrzymuję gdy na zasilaczu ustawiam 5V to 53. Czy gdzieś jest błąd w moim rozumowaniu?
Kod: Zaznacz cały
#include <avr/io.h>  
#include <stdio.h>  
#include <avr/interrupt.h>    
#include <util/delay.h>
			
volatile unsigned char wyslano_flaga;      
volatile unsigned char wartosc;
volatile unsigned char wynik;
ISR(ADC_vect)
{
wartosc=ADCH;	// wpisanie wyniku pomairu do zmiennej wartosc
}
 
void usart_inicjuj(void)  
{  
 //definiowanie parametrów transmisji za pomocą makr zawartych w pliku  
 //nagłówkowym setbaud.h. Jeżeli wybierzesz prędkość, która nie będzie   
  
 #define BAUD 9600         //żądaną prędkość transmisji  
 #include <util/setbaud.h>  //linkowanie tego pliku musi być po zdefiniowaniu BAUD  
   
 //ustaw obliczone przez makro wartości  
 UBRRH = UBRRH_VALUE;    
 UBRRL = UBRRL_VALUE;  
 #if USE_2X  
    UCSRA |= (1 << U2X);  
 #else  
    UCSRA &= ~(1 << U2X);  
 #endif  
  
 //Ustawiamy pozostałe parametry moduł USART  
 UCSRC = (1<<URSEL) | (1<<UCSZ1) | (1<<UCSZ0);   //bitów danych: 8  
                                                 //bity stopu:  1  
                                                 //parzystość:  brak  
  
 //włącz nadajnik i odbiornik oraz ich przerwania  
 UCSRB = (1<<TXEN);   
}  
//--------------------------------------------------------------  
 void wyslij_wynik(void){  
  
 //Zaczekaj, aż bufor nadawania będzie pusty  
 while (!(UCSRA & _BV(UDRE)));   
 
  UDR = wartosc; //wyślij wynik
    
}  
//--------------------------------- 
int main(void)  
{
// 	KONFIGURACJA ADC
ADMUX = (1<<MUX0)							// kanal 0 PC1
		|(1<<REFS0)|(1<<REFS1)				//wewnetrzne 2.56 z kon. na AREf
		|(1<<ADLAR);         				// tryb 8 bitowy
 ADCSRA = (1<<ADEN)							//odblokowanie adc
		|(1<<ADIE)							//wlaczenie przerwania od adc
		|(1<<ADFR)							//tryb free running
		|(1<<ADSC)							//start konwersji
		|(1<<ADPS1)|(1<<ADPS2); 			// prescaler 64
sei();  //włącz przerwania globalne  
//-------------------------------------  
  
 usart_inicjuj(); //inicjuj moduł USART (RS-232)  
   
           
  
 while(1)  
 {  
   wyslij_wynik();  //rozpocznij wysyłanie wyniku przez RS-232  
  _delay_ms(50); 
 
 }  
}
 







