Elektroda.pl
Elektroda.pl
X

Wyszukiwarki naszych partnerów

Wyszukaj w ofercie 200 tys. produktów TME
Kategoria: Kamery IP / Alarmy / Automatyka Bram
Montersi
Proszę, dodaj wyjątek elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Jak zmieniać dwie (kilka) wartości sekwencyjnie w Arduino

PiotrPitucha 07 Sie 2017 19:06 516 13
  • #1 07 Sie 2017 19:06
    PiotrPitucha
    Poziom 32  

    Witam
    Mam mały wyświetlacz na którym chciałem wyświetlić kilka wartości.
    Niestety jest tylko dwie linijki po 8 miejsc i wyniki się nie mieszczą, scroll zabiera zbyt wiele miejsca i muszę go z natury odrzucić.
    Pomysł był taki by w pierwszej linijce wyświetlać główny pomiar, natomiast w drugiej co kilka sekund sekwencyjnie wyświetlać pozostałe pomiary.
    Kiedyś w C miałem taki problem i stworzyłem małą tablicę w której były akurat liczby i w każdym przejściu jakiejś pętli realizowane było

    succ(..) ,

    gdzie po ostatnim elemencie wracało się do pierwszego ( sorry jeśli coś przekręciłem w składni, ale to było 30 lat temu :) ).
    W moim programie regularnie wywołuję pomiary co sekundę i szukam pomysłu na zgrabne sekwencyjne wybieranie po kolei dla przykładu cyfr 1, 2, 3, 4 .
    Oczywiście wiem że mogę zrobić nieśmiertelne if i kilka następnych komend, ale może macie pomysł jak to zrobić inaczej.
    Piotr

  • #2 07 Sie 2017 20:00
    dedito
    Poziom 39  

    Nieśmiertelna funkcja Millis ubrana w nieśmiertelne IF'y :)
    Millis zwraca czas działania programu (w ms) od uruchomienia, nie wstrzymuje działania programu jak to robi funkcja delay.

  • #3 07 Sie 2017 20:36
    PiotrPitucha
    Poziom 32  

    Witam
    Nie w tym problem, szukam zgrabnej metody wyświetlenia prądu, napięcia, temperatury w jednej lini co kilka sekund a nie samego odmierzania czasu.

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Chodzi o zgrabne uzyskanie "flag" od 1 do n

    Pozdrawiam

  • #4 07 Sie 2017 20:39
    dedito
    Poziom 39  

    Ale dzięki znajomości upływu czasu możesz wyświetlać właśnie cokolwiek co kilka sekund :)

  • #5 07 Sie 2017 20:41
    Marek_Skalski
    Poziom 32  

    To może tablica/struktura/lista ze wskaźnikami na funkcje wyświetlające i czasem wyświetlania? Wskaźniki i czas możesz rejestrować dynamicznie podczas pracy urządzenia. Jeżeli wskaźnik NULL, albo czas NULL to pomijasz ten element. Pomocniczo możesz też operować maksymalnym indeksem N w połączeniu z indeksem roboczym zwiększanym w zadanych odstępach czasu pobieranych z tej samej tablicy.

  • #6 07 Sie 2017 23:24
    PiotrPitucha
    Poziom 32  

    Witam
    Przypominam:
    - po pierwsze mam Arduino i chcę programować w tym co Arduino udostępnia
    - po drugie nie interesuje mnie czas, zupełnie wszystko mi jedno czy mierzę co 0,5s , 0,7s , czy też co 1,3s !
    Mierzę prąd, napięcie, temperaturę i wyświetlam PWM.

    Pierwsza linijka PWM=93%
    Druga linijka T=120 F
    Druga opcjonalnie I=30 A
    Druga opcjonalnie U=7 V

    Czyli mamy :
    PWM=93%
    T=120 F

    PWM=93%
    I=30 A

    PWM=93%
    U=7 V


    i tak w kółko co jakiś czas.
    Interesuje mnie mechanizm który wybierze mi drugą linijkę i nie mam pomysłu jak to zrobić by:
    - było oszczędne na zużycie pamięci;
    - by program wynikowy był krótki;
    - wiem że są inne Arduino ale ja mam to z małą pamięcią :).
    Pamięć mam na granicy i obszar na program też, kilkadziesiąt procent pamięci zajmuje biblioteka wyświetlacza OLED.
    Czy w Arduino można zrobić wstawkę w czystym C ?, jeśli tak to jak?
    Wtedy mój problem rozwiążę jedną deklaracją i jednym przypisaniem.
    Pozdrawiam

  • #8 08 Sie 2017 07:45
    JacekCz
    Poziom 32  

    PiotrPitucha napisał:
    Witam
    Przypominam:
    - po pierwsze mam Arduino i chcę programować w tym co Arduino udostępnia


    Problemem większości projektów nawet Arduino nie jest "to co system udostepnia", tylko stojący z drugiej strony ekranu / łącza serial / konsoli

    PiotrPitucha napisał:

    Oczywiście wiem że mogę zrobić nieśmiertelne if i kilka następnych komend, ale może macie pomysł jak to zrobić inaczej.
    Piotr


    Wiesz, można użyć jakiś wzorców projektowych "bezifowych", ale myślę że nie o to pytasz.


    PiotrPitucha napisał:

    Czy w Arduino można zrobić wstawkę w czystym C ?, jeśli tak to jak?
    Wtedy mój problem rozwiążę jedną deklaracją i jednym przypisaniem.


    To powiedz jaka ta jedna deklaracja i jedno przypisanie "ratuje" wszystko, a ja Ci powiem jak w Arduino napisać wstawkę w C.

    rs6000 napisał:
    Nie mozesz użyć pętli for ?


    Mysle że nie może. Jeszcze nie i długo.

  • #9 08 Sie 2017 08:56
    PiotrPitucha
    Poziom 32  

    Witam
    RS6000 do pętli FOR muszę dodać jeszcze kilka instrukcji, aby się to wykonywało w nieskończoność. Kompiluje się to dość efektywnie, będę musiał zoptymalizować resztę i może się zmieszczę, dzięki.

    JarekCz , chcesz pomóc czy tylko bawisz się w złośliwe uwagi?
    JarekCz napisał:

    Cytat:
    Mysle że nie może. Jeszcze nie i długo.


    Jestem sprzętowcem i z tym sobie bardzo dobrze radzę, jak z konieczności programuję to czasami pytam.
    JarekCz napisał:
    Cytat:
    To powiedz jaka ta jedna deklaracja i jedno przypisanie "ratuje" wszystko, a ja Ci powiem jak w Arduino napisać wstawkę w C.

    A bardzo proszę jak wiesz,
    int tabelka[3];
    // akurat mam 3 zmieniane linie
    n=succ tabelka[];

    druga wersja wstawka assemblera,
    RCR B,1
    // rotacja w prawo ( lub w lewo ) z przeniesieniem
    W moim starym C ( Keil ) na procesory 8051 succ kompilowało się bardzo efektywnie, podejrzewam, że o niebo efektywniej niż pętla FOR.
    Co do drugiej wersji to w AVR RCR wykonuje się w jednym kroku procesora i nie zżera pamięci, prościej nie można.
    Pozdrawiam

  • #10 08 Sie 2017 09:38
    JacekCz
    Poziom 32  

    PiotrPitucha napisał:

    Cytat:
    To powiedz jaka ta jedna deklaracja i jedno przypisanie "ratuje" wszystko, a ja Ci powiem jak w Arduino napisać wstawkę w C.

    A bardzo proszę jak wiesz,
    int tabelka[3];
    // akurat mam 3 zmieniane linie
    n=succ tabelka[];

    druga wersja wstawka assemblera,
    RCR B,1
    // rotacja w prawo ( lub w lewo ) z przeniesieniem
    W moim starym C ( Keil ) na procesory 8051 succ kompilowało się bardzo efektywnie, podejrzewam, że o niebo efektywniej niż pętla FOR.
    Co do drugiej wersji to w AVR RCR wykonuje się w jednym kroku procesora i nie zżera pamięci, prościej nie można.
    Pozdrawiam


    1. Nie ma potrzeby asemblera, kompilacja C/C++ jest naprawdę wydajna. Optymalizujesz gdzie nie trzeba. Domniemanie o braku wydajności pętli for MSZ nie ma sensu. Łączenie z językiem wysokiego poziomu (Arduino) tym bardziej powinno hamować użycie wstawek asemblerowych. (jak wstawką obsłużyć arduino String???)

    Hipotetycznie szukasz jakiś oszczędności na złym 'for()' ale masz wiele większe straty w swoim stylu.

    2. z wątku przebija, że alternatywne dane są formatowane (???) bo są to różne dane. Z tego wynika że tablica int[] nie ma sensu, nadal będą if'y to formatujące. @Marek_Skalski ci sugeruje sensowe opcje: w tablicy sformatowane dane lub funkcja formatująca

    Funkcja formatująca ma niskie zużycie RAM (ale może nieco spowalniać), sformatowane wersje nieco RAM, ale formatowac tzreba tylko po zmianie danych z pomiaru.

    PiotrPitucha napisał:

    Jestem sprzętowcem i z tym sobie bardzo dobrze radzę, jak z konieczności programuję to czasami pytam.


    Forum jest do pomocy. Ale jest SZTUCZNE JEST chcenie pomocy i bujanie w jakiś abstrakcjach. Jest pełny kod, można coś doradzić, inaczej to wróżenie z fusów. Nie jest wstyde na jakims etapie czegos nie umieć, ale sposób z korzystania pomocy na forach programistycznych jest jasny.

    EDIT: na przykład powinieneś zająć "jakieś" stanowisko co do rady Marka (oraz innych), tak/ nie /nie rozumiem itd... Inaczej to bicie piany w kółko. TYM BARDZIEJ jako czujący się niepewnie

    Na marginesie, intuicja mi mówi że przegląd kodu na forum by wskazał oszczędności RAM sto razy większe niż mityczna pętla for()

    3. Język arduino jest mutacją języka C++, a ten jest nadzbiorem języka C. Nie ma "wstawek C" bo się takie fragmenty po prostu pisze (jak Kargul mówił: byle mądrze). Aha, to co przywołujesz to NIE JEST wstawka C.

  • #11 08 Sie 2017 09:59
    grko
    Poziom 31  

    JacekCz napisał:

    3. Język arduino jest mutacją języka C++, a ten jest nadzbiorem języka C.


    Cały czas na tym forum ludzie błędnie powołują się na język mityczny język programowania arduino. Nie istnieje coś takiego jak język arduino, więc nie jest on żadną mutacją C++. Arduino to IDE gdzie pisze się po prostu w C++ (z pewnymi ograniczeniami). Kolejną nieprawdą jest to, że niby C++ jest nadzbiorem C. Nie jest tak, ponieważ wiele konstrukcji z C po prostu nie jest poprawnych w C++:

    https://en.wikipedia.org/wiki/Compatibility_of_C_and_C++

  • #12 08 Sie 2017 10:11
    JacekCz
    Poziom 32  

    grko napisał:
    JacekCz napisał:

    3. Język arduino jest mutacją języka C++, a ten jest nadzbiorem języka C.


    Cały czas na tym forum ludzie błędnie powołują się na język mityczny język programowania arduino. Nie istnieje coś takiego jak język arduino, więc nie jest on żadną mutacją C++. Arduino to IDE gdzie pisze się po prostu w C++ (z pewnymi ograniczeniami).


    Wiesz co ... masz w teorii rację (a ja powieniem napisac w cudzysłowie "język arduino", błąd redakcyjny) , języki, rdzeń tak.
    Ale zestaw: formalny język + bilioteka standardowa czyli "język użytkowy" to w praktyce co innego. Dla mnie każda "system programowania na bazie C++" który zastępuje standardowe klasy swoimi to (w praktyce) niezależna mutacja. Zatrudnianie programistów mających w CV "znajomośc C++" to pokazuje.
    W realnym życiu, tak sobie pomyślałem, nawet mniej groźne są ograniczenia, jak rozszerzenia.

    Aha, wrócę "język arduino" jest jeszcze jeden argument: wzięty surs arduino nie jest kompilowalny w C++ (przez preprocesor)

    grko napisał:
    ... Kolejną nieprawdą jest to, że niby C++ jest nadzbiorem C. Nie jest tak, ponieważ wiele konstrukcji z C po prostu nie jest poprawnych w C++:

    https://en.wikipedia.org/wiki/Compatibility_of_C_and_C++

    wiem, ale nie o tym wątek.

  • #13 08 Sie 2017 10:29
    PiotrPitucha
    Poziom 32  

    Witam
    Zamykam temat bo zaczęły się dyskusje okołotematyczne bez sensu.
    JacekCz napisał:

    Cytat:
    To powiedz jaka ta jedna deklaracja i jedno przypisanie "ratuje" wszystko, a ja Ci powiem jak w Arduino napisać wstawkę w C.

    Podałem jedną instrukcję C która załatwia mój problem i jedną assemblerową która też to rozwiązuje i cisza....
    JacekCz bardzo lubię Marka Skalskiego, wielokrotnie korzystałem z jego rad, ale gdybym wiedział coś więcej na temat
    Cytat:
    /struktura/lista ze wskaźnikami na funkcje wyświetlające
    to bym nie musiał pytać.
    Chyba spróbuję przenieść program na pogardzanego Bascoma, tam przynajmniej wstawki w assemblerze robi się bajecznie prosto.
    Pozdrawiam

  • #14 08 Sie 2017 10:35
    dondu
    Moderator Mikrokontrolery Projektowanie

    PiotrPitucha napisał:
    Chyba spróbuję przenieść program na pogardzanego Bascoma, tam przynajmniej wstawki w assemblerze robi się bajecznie prosto.

    Uwstecznianie się na maksa :) a to wina tego, że z ograniczającego Ciebie Bascom, przeniosłeś się na równie ograniczające Arduino.

    ... zamiast w końcu zacząć programować tylko w C, skoro już liznąłeś Arduino.

 Szukaj w ofercie
Zamknij 
Wyszukaj w ofercie 200 tys. produktów TME