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

Jak zrealizować 2 UART-y w urządzeniu z AT89Cxx i RS232C?

h-doc 19 Wrz 2003 16:33 4695 32
Najlepsze odpowiedzi LABEL_AI_GENERATED

Jak zrealizować dwa niezależne interfejsy UART/RS232 w urządzeniu opartym o AT89Cxx, gdy oba łącza muszą działać prawie jednocześnie?

Najpraktyczniej zrobić drugi UART na osobnym AT89C2051/AT89Cxx i połączyć go z głównym mikrokontrolerem prostym, własnym protokołem — taką opcję wybrano w wątku jako najszybszą i najprostszą przy równoległej obsłudze hosta i urządzenia [#334675][#334771] Programowy UART jest wykonalny, ale przy dodatkowych zadaniach sterownika może zbyt mocno obciążać procesor; przy 300 bodach autor uznał go za nie do przyjęcia [#341015] Zewnętrzny układ typu MAX3100 też był rozważany, ale wymaga SPI i dochodzi kolejny protokół do implementacji [#334025] Przełączanie jednego sprzętowego UART-a przez CD4066 ma sens tylko wtedy, gdy oba połączenia nie muszą działać jednocześnie [#331903][#331904]
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA
  • #1 331876
    h-doc
    Poziom 27  
    Posty: 1208
    Pomógł: 57
    Ocena: 21
    Problem polega na tym, że musze zrobić sterownik urządzenia komunikującego się przy pomocy RS232C. Dodatkowo sterownik ten jest kontrolowany przez komputer również przez RS232C. Sterownik musi być oparty o atmelowski AT89Cxx. Niestety nie mogę nigdzie dostać Atmeli z dwoma UART-ami.

    Oto kilka pomysłów na rozwiązanie tego problemu, o których recenczję proszę:
    1. skorzystać z wbudowanego w Atmela UART i w jakiś sposób komutowć linie sygnałowe pomiędzy sterowane urządzenie a komputer (pytanie - jak to zrobić?)
    2. drugi UART zrobić software'owo (eh, nie chce mi się tego programować...)
    3. drugi UART zrobić przy pomocy zewnętrznego specjalizowanego układu (82C51 - ale on kosztuje 14,90 netto!)
    4. drugi UART zrobić przy pomocy drugiego Atmela lub PIC-a (AVR i inne nie wchodzą w grę) i dorobić prosty protokół komunikacyjny z głównym mikrokontrolerem (w tej chwili skłaniam się właśnie w stronę tego rozwiązania)

    czekam na Wasze opinie
  • REKLAMA
  • #2 331903
    Marek81
    Poziom 19  
    Posty: 367
    Pomógł: 6
    Ocena: 8
    Skłaniałbym się do opcji nr. 1. Stosowny układ przełączający możesz zrobić np. na CD4066 i sterować go z nóżki procesora. W ten sposób procesor będzie "wiedział" z kim "gada". :)

    Pozdrawiam.
  • #3 331904
    Maciej256
    Poziom 14  
    Posty: 128
    Pomógł: 2
    Ocena: 13
    Witaj. czy oba uarty mają być wykorzystywane w tym samym czasie? jak nie to można zrobić przełącznik sygnału który będzie przełączał pojedyńczy uart do pc oraz do tego urządzenia.
  • #4 332068
    h-doc
    Poziom 27  
    Posty: 1208
    Pomógł: 57
    Ocena: 21
    Właśnie oba uarty muszą chodzić z grubsza w tym samym czasie - sterownik cały czas musi nasłuchiwać hosta i urządzenia. Komendy powienien realizować w miarę szybko i szybko wysyłać odpowiedzi do hosta, bo aplikacja wymaga dosyć szybkich reakcji. Również obsługiwane urządzenie nie może zbyt długo czekać na obsługę. Plusem jest przynajmniej to, że nie muszę przepychać wielkich ilości danych (po kilkanaście bajtów). Dodatkowo sterownik robi jeszcze kilka innych rzeczy, które są dosyć krytyczne czasowo.
  • #5 332177
    elektryk
    Poziom 42  
    Posty: 11029
    Pomógł: 439
    Ocena: 241
    Ja bymbył za rozwiązeniem 2 lub 4, przy czym 2 jeśli Ci zależy na cenie i na mniejszych rozmiarach a 4 jeśli Ci zalezy na stosunkowo prostym programie.
  • #6 332416
    h-doc
    Poziom 27  
    Posty: 1208
    Pomógł: 57
    Ocena: 21
    no właśnie chyba zastosuję rozwiązanie 4, ponieważ sprzętowa obsługa RS zaowocuje faktycznym uproszczeniem kodu. Poza tym sterownik na pewno nie zgubi żadnego nadchodzącego bitu a przy znacznym napływie danych będzie je można łatwo kolejkować.

    Dzięki za propozycje!
  • REKLAMA
  • #7 332563
    Tdv
    Poziom 34  
    Posty: 2237
    Pomógł: 150
    Ocena: 55
    A ja proponuje inne rozwiązanie:
    ATmega162, ATmega64 lub ATmega128 - wszystkie trzy mają wbudowane po dwa UARTY - to chyba będzie najprostsze...
    AVR'y to też Atmele...
  • #8 332716
    h-doc
    Poziom 27  
    Posty: 1208
    Pomógł: 57
    Ocena: 21
    ok - też o tym myślałem. Ale niestety mam za mało czasu. '51 mam zgrubsza opanowane, mam do tego programator, środowisko itd. AVR nie znam. Ale jeśli przy moim następnym projekcie będę miał trochę więcej czasu, to na pewno sięgnę po AVR.
  • #9 333895
    tadzioor
    Poziom 15  
    Posty: 132
    Pomógł: 1
    Ocena: 4
    Miałem kiedyś podobny problem, rozwiązałem go robiąc drugi UART programowo (to taki polski odpowiednik słowa "software'owo" :) ). Nie jest to nawet takie bardzo skomplikowane, tylko, że dużych prędkości nie wyciśniesz (mój chodził na 2400kbps, a sprzętowy 19200kbps).
    Natomiast jeżeli chcesz zastosować oddzielną kość, to ostatnio natknąłem się na fajną kość Maxima: MAX3100 ( http://www.maxim-ic.com/quick_view2.cfm?qv_pk=1731&ln= )
  • #10 334025
    h-doc
    Poziom 27  
    Posty: 1208
    Pomógł: 57
    Ocena: 21
    hmmm... niezły ten MAX, ale komunikuję się po SPI, czyli kolejny protokół do zaimplementowanie. Poza tym nie ma tego układu u dystrybutora, u którego się zaopatruję...
  • #11 334031
    Nemo
    Poziom 31  
    Posty: 2078
    Pomógł: 9
    Ocena: 72
    Zapomnij o zabawach z innymi układami. Użyj drugiego At89C2051 tak jak radzi elektryk. Sam sobie wymyślisz protokół transmisji i będziesz miał taniej i prościej.
    Pozdrawiam.
  • #12 334040
    sLoTeRRR
    Poziom 13  
    Posty: 91
    Pomógł: 3
    Ocena: 1
    Free sample i programowa implementacja SPI-jest banalna

    Z tymi freesamplami z maxima mam pozytywną przeszłość oprócz tych wypaśnych mikrokontrolerów z TCP i CAN'em.

    pozdrowionka :-)
  • #13 334127
    tadzioor
    Poziom 15  
    Posty: 132
    Pomógł: 1
    Ocena: 4
    A z jaką prędkością ma działać ten drugi UART ?. Jeżeli nie większą niż 4800bps oraz nadawanie i odbiór nie odbywają się jednocześnie, to ja zrobił bym go na twoim miejscu programowo.
  • #14 334554
    h-doc
    Poziom 27  
    Posty: 1208
    Pomógł: 57
    Ocena: 21
    już odpowiadam:
    - darmowe próbki nie wchodzą w grę, bo muszę tego zrobić kilkadziesiąt sztuk
    - jeszcze nie wiem z jaką prędkością będzie chodzić ten drugi UART (bo nie dostałem jeszcze specyfikacji) ale będzie to raczej jeden z wolniejszych trybów
  • REKLAMA
  • #15 334675
    Tdv
    Poziom 34  
    Posty: 2237
    Pomógł: 150
    Ocena: 55
    W takim układzie ja bym jednak polecał rozwiązanie z dodatkowym uC np. Będzie szybciej i znacznie prościej bo programowy UART to wcale nie taka prosta rzecz, szczeglnie jezeli procesor masporo zajęć.
  • #16 334771
    h-doc
    Poziom 27  
    Posty: 1208
    Pomógł: 57
    Ocena: 21
    ok - dzięki wszystkim - decyzja podjęta. Dodatkowy UART będzie na drugej "pięćdziesiątcejedynce"
  • #17 338771
    rav.k
    Poziom 14  
    Posty: 109
    Pomógł: 1
    Ocena: 1
    Też mimo wszystko,że już po fakcie skłaniałbym się do programowego rozwiązania jeżeli już nie chcesz zmieniać na uP z dwoma UART. Programowa realizacja wcale nie jest taka straszna. Z drugiej strony dwa układy pozwolą Ci na szybsze prędkości i większą uniwersalność.
  • #18 339275
    Eagle
    Poziom 24  
    Posty: 536
    Pomógł: 57
    Ocena: 31
    Wiem że temat już zamknięty ;( ,

    Ale idąc za wszym rozyślaniem to proponuję tak kupic najbogatszy '51 lub AVR a następnie gdy będzie potrzebny przetwornik A/D, to połaczyc zewnętrzny sprzętowy albo drugi taki sam uC z A/D, dodatkowo jeśli byśmy chcieli wysłac to RS to układ który zajmuje się konwersja A/D nie powinien tego robić weźmy kolejny. Jeszcze chciał bym zapalić diodkę to kolejny procek który będzie zajmował się tylko diodka. A jeszcze jak bym chciał posterowac buzerem to kolejny procek a co mi tam.

    O.K. dosyc tej ironi a teraz na serio. Żyjemy w czasach kapitalizmu, gdzie najważniejszy jest pieniądz !. Więc jeśli zrobisz jeden projekt to gance gal bo koszty twojej prcy ( umysłowej przy pisaniu softu ) i dodatkowego układu będą podobne. Jeśli zrobisz natomiast 100 Twoich układów do jesteś dużo do tyłu z kasą bo do każdego układu muszisz dodać sprzetowy drugi
    UART. Tym bardziej że jest to wykonalne -> 2 RS lecz jeśli podchodzisz do tego w en sposób -> "eh, nie chce mi się tego programować...) " to zapewnim Cię, że są osoby które zgarną kasę którą miał by zgarnąc pośrednik i producent sprzętowych UART'ów.

    Pozdrawiam wszystkich leniuchów, Eagle


    Hasło dnia :)

    Złej baletnicy, przeszkadza rąbek u spódnicy.
  • #19 339279
    Tdv
    Poziom 34  
    Posty: 2237
    Pomógł: 150
    Ocena: 55
    rav.k: przeczytałem dzisiaj kilka Twoich postów i się zastanawiam po co w ogóle coś piszesz. Pomijając fakt, że w tym poście nic nowego nie wniosłeś (w innych, które czytałem też nie) to może wykaż się swoją wiedzą i zapodaj tutaj tę softową implementację UART'a. Dobrze by było jakbyś podał też statystyki czasu potrzebnego uC do obsługi tych procedur (w zależności od szybkości transmisji) i oszacował przy jakim błędzie częstotliwości Twój S(oft)UART będzie nadal pracował prawidłowo.
    Żeby nie było niedomówień: da się to zrobić ale może rav.k w końcu się wykażesz swoją wiedzą, a nie tylko propagandowymi hasłami.
    Nie zapmnij podać dla jakiej częstotliwości kwarcu robisz.
  • #20 339474
    h-doc
    Poziom 27  
    Posty: 1208
    Pomógł: 57
    Ocena: 21
    Eagle - zgadzam się z Tobą. Przy wielkoseryjnej produkcji na pewno nie mógłbym sobie pozwolić na 2 mikrokontrolery. Sytuacja jednak nie jest taka straszna, bo docelowo ma być kilkadziesiąt sztuk. Mój zleceniodawca ma poza tym trochę inne priorytety - ważniejszy jest dla niego czas realizacji całego projektu, niż końcowe koszty wyprodukowania płytki (zwłaszcza, że stanowią one niewielki procent kosztów produkcji całego urządzenia, w którym będzie pracować mój sterownik). Rozwiązanie prostsze (czyli 2 mikrokontrolery) jest szybsze a zatem korzystniejsze dla mojego zleceniodawcy (no i dla mnie też)

    pozdrawiam!
  • #21 340930
    rav.k
    Poziom 14  
    Posty: 109
    Pomógł: 1
    Ocena: 1
    Szanowny Tdv Twoje wszechwiedza chyba Ci troszkę z kultury ujmuje. Nie życzę sobię żadnych inwektyw i kalumni z Twojej strony ponieważ nic nie mam do Ciebie więc i Ty pilnuj swego nosa a jak Ci nie pasuje to nie czytaj moich postów.
    Wracając to tematu kiedyś planowałem programową transmisję i ją zrobiłem i sprawdziłem załącznik PROGR.C
    Potem przesiadłem się na 517A i od tej pory korzystam z innych procedur które napisałem i dołączam tylko je do swoich projektów gdzy chce komunikacji szeregowej w rs232 lub 485. Pliki szer0.c szer1.c. Przykro mi że nie jestem kompatybilny do większości ponieważ widzę że używacie tu raczej ASSEMBLERA lub BASCOMa a ja piszę w ANSI C. Kwarc to 12MHz w komunikacji sprzętowej gdy robiłem programową to chyba miałem układ z kwarcem 11.059MHz. Dokładność programowej realizacji komunikacji jest bardzo duża wystarczy że dasz najwyższy priorytet od timera taktującego dla potrzeb komunikacji a wszystkie inne dasz na niższe priorytety. Są to pliki wyrwane z moich projektów bo nie mam zamiaru specjalnie dla Ciebie pisać programów prezentacyjnych, ale jeżeli masz zielone pojęcie o programowaniu to napewno zrozumiesz ideę działania komunikacji sprzętowej i programowej którą zastosowałem.
    Pozdrawiam.
    Załączniki:
    • szer1.C (3.97 KB) Musisz być zalogowany, aby pobrać ten załącznik.
    • szer0.c (3.65 KB) Musisz być zalogowany, aby pobrać ten załącznik.
    • PROGR.C (3.75 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #22 341015
    h-doc
    Poziom 27  
    Posty: 1208
    Pomógł: 57
    Ocena: 21
    hmmm - dzięki za listingi. Ja również preferuję C. Przyjrzałem się bliżej realizacji programowej i u mnie byłaby raczej nie do przyjęcia, ponieważ za bardzo absorbuje czas procesora. Ja muszę się komunikować z prędkością 300 bodów, co dawałoby dosyć spore zastoje w pracy mikrokontrolera, przy przesyłaniu kilku bajtów.
  • #23 341303
    rav.k
    Poziom 14  
    Posty: 109
    Pomógł: 1
    Ocena: 1
    dlatego uważam że należy przede wszystkim wykorzystywać to co oferuje procesor czyli sprzętowa realizacja komunikacji. Programowa jest fajna jeżeli procek nie ma nic innego do roboty oprócz odmierzania czasów na potrzeby RS. Sprawdzałeś sprzętową h-doc - u mnie sprawdza się 100% (zależy oczywiście w czym pracujesz), co do programowej realizacji nie ma alternatytwy tak musi być. Cieszę się, że nie jestem osamotniony w swoim ANSI C.
  • REKLAMA
  • #24 341842
    h-doc
    Poziom 27  
    Posty: 1208
    Pomógł: 57
    Ocena: 21
    rav.k - jeszcze nie robiłem oprogramowania - na razie kończę schemat i zaczynam projekt PCB. Oprogramowanie będę robić na końcu, jak już będzie gotowa płytka.

    pozdrawiam!
  • #25 342731
    Tdv
    Poziom 34  
    Posty: 2237
    Pomógł: 150
    Ocena: 55
    rav.k: Trzebabyło zaraz coś mądrego napisać to bym się nie czepiał. Zresztą sam przejrzyj swoje posty z poprzedniego tygodnia i pokaż mi, który z nich wnosił coś NOWEGO do sparwy?
    Przejrzałem pobierzenie szer1.c i nie mam większych zastrzeżeń.
    Co do mojej wszechwiedzy - to nie uważam żebym taką posiadał, a wręcz przeciwnie, uważam że się muszę jeszcze sporo nauczyć (i zawsze będzie coś, czego się trzeba będzie uczyć). Co do C, BASCOMa i asm to przejrzyj moje posty - jestem chyba największym na elektorda.pl propagatorem tego języka dla uC (chidzi mi o C), choć faktycznie masz rację, że większość preferuje BASCOM'a, a całkiem sporo asm.
  • #26 342865
    rav.k
    Poziom 14  
    Posty: 109
    Pomógł: 1
    Ocena: 1
    Tdv - dodatkową przeszkodą w podawaniu przeze mnie gotowych przykładów jest to że od dawien dawna programuję 517A a większość używa 51 niby to samo a jednak znaczna różnica. Co sądzisz na temat programowego rozwiązania transmisji, na prawdę działało.
  • #27 342876
    Tdv
    Poziom 34  
    Posty: 2237
    Pomógł: 150
    Ocena: 55
    Napisałem już, że tylko pobieżnie przejrzałem plik szer1.c, a trzeba by sie przyjrzeć dokladniej. Podstawowe zastrzeżenie jakie się nasu(ó)wa od razu to czasochłonność tego UART'a. Procesor praktycznie nic inneg nie będzie w stane robić, tylko orać UART'a, szcególnie przy większych szybkościach transmisji.
    No ale to niestety wada S(oft)UARTA...
  • #28 342980
    tadzioor
    Poziom 15  
    Posty: 132
    Pomógł: 1
    Ocena: 4
    Krążą tu jakieś mity o czasochłonności porgramowego UART. Procedura, którą kiedyś napisałem przy transmisji 2400bps i kwarcu 18,432MHz zajmowała procesorowi niecałe 10% czasu, czyli przy transmisji 300bps, jak chce h-doc, obciążenie procesora wyniosło by około 1,25%. Procedura wykorzystuje timera2 i jest napisana w asm.
  • #29 342989
    Tdv
    Poziom 34  
    Posty: 2237
    Pomógł: 150
    Ocena: 55
    tadzioor: tak z ciekawości, napisz jeszcze jaki to był procek to raz, a dwa to nie zawsze stać nas na te 10% czasu uC bo to sporo... Zresztą wkładanie kwarców 18,xxxxMHz też nie zawsze jest najlepszym rozwiązaniem bo z takim speedem toprocek będzie niezły prądzik pobierał.
    Może zapodasz tę procedurkę?
    PS. procedura rav.k zajmuje bardzo dużo czasu bo jest rozbudowana o komunikaty o błędach itp., jakby ją z tego ogołocić, to też wyjdzie trochę bardziej ekonomiczna wersja.
  • #30 343015
    tadzioor
    Poziom 15  
    Posty: 132
    Pomógł: 1
    Ocena: 4
    Procesor jak w temacie (dokładniej AT89S53). Co do wartości kwarcu, poboru prądu, szybkości itp. to wszystko zależy od konkretnej aplikacji i nie ma co tu spekulować.
    Jak znajdę trochę więcej czasu to postaram się zamieścić tą procedurę. Muszę ją najpierw trochę zmodyfikować bo wyrwana z programu nie nagaje się do publikacji, zresztą nie pozwalają mi na to przepisy firmy w której pracuje.

Podsumowanie tematu

LABEL_AI_GENERATED
Temat dotyczy realizacji dwóch interfejsów UART w urządzeniu opartego na mikrokontrolerze Atmel AT89Cxx z komunikacją RS232C, gdzie jeden UART służy do sterowania urządzeniem, a drugi do komunikacji z komputerem. Problemem jest brak mikrokontrolera z dwoma sprzętowymi UART-ami w rodzinie AT89Cxx. Rozważano cztery główne rozwiązania: przełączanie linii sygnałowych za pomocą układu CD4066, implementację drugiego UART-a programowo, zastosowanie zewnętrznego układu specjalizowanego (np. 82C51 lub MAX3100), oraz użycie drugiego mikrokontrolera (AT89C2051) do obsługi drugiego UART-a z własnym protokołem komunikacyjnym.

W dyskusji podkreślono, że oba UART-y muszą działać równocześnie, co wyklucza proste przełączanie linii. Programowa implementacja UART jest możliwa, ale obciąża procesor i może być problematyczna przy krytycznych czasowo zadaniach, choć przy niskich prędkościach (np. 300 bps) obciążenie jest niewielkie. Zastosowanie drugiego mikrokontrolera jest rozwiązaniem prostszym programowo i bardziej niezawodnym, choć zwiększa koszty i złożoność sprzętową. Alternatywnie zasugerowano użycie mikrokontrolerów AVR (np. ATmega162, ATmega64, ATmega128) z wbudowanymi dwoma UART-ami, jednak wymaga to nauki nowej platformy i zmiany środowiska.

Ostatecznie autor zdecydował się na rozwiązanie z dwoma mikrokontrolerami AT89C2051, ze względu na szybszy czas realizacji projektu i prostotę oprogramowania, mimo wyższych kosztów produkcji. W dyskusji pojawiły się także uwagi dotyczące implementacji programowego UART-a w asemblerze i C, wykorzystania timerów do obsługi transmisji oraz wpływu częstotliwości kwarcu na dokładność i obciążenie procesora. Projekt ostatecznie został anulowany, ale problem pozostaje aktualny dla podobnych zastosowań.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA