Skocz do zawartości

ADC-wiele pomiarów


Pomocna odpowiedź

Napisano

Napisałem sobie taki kod:

#include <avr/io.h>
#include <avr/delay.h>
#include "HD44780.h"

// ADMUX- konfiguracja przetwornika ADC
uint16_t pomiar(uint8_t kanal);
void przelicznik(uint16_t wartosc);
uint8_t cz_c=2;
uint8_t cz_u;
int main(void)
{
LCD_Initalize();

ADMUX |= (1<<REFS0) ; //Vin napięcie porównawcze zasilanie proc
ADCSRA |= (1<<ADEN);   //włączenie przetwornika
ADCSRA|= (1<<ADPS1) | (1<<ADPS2);// preskaler  na 64 125 kHZ
while(1)
{
LCD_GoTo(0,0);
LCD_WriteText("p=");
LCD_Write_int(pomiar(0));
_delay_ms(500);
LCD_GoTo(8,0);
LCD_WriteText("d=");
LCD_Write_int(pomiar(1));
/*LCD_GoTo(5,1);
LCD_WriteText("t=");
LCD_Write_int(pomiar(2));
*/

_delay_ms(500);

}
}
uint16_t pomiar(uint8_t kanal)
{
ADMUX |= (ADMUX & 0xF8) | kanal ;// ustawienie kanalu
ADCSRA |= (1<<ADSC); // START pomiaru
while (ADCSRA & (1<<ADSC));//oczekiwanie na zakączenie pomiaru
return ADCW;// zwrot wartosci pomiaru


}

I mam problem ponieważ wyświetlane wyniki są dublowane to znaczy oba wyświetlone pomiary są z portu ADC1 a nie za ADC0 i ADC1 . Nie mam pojęcia dlaczego tak się dzieję. Program jest wstępem do budowy LF. Proszę o podpowiedź co robię źle.

Ustawiając numer kanału w ADMUX zamiast zwykłego podstawienia masz operację |= co powoduje, że raz ustawiony kanał 1 już zostanie tam na zawsze. Widzę, że nadużywasz tego operatora w miejscach, gdzie wystarczyłoby zwykłe podstawienie. Poza tym pewne rzeczy możesz z pętli wyrzucić. Po co za każdym razem wpisujesz REFSx albo ADEN. To można zrobić raz przy inicjalizacji przetwornika. Ustawianie ADSC też możesz robić wpisywaniem - przecież wiesz co w tym rejestrze powinno być w chwili startu przetwarzania, więc po co |= ?

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...