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.

Bascom / Atmega328 - Rozdzielenie zmiennej typu Byte na Bit

maximus22_kr 19 Maj 2016 16:36 1074 11
  • #1 19 Maj 2016 16:36
    maximus22_kr
    Poziom 18  

    Witam
    Chciałbym zapytać, czy zapis:

    Kod: vbnet
    Zaloguj się, aby zobaczyć kod


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

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

    Mam taki kod:
    Kod: vbnet
    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: vbnet
    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ć ?

    0 11
  • Pomocny post
    #2 19 Maj 2016 17:01
    373522
    Użytkownik usunął konto  
  • #3 20 Maj 2016 00:42
    maximus22_kr
    Poziom 18  

    Dziękuję oczywiście pomogło ( z 78 % zajętości zrobiło się 72 % ).
    Teraz wygląda tak:

    Kod: vbnet
    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: vbnet
    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)

    0
  • Pomocny post
    #4 20 Maj 2016 07:35
    373522
    Użytkownik usunął konto  
  • #5 20 Maj 2016 14:39
    maximus22_kr
    Poziom 18  

    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: vbnet
    Zaloguj się, aby zobaczyć kod


    nie powinno być
    Kod: vbnet
    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

    0
  • Pomocny post
    #6 20 Maj 2016 14:55
    373522
    Użytkownik usunął konto  
  • #7 20 Maj 2016 23:08
    maximus22_kr
    Poziom 18  

    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.

    0
  • #8 21 Maj 2016 09:57
    373522
    Użytkownik usunął konto  
  • #9 21 Maj 2016 13:47
    maximus22_kr
    Poziom 18  

    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.

    0
  • #10 22 Maj 2016 11:54
    maximus22_kr
    Poziom 18  

    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: vbnet
    Zaloguj się, aby zobaczyć kod


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


    Może najlepiej byłoby to zrobić tak:
    Kod: vbnet
    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: vbnet
    Zaloguj się, aby zobaczyć kod

    0
  • #11 24 Maj 2016 09:23
    maximus22_kr
    Poziom 18  

    Wracając do WTV020
    Okazało się, że działa na takim kodzie:

    Kod: vbnet
    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.

    0
  • #12 25 Maj 2016 00:36
    maximus22_kr
    Poziom 18  

    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

    0