Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 28 mar 2024, o 21:12


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 7 ] 
Autor Wiadomość
 Tytuł: ADC-problem
PostNapisane: 30 paź 2012, o 23:01 
Offline
Nowy

Dołączył(a): 07 lip 2012
Posty: 12
Pomógł: 0

Witam mam problem z przetwornikami ADC.
oto moj program, wpisuje on wartosc z jednego ADC do wszystkich



Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Ostatnio edytowano 8 lis 2012, o 17:48 przez senso, łącznie edytowano 2 razy

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
 Tytuł: Re: ADC-problem
PostNapisane: 30 paź 2012, o 23:07 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27212
Lokalizacja: Szczecin
Pomógł: 1041

ok to zastanów się nad takim kodem w przerwaniu:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


bo to robi dokładnie to samo co w twojej wersji przerwania - a przyznasz że krócej się pisze ?

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
 Tytuł: Re: ADC-problem
PostNapisane: 31 paź 2012, o 14:23 
Offline
Nowy

Dołączył(a): 07 lip 2012
Posty: 12
Pomógł: 0

krócej faktycznie, ale jak dla mnie mniej oczywiste.
Pewnie dlatego ze zaczynam przygode z mikrokontrolerami i nie mam takiego doświadczenia.

ta linijka jest niezrozumiała
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

po co do ADMUXA przypisywac same jedynki?

nie trzeba wyzwolic nastepnego pomiary poprzez bit ADEN w ADCSRA?
i przypadkiem MUX3 nie powinien być 0 w rejestrze ADMUX? używam 3 bity, a nie 4 żeby obsłużyć 8 wejść?


mirekk36, ok teraz bede umieszał w [syntax =c]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
 Tytuł: Re: ADC-problem
PostNapisane: 31 paź 2012, o 14:42 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27212
Lokalizacja: Szczecin
Pomógł: 1041

W książce w rozdziale związanym z multipleksowaniem wyświetlaczy LED dokładnie opisuję i to praktycznie dokładnie takie samo maskowanie ;)

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


nie będę więc teraz tutaj tego tak dokładnie opisywał ale spróbuj popatrzeć na to tak:

1. musisz do rejestru wpisać kolejny numer kanału, ty robisz to co chwilę za pomocą linii typu:

Kod:
ADMUX = 0b11100010; 


nadpisując bity REFS1, REFS2 i ADLAR - a po co ??? gdyby nagle przyszło ci zmodyfikować działanie ADC to musiałbyś poprawiać TYLE linii, a można tych bitów przecież w ogóle nie "DOTYKAĆ", dlatego najpierw popatrz na to

Kod:
(ADMUX & 0xF8)


co tu robimy - maskujemy wszystkie bity poza 3 najmłodszymi które zerujemy (to w nich ustala się numer kanału tak?) ;), potem druga część:

Kod:
(mux & 0x07)


tu z kolei robimy odwrotną maskę, zerujemy wszystkie bity poza trzema pierwszymi z numerem kanału

i teraz robimy operację OR pomiędzy tymi wyrażeniami, dzięki czemu

1. NIE ZMIENIAMY ustawień REFS1, REFS0 i ADLAR
2. wpisujemy TYLKO nowy kanał

i całość do ADMUX ;)

------------------

ADEN panie kochany nie służy do wyzwalania TYLKO załącza cały ADC, robi się to RAZ w inicjalizacji więc nie wiem o czym mówisz, chyba że masz na myśli bit:

oczywiście jeśli nie ustawiłeś w inicjalizacji bitu Bit 5 – ADATE: ADC Auto Trigger Enable
to naturalnie musiałbyś na koniec każdego przerwania inicjalizować pomiar bitem ADSC. Ale jeśli ten bit ustawisz w inicjalizacji to ustawiasz ADC w tryb Free Running Mode, dzięki czemu pomiary odbywają się automatycznie raz za razem a wystarczy TYLKO raz zainicjalizować przy starcie bitem ADSC

możesz więc albo w ostatniej linii przerwania dodać

Kod:
ADCSRA |= (1<<ADSC);


ale po co ? lepiej w inicjalizacji ustaw ten bit

Kod:
ADCSRA |= (1<<ADATE);


------------------------ [ Dodano po: 4 minutach ]

Ale jeśli jeszcze nawet po doczytaniu w książce o tym maskowaniu nie zaskoczysz to śmiało pytaj dalej - ZDECYDOWANIE WARTO to zrozumieć - bo będzie CIĄGLE przydatne w milionach sytuacji podczas pisania programów.

z tym, że ja widzę, że nie do końca nauczyłeś się działania operatorów bitowych a szczególnie przesunięć. Wnioskuję to po twoim usilnym deklarowaniu kocich makr rodem ze starszych wersji GCC, które zostały wycofane gdyż wygląda kod jakby ktoś pisał w asemblerze. Zamiast więc pisać

Kod:
sbi(ADCSRA,ADIE);


ZDECYDOWANIE polecam ci zapomnieć o tych kocich makrach i przyzwyczaić się do

Kod:
ADCSRA |= (1<<ADIE);


poczytaj na forum, każdy na początku miał z tym może trudności ale spróbuj po czasie zobaczyć i dopytać - większość przechodzi na jasną stronę mocy czyli poprawny zapis w czystym C

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
 Tytuł: Re: ADC-problem
PostNapisane: 31 paź 2012, o 17:43 
Offline
Nowy

Dołączył(a): 07 lip 2012
Posty: 12
Pomógł: 0

ok prawie wszystko rozumiem.
Ostatnia sprawa, w mojej wersji ostatni pomiar musiał mieć odnośnik do pierwszego aby to zapętlić.
Czy tutaj też tak nie trzeba zrobić?
Ustalam muxa, wpisuje wartość do ADCH, i następnie zwiększam go o 1 i wpisuje do ADMUX, tak aż bedzie wartość ADMUX = 0xFF.
Czy po zakończonym procesie, sam ponownie pobierze wartość z rejestru ADMUX = 0xF8 aby zapętlić pomiary?

AHA Panie Mirku dlaczego proponuje Pan tutaj stosowanie Positive Differential Input zamiast Single Ended Input?
Przepraszam za tyle pytań, ale chciałbym dobrze zrozumieć temat.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
 Tytuł: Re: ADC-problem
PostNapisane: 31 paź 2012, o 19:06 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27212
Lokalizacja: Szczecin
Pomógł: 1041

senso napisał(a):
ok prawie wszystko rozumiem.
Ostatnia sprawa, w mojej wersji ostatni pomiar musiał mieć odnośnik do pierwszego aby to zapętlić.
Czy tutaj też tak nie trzeba zrobić?
Ustalam muxa, wpisuje wartość do ADCH, i następnie zwiększam go o 1 i wpisuje do ADMUX, tak aż bedzie wartość ADMUX = 0xFF.


Zwróć uwagę że (mux & 0x07) powoduje zapętlenie się licznika kanałów dokładnie w zakresie od 0 do 7 ;) ... przecież jak wartość z 7 zwiększy się na 8 i zamaskujemy 5 starszych bitów - to do mux trafi 0 a nie 8 ... Ten sam sposób (trick) masz opisany i wykorzystany w książce podczas obsługi buforów cyklicznych przy obsłudze UART ;)


senso napisał(a):
Czy po zakończonym procesie, sam ponownie pobierze wartość z rejestru ADMUX = 0xF8 aby zapętlić pomiary?

Dlaczego po skończonym procesie - przecież przy każdym wejściu w przerwanie masz

Kod:
mux = ADMUX & 0xF8;


czyli właśnie pobranie tylko 3 najmłodszych bitów w których trzymane są numery kanałów od 0 do 7

senso napisał(a):
AHA Panie Mirku dlaczego proponuje Pan tutaj stosowanie Positive Differential Input zamiast Single Ended Input?.


A skąd wynika to co napisałeś - nie rozumiem gdzie ja ci to proponuję ?

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
 Tytuł: Re: ADC-problem
PostNapisane: 31 paź 2012, o 19:39 
Offline
Nowy

Dołączył(a): 07 lip 2012
Posty: 12
Pomógł: 0

w nocie katalogowej na stronie 256 są rozpisane odpowiednio MUXy.
Mamy od MUX0 do MUX4 jesli MUX4 i MUX3 mamy ustawione na 1 to mamy Positive Differential Input(druga kolumna na zdjęciu)
jeśli MUX4 i MUX3 byłyby ustawione na 0 to wtedy mamy Single Ended Input (pierwsza kolumna)

nie wiem jaka jest różnica pomiędzy nimi
poniżej tabeli jest napisane:
The differential input channels are not tested for devices in PDIP Package. This feature is only
guaranteed to work for devices in TQFP and VQFN/QFN/MLF Packages

oto zdjęcie :
https://dl.dropbox.com/u/27190918/MUX.png

zlożylem kod i mi nie działa, pewnie zle zczytuje z tablicy
aha zmienilem na dwa wejścia ADC zeby bylo latwiej

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 7 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 7 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
cron
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO