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

[Rozwiązano] Jak działa kod wyświetlający pasek na LCD z Atmega8 na podstawie ADC?

Roberto_new_user 22 Paź 2019 12:46 531 9
REKLAMA
  • #1 18232881
    Roberto_new_user
    Poziom 5  
    Proszę o pomoc w zrozumieniu kodu.
    Dokonuję pomiaru na pinie adc atmegi i wartość wyświetlam na lcd w postaci paska. Wszystko ładnie działa, ale nie do końca rozumiem istotę działania, dopiero się uczę.

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



    Co rozumiem:

    wartosc_z_adc, jest to wartość zmierzona na pinie adc atmegi8 w zakresie 0-1023 (postać cyfrowa)

    max. wartość cyfrowa 1023 podzielona przez 20 kolumn w wierszu daje nam wartość 51 i po przecinku (po przecinku nie brane pod uwagę), czyli po przekroczeniu 51++ zaświeca się kolejny kwadrat, 102 kolejny kwadrat, itd. do 1023-świecą się 20 kwadraty w linijce.

    Powołana jest zmienna a i na początku ma wartość 0. Następnie w pętli for zmienna ta jest inkrementowana przy każdym obiegu pętli o 1, jeśli jest mniejsza od zmiennej kolumna.

    Zmienna kolumna przybiera wartości 0-20 w zależności, jaki jest wynik dzielenia wartosc_adc / 51

    Program wyświetlający pasek działa i wszystko jest ok, poza tym, że nie do końca rozumiem kodu. Ważniejsze dla mnie jest zrozumienie kodu od samego jego działania :).

    Nie rozumiem, po co tak na prawdę jest zmienna a. Jak to się dzieje, że kolejne segmenty zapalają się wraz ze wzrostem napięcia na pinie adc (kręcąc potencjometrem), a pozostałe-wcześniejsze nie
    gasną.

    Nie mogę jakoś logicznie powiązać tej pętli for z samym wyświetlaniem ciągu kwadratów.

    Po krótce sobie tłumaczę, że co wartość około 51 następuje „przepełnienie” i zaświecanie kolejnego kwadratu, ale błądzę w domysłach, a chciałbym to zrozumieć.

    Proszę o cierpliwość i łopatologiczne wyjaśnienie mi tej kwestii. Dzięki.
  • REKLAMA
  • #2 18232910
    kindlar
    Poziom 42  
    LCD ma własną pamięć. Znak w danym miejscu (wyslij_do_lcd(kolumna,wiersz) będzie wyświetlany dopóki nie zostanie zgaszony, zastąpiony innym wynikającym z przebiegu programu.
  • REKLAMA
  • #3 18233013
    Roberto_new_user
    Poziom 5  
    Dzięki za pomoc
    Przepraszam, ale mimo wszystko jeszcze za mało. Ale jak to jest, że ze wzrostem wartości mierzonej następuje zapalenie kolejnej kolumny, skoro nie zmieniamy współrzędnych wyświetlania. Jaki wpływ ma na to pętla for i zmienna a ?
    Z tego co pamiętam, to po wyświetleniu znaku np. na pozycji 0,0 kursor automatycznie ustawia się w kolejnej kolumnie i czeka na znak, ale gdzie tu info dla sterownika lcd, a żeby rysować w kolejnej i kolejnej kolumnie? Proszę jakoś wytłumaczyć szczegółowo w kodzie, jak to sie ma i na jakiej zasadzie (tak, jak ja opisałem ze szczegółami, co rozumiem). Ciężko zaskoczyć.
  • Pomocny post
    #4 18233061
    kindlar
    Poziom 42  
    Obliczasz długość słupka, który wyświetlasz i jest ona zależna od odczytu z adc i wielkości LCD. Tu chyba jest założony wyświetlacz 20x2 czyli obliczasz ilość jednostek na podziałkę wyświetlacza.
  • #5 18233094
    Roberto_new_user
    Poziom 5  
    No tak mniej więcej sobie to tłumaczyłem.
    Tylko właśnie do końca nie jest dla mnie jasne, na jakiej zasadzie następuje wyświetlenie coraz to kolejnych segmentów. Wiem, że jestem upierd....
    no ale chcę to pojąć. Jak będę pomijał niejasne dla mnie kwestie, to potem się zemści.
    Rozumiem, że w tym przypadku podział jest około 51, ale jaki to ma wpływ, że jak osiągnie np. 102, to zaświeca się drugi segment. Przecież nie wysłałem komendy " rysuj w 0,1, czyli zerowa linia, ale teraz druga kolumna i następnie po kolejnych 51 rysuj 0,2, czyli zerowa linia, ale teraz trzecia kolumna, itd..... Nie widzę tego w kodzie. Nie zmieniam współrzędnej x, czy y , a jak się ma do nich pętla for i zmienna a.

    A żebym to pojął, to musiałby mi ktoś wytłumaczyć na zasadzie odpowiedzi na poszczególne zapytania. Jedno zdanie i trzy wyrazy dla mnie nic nie mówią na moim etapie wiedzy. Ja rozumiem, że dla kolegi to może być proste i oczywiste :).

    Może ktoś jeszcze się wypowie.
  • REKLAMA
  • Pomocny post
    #6 18233150
    AdamFilipek
    Poziom 20  
    Załóżmy, że zmienna wartosc_z_adc = 170.


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

    Po tej linii zmienna kolumna = 3

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

    Po tej linii kursor trafia na pozycję 0,0.

    Program trafia na pętlę.

    Pierwszy "obrót": a=0 warunek a<kolumna spełniony program wchodzi w pętlę i wykonuje linię
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Na pozycji 0,0 rysowany jest znak, kursor wyświetlacza przesuwa się na pozycję 1,0
    Koniec obrotu pętli.

    Kolejny "obrót": a=1 warunek a<kolumna spełniony program wchodzi w pętlę i wykonuje linię
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Na pozycji 1,0 rysowany jest znak, kursor wyświetlacza przesuwa się na pozycję 2,0
    Koniec obrotu pętli.

    Kolejny "obrót": a=2 warunek a<kolumna spełniony program wchodzi w pętlę i wykonuje linię
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Na pozycji 2,0 rysowany jest znak, kursor wyświetlacza przesuwa się na pozycję 3,0
    Koniec obrotu pętli.

    Kolejny "obrót": a=3 warunek a<kolumna nie jest spełniony program wychodzi z pętli.
  • Pomocny post
    #7 18233194
    trol.six
    Poziom 31  
    Roberto_new_user napisał:
    Powołana jest zmienna a i na początku ma wartość 0. Następnie w pętli for zmienna ta jest inkrementowana przy każdym obiegu pętli o 1, jeśli jest mniejsza od zmiennej kolumna.

    Zmienna kolumna przybiera wartości 0-20 w zależności, jaki jest wynik dzielenia wartosc_adc / 51

    Program wyświetlający pasek działa i wszystko jest ok, poza tym, że nie do końca rozumiem kodu.

    Przecież to podstawy języka C. "a" to jest zmienna służąca do tego ile razy pętla for ma się wykonać. Ponieważ bierze ona udział w sprawdzaniu warunku pętli.

    Czyli jeśli "kolumna" ma wartość przykładowo 11, to pętla wykona się 11 razy i tyle słupków się wyświetli, ponieważ w kodzie pętli masz wyświetlanie jednego słupka,.

    .
  • #8 18233829
    Roberto_new_user
    Poziom 5  
    Dziękuję Wam za pomoc.
    Wreszcie zrozumiałem :). Ja wiem, że to są elementarne podstawy C, no ale każdy przez to przechodzi. Zasadniczo to rozumiem działanie pętli for, ale tutaj odbiega ona od innych przykładów, jakie znałem i nie mogłem zaskoczyć. Czyli pętla wykona się tyle razy ile aktualnie przybierze zmienna a, a za wyświetlanie w kolejnych kwadratach odpowiedzialny jest fakt (i to jest chyba istota działania), że po zajęciu wcześniejszej kolumny przy poprzednim obiegu pętli kursor się przestawia o 1 do przodu i kolejny kwadrat musi się zapalić w następnej kolumnie.
    Chyba nic nie pokręciłem i dobrze myślę ???
    Jeszcze raz dzięki za udział w temacie.
  • REKLAMA
  • #9 18233901
    trol.six
    Poziom 31  
    Roberto_new_user napisał:
    Czyli pętla wykona się tyle razy ile aktualnie przybierze zmienna a,

    nie zmienna "a" , a zmienna "kolumna". Zmienna "a" w tym kodzie, zawsze zaczyna się od zera przy każdym starcie pętli.
    Natomiast służy do określania ile razy pętla się wykona w sposób pośredni, tzn przez porównanie ze zmienną "kolumna".

    Pętla działa tak długo jak warunek: a < kolumna jest prawdziwy. Gdy wartość "a" będzie większa lub równa zmiennej "kolumna", wówczas pętla zakończy swoje działanie.
    .
  • #10 18234469
    Roberto_new_user
    Poziom 5  
    OK
    Teraz wszystko jasne. Teraz rozumiem istotę zastosowania zmiennej a. Myślę, że temat do zamknięcia. Dzięki wszystkim.
REKLAMA