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

Bascom / Atmega328 - Rozdzielenie zmiennej typu Byte na Bit

maximus22_kr 19 Maj 2016 16:36 1554 11
REKLAMA
  • #1 15685473
    maximus22_kr
    Poziom 18  
    Posty: 513
    Pomógł: 1
    Ocena: 20
    Witam
    Chciałbym zapytać, czy zapis:

    Kod: VB.net
    Zaloguj się, aby zobaczyć kod


    można zastąpić np. takim zapisem
    Kod: VB.net
    Zaloguj się, aby zobaczyć kod

    przy założeniu, że zmienna Dzien typu Byte nie przekroczy wartości 7.

    Mam taki kod:
    Kod: VB.net
    Zaloguj się, aby zobaczyć kod


    który co minutę ( sekundy = 0 ) sprawdza, czy godziny i minuty alarmu oraz dzień tygodnia są zgodne z którymś z ustalonych alarmów. Jest 5 alarmów, każdy może być ustawiony na jeden lub kilka dni tygodnia. Dla ułatwienia aktualny czas ( tylko godziny i minuty ) oraz czasy alarmów zamieniłem na minuty - porównuję tylko jedną wartość.

    W ramach oszczędności pamięci Flash chciałem to zmienić ( np. w formie funkcji, choć samodzielnie jeszcze funkcji nie tworzyłem ) i zrobić sprawdzanie co minutę w tych pięciu alarmów w pętli For.. Next

    i zmienić np.
    Kod: Text
    Zaloguj się, aby zobaczyć kod


    czyli powinno to wyglądać tak:
    Kod: VB.net
    Zaloguj się, aby zobaczyć kod


    Nie mam tego jak sprawdzić w pracy, ale jestem ciekaw, czy może zadziałać, może da się ( trzeba ) to uprościć / poprawić ?
  • REKLAMA
  • Pomocny post
    #2 15685531
    Konto nie istnieje
    Konto nie istnieje  
  • #3 15686572
    maximus22_kr
    Poziom 18  
    Posty: 513
    Pomógł: 1
    Ocena: 20
    Dziękuję oczywiście pomogło ( z 78 % zajętości zrobiło się 72 % ).
    Teraz wygląda tak:
    Kod: VB.net
    Zaloguj się, aby zobaczyć kod


    faktycznie jeśli bitem zmiennej Alarm(n_alarm) jest numer dnia tygodnia to program sobie sprawdzi, czy pasuje.

    Z tymi aliasami to nie wiedziałem, aczkolwiek gdzieś widziałem kod z użyciem Case i tam zamiast cyfr były nazwy.

    Mam pytanie "elektroniczne" - buzer z generatorem na 5V, który podłączam do Atmegi przez tranzystor NPN ( baza tranzystora przez rezystor 1K do pinu Atmegi ) piszczy bardzo cicho, gdy dam rezystor 220 om to dopiero coś słychać, a jak nie dam wcale to jest dobrze, ale wydaje mi się, że coś jest nie tak.


    Wracając do mojego "wspaniałego kodu budzika" :D

    Mam drugą trudniejszą cześć, która tylko częściowo działa dobrze. Ta część po naciśnięciu przycisku ma sprawdzić, czy w najbliższym czasie ( powiedzmy 24 godziny ) jest zaplanowany i aktywny któryś z alarmów. Jeśli tak, przepisuje wartości godzin i minut oraz dzień tygodnia tego alarmu do zmiennych, które będą wyświetlane na wyświetlaczach LED

    Kod: VB.net
    Zaloguj się, aby zobaczyć kod


    Tutaj jest dodatkowa trudność bo założyłem, że danego dnia są sprawdzane alarmy z tego dnia i z dnia następnego.
    Czyli sprawdzając alarm o 23:40 ( alarm ustawiony na 6:30 następnego dnia ) - godzina alarmu będzie mniejsza niż aktualna godzina, jeśli nic z tego to sprawdzi, czy alarm z następnego dnia jest aktywny i sprawdzi o której

    Sprawdzając alarm o 00:15 ( alarm ustawiony na 6:30 już tego samego dnia ) - godzina alarmu będzie większa niż aktualna godzina, to wyświetli ten alarm i nie będzie szukał następnego np. o 18:30 tego samego dnia.

    Co do zmiennych to:
    Kod: Text
    Zaloguj się, aby zobaczyć kod


    Kod masakra, nie mam pomysłu jak go uprościć. Tzn. myślałem zrobić tak samo jak w pierwszym przypadku, czyli:
    Alarm1.1 -> Alarm(1).1
    Flaga_alarm1 -> Flaga_alarm(1)
    Alarm1_status -> Alarm_status(1)
  • REKLAMA
  • Pomocny post
    #4 15686719
    Konto nie istnieje
    Konto nie istnieje  
  • #5 15687440
    maximus22_kr
    Poziom 18  
    Posty: 513
    Pomógł: 1
    Ocena: 20
    Woow - sprawdzę wieczorem w domu.

    Na razie dopasowuję kod do reszty, w sumie teraz widzę, jak źle definiuję zmienne - tablice się przydają.

    Na razie analizuję ( jako, że nie chcę na ślepo wszystko przepisać, bo lubię wiedzieć co dany kod robi ) i komentuję ten kod i zastanawiam się czy zamiast
    Kod: VB.net
    Zaloguj się, aby zobaczyć kod


    nie powinno być
    Kod: VB.net
    Zaloguj się, aby zobaczyć kod


    zmienna Alarm typu Byte ma służyć do pokazania numeru dnia na diodach led, jej poszczególne bity to ledy
  • Pomocny post
    #6 15687469
    Konto nie istnieje
    Konto nie istnieje  
  • REKLAMA
  • #7 15688688
    maximus22_kr
    Poziom 18  
    Posty: 513
    Pomógł: 1
    Ocena: 20
    Kod działa, chylę czoło przed wiedzą Kolegi.

    Podpiąłem go pod przycisk wyłączania alarmu, dodając warunek, że gdy alarm jest nie włączony to ma pokazać najbliższy alarm lub informować o jego braku. Przyznam, że oszczędność jest imponująca - moje "wypociny" zajęły 25 % pamięci flash, ten krótki kod coś ze 2%.

    Przyznam, że bez tego nie byłoby miejsca na zabawę ze sterowaniem przez SPI playera WtV020 ( choć na razie, mimo, że jego obsługa jest bardzo prosta, przynajmniej tak pisze Kolega Kaktus na swojej stronie, to uparcie milczy, wersja na zielonej płytce nie działa, zamówiłem dłuższą czerwoną, zobaczymy w czym rzecz ). Ostatecznie użyję MP3 TF-16P ze sterowaniem przez UART, ale UART wolałbym zachować np. na podłączenie ESP8266 i pobranie czasu NTP.
  • #8 15689103
    Konto nie istnieje
    Konto nie istnieje  
  • REKLAMA
  • #9 15689475
    maximus22_kr
    Poziom 18  
    Posty: 513
    Pomógł: 1
    Ocena: 20
    O tym OTP w modułach WTV020 to czytałem ( chyba na stronie Kaktusa ). Natomiast ja kupując starałem się wybrać oferty z opisem "arduino" lub "avr". A jako, że nie nie mam zaufania do chińskich "myfriend" to kupiłem na polskim portalu aukcyjnym od sprzedawcy, który ma sporą ofertę modułów - miał informacje, że to pod arduino AVR będzie działać - niestety nie.
    Sprawdzę dzisiaj, czy działa z przyciskami.


    Nie wiem, czy nie uwaliłem modułu głośniczkiem, gdzieś znalazłem informację, że płaskie głośniczki ( lub przetworniki piezo - nie wiem czy dobrze zrozumiałem, bo to było po angielsku ) nie działają. Ja kupiłem kilka sztuk takich płaskich głośników, z opisem, że są to głośniki 0,5W/8om z plastikową membraną. Dzisiaj spróbuję jeszcze użyć dodatkowego wzmacniacza na układzie PAM8403.
    Jako, że dioda podpięta pod BUSY podczas jednej z prób nieregularnie się świeciła, tak jakby coś odtwarzał ( na karcie miałem zapisane kilka utworów testowych - sampli ), tylko w głośniku cisza.
  • #10 15691303
    maximus22_kr
    Poziom 18  
    Posty: 513
    Pomógł: 1
    Ocena: 20
    Niestety muszę wrócić do kodu pokazującego najbliższy alarm.
    Alarm ustawiony na poniedziałek 6:30
    - w sobotę pokazuje OFF
    - w niedzielę o 00:30 pokazuje numer alarmu i godzinę
    - w niedzielę o 11:30 pokazuje OFF

    Dzieje się tak dlatego, bo nie uwzględniony został przypadek aktualnej godziny większej niż godzina alarmu ( próbowałem to rozwiązać, dlatego tak duży "kod" mi wyszedł )

    Czyli w kodzie:
    Kod: VB.net
    Zaloguj się, aby zobaczyć kod


    potrzebne jest sprawdzanie alarmu dla następnego dnia, ale sprawdzenie warunku
    Kod: VB.net
    Zaloguj się, aby zobaczyć kod


    Może najlepiej byłoby to zrobić tak:
    Kod: VB.net
    Zaloguj się, aby zobaczyć kod


    Przy trzecim wejściu w pętlę Helpb będzie dotyczyć dnia następnego, jednocześnie dodałem warunek, aby po drugiej pętli nie zwiększał Helpb

    Właściwie to powinno być:
    Kod: VB.net
    Zaloguj się, aby zobaczyć kod
  • #11 15695327
    maximus22_kr
    Poziom 18  
    Posty: 513
    Pomógł: 1
    Ocena: 20
    Wracając do WTV020
    Okazało się, że działa na takim kodzie:
    Kod: VB.net
    Zaloguj się, aby zobaczyć kod

    do tego nie wszystkie moduły miały zrobioną zworkę na wyborze zasilania, jeden okazał się być sterowany tylko przyciskami. No i na koniec wzmacniacz na PAM8403 się nie sprawdził ( albo mam uszkodzony ) bo tylko coś "pykało" w głośniku, natomiast podpinając bezpośrednio głośnik działa.
  • #12 15697264
    maximus22_kr
    Poziom 18  
    Posty: 513
    Pomógł: 1
    Ocena: 20
    Niestety z kodem "pokazującym" najbliższy alarm nie jest łatwo.
    Mam teraz sytuację, że:
    Jest godzina 00:30 ( środa )
    Alarm1 ustawiony jest na czwartek 6:30
    Alarm2 ustawiony jest na środę 8:00
    wywołując sprawdzanie alarmu program w pętli znajduje Alarm1 ( w drugim przebiegu pętli ) i wychodzi nie wiedząc ( sprawdza ), że Alarm2 jest wcześniej niż Alarm1

Podsumowanie tematu

✨ W dyskusji poruszono temat zamiany bitów zmiennej typu Byte w kontekście programowania alarmu na mikrokontrolerze Atmega328. Użytkownik zapytał, czy można zastąpić zapis Toggle Alarm1.4 zapisem Toggle Alarm1.dzien, zakładając, że zmienna Dzien nie przekroczy wartości 7. Odpowiedzi sugerowały, że można uprościć kod, wykorzystując pętle oraz aliasy dla dni tygodnia, co pozwala na bardziej przejrzyste i oszczędne w pamięci rozwiązanie. Użytkownik z powodzeniem zaimplementował zmiany, co znacznie zmniejszyło zajętość pamięci flash. W dalszej części rozmowy poruszono problemy z modułem WTV020, który nie działał zgodnie z oczekiwaniami, oraz kwestie związane z podłączeniem głośników i wzmacniaczy.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA