Mam problem z wyrównaniem napięć, tak żeby napiecie które podaje na atmege było tej samej amplitudy (lub jakoś proponcjonalne) co w środowisku.
Np podaje 1,5 V z baterii a na wykresie raz skacze skacze do10, czasem do 8 a innym razem do 80 jednostek, mimo że cały czas podaje napiecei z baterii.
Tu jest kod w atmedze:
Kod: Zaznacz cały
#include <avr/io.h>
#include <avr/interrupt.h>
void ADC_init();
void USART_Transmit(unsigned int);
void USART_Init(unsigned int);
volatile uint16_t pomiar;
volatile uint16_t licznik = 0;
int main(void)
{
sei();
USART_Init(51); //51 z noty katalogowej dla baud=9600, U2X=0;
ADC_init();
while(1)
{
}
}
ISR(ADC_vect)
{
licznik++;
if(licznik>200)
{
pomiar = ADCH;
USART_Transmit(pomiar);
licznik = 0;
}
}
void ADC_init(void)
{
ADMUX |= (1<<REFS0) | (1<<ADLAR); //napiecie odniesienia VCC,rejestr z wartoscia = ADCH
ADCSR |= (1<<ADEN) | (1<<ADSC) | (1<<ADFR) | (1<<ADIE); //wlaczenie ADC, start, Free Running, zezwolenie na przerwanie
ADCSR |= (1<<ADPS0) | (1<<ADPS1) | (1<<ADPS2); //preskaler /128
}
void USART_Transmit(unsigned int data)
{
while ( !( UCSRA & (1<<UDRE)) );
UDR = data;
}
void USART_Init(unsigned int baud)
{
UBRRH = (uint8_t)(baud>>8);
UBRRL = (uint8_t)baud;
UCSRB = (1<<RXEN) | (1<<TXEN); //włączenie nadajnika i odbiornika
UCSRC = (1<<URSEL) | (3<<UCSZ0); //8 bitów, 1 bit stopu
}