Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[ATmega8][avr-gcc]ADC/Woltomierz na wyświetlaczach LED

mateusz19955 24 Kwi 2014 20:41 2496 3
  • #1 24 Kwi 2014 20:41
    mateusz19955
    Poziom 13  

    Witam wszystkich.

    Napisałem dzisiaj kod do woltomierza wykorzystując przetwornik ADC w języku C.
    Kod napisałem dla mikrokontrolera ATMega8.
    Wynik pomiaru wyświetlany jest na czterech wyświetlaczach LED wspólna anoda.
    Anody wyświetlacza podłączone są do PORTD, a cztery katody do PORTC.
    Multipleksacja tych wyświetlaczy wykonuje się w przerwaniu.
    Program działa, chciałem tylko aby ktoś sprawdził i napisał czy jest on poprawnie napisany(czy dobrze napisane funkcje, czy dobrze je wywołuje i wszystko co w tym kodzie jest).
    Uczę się pisania w C i sporo już się nauczyłem ponieważ kod jest w 100% mojego autorstwa (no oprócz tej linijki "while(ADCSRA & (1<<ADSC));" niezabardzo wiem do czego ona służy).
    Chciałbym wiedzieć jakich błędów nie popełniać na przyszłość.
    Mierzone napięcie podaję przez dzielnik napięciowy, który ma wsp. podziału 34, na pin PC1 mikrokontrolera.

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Poprawiłem tytuł na bardziej oddający problem i zgodny z regulaminem p. 3.1.15. LordBlick

    0 3
  • Pomocny post
    #2 24 Kwi 2014 21:28
    el2010tmp
    Poziom 25  

    Po co dwie tablice?
    Kropkę można zdefiniować jako:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    i używać w ten sposób:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    mateusz19955 napisał:
    while(ADCSRA & (1<<ADSC));

    Jeżeli ustawisz bit ADSC [linijkę wyżej w kodzie], przetwornik zostaje uruchomiony a po zakończeniu konwersji zeruje ten bit. Powyższa pętla "czeka" aż ADSC zostanie wyzerowany ponieważ dopiero wówczas można odczytywać wynik.

    0
  • Pomocny post
    #3 01 Maj 2014 01:41
    Brutus_gsm
    Poziom 25  

    Generalnie kod nie wygląda tak źle. Jak na początkującego, to muszę nawet pochwalić! Formatowanie poziome i rozdzielenie różnych części programu białymi znakami na duży plus. Bardzo wiele osób ma z tym problem, mimo tego, że nowoczesne IDE dbają o to praktycznie same.

    Kilka uwag się znajdzie, ale myślę, że będzie to konstruktywna krytyka.

    Po pierwsze (i chyba najważniejsze) warto stosować nazwy zmiennych, które jednoznacznie określają ich funkcję. Praktycznie każde porządne IDE pomaga nam automatycznie uzupełniając kod.

    Zwyczajowo stałe (oraz makra) definiowane za pomocą dyrektywy #define piszemy wielkimi literami. Nie ma to żadnego wpływu na działanie programu, ale pozwala na pierwszy rzut oka rozróżnić takie stałe od zmiennych, czy funkcji.

    Zmienna uint8_t i nie powinna być zmienną globalną. W zasadzie zmienne globalne powinniśmy stosować w ostateczności. W tym przypadku lepiej byłoby zdefiniować tę zmienną jako static bezpośrednio w procedurze obsługi przerwania. Modyfikator ten powoduje, że wartość zmiennej jest zapamiętywana między kolejnymi wywołaniami funkcji (można powiedzieć, że zachowuje się częściowo jak zmienna globalna, ale nie zaśmieca nam przestrzeni nazw).

    Kolejną rzeczą są zmienne w1, w2, w3, w4. Czytelniej i lepiej byłoby stworzyć tablicę składającą się z czterech elementów. Tym bardziej, że wcześniej tablice wykorzystywałeś. Zawartość tablic nie musi być stała - można je stosować jako uporządkowany zbiór zmiennych.

    Zrezygnowałbym również ze zmiennych wyn_pom, liczba oraz wynik - są niepotrzebne. Równie dobrze można wykonać taką operację:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Procedurę obsługi przerwania można również znacznie skrócić. Zauważ, że przed włączeniem nowego wyświetlacza wyłączasz dotychczas działający. W zasadzie jest to równoważne wyłączeniu wszystkich wyświetlaczy, więc możesz zastosować do tego jedną linijkę na początku procedury. Dalej - zamiast stosować instrukcję warunkową switch możesz wykorzystać fakt, że masz do dyspozycji zmienną i, która określa który aktualnie wyświetlacz powinien zostać włączony. Same wyświetlacze masz podłączone na kolejnych wyprowadzeniach portu C (poczynając od PC2, czyli liczby 4), więc wystarczy tak naprawdę przesuwać jedynkę na kolejne wyprowadzenia. Tablica o nazwie np. wyswietlacz[] (zamiast zmiennych w1...w3) może od razy przechowywać wygląd cyfry (w formie binarnej) przepisany z tablica[] (która w zasadzie powinna się inaczej nazywać, np. cyfry[]. Stosując moje poprzednie porady, kod procedury mógłby wyglądać np. tak:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    ... lub korzystając z operatora trójargumentowego (który wg mnie zaciemnia trochę kod)...

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Oczywiście są to tylko moje uwagi - możesz, ale nie musisz się do nich stosować. Polecam także przeczytać artykuł jak pisać czysty kod. Generalnie warto starać się pisać czytelny kod. Zobaczysz sam, gdy po kilku miesiącach będziesz musiał wrócić do swojego programu, który okaże się zbitkiem nieczytelnych linijek.

    Pozdrawiam

    0
  • #4 03 Kwi 2015 21:22
    mateusz19955
    Poziom 13  

    Dzięki za pomoc.

    0