Skocz do zawartości

[C] Atmega16 - ADC


sarnecki

Pomocna odpowiedź

Witam, na wstępie chciałbym prosić o cierpliwość i wyrozumiałość... 🙂

Od jakiegoś czasu zmagam się z programem wykorzystującym przetwornik ADC w Atmedze16. Głównym i prawdopodobnie jedynym problemem jest konfiguracja ADC, nie moge poradzić sobie stosując note katalogową Atmegi. Chce osiągnąć następujący efekt: pomiar z ADC zapisywany jest jako np.: "pomiar" abym dalej mógł wykorzystać tę wartość

if(pomiar<100)
PORTC=0x42;
else
PORTC=0x81;

Czujnik analogowy Sharpa podpięty jest pod ADC0 (PA0).

Napisałem coś takiego lecz jak się można domyślić nie działa...

#include <avr/io.h> 
#include <avr/interrupt.h> 

#define F_CPU 1000000L

unsigned int pomiar; 
//////////////////////////////////////////////////// 

SIGNAL(SIG_ADC) 
{ 

pomiar=ADCH; 
} 

int main( void ) 
{ 

ADMUX = (1<<REFS1) | (1<<REFS0) | (1<<MUX0) | (1<<ADLAR); 

ADCSRA = (1<<ADEN) | (1<<ADPS1) | (1<<ADPS0) | (1<<ADATE) | (1<< ADIE); 

sei(); 

ADCSRA |= _BV(ADSC); 

while(1) 

{ 
 char LPPP, LTPT;
DDRC=0xff;


LPPP=0x42;//przod	
LTPT=0x81;//tyl

if(pomiar<100)

PORTC=LPPP;

else
PORTC=LTPT;



} 
}

Z góry dziękuje za pomoc.

Pozdrawiam

Link do komentarza
Share on other sites

Po pierwsze to co mówi dondu. Jeżeli chcesz odczytać tylko wyższy bajt rejestru ADC to powinno to wyglądać tak:

ISR(ADC_vect){

   	pomiar=ADCH;

   }

a skoro już bawimy się w przerwania to konieczne jest ich wcześniejsze odblokowanie.

SREG|=_BV(7);

Po za tym wartość zmiennej pomiar będzie zawsze mieściła się w zakresie od GND do Vref - 1LSB- dlatego nie rozumiem w jakim celu sprawdzasz warunek

 if(pomiar<100) 

i jeszcze jedna rzecz jak rzuciła mi się w oczy:

ADMUX = (1<<REFS1) | (1<<REFS0) | (1<<MUX0) | (1<<ADLAR); 

ta konfiguracja bitów daje odczyt na pinie ADC1 a nie jak sądzisz ADC0, żeby czytać z pinu ADC0 usuń ten | (1<

Link do komentarza
Share on other sites

Jeżeli chcesz odczytać tylko wyższy bajt rejestru ADC ...

tutaj powinienem był jeszcze zapytać autora tematu, w jakim celu zmienna pomiar jest typu INT skoro odczytuje jej tylko starszy bajt?:

unsigned int pomiar;
...
pomiar=ADCH;
a skoro już bawimy się w przerwania to konieczne jest ich wcześniejsze odblokowanie.
SREG|=_BV(7);

tę czynność autor wykonuje rozkazem sei().

A propos powyższego uwaga do autora: zdecyduj się, czy wykorzystujesz zapis (1<

Po za tym wartość zmiennej pomiar będzie zawsze mieściła się w zakresie od GND do Vref - 1LSB- dlatego nie rozumiem w jakim celu sprawdzasz warunek
 if(pomiar<100) 

Nie bardzo rozumie, do czego masz zastrzeżenia.

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

dondu

Nie bardzo rozumie, do czego masz zastrzeżenia.
if(pomiar<100)
PORTC=0x42;
else
PORTC=0x81;

Jak napisałem wcześniej pomiar będzie w zakresie GND a Vref - 1LSB. czyli np od 0 do ~5V co oznacza że nigdy nie wykona się instrukcja else. Czy źle interpretuje ten kod ?

Link do komentarza
Share on other sites

Autor ustawił Vref na wewnętrzne źródło napięcia 2,56V.

Nie wiemy jakie napięcie mierzy, stąd nie można powiedzieć, że else się nie wykona.

Wprawdzie podaje, że to czujnik Sharp i nic więcej, ani nawet nie pokazał schematu.

Patrząc na wykres GP2Y0A21YK0F, kod działać będzie prawidłowo, choć nie wykorzysta pełnej skali pomiaru bliskich odległości.

Innymi słowy brak danych, by twierdzić, że else się nie wykona.

Link do komentarza
Share on other sites

Kolega wybrał notację left adjusted - stąd ADCH to 8 bitów.

ADCH to zawsze jest 8 bitów 🙂

choć nie zawsze zawiera 8 bitów pomiaru.

Nie to wskazywałem, tylko:

... w jakim celu zmienna pomiar jest typu INT skoro odczytuje jej tylko starszy bajt?
Link do komentarza
Share on other sites

Jeśli chcesz odczytać wynik konwersji to albo czytasz całość np. zmienna=ADCW albo najpierw czytasz dolny bajt potem górny,wszystko jest w nocie.

Autor prawidłowo odczytuje starszy bajt wyrównując wynik do lewej, co świadczy o tym, że czytał notę, stąd Twój komentarz jest całkowicie zbędny.

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.