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

BASCOM - [ATtiny2313] Sterownik podwórkowy

10 Wrz 2015 17:52 1398 9
  • Poziom 32  
    Hej,

    Potrzebuje pomocy w poprawieniu kodu. Siedzę nad nim już dość długo i nie mogę sobie z nim poradzić-brak umiejętności :(

    Założenia czyli co chcę podłączyć:
    1. wyjścia:
    a) Lampa ogrodowa nr.1
    b) Lampa ogrodowa nr.2
    c) Lampa ogrodowa nr.3
    d) lampy ogrodowe (2szt.) podłączone pod jedno wyjście uC
    e) furtka (impuls 0.5-1s)
    f) brama (impuls 0.5-1s)

    2. wejścia:
    a) czujnik zmierzchu
    b) czujnik ruchu nr.1
    c) czujnik ruchu nr.2
    d) przycisk zwierny nr.1
    e) przycisk zwierny nr.2
    d) krańcówka do skrzydła bramy, abym wiedział czy jest otwarta czy zamknięta

    3. docelowo ma być dodatkowe sterowanie poprzez RS-485 (na razie to zostawiam)

    Jak to ma działać:
    a) gdy zapada zmrok mają się włączyć lampy nr.1,2,3, ale mają się zmieniać co 5 minut czyli w jednym czasie świecą tylko dwie:
    Zapada zmrok świeci nr.1 i nr.3, mija 5 minut zaświeca się nr.1 i nr.2, mija 5 minut zaświeca się nr.2 i nr.3 i tak w kółko aż będzie jasno.
    b) gdy jest ciemno czujnik ruchu nr.1 wykryje ruch maja się zaświecić lampy ogrodowe (dwie sztuki)
    c) gdy jest ciemno czujnik ruchu nr.2 wykryje ruch maja się zaświecić lampy ogrodowe nr.1,2,3
    d) gdy nacisnę przycisk nr.1 maja się zaświecić (nieważne czy jest ciemno czy jasno) lampy ogrodowe (dwie sztuki) gdy nacisnę go drugi raz mają zgasnąć
    e) gdy przytrzymam przycisk nr.1 ma się otworzyć furtka (impuls)
    f) gdy nacisnę przycisk nr.2 maja się zaświecić (nieważne czy jest ciemno czy jasno) lampy ogrodowe nr.1,2,3 gdy nacisnę go drugi raz mają zgasnąć
    g) gdy przytrzymam przycisk nr.2 ma się otworzyć brama (impuls)

    Mój kod:
    Kod: vbnet
    Zaloguj się, aby zobaczyć kod


    Kod praktycznie mi działa, ale:
    -gdy czujnik zmierzchu już działa (lampy świecą i się przełączają) i ja przytrzymam przycisk nr.1 lub nr.2 to przestają chwile świecić-wykorzystuje "Gosub" a w nim "Waitms 500"
    -cały kod jest jakiś chaotyczny i nie wiem jak sobie z nim poradzić

    Może znajdzie się dobra dusz i pomoże mi to wszystko jakoś ogarnąć?
    Ze mnie żaden programista, ale nie ukrywam, że bardzo chciałbym to złożyć w całość.
  • OptexOptex
  • Pomocny post
    Użytkownik usunął konto  
  • Poziom 32  
    Kolego @niveasoft bardzo dziękuję za kod-zabieram się za lekturę... Muszę to jakoś "przełożyć" na mój mały rozumek :)

    Bardziej spodziewałem się, że dostanę odpowiedź typu "weź to zostaw i przejdź na C", "eskimoskiego dziś już nikt nie używa"

    HA! Normalnie Św. Mikołaj mnie odwiedził we wrześniu :)
  • OptexOptex
  • Użytkownik usunął konto  
  • Poziom 32  
    Kolego @niveasoft jeszcze raz bardzo dziękuję za kod. Wszystko działa bezbłędnie-tak jak chciałem :)

    Pojawia się problem kiedy chcę dorzucić RS485:
    Kod: vbnet
    Zaloguj się, aby zobaczyć kod


    Gdy karta startuje to w terminalu widzę "Karta: 22" czyli kart się uruchomiła.
    Gdy wysyłam do niej "S2211" to ustawia się "Flaga_lampa_1_2_3" i lampy się włączają-tu jest wszystko OK.

    Problem nr.1
    Problemem jest to, że wysyłam "S2212" karta zamiast odpowiadać on/off to wysyła śmieci typu "��5R�" Inne karty (ten sam kod od RS485) w sieci odpowiadają poprawnie.

    Problem nr.2
    Nie wiem jak "wystartować" furtkę i bramę. Ze światłem było proste
    tzn. chcę wysłać do karty "S2231" aby otworzyć bramę
    lub wysłać do karty "S2241" aby otworzyć furtkę
  • Pomocny post
    Użytkownik usunął konto  
  • Poziom 32  
    Drugiego kodu jeszcze mój mały rozumek za bardzo nie ogarnia, ale... również pokazuje "śmieci" przy odpowiedzi :(

    Więc zacząłem poszukiwania.
    Pierwsze co poszło pod młotek to płytka stykowa już byłem praktycznie pewny, że tam coś musi być, ale nie...
    Więc wiozłem sobie do serca słowa:
    niveasoft napisał:
    Dosyć odważnie sobie poczynasz na mikrokontrolerze mającym 2kB Flash i 128B SRAM

    Wygrzebałem z szuflady ATmega8, ale też nie...

    Okazuje się, że problemem są czasy RS485, a więc gdy korzystam ze sposobu który kiedyś mi podpowiedziałeś:
    Kod: vbnet
    Zaloguj się, aby zobaczyć kod

    to mam śmieci w odpowiedzi.

    A jak zmienię na:
    Kod: vbnet
    Zaloguj się, aby zobaczyć kod


    To nie mam żadnych śmieci i wszystko jest OK. Nawet ATtiny2313 się wyrabia, daje radę mikrus :)

    Ale jak teraz poprawnie wyliczyć te czasy?
    Jak długo może trwać wysłanie znaków "on", "off"?
    Jak długo może trwać odebranie znaków "S1234"?
    Jak to obliczyć?
  • Użytkownik usunął konto  
  • Poziom 32  
    niveasoft napisał:
    Z ta funkcją Config Print nie miałem jeszcze problemów więc problemu szukałbym gdzie indziej.
    Łatwo o błahy błąd. Czy na pewno masz wybrane zewnętrzne taktowanie?

    uC programuję programem MkAvrCalculator i oczywiście wybieram zewnętrzny kwarc.
    Wymieniałem uC i MAX485 na inny egzemplarz. Próbowałem na ATmega8. Wywaliłem z kodu wszystko poza obsługą RS485. Za każdym razem to samo-gdy robię Twoim sposobem to mam w odpowiedzi śmieci, a gdy w programie ustawiam kiedy ma się przełączać odbiór/nadawanie to mam prawidłowe odpowiedzi. Czyli albo gdzieś w kodzie siedzi jakiś chochlik, albo problemem jest mój konwerter USB-RS485.
    niveasoft napisał:
    Może spróbuj tylko na próbę dać jakiś inny rezonator i w kodzie zmień na jego prędkość.

    Jutro popróbuję jeszcze podziałać tak jak mówisz.
    niveasoft napisał:
    Co do dobrania opóźnień czasowych to naucz się czegoś takiego jak robię ja. Na górze, na początku kodu określasz stałe które sa ważne w całym kodzie. Zobacz jak łatwo można zmienić czasy Furtki i Bramy. Są na górze i nie trzeba ich szukać w kodzie

    Chodziło mi o czasy przy przełączaniu odbiór/nadawanie RS485.

    Dziękuję za podpowiedzi :)

    Dodano po 3 [godziny] 29 [minuty]:

    Jednak to będzie wina konwertera-kombinuje, kombinuje i co bym nie zrobił to są śmieci w odpowiedzi.
    Wyszło, że musi być opóźnienie. Zrobiłem Twoim sposobem i dodałem opóźnienie i wszystko działa jak należy.
    tzn.:
    Kod: vbnet
    Zaloguj się, aby zobaczyć kod