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

89C2051 z jednym UART i CMOS 4052 do konwersji prędkości RS232 1200/9600bps

speedy9 05 Wrz 2004 00:10 1743 15
REKLAMA
  • #1 833537
    speedy9
    Pomocny dla użytkowników
    Posty: 12035
    Pomógł: 1233
    Ocena: 2425
    Witam wszystkich Forumowiczów!

    Robię układ, w którym potrzebuję skomunikować dwa urządzenia za pomocą RS232, które mają na stałe ustawioną prędkość transmisji. Niestety nie jest ona taka sama :cry: Inaczej nie byłoby problemu :D
    Wymyśliłem więc, że wstawię 89C2051, który będzie odbierał dane z jednego urządzenia i wysyłał je z inną prędkością do drugiego. Problem jest tylko z tym, że procek ów ma jeden UART. Pomyślałem, że wstawię po prostu przełącznik, który będzie sterowany z procka. Wybrałem 4052.
    Co myślicie o takim rozwiązaniu? Ma szansę działać. Prędkości tych urządzeń to 1200bps i 9600bps. Transmisja głównie od wolniejszego do szybszego.
  • REKLAMA
  • #2 833549
    Dexter77
    Poziom 28  
    Posty: 889
    Pomógł: 134
    Ocena: 19
    Moze byc. Powinien bez problemu sie wyrobic.
    Pozdro
    Dexter
  • #3 833554
    speedy9
    Pomocny dla użytkowników
    Posty: 12035
    Pomógł: 1233
    Ocena: 2425
    Też mi się zdaje, że sie wyrobi. Bardziej mnie ciekawi ten pomysł z (de)multiplekserem - czy to zadziała. Bo 4052 (wg noty aplikacyjnej) to chyba jedyny układ umożliwiający transmisję w dwóch kierunkach - piny są oznaczone In/Out.
  • REKLAMA
  • #4 833753
    BoskiDialer
    Poziom 34  
    Posty: 1530
    Pomógł: 353
    Ocena: 42
    A może lepiej by było dać w tym szybszym układzie kwarc 8 razy wolniejszy(jeśli się da)?
    jeśli układy wymieniają dane w dwóch kierunkach naraz tz. full-duplex to są wymagane 2 uarty inaczej niebędzie można naraz śledzić programowo wejście i wysterowywać wyjście. ja bym radził zastosować któryś układ mega z rodziny avr, one posiadają 2 uart'y więc cała sprawa powinna pójść bardzo łatwo, program to powinno być mniej niż 30 linijek kodu asemblera.
  • #5 833797
    speedy9
    Pomocny dla użytkowników
    Posty: 12035
    Pomógł: 1233
    Ocena: 2425
    Kwarcu nie da się zmienić.
    Co do transmisji full-dubplex, to można powiedzieć, że będzie ona semi ful-duplex. Urządzenie szybsze będzie co jakiś czas przesyłać najwyżej 1 bajt danych. W takim przypadku myślę, że to nie problem, bo zamierzam użyć linii sterujących CTS, RTS, DTR, więc podczas jednego zadania mogę zabronić wysyłania danych. Poczekają w buforze urządzenia. Myślę, że to się sprawdzi.
    Z AVRem jest jeszcze taki problem, że nie miałem z nimi styczności i nie znam się na tych prockach. Jeszcze jedno: taki AVR kosztuje około 50zł...
  • #6 833990
    Jacu$
    Poziom 27  
    Posty: 730
    Pomógł: 119
    Ocena: 26
    Przy cenie za AT90S2313 ok. 4 PLN (ostatnio na Allegro, SMD) to ja bym ustawił dwa takie i każdy obsługiwałby jedno urządzenie a dane wymieniałyby między sobą przez porty 8-bitowe. Myślę, że płytka byłaby prostsza do zaprojektowania i układ byłby łatwiejszy do uruchomienia ale tylko teoretyzuję. Jeśli nie próbowałeś jeszcze z AVR-ami to mogą być dwa 2051, ale nie znam cen.
  • #7 834077
    Dexter77
    Poziom 28  
    Posty: 889
    Pomógł: 134
    Ocena: 19
    Jacu$ takie rozwiazanie ma dwie powazne wady. Moze sie okazac ze zmiana programu w jednym procku moze wywolac koniecznosc zmian w drugim, przykra sprawa. Druga wada: zabieramy po jednym porcie ktorych w 90S2313 nie ma za duzo.
    Chyba najprosciej bedzie ten wolniejszy protokol zrobic programowo wykorzystujac przerwania.
    Pozdro
    Dexter
  • #8 834187
    gummis
    Poziom 15  
    Posty: 162
    Pomógł: 4
    Ocena: 1
    ten szybszy dajesz na UARTA a ten wolniejszy realizujesz programowo.
    txd realizujesz na zwyklej lini wsuwajac do niej bity w rownych odstepach czasu.rxd relizujesz na INT i przy pomocy timera.
    gdy dostajesz przerwanie od inta ustawiasz timer na czas 1,5*czas bitu transmisji, oraz ustawisz licznik bitow na 8 lub 9 zaleznie od tego czy odbierasz 9 bit.gdy timer sie przepelni oczytujesz z INT stan wsuwasz go do rejestru o nazwie np. dataRX, przeladowujesz timer czasem 1*czas bitu, i dekrementujesz licznik bitow.jak licznik bitow wyzeruje sie to masz w rejestrze dataRX odebrana daną.
    wtedy nie bedziesz musial sie martwic o to ze jakas dana ci przepadnie tak jak to jest w przypadku przelaczania UARTU.
  • REKLAMA
  • #9 834687
    speedy9
    Pomocny dla użytkowników
    Posty: 12035
    Pomógł: 1233
    Ocena: 2425
    Pomysł Jacu$a rzeczywiście nie jest dobry. Zabraknie mi linii do obsługi RTS, CTS itp.
    Co do programowego UARTu, to też się zastanawiałem. Problemy są dwa:
    1. Pisałem w tej sprawie na różnych forach i pawda jest taka, że jeszcze chyba nikt nie zrealizował tego programowo.
    2. Myślę, że byłby problem z "wyrobieniem" sie z obsługą wszystkiego przez 89C2051. Może na AVR...

    Co do gubienia danych podczas przełączania to jestem skłonny się nie zgodzić. Jeśli wykorzystuję linie RTS, CTS itd., którymi steruję z procka, multiplekserem zresztą też, to nie wydaje mi się żeby coś się mogło zgubić... To tylko kwestia programu.
    Alorytm może być mniej więcej taki:
    1. Odbieram daną z wolniejszego urządzenia
    2. Ustawiam DTR na 1
    3. Przestawiam prędkość UARTu w procku i przełączam multiplekser
    4. Sprawdzam czy CTS =1
    Jeśli tak, to wysyłam dane.
    5. Ustawiam RTS i DTR na 0 i sprawdzam czy DSR=0
    Jeśli tak, to czekam na odebranie danych.
    6. Ustawiam DTR na 1 i dalej podobnie jak na początku

    Myśle, że powinno być OK :roll: , ale może ktoś zrobił coś takiego i może potwierdzić.
  • #10 834723
    gummis
    Poziom 15  
    Posty: 162
    Pomógł: 4
    Ocena: 1
    ja to zrealizowalem dosyc dawno ale gdzies mam w starych projektach
    przy 1200 bodow procek bez problemu by zrealizowal UART
    przy 1200 bodach czasy pomiedzy przerwaniami od timera taktujacego w ktorym pobieraloby sie kolejny bit wynosza przy 12MHz 1000000/1200=833us.bez problemu by to sie wyrabialo.wazne jest zeby przerwania od inta i timera taktujacego chodzily na wysokim priorytecie a przerwanie UARTA sprzetowego na niskim.
  • REKLAMA
  • #12 834820
    gummis
    Poziom 15  
    Posty: 162
    Pomógł: 4
    Ocena: 1
    trzymaj plik calego projektu.niechcialo mi sie tam zaglądac i usuwac , wiec to caly kompletny projekt sprzed ladnych paru lat.
    cala transmisja byla zrealizowana programowo za pomoca INT i timera 1.i nawet nieistotne jest stawianie na wysokim priorytecie przerwan od timera bo jest chyba dana procedurka korygujaca stany timera tak ze zawsze rowne odstepy daje.
    sekw tym ze sa dwa procesory.jedne byl jako nadajnik a drugi jako odbiornik.ale mysle ze bez preoblemu mozna zrobic nadajniki odbiornik w jednym procesorze.jak bedziesz mial jakies pytania to wtedy zajrze bo juz nie pamietam dokladnie jak to bylo zrealizowane.
    Załączniki:
    • ZegarTimer.zip (159.58 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #13 834942
    gummis
    Poziom 15  
    Posty: 162
    Pomógł: 4
    Ocena: 1
    teraz tak patrze na ten projekt to widze kilka rzeczy ktore bym pozmienial.przede wszystkim jak widac nie ma tam podzialu na ramki 8-bitow tylko idzie cale 5 bajtow czyli ramka transmisji ma 5*8=40bitow
    no ale to nie problem zmaist licznik bitow ladowac liczba 41 bo jeszcze bit stopu to mozna zaldowac liczba 9.druga spraw to musialbys dokladnie wyliczyc wartosc ladowana za pierwszy razem i za kolejnymi.
    wiadomo ze za pierwszym razem musisz odczekac czas 1,5 x czas na bit
    bo przerwanie jest generowane na poczatku bitu startua kolejne bity przeciez zczytywac tzreba w srodku.wszytsko jesat do przeliczenia.problem jednak pozostaje bo ciezko byloby zrobic nadajnik i odbiornik pracujacy niezaleznie.bo wiadomo ze jak odironik odbiera dane to przerwania by przerywaly dzilanie nadajnika co spowodowaloby przeklamania na odbiorniku.znowu wylaczyc przerwan tez sie nie da bo wtedy odbiornik by mogl przegapic dana.jedyny sposob to sprobowac w przerwaniach od timera 1 nie tylko odbiornik zrealizowac ale rownierz nadajnik.
  • #15 837472
    radek.kaba
    Poziom 15  
    Posty: 120
    Pomógł: 1
    speedy9 napisał:
    Ja mam kwarc 11,0592 MHz, żeby mi sprzętowy UART ładnie chodził :) Przeliczyłoby się. Jakbyś zamieścił taki sprawdzony programik, to byłbym wdzięczny.

    a może coś made by ATMEL?
    Załączniki:
    • drugi_serial.pdf (57.83 KB) Musisz być zalogowany, aby pobrać ten załącznik.

Podsumowanie tematu

LABEL_AI_GENERATED
Dyskusja dotyczy projektu konwersji prędkości transmisji RS232 między dwoma urządzeniami o stałych, różnych prędkościach 1200 i 9600 bps, przy użyciu mikrokontrolera 89C2051 z jednym UART-em oraz multipleksera CMOS 4052 do przełączania linii UART. Propozycja zakłada, że 89C2051 odbiera dane z wolniejszego urządzenia i wysyła je z inną prędkością do szybszego, sterując przełącznikiem 4052 i wykorzystując linie kontrolne RTS, CTS, DTR do synchronizacji i zapobiegania utracie danych podczas przełączania. Wskazano, że 4052 umożliwia transmisję dwukierunkową, co jest istotne dla tego rozwiązania. Alternatywnie sugerowano użycie mikrokontrolerów AVR (np. AT90S2313) z dwoma UART-ami, co uprościłoby implementację, ale wiązałoby się z wyższymi kosztami i koniecznością nauki nowej platformy. Rozważano także realizację programowego UART-a dla wolniejszej prędkości, wykorzystując przerwania i timer, co jest technicznie wykonalne przy odpowiednim taktowaniu (np. 12 MHz lub 11,0592 MHz), lecz wymaga precyzyjnego zarządzania przerwaniami i synchronizacją, a także może być trudne do zrealizowania na 89C2051. Ostatecznie autor skłania się do pierwotnego rozwiązania z 89C2051 i 4052, uznając je za mniej problematyczne. W dyskusji pojawiły się także uwagi dotyczące konieczności dokładnego wyliczenia czasów bitów i obsługi protokołu semi full-duplex z buforowaniem danych.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA