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] RS485 zakłócenia odbioru podczas jednoczesnego nadawania.

FastProject 10 Cze 2011 00:26 3579 9
REKLAMA
  • #1 9595439
    FastProject
    Poziom 28  
    Witam,
    od jakiegoś czasu opracowuję urządzenia komunikujące się po RS485 w protokole PELCO-D. Urządzenia komunikują się albo jedno albo dwukierunkowo-tutaj to nie istotne...

    Wszystko działa wyśmienicie i komunikuje się bez najmniejszego błędu gdy nadaje jedno z urządzeń. Urządzenie to nadajnik i odbiornik.

    Gdy nadają 2 nadajniki jednocześnie (jednocześnie zwieram wejścia) i jednocześnie wysłana jest ramka, to wszystkie urządzenia (zarówno nadajniki i odbiorniki) blokują się gdzieś w programie. Podejrzewam, że zwis następuje w podprogramie odbioru ramki.

    Poniżej wysyłana ramka:
    Kod: text
    Zaloguj się, aby zobaczyć kod


    Odbieranie ramki:
    Kod: text
    Zaloguj się, aby zobaczyć kod


    Odczyt danych z bufora UARTA Atmegi88 występuje po warunku:
    Kod: text
    Zaloguj się, aby zobaczyć kod

    czyli po odebraniu całej ramki 7 bajtów(znaków).

    Wcześniej sprawdzałem warunkiem :
    Kod: text
    Zaloguj się, aby zobaczyć kod

    Też działało dobrze.

    Także odczyt z bufora czy to za pomocą Inputbin czy Inkey nie wpływa na pracę.

    Proszę o wskazówki, co może być powodem blokowania się programu gdy jednocześnie próbuje wysłać 2 ramki...oczywiście, że powstają błędy w transmisji ale jak ich się ustrzec lub uodpornić urządzenia na takie sytuacje?

    Zastanawiam się czy czasami układy które wykorzystuje do RS485(MAX485) po jednoczesnym włączeniu nadajników nie sieją bzdur na linii RS484 która powoduje może zawieszenie UARTa atmegi, a po chwili namysłu raczej skłaniałbym się ku tej opcji, a więc proszę o jakieś wskazówki lub wytłumaczenie problemu i sposobu rozwiązania, którego aktualnie nie widzę.
    Dla chętnych pomóc udostępnię większe fragmenty kodu.

    Transmisja prędkością 2400baud lub 9600baud.
  • REKLAMA
  • #3 9595479
    FastProject
    Poziom 28  
    Tak tak właśnie o tym pomysłem i jasne że jeśli nadają 2 lub więcej to są śmieci na linii, tylko dlaczego programy lub UARTy się zawieszają? Jak uniknąć błędnego działania programu w przypadku gdy 2 MAX485 próbują nadawać?

    Zapewne będę musiał pomyśleć o sprawdzanie zajętości linii, ale chce zrozumieć powód zawieszania programu.
  • REKLAMA
  • REKLAMA
  • #5 9595495
    FastProject
    Poziom 28  
    Właśnie nie może być tak, żeby całe urządzenia się resetowały.

    To nie jest rozwiązanie mojego problemu, bo stan wyjść(przekaźników) odbiorników musi zawsze odpowiadać stanom wejść nadajników...owszem jest zapis do EEPROM, ale...

    Na jednej linii może być kilka takich par o rożnych adresach. Stany pamiętane są w EEPROM i odtwarzane po włączeniu zasilania, ale sekwencja startowa(po włączeniu zasilania czy resecie) trwa kilka sekund tak aby nie było kolizji na linii.

    Taka kilkusekundowa sekwencja nie jest wskazane przy każdym błędzie spowodowanym śmieciami na linii.

    Najistotniejsze pytanie: DLACZEGO GDY NADAJĄ 2 NADAJNIKI, TO PROCESORY LUB PROGRAMY Z POWODU ŚMIECI "IDĄ W KRZAKI" PODCZAS ODBIORU TYCH ŚMIECI?
  • #6 9595705
    markosik20
    Poziom 33  
    Daro_Elektronik napisał:

    Najistotniejsze pytanie: DLACZEGO GDY NADAJĄ 2 NADAJNIKI, TO PROCESORY LUB PROGRAMY Z POWODU ŚMIECI "IDĄ W KRZAKI" PODCZAS ODBIORU TYCH ŚMIECI?


    Bo program jest źle napisany (źle "wymyślony" algorytm odbioru). Niestety nie jestem w stanie pomóc...nie znam Bascoma.
  • #7 9595799
    tmf
    VIP Zasłużony dla elektroda
    Po pierwsze nie jesteś w stanie sprawdzić zajętości magistrali. Niestety kontrola musi się odbywać na etapie odbiornika, a co za tym idzie dane muszą być w jakiś sposób potwierdzane. Pewnie ten protokół to ma. Co do zawieszania - musisz mieć namieszane w programie. Zauważ, że sytuacja konfliktu na magistrali powoduje odbiór nieprawidłowej ramki i generowanie różnych błędów odbiornika - PE, overrun itd. Musisz je obsłużyć. Program musi się blokować na jakiejś pętli oczekującej na zdarzenie, np. odbiór bajtu z RS.
  • REKLAMA
  • #8 9595937
    FastProject
    Poziom 28  
    markosik20 napisał:
    Daro_Elektronik napisał:

    Najistotniejsze pytanie: DLACZEGO GDY NADAJĄ 2 NADAJNIKI, TO PROCESORY LUB PROGRAMY Z POWODU ŚMIECI "IDĄ W KRZAKI" PODCZAS ODBIORU TYCH ŚMIECI?


    Bo program jest źle napisany (źle "wymyślony" algorytm odbioru). Niestety nie jestem w stanie pomóc...nie znam Bascoma.


    No to żeś się popisał...to że coś jest źle to chyba wiadomo ;P

    tmf napisał:
    Niestety kontrola musi się odbywać na etapie odbiornika, a co za tym idzie dane muszą być w jakiś sposób potwierdzane. Pewnie ten protokół to ma.

    Generalnie w protokole PELCO-D nie ma potwierdzeń, jest to z definicji transmisje jednokierunkowa. Ja jednak na życzenie wprowadziłem modyfikację tego protokołu właśnie o odpowiedzi i potwierdzenia. I to wszytko działa dopoki nadajniki nadają w różnych czasach.

    Zawieszenie występuje zarówno w pracy jednokierunkowej jaki dwukierunkowej. Problem jest ten sam...obserwuje zachowanie linii w terminalu i np tak wyglądają ramki i to co odbiera PC...
    [Bascom] RS485 zakłócenia odbioru podczas jednoczesnego nadawania.

    Dodano po 1 [godziny] 9 [minuty]:

    Panowie...problem chyba rozwiązany.

    Cały odbiór i weryfikacja ramki była prawidłowa. Okazało się, że niepotrzebnie w konfiguracji bufora wejściowego dałem jego zbyt dużą wartość.
    Kod: text
    Zaloguj się, aby zobaczyć kod

    Moja ramka ma 7 bajtów i teraz taką długość ma bufor wejściowy.

    Gdy bufor był większy (16 bajtów) występowały powyższe problemy...prawdopodobnie zawsze coś z tych śmieci zostawało w buforze...ale uwaga...mimo, że czyściłem go za pomocą:
    Kod: text
    Zaloguj się, aby zobaczyć kod


    Tak z ciekawości: Czy jest ktoś w stanie mi powiedzieć dlaczego tak się działo?
  • #9 9596755
    tmf
    VIP Zasłużony dla elektroda
    Można tylko strzelać. Obstawiam, że problemem jest niedostateczna ilość pamięci SRAM i nakładanie się zmiennych, które są nadpisywane. Śmieci na magistrali zapełniały ci cały bufor, normalna transmisja nie i dlatego nie obserwowałeś wtedy problemu. To tylko hipoteza, nie znam Bascoma więc ci nie poradzę jak ją sprawdzić, jeśli przejdziesz na C to będę mógł pomóc :)
  • #10 9598760
    FastProject
    Poziom 28  
    SRAM-u raczej nie zapełniało, bo mam zadeklarowane sporo więcej jak standardowo Bascom ustawia. Śmieci też raczej nie zapełniały bufora, bo na printscreenie widać, że podczas jednoczesnego nadawania rzadko kiedy dochodziło do bufora i na linie pełne 7 i więcej bajtów.

    Na razie nie jest to tak istotne, ale ważne, że udało się rozwiązać problem. Jak będzie czas to kiedyś do tego wrócę...ale pewnie prędzej zacznę uczyć się C..książki już mam tylko czasu brak...a gotowych procedurek w Bascomie co-nie-miara...
REKLAMA