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

[Atmega32][Bascom] 6xprogramowy UART (RS-485)

miki99999 18 Cze 2009 00:37 2486 7
REKLAMA
  • #1 6670574
    miki99999
    Poziom 1  
    Witam Kolegów,

    Natrafiłem na problem i zwracam się do bardziej doświadczonych z prośbą o wsparcie.

    Mam 6 urządzeń po RS-485 1200 baud (można skonfigurować dowolnie), które muszę zaterminować w jednym mikrokontrolerze - stąd muszę stworzyć 6 programowych UARTów. Sprzętowy jest już zajęty przez działającą transmisję z modemem - wolnych nóżek jest jeszcze ze 2 razy więcej. Interesują mnie wyłącznie informacje przychodzące do uC.
    Nadmienię, że po podłączeniu każdego z urządzeń do sprzętowego UARTa, transmisja przebiega poprawnie.
    Mój pomysł:
    otworzyć transmisję
    Open "comd.7:1200,8,n,1" For Input As #1
    ...
    ...
    Open ........... #6
    w przerwaniu odczytywać przy pomocy Inkey() transmisję - dostaję krzaczki, a ponieważ jest to rozwiązanie programowa, nie można zbuforować poprzez Config Serialin = Buffered, ....
    Spróbowałem Serin S , 0 , D , 7 , 1200 , 0 , 8 , 1, który buforuje w zakresie zadeklarowanej zmiennej S - czyta do pierwszego {13}{10}, resztę ignoruje.

    Do tej pory wykorzystywałem wyłącznie UART sprzętowy i nie napotkałem większych problemów, natomiast przy tych wymogach stanąłem przed ścianą...

    Koledzy, jakiś pomysł?
    Z góry dziękuję i pozrdawiam,
    Marcin
  • REKLAMA
  • #2 6675587
    gothye
    Poziom 33  
    skoro stosujesz rs485 ,to po co Ci programowe UART'y ? skoro na szynie rs485 może pracować wiele urządzeń ,w zależności od typu full /hall duplex ,to już kwestja programowa rozróżniania urządzeń po adresacji
  • REKLAMA
  • REKLAMA
  • #4 6677134
    marek_Łódź
    Poziom 36  
    gothye napisał:
    skoro stosujesz rs485 ,to po co Ci programowe UART'y ? skoro na szynie rs485 może pracować wiele urządzeń ,w zależności od typu full /hall duplex ,to już kwestja programowa rozróżniania urządzeń po adresacji
    Poza problemami natury elektrycznej, może być jeszcze problem "spotkania protokołów", czy jak kto woli synchronizacji. W przypadku danych napływajacych asynchronicznie w kilku kanałach bez synchronizacji (np. linie jednokierunkowe), nie da się tych danych odebrać jednym portem.
    Z podobnych powodów nie da się tych danych odebrać sekwencyjnymi procedurami emulującymi port szeregowy na kilku liniach (programowa emulacja w BASCOMie), chociażby dlatego, że w czasie odsłuchiwania bajtu na jednej linii możemy zgubić część danych na innych.

    Jeśli starczy Ci determinacji, to trzeba to rozwiązać programowo przemiatając wszystkie linie odbiorcze w przerwaniu zegara z częstotliwością zdecydowanie wyższą od prędkości transmisji (np.32x1200=38400Hz). Oczywiście bez asemblera się raczej nie obędzie - wstawka asemblerowa do obsługi przerwania zegarowego, procedura rozpoznająca zmiany na liniach wejściowych, odliczająca cykle i dekodująca to, co odczytała. Mając procesor generujący przerwania od zmian na liniach wejściowych (portach), można odwrócić działanie tej procedury i w przerwaniu portu odczytywać zegar procesora generując odpowiednią procedurą kolejne bity zdekodowanej danej.

    Sam choruję na coś takiego, bo już parę razy spotkało mi się kilka RS-ów w jednym procesorze (niekoniecznie 485), ale nigdy nie starczyło determinacji. Może "następną razą". Zawsze prościej było włożyć dodatkowe kość spotykające się na SPI, czy to małe procesorki, czy też specjalizowane układy komunikacyjne.
  • #5 6677198
    kamyczek
    Poziom 38  
    Problem polega na tym że programowy uart w tym samym czasie będzie działał tylko jeden a urządzeń masz 6. Rozwiązaniem twojego problemu jest połączenie wszystkich urządzeń razem na jednym rs485 i odpytywanie przez urządzenie nadrzędne kolejno modułów.
  • #6 6677300
    marek_Łódź
    Poziom 36  
    kamyczek napisał:
    Problem polega na tym że programowy uart w tym samym czasie będzie działał tylko jeden a urządzeń masz 6. Rozwiązaniem twojego problemu jest połączenie wszystkich urządzeń razem na jednym rs485 i odpytywanie przez urządzenie nadrzędne kolejno modułów.
    A jest możliwość odpytania urządzenia, czy dane sobie napływają swoją koleją bez synchronizacji :?: Programowa emulacja w przerwaniach zegara lub portu pozwoli na jednoczesny odsłuch kilku linii, nawet w przypadku gdy nie ma możliwości odpytania urządzeń współpracujących (linie simpleksowe).
  • REKLAMA
  • #7 6677317
    gothye
    Poziom 33  
    spotkałem sie z systemem który może być rozbudowany do 128 urządzeń na jednej lini rs485 ,wiec wszystko jest do napisania ,zwłaszcza protokół komunikacyjny nawet w bascom ;)
  • #8 6677336
    marek_Łódź
    Poziom 36  
    gothye napisał:
    spotkałem sie z systemem który może być rozbudowany do 128 urządzeń na jednej lini rs485 ,wiec wszystko jest do napisania ,zwłaszcza protokół komunikacyjny nawet w bascom ;)
    Jeśli układy transmitują jednokierunkowo (SIMPLEX) bez możliwości synchronizacji nie zrobisz nic. Każda linia musi być odsłuchiwana na odrębnym porcie.
REKLAMA