logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

konfiguracja ADC - ATMega128

Albi1983 13 Kwi 2015 13:33 1485 21
REKLAMA
  • #1 14613462
    Albi1983
    Poziom 10  
    Witam

    Po przejściach z PWMami oraz diodami LED przyszedł czas na coś bardziej ambitniejszego mianowicie ADC.

    Ze strony: http://mikrokontrolery.blogspot.com/2011/03/adc-wstep-i-uruchomienie.html

    pobrałem sobie program. Podpiąłem piny pod moją konfigurację jeszcze z programu o PWM czyli

    Klawisze - PORT A
    LEDy 0,1,2,3 - PORT B
    LEDy 4,5,6 - PORT E

    Pokazuje tutaj kod:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    W opisie na stronie można przeczytać:
    
    Program działa w następujący sposób:
    Po uruchomieniu programu obydwie diody nie świecą się, ponieważ nie było żadnego uruchomienia konwersji. Naciśnięcie klawisza powoduje porównanie 10 bitowego wyniku z rejestru ADC z zdeklarowanymi wartościami i odpowiednie zapalenie/zgaszenie diod. Konwersja jest pojedyncza za każdym razem, kiedy nastąpi naciśnięcie klawisza.
    


    I teraz mam następujące pytania:

    Czy trzeba w jakiś sposób przewodem podpiąć jakiś pin do PORTU F ( bo taki jest odpowiedzialny za ADC0-8 na medze128 zgodnie z datasheeetem), jeżeli tak to do jakiego PINu trzeba podpiąć PF0(ADC0) ?

    Drugie pytanie jest następujące:
    Po skompilowaniu programu obydwie diody się automatycznie świecą, a nie powinny dlaczego?

    Dodam jeszcze, że po ponownym przyciśnięciu przycisku nic się nie dzieje i jeszcze jedno BIT M103C przy problemach z PWM odptaszkowałem.

    Dodam tylko że kompilacja jest poprawna i jest 1 warnning

    Warning	1	return type of 'main' is not 'int' [-Wmain]	


    Pozdrawiam i proszę o pomoc
  • REKLAMA
  • #2 14613523
    dondu
    Moderator na urlopie...
    1. Chciałeś by pinem pomiarowym był pin PF0 (ADC0), ale wybierasz kanał PF5 (ADC5) ustawiając bitami MUX2 i MUX0 - patrz tabelka: Input Channel and Gain Selections

    2. Warning jest prawidłowy - funkcja main() powinna być typu int czyli: int main(void)
    Poprawiłem w Drzaśka artykule.

    3. Pamiętaj, że jako napięcie odniesienia ustawiasz 2,56V.
  • #3 14613550
    Albi1983
    Poziom 10  
    Tak też to dostrzegłem właśnie w moim kodzie
    Doczytałem także z innego artykułu na elektrodzie, że ważne jest w jakiej kolejności inicjowany jest ADC tzn:

    1. Ustawiamy preskaler
    2. Ustawiamy napięcie
    3. Uruchamiamy ADC


    Poprawiłem:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod



    I teraz dioda LED1 mruga jak sie nacisnie przycisk a druga dioda LED2 świeci sie caly czas

    Tak miało być?
  • REKLAMA
  • #4 14613561
    dondu
    Moderator na urlopie...
    Albi1983 napisał:
    Doczytałem także z innego artykułu na elektrodzie, że ważne jest w jakiej kolejności inicjowany jest ADC tzn:

    1. Ustawiamy preskaler
    2. Ustawiamy napięcie
    3. Uruchamiamy ADC

    W Twoim przypadku kolejność nie ma znaczenia.

    Zastanów się, co znajduje się w rejestrze ADSRA po dwóch operacjach, które wykonujesz w swoim kodzie:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Podaj jeszcze na wszelki wypadek, jakie maksymalne napięcie masz na pinie wejściowym.
  • REKLAMA
  • #7 14613622
    Albi1983
    Poziom 10  
    Poprawiłem to w ten sposób

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    I po wciśnięciu przycisku gasi się LED1 a druga dioda stale się świeci.

    Kolejne przyciśnięcie przycisku powoduje mrugnięcie diody LED2

    Jestem teraz kompletnie zielony czy tak miało to wyglądać ?
  • #8 14613650
    Albi1983
    Poziom 10  
    Wstawiam cały program

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #9 14613662
    dondu
    Moderator na urlopie...
    I jeszcze udziel odpowiedzi:

    dondu napisał:
    Podaj jeszcze na wszelki wypadek, jakie maksymalne napięcie masz na pinie wejściowym.


    Edit:

    Jeszcze jeden błąd - włączasz rezystor pull-up przycisku na wejściu PA0, a w warunku sprawdzasz pin PA1 - gdzie jest podłączony przycisk?
  • #10 14613684
    Albi1983
    Poziom 10  
    z tego co widzę to 5V

    Przyciski mam na porcie A

    KEY0-KEY7
    PA0-PA7
  • #11 14613690
    dondu
    Moderator na urlopie...
    Albi1983 napisał:
    z tego co widzę to 5V

    Tak to jest, jak odpowiadasz tylko na wybrane tematy, które Ci w postach przekazuję.
    A jeszcze wcześniej zwracałem Ci na to uwagę:

    dondu napisał:
    3. Pamiętaj, że jako napięcie odniesienia ustawiasz 2,56V.


    Widzisz problem?


    Co do przycisku, to rezystor pull-up musi być włączony dla przycisku, który sprawdzasz w warunku - przeanalizuj sobie artykuł pod tym kątem.

    Na wszelki wypadek jeszcze zapytam, jak ten przycisk podłączyłeś?
  • #12 14613738
    Albi1983
    Poziom 10  
    Przycisk jest dobrze podłączony SW0 do PB4

    Co do napięcia to jak z tym napięciem zrobić ?

    Bo nie chce żeby mi się coś zjarało

    Załączyłem pull-up dla przycisku PA0

    W tej chwili jeżeli chodzi o przycisk mam tak:

    //definicja KLAWISZ (do którego pinu podłączony klawisz)
    #define KEY0 PA0

    DDRA = 0b00000000;        //Ustawienie portu A sterującego klawiszami jako wejście

    	PORTA |=  (1<<PA0);         //Pull_up klawisz

    if(!(PINA & (1<<PA0)))//jeśli klawisz wciśnięty


    Więc myślę że przycisk jest dobrze skonfigurowany. Zresztą na PWMie działał a dokładnie w ten sam sposób go konfigurowałem.
  • #13 14613761
    dondu
    Moderator na urlopie...
    Albi1983 napisał:
    Przycisk jest dobrze podłączony SW0 do PB4

    Jaki znowu pin PB4 skoro porzed chwilą w kodzie miałeś go na PA1:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    a aktulnie na PA0:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Problemem tak długiego ciągnięcia tego tematu jest brak schematu, przez co musimy dopytywać o szczegóły - schodek nr 1: http://mikrokontrolery.blogspot.com/2011/04/pieklo-poczatkujacych.html


    Albi1983 napisał:
    Co do napięcia to jak z tym napięciem zrobić ?
    Bo nie chce żeby mi się coś zjarało

    Skoro się boisz, to dlaczego gdy o tym pisałem pominąłeś tę kwestię?
    Jeśli będziesz w ten sposób postępował (pomijał nasze uwagi), to prędzej czy później właśnie doprowadzisz do jakiegoś problemu.



    Ustaw napięcie odniesienia na napięcie: AVCC with external capacitor at AREF pin
    tabela: Voltage Reference Selections for ADC
  • #14 14613807
    Albi1983
    Poziom 10  
    Sorki już się mylę oczywiście przyciski są przypisane do portu A a LED1 na PB4 i LED2 na PB5

    Dałem jak mi podpowiedziałeś

    
    //AVCC with external capacitor at AREF pin
    ADMUX = (1<<REFS0);
    


    i obydwie diody się świecą cały czas.
    Nic się nie dzieje jak wcisne przycisk
    Nawet dioda w tej chwili nie mruga

    Przycisk mam zmieniony na PA0 wszędzie

    Jeżeli chodzi o schemat to mam całą płytke GrandEVBavr firmy Propox nie robiłem swojej
  • REKLAMA
  • #16 14613829
    Albi1983
    Poziom 10  
    Wstawiam po poprawkach

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #17 14613854
    dondu
    Moderator na urlopie...
    Teraz program wygląda na prawidłowy pomijając, że nie poprawiłeś przyczyny warningu:

    dondu napisał:
    2. Warning jest prawidłowy - funkcja main() powinna być typu int czyli: int main(void)
    Poprawiłem w Drzaśka artykule.


    1. Co według Ciebie powinien program robić w pętli głównej while(1), dla każdego przypadku, a co de facto w danym przypadku zaobserwowałeś?

    2. Czy przycisk na PA0 na pewno zwiera do masy, gdy jest przyciśnięty?
  • #18 14613876
    Albi1983
    Poziom 10  
    Program po wciśnięciu przycisku uruchamia pojedynczą konwersje a następnie czeka na jej zakończenie i w zależności od jej zakończenia wykonywane są instrukcje

    Czyli jeśli:
    ADC<350 to gasi obydwie diody
    ADC<700 to świeci LED1
    jeśli ADC>=700 świecą obydwie diody

    Tylko jest jeden problem bo z tej strony co na początku ją podawałem
    http://mikrokontrolery.blogspot.com/2011/03/adc-wstep-i-uruchomienie.html

    Tam jest napisane coś takiego:
    Program działa w następujący sposób:
    Po uruchomieniu programu obydwie diody nie świecą się, ponieważ nie było żadnego uruchomienia konwersji. Naciśnięcie klawisza powoduje porównanie 10 bitowego wyniku z rejestru ADC z zdeklarowanymi wartościami i odpowiednie zapalenie/zgaszenie diod. Konwersja jest pojedyncza za każdym razem, kiedy nastąpi naciśnięcie klawisza. 


    Problem jest w tym, że po wgraniu programu u mnie obydwie diody odrazu się świecą

    Edit :
    Po przyciśnięciu przycisku dioda LED1 mrugnie po czym się zapala. Natomiast dioda LED2 świeci się stale
  • #19 14614006
    dondu
    Moderator na urlopie...
    Przeanalizujmy więc:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Skoro masz tam podłączone diody, to mogą świecić (na początku programu), jeśli podłączyłeś je katodami do pinów ... ale tego nie sprawdzę, bo jak już mówiłem nie pokazujesz schematu.

    Sprawdź więc:
    - jak podłączyłeś diody,
    - lub dodaj pętlę while(1); przed pętlą główną - jeśli będą świecić to znaczy że je podłączyłeś tak jak napisałem powyżej.

    A teraz zerknijmy jak LEDy są podłączone na schemacie z artykułu:

    konfiguracja ADC - ATMega128

    Przy okazji wklejenia schematu odniosę się do tego, że traktowałeś pin ADC napięciem 5V podczas, gdy napięcie odniesienia ustawiłeś na 2,56V. Gdybyś postępował zgodnie z artykułem, zrobiłbyś dzielnik rezystorowy złożony z R5 i potencjometru, i wtedy napięcie nie przekroczyłoby 2,5V.

    Reasumując dotychczasową dyskusję:
    Staraj się być jeszcze bardziej dokładny w tym co robisz. Generalnie nie jest źle, ale jak widzisz szczegóły są baaaardzo istotne :)
  • #20 14614067
    Albi1983
    Poziom 10  
    OK teraz mi na początku programu diody nie świecą i po przyciśnięciu gasi diode LED0. Więc jest ok :)

    Dzięki bardzo a teraz kolejny problem mam jakbym chciał za pomocą potencjometru pokazywać na tej diodzie wartość napięcia ale taką jaką ustawie na potencjometrze i to w każdej chwili czyli taki PWM za pomocą ADC i potencjometru to jakby to miało wyglądać ??

    Dodano po 3 [minuty]:

    Czy to jest mniej więcej coś takiego??

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Oczywiście tam zamiast PB1 to PB4

    i bez żadnych pętli tylko przed ostatnią klamrą dodać while(1) lub for(;;)

    Dodano po 20 [minuty]:

    Jeżeli chodzi o ten PWM za pomocą potencjometru i ADC wymodziłem coś takiego:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    i podłączyłem kabelkiem pin PF0 portu F z pinem POT1 na ANALOG ( nie wiem czy dobrze kombinuje )

    Dodatkowo dodałem ustawienia portu F

    DDRF = 0b11111111;
    	DDRF &=~(1<<ADCIN); 


    Prośba o pomoc
  • #22 14618480
    Albi1983
    Poziom 10  
    Witam

    Ten temat można zamknąć
    Tamtego o którym piszesz jeszcze nie zamykaj

    Dziękuje za pomoc
REKLAMA