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] Jak skonfigurować 6 programowych UART na Atmega32 w Bascom dla RS-485?

miki99999 18 Cze 2009 00:37 2564 7
REKLAMA
  • #1 6670574
    miki99999
    Poziom 1  
    Posty: 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  
    Posty: 2421
    Pomógł: 183
    Ocena: 60
    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  
    Posty: 3103
    Pomógł: 208
    Ocena: 66
    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.
  • REKLAMA
  • #5 6677198
    kamyczek
    Poziom 38  
    Posty: 3994
    Pomógł: 394
    Ocena: 574
    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  
    Posty: 3103
    Pomógł: 208
    Ocena: 66
    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).
  • #7 6677317
    gothye
    Poziom 33  
    Posty: 2421
    Pomógł: 183
    Ocena: 60
    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  
    Posty: 3103
    Pomógł: 208
    Ocena: 66
    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.

Podsumowanie tematu

LABEL_AI_GENERATED
Temat dotyczy implementacji sześciu programowych portów UART na mikrokontrolerze Atmega32 w Bascom do komunikacji z urządzeniami RS-485 przy prędkości 1200 baud. Problem wynika z zajętości sprzętowego UART przez modem oraz konieczności odbioru danych z sześciu niezależnych urządzeń. Próby otwarcia wielu portów COM w Bascom i odczytu danych za pomocą Inkey() skutkują błędami (krzaczkami), a funkcja Serin() buforuje tylko do pierwszego znaku końca linii, ignorując resztę. W dyskusji podkreślono, że na magistrali RS-485 wiele urządzeń może współdzielić jeden port UART dzięki adresacji i protokołowi, co eliminuje potrzebę wielu programowych UARTów. W przypadku braku synchronizacji i jednokierunkowej transmisji (simpleks) na wielu liniach, programowa emulacja wielu UARTów jest bardzo trudna i wymaga przerwań zegarowych o wysokiej częstotliwości oraz asemblerowych wstawek do dekodowania sygnału. Zwrócono uwagę, że programowy UART może działać tylko na jednej linii w danym czasie, więc lepszym rozwiązaniem jest połączenie wszystkich urządzeń na jednej magistrali RS-485 i sekwencyjne odpytywanie ich przez urządzenie nadrzędne. Wspomniano również o systemach obsługujących do 128 urządzeń na jednej linii RS-485, co potwierdza możliwość realizacji komunikacji wielopunktowej przy odpowiednim protokole.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA