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

[BASCOM]rs485 slave odbiera dane, nadaje i nie wznawia odbioru, ogolne porady

*zaba* 03 Sty 2013 23:32 2712 7
  • #1 03 Sty 2013 23:32
    *zaba*
    Poziom 13  

    Witam. Nie dawno wybudowałem altanę na działce.

    [BASCOM]rs485 slave odbiera dane, nadaje i nie wznawia odbioru, ogolne porady [BASCOM]rs485 slave odbiera dane, nadaje i nie wznawia odbioru, ogolne porady

    Chciałbym w niej sterować gniazdkami, przyciskami do oświetlenia i oświetleniem.
    Każde gniazdko będzie miało podświetloną obwódkę wykonaną z pleksi, podświetlenie na diodach RGB sterowanych PWM z atmegi8, która będzię przy każdym gniazdku.
    Na płytkach z atmegą będą też przekaźniki do sterowania gniazdkiem a także przyciski do ich załączania (lokalnego, bo zdalne będzie poprzez RS485)
    Coś takiego ale to jest tylko prototyp na kartce trzeba te kawałki pleksi dociąć, poskładać i więcej diod RGB a przełącznik będzie wmontowany w gniazdko.
    [BASCOM]rs485 slave odbiera dane, nadaje i nie wznawia odbioru, ogolne porady [BASCOM]rs485 slave odbiera dane, nadaje i nie wznawia odbioru, ogolne porady
    Obok płytka, która będzie w każdym gniazdku. Otóż tak problem mam z wznowieniem odbioru danych przez slave czyli gniazdko po nadaniu odpowiedzi dla master'a. Czyli gdy nadam do slave adres "{008}G1r1n" czyli zeby odpowiedział mi jaki jest stan przekaźnika to on mi odpowiada "zal" lub "wyl" zależności od stanu przekaźnika czyli wszystko gra do tej pory ale gdy wysyłam komendy (a wysyłam na 100% bo widzę je w terminalu na PC) do podświetlenia, ustawienia koloru to tego nie odbiera a przed sprawdzeniem stanu przekaźnika wszystko było w porządku a gdy znów chce odczytać stan to też dostaję prawidłowy wynik ale w dalszym ciągu nie umie sterować podświetleniem.




    Raczej to będzie wina kodu a podłączone mam rezystory polaryzujące linie A i B 470R zamiast 560R bo innych nie miałem a rezystora pomiędzy liniami 120R nie mam bo mi wtedy nie chciało wcale to chodzić.
    Kod master

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    Kod slave, gniazdko
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    Film prezentujący problem.

    Prośiłbym o porady dotyczące kodu czy dobrze to zrobiłem czy może zająć się instrukcją printbin może inne jakieś rady?
    Chciałem zrobić tak że rs485 jest podłączony do każdego urządzenia i jest 1 master co tylko by wysyłał zapytania do slave czy mają coś do nadania i wszystkie te dane by po sieci krążyły a odbiorcy by sobie odpowiednio dobierały dane. Tylko tu mam pytanie jaka może być szybkość tych zapytań mastera czyli że jak ja nacisnę przycisk załączający światło czy inne cudo to czy ja nie będę musiał czekać powiedzmy z 20 sekund aż master zapyta się akurat tego przycisku czy coś ma do nadania. Ewentualnie mógłbym dodać osobny master dla gniazdek, osobny dla przycisków, osobny dla oświetlenia wtedy mastery będą miały mniej urządzeń do pytania. Moje pytania biorą się stąd, że czytałem dużo nawet o osobnej lini, która by sygnalizowała czy ktoś nadaje ale ostatecznie koleżanka zdecydowała się na system z 2 masterami , czytałem o metodzie "żetonowej"
    Proszę o porady i a może zmienić standard komunikacji ??
    Jak to jest rozwiązane w sieciach inteligentnego domu (nie interesuje mnie umieszczenie wszystkiego, przekaźników, i innych w jednym miejscu)?

    0 7
  • SterControl
  • #2 04 Sty 2013 13:33
    *zaba*
    Poziom 13  

    Poczytałem trochę mam kilka wniosków a mianowicie problemem nie jest warstwa fizyczna RS485 a warstwa protokołu. A także zdecydowanie powinienem zając się instrukcją Printbin a nie Print i muszę wysyłać dane typu byte a nie jak ja mam tu wyżej za pomocą znaków ASCII czy mam racje czy się mylę oświećcie mnie.

    0
  • #3 04 Sty 2013 23:04
    *zaba*
    Poziom 13  

    W tym wątku Link kolega Dawid_20 napisał o SPI co też mnie zainteresowało z racji tego że nie występuje kolizja danych z racji wykorzystania linii SS tak jak tam kolega opisał slave będzie nadawało wtedy kiedy linia SS biedzie wolna nie tak jak to jest z RS485 kiedy slave dostanie zapytanie od mastera i to by mnie interesowało bo gdy jest duża liczba układów to w RS485 zanim master odpyta wszystkie slave to trochę czasu minie ( czy to nie jest aż taki duży problem jak mi się wydaje bo nie chciałbym aby światło załączył by się np. po 4 sekundach od załączenia włącznika) a kolega niżej pisze o ograniczonych na SPI urządzeniach bo każda linia SS z każdego slave ma być podłączona do osobnego wyprowadzenia ale są przecież układy na I2C które powielają I/O np PCF8574 który daje dodatkowe 8 a do I2C możemy podłączyć 8 takich układów czyli mamy 64 a tyle by mnie już zadowoliło co o tym sądzicie?
    Jeszcze jeden inny pomysł to żeby linie SS poprowadzić jedna wspólną a adresować poprzez ramkę i też czytałem o dodatkowej takiej linii w RS485 i odrazu pisali żeby o tym zapomnieć a ja się pytam dlaczego taka linia zajętości sieci jest bezsensu w RS485 ?

    0
  • SterControl
  • #4 23 Lut 2013 15:12
    wijo
    Poziom 12  

    *zaba* napisał:
    bo gdy jest duża liczba układów to w RS485 zanim master odpyta wszystkie slave to trochę czasu minie ( czy to nie jest aż taki duży problem jak mi się wydaje bo nie chciałbym aby światło załączył by się np. po 4 sekundach od załączenia włącznika)

    Przecież pod wyłącznikiem oświetlenia jest płytka z procesorem i przekaźnikiem. Nie rozumiem po co slave (wyłącznik oświetlenia) ma oczekiwać na zezwolenie od mastera na zaświecenie światła. Po prostu naciskasz przycisk i slave ma natychmiast włączyć bądź wyłączyć żarówkę, a potem, kiedyś, master przyśle zapytanie o stan slave (wyłącznika oświetlenia) i przyjmie to do wiadomości.
    500ms opóznienia przy wysyłaniu danych to o wiele za dużo, choćby dlatego układ nie działa błyskawicznie, tak jak byś oczekiwał, ale nie jest to chyba przyczyną błędów i zawieszania transmisji. W swoich programach stosuję z zapasem opóźnienie w wymiarze ok 0,7 ms na każdy wysłany bajt danych i nie mam problemów.

    0
  • #5 24 Lut 2013 06:39
    *zaba*
    Poziom 13  

    No tak w zupełności masz racje że pod włącznikiem będzie płytka z włącznikiem gdyby miało to tylko funkcje włącz wyłącz to rzeczywście jest to dobre a jeśli będzie oświetlenie na LEDach to slave będzie czekał na informację ile i jakie ma włączyć.
    Narazie szykuję do służby w altance gniazdka podświetlane RGB i ma mieć takie opcje:
    1. włącz / wyłącz przekaźnika lokalnie i zdalnie czyli na przycisku i poprzez mastera (zrealizowane)
    2. ustawienie koloru podświetlania dla każdego gniazdka, kolory od 1 do 9 zdefinowane w programie slave (zrealizowane dla 1 ale to problem nie będzie zmienić tylko adres slave)
    3. tryb auto podświetlenia, czyli automatyczna zmiana kolorów (zrealizowane tylko dla 1)
    4. tryb pwm, czyli wypełnieniem dla każdego z osobna kolorem sterujemy potenciometrem w masterze (nie zrealizowane)
    Mówisz, że opóźnienie masz 0,7ms po każdym wysłanym bajcie a czy po zmianie kierunku nadawania tą linią sterującą masz jakieś opóźnienia.
    Teraz mam już inne programy wykorzystujące przerwanie bytematch i w slave i masterze.
    Czekam jeszcze na wyświetlacz 4x40 dla mastera i będę robił menu.
    Czemu nie zdecydowałem się na graficzny ano dlatego, że nie obsługiwałem jeszcze graficznego i zanim dojdę do wprawy to trochę minie a z lcd mam trochę doświadczenia. Dzięki wielkie za odpowiedź
    master:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    slave:
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    0
  • #6 24 Lut 2013 18:01
    konstruktor_123456
    Poziom 14  

    Cześc
    Pomyśl nad stworzeniem logicznego protokołu wysyłanego przez mastera do slevów i potwierdzeniem odsyłanym że dane zostały pomyślnie odebrane.
    np.
    Master Wysyła Znak_początku_transmisji Adres_gniazdka Stan_jaki ma_przyjąć_to_gniazdko Znak_końca_transmisji
    Master potem czeka na odpowiedz od tamtego sleva

    Co do programu to użyj Uartu sprzętowego a nie programowego + przerwanie Udrx i tam składaj całą odebraną informacje i wyszukuj tam Początka i końca transmisji.

    Taka komunikacja wymaga obmyślenia dobrej logiki i zajmie Ci z pewnością sporo czasu.
    Powodzenia

    0
  • #7 24 Lut 2013 21:02
    wijo
    Poziom 12  

    *zaba* napisał:
    Mówisz, że opóźnienie masz 0,7ms po każdym wysłanym bajcie a czy po zmianie kierunku nadawania tą linią sterującą masz jakieś opóźnienia.


    Nie 0,7ms po każdym bajcie, tylko sumarycznie, jesli wysyłam kilka zmiennych które razem zajmują 10bajtów to wstawiam po wysyłce 7ms opóźnienia. Przy 0,4ms/bajt czasami pojawiają się problemy, 0,5ms/bajt wszytko działa dobrze, ale tak jak napisałem wcześniej daję trochę zapasu, dlatego przyjąłem 0,7ms/bajt. Te opóźnienia są w odniesieniu do 4Mhz i 4800baud które to parametry najczęsciej stosuje w projektach. Tak więc Ty mógłbyś stosować jeszcze mniejsze wartości opóźnienia, ale trzeba to sprawdzić eksperymentalnie.
    Po zmianie kierunku transmisji nie ma opóźnień, ponieważ odbór danych odbywa się w przerwaniu od Urxc.
    Komunikację realizuję za pomocą instrukcji Printbin, Inputbin. Wiem wiem, niektórzy transmisję binarną obchodzą szerokim łukiem, uważają ją za źródło pułapek i błędów. To nie jest prawda, jeśli kiedykolwiek pojawiły się jakieś problemy w transmisji, to było to skutkiem mojej niewiedzy bądź błędu. Komunikacja jest na tyle pewna, że dawno temu zaniechałem potwierdzania odbioru danych i różnych metod wykrywania błędów. Po prostu zakładam, że informacja wysłana została poprawnie odebrana i tyle.
    Tak jak napisał konstruktor_... używaj sprzętowego uartu.

    0
  • #8 09 Mar 2013 15:23
    *zaba*
    Poziom 13  

    Dziekuję za wszystkie dotąd udzielone mi porady. Jeśli chodzi o transmisję binarną printbin, inputbin to próbowałem wyszło super przede wszystkim zmniejsza liczbę byte ramki chodzi mi o to, że gdy wysyłam parametr do pwm np. 255 to używam 3 znaków ASCII czyli 3 byte a binarnie wyśle byte 255 i to tyle ale w transmisji nie mogłem korzystać z przerwania BYTEMATCH i dlatego na razie zrezygnowałem z tego i próbuje dalej z znakowej. Gdy tylko skończę transmisje znakową to wróce do binarnej aby uszczuplić troche kod i liczbe wysylanych byte. W binarnej musze cały czas odbierać dane w programie i w programie odczytuje adres z ramki a w znakowej z przerwaniem BYTEMATCH ustawiam np. na 8 i wtedy ustawiam flagę i odbieram resztę danych z ramki jest to lepsze bo inne slave ich nie odbiera.
    Jeśli chodzi o sprzętowy USART to ja właśnie korzystam z niego czy może się mylę szukałem informacji i wydaje mi się że jest to sprzętowy

    Cytat:
    Sprżetowego nie trzeba konfigurować. Użycie Print,Inkey,Input bez numeru kanału domyślnie używa sprzętowego Uart. Jedynie można sobie ustawić bufor wejściowy i wyjściowy poleceniami Config Serialin/Serialout

    Gdy już skończę program w Bascomie będę powoli chciał przejść na C lub Asm i napisać taki sam program w innym języku oczywiście będę musiał zaopatrzyć się w potrzebną literaturę.

    0