Aktyw Forum

Zarejestruj się na forum.ep.com.pl i zgłoś swój akces do Aktywu Forum. Jeśli jesteś już zarejestrowany wystarczy, że się zalogujesz.

Sprawdź punkty Zarejestruj się

Problem z odczytem dwóch potencjometrów w ATMega

retsef
-
-
Posty:1
Rejestracja:22 lis 2007, o 15:12
Lokalizacja:Łódź
Kontaktowanie:
Problem z odczytem dwóch potencjometrów w ATMega

Postautor: retsef » 22 lis 2007, o 15:43

Witam,

mam problem sekwencyjnym odczytem z dwóch potencjometrów podpiętych pod konwertery A/C w ATMega88. Nazwijmy potencjometry odpowiednio POT1 i POT2. Problem polega na tym, że jak odczytuje po kolei POT1 i POT2 w przerwaniu wywoływanym co 1ms to czasami wartość POT2 jest kombinowana, to znaczy zależy zarówno od ustawienia POT1 jak i samego POT2. Co ciekawe gdy zamieniłem kolejność odczytu potencjometrów, czyli czytałem najpierw POT2 potem POT1 to efekt znikł, a raczej spodziewałem, się że POT1 będzie wartością kombinowaną. Minął tydzień i sytuacja się powtarza. Tym razem zgodnie z przewidywaniami odczyt POT1 głupieje. Czasami odczytuje się dobrze, a czasami dostaje wartość kombinowaną z obu. Sprawdziłem na oscyloskopie, że na nóżkach scalaka wszystko jest idealnie więc problem leży gdzieś w samym programie. Może źle coć odczytuje?

Jakby ktoś chciał spytać jako wartość kombinowaną rozumiem, że odczytana wartość zależy od obu potencjometrów to znaczy jak rusze dowolnym to wartość ta będzie się zmieniać przy czym jak zatrzymam to będzie odczytywać cały czas to samo czyli nie jest to pojedynczy przypadek, ale powtarzająca się sprawa - co 1ms dokładnie.

Załączam wycinki programu.
Inicjalizacja konwertera A/C:

Kod: Zaznacz cały

#include <string.h> #include <inttypes.h> #include <avr/io.h> #include <avr/interrupt.h> #include <avr/iomx8.h> signed long POT1 = 0; signed long POT2 = 0; //Procedura inicjalizująca konwertery A/C void ADCInit() { // konfiguracja portów I/O DDRC = 0; // 1 - wyjście PORTC = 0; //0b00000000; // 1 - podciągnięte do Vcc ADMUX |= 0 /*_BV(REFS0) | _BV(REFS1)*/; //zewnetrzne zrodlo odniesienia ADMUX |= _BV(ADLAR); // osiem starszych bitow do ADCH ADCSRA|= _BV(ADEN); // zezwolenie na konwersje ADCSRA|= /*_BV(ADPS0) | */_BV(ADPS1) | _BV(ADPS2); // dzielnik zegara przez 128 DIDR0 = _BV(ADC0D) | _BV(ADC1D); /*| 1<<ADC2D | 1<<ADC3D | 1<<ADC4D | 1<<ADC5D*/ }
Odczyt potencjometrów:

Kod: Zaznacz cały

//Procedura odczytująca konwertery A/C void ADCRead() { // pomiar wartosci potencjometr 2 - ADC1 ADMUX |= _BV(MUX1); ADCSRA|= _BV(ADSC); //start pojedynczej konwersji while(bit_is_set(ADCSRA,ADSC)){}; POT2 = ADCH; ADMUX &= ~_BV(MUX1); // pomiar wartosci potencjometr 1 - ADC0 ADMUX |= _BV(MUX0); ADCSRA|= _BV(ADSC); //start pojedynczej konwersji while(bit_is_set(ADCSRA,ADSC)){}; POT1 = ADCH; ADMUX &= ~_BV(MUX0); }

Wróć do „AVR/AVR32”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 3 gości