Nie mam UART na moim mikrokontrolerze, więc jak mogę go dodać?

13

Korzystam z mikrokontrolera ATMEGA32HVB, który ma funkcję równoważenia komórek, dzięki której możemy podłączyć 4 baterie szeregowo i używać jednej na raz. Jest to bardzo przydatne do zarządzania energią, więc nie mogę użyć innego mikrokontrolera. Proszę zasugerować kilka metod dodania do niego UART, aby móc łatwo łączyć się z urządzeniami szeregowymi.

użytkownik27475
źródło
11
Programowy sposób UART opisany przez użytkownika 26129 nazywa się bit- bitting .
Johan.A
4
Po prostu moje bardzo subiektywne 0,02 USD, ale zwykle wolałbym osobny dedykowany kontroler baterii i UART zintegrowany z UC zamiast na odwrót. Dlaczego potrzebujesz zarządzania baterią zintegrowanego z komputerem?
Mels
Muszę użyć akumulatorów, które będą ładowane za pomocą panelu słonecznego, więc potrzebuję 4 akumulatorów szeregowych, które będą używane pojedynczo
27475,
4
Jedno pytanie dotyczy tego, ile chcesz korzystać z UART i w jakich kierunkach. Jeśli chcesz generować tylko sporadyczne komunikaty o debugowaniu lub statusie, w czasie, gdy twój procesor nie jest obciążony dodatkowymi wymaganiami, szeregowe wyjście bitowe może wyglądać bardzo atrakcyjnie. Istnieją tiki, takie jak stosowanie przerwań zmiany pinów, które mogą zmniejszyć średnie obciążenie posiadania kanału wejściowego, ale jeśli spodziewasz się odbierać znaki z dużą szybkością transmisji w czasie, gdy masz inne zobowiązania w czasie rzeczywistym, może to być problem.
Chris Stratton,

Odpowiedzi:

17

Jak zauważyli inni, możesz albo dodać dodatkowy sprzęt do swojego systemu, aby zapewnić funkcjonalność UART, albo emulować go w oprogramowaniu. Jeśli masz kontrolę nad ogólnym projektem sprzętu i dodanie innego układu scalonego jest opcją, zdecydowanie rozważę podejście sprzętowe. Z pewnością możesz sprawić, by oprogramowanie UART działało przy użyciu bit-bangingu , ale możesz nie chcieć poświęcać zasobów procesora na generowanie wymaganego czasu.

Na pierwszy rzut oka widać, że twój mikrokontroler ma zarówno SPI, jak i I2C (które Atmel nazywa interfejsem dwuprzewodowym (TWI)). Prawdopodobnie byłyby to najlepsze interfejsy do podłączenia zewnętrznego UART. Wymienione urządzenia są dostępne od wielu producentów. Kilka przykładów:

  • Exar ( http://www.exar.com/connectivity/uart-and-bridging-solutions/i2c-spi-uarts ) ma do dyspozycji linię 1- i 2-kanałowych urządzeń UART SPI / I2C, obejmujących ~ 1.6- Zakres pracy 3,3 V. Nie korzystałem z żadnej z tych części, ale w przeszłości korzystałem z urządzeń Exar (z równoległymi interfejsami magistrali pamięci) i działały one dobrze.

  • NXP ( http://ics.nxp.com/products/bridges/i2c.spi.slave.uart.irda.gpio/ ) ma dostępną linię urządzeń SPI / I2C UART / IrDA / GPIO, również w wersjach 1 i 2 - odmiany kanałów w kilku zakresach napięcia. W przeszłości z dużym powodzeniem korzystałem z tych części (szczególnie z SC16IS762).

  • Maxim ( http://www.maximintegrated.com/datasheet/index.mvp/id/2052 ) ma urządzenia MAX3110E i MAX3111E, które są urządzeniami UART podłączonymi do SPI. Jedną z unikalnych cech tych urządzeń jest to, że mają zintegrowany sterownik linii RS-232. Tak więc, jeśli potrzebujesz, aby Twój UART łączył się z urządzeniem, które wykorzystuje napięcia liniowe RS-232 zamiast poziomów logicznych (np. Komputer), może to być przydatne, ponieważ pozwoli ci to uniknąć dodania kolejnego układu scalonego sterownika linii do twojej płyty.

Jason R.
źródło
Wow, nigdy nie wiedziałem, że Maxim miał te przedmioty, dałbym +2, gdybym mógł.
Tevo D
8

Musisz użyć sterownika programowego UART. W zależności od dokładnie tego, czego oczekujesz od tego UART, możesz użyć AVR305 (wyjątkowo kompaktowy, ale nie ma żadnych funkcji poza blokowaniem wysyłania / odbierania w trybie półdupleksowym), AVR274 (sterowany przerwań, dość kompletny), możesz napisać własne oprogramowanie sterownika UART lub możesz użyć tego, który znajdziesz w Internecie, na przykład, przeglądając „avr software uart”

użytkownik36129
źródło
3

Krótka uwaga na temat projektowania oprogramowania „UART”: istnieją przynajmniej jakościowo różne podejścia, w zależności od wymagań:

  • Sterownik bit-bang „przejmuj wszystko” wyłączy wszystkie przerwania i użyje kodu zliczanego do cyklu, aby taktować każdy bit. Odbieranie danych za pomocą sterownika „przejmuj wszystko” wymaga, aby po otrzymaniu danych sterownik robił tylko na nie czekając.

  • Sterownik bit-bang „przejmujący główną pętlę” będzie zachowywał się podobnie jak powyżej, z tym wyjątkiem, że użyje zasobu timera dla taktowania bitów, a nie zliczania cykli. Przerwania, których obsługa nie trwa zbyt długo, mogą pozostać włączone. W przypadku transmisji szeregowej zasób timera o stałej szybkości może być współdzielony z innymi celami; jednak w przypadku odbioru szeregowego sterownik bit-bang będzie musiał ponownie załadować zegar, gdy nadejdzie bit startowy, tak aby wygasł w połowie każdego nadchodzącego czasu.

  • W pełni sterowany przerywnikiem sterownik bit-bang używa timera o stałej szybkości, który działa z pewną wielokrotnością szybkości transmisji danych (najlepiej 3x i 5x są lepsze niż 4x) i robi wszystko przez ten zegar. Taki sterownik może działać jednocześnie ze wszystkim innym, ale będzie wymagał szybszego procesora niż poprzednie typy sterowników.

Aby uniknąć sytuacji, w której pierwsze dwa style kontrolera będą wiecznie czekać na dane, które mogą nigdy nie nadejść, często procedury odczytu zawierają wartość limitu czasu. Zauważ, że jeśli pętla kontrolera np. „Pobiera bajt, czekając na niego do 100 ms, zrób inne rzeczy, jeśli nie przyszedł, a następnie pobierz następny bajt itp.” i pojawia się bajt między czasem, w którym procedura „get” kończy się, a kontroler zaczyna ponownie czekać, ten bajt zostanie utracony; urządzenie, z którym się komunikuje, będzie musiało oczekiwać takiej możliwości.

Tylko trzeci styl sterownika będzie w stanie poradzić sobie z możliwością nadejścia bajtu danych podczas przesyłania bajtu danych. Dwa pierwsze style można jednak zastosować w przypadku niektórych protokołów komunikacyjnych pełnego dupleksu, jeżeli kontroler musi mówić tylko wtedy, gdy się do niego mówi. Sztuczka polega na tym, aby mieć procedurę „odczytu i zapisu danych”, która będzie czekać na nadchodzący bit startowy, a gdy zostanie wykryty, nakłada się na odczyt i zapis w taki sposób, że kontroler wysyła każdy bit tak, jak ma zamiar zbadać przychodzące dane. Gdy kontroler wykryje nadchodzący bit startowy, będzie wiedział dokładnie, kiedy będzie szukał kolejnych 8 bitów danych i bitów stopu, i tym samym będzie wiedział, że może bezpiecznie wykorzystać czas pomiędzy wysłaniem własnych danych.

Jedna uwaga na temat podziału: kontroler, który do odbierania danych używa jednego z dwóch pierwszych stylów bit-bang uart, musi przetworzyć każdy bajt danych przed opadającym zboczem bitu początkowego następnego bajtu, aby uniknąć utraty danych. Jeśli kontroler wie, że przetwarzanie zajmie co najmniej pół bita, może zmaksymalizować czas dostępny do przetwarzania, akceptując każdy bajt, gdy tylko pobierze ostatni bit danych, zamiast czekać na bit stopu. Jednak jako dodatkowy sposób na zapewnienie kontrolerowi więcej czasu, może być pomocne, aby urządzenie, które daje mu transmisję danych, miało dwa bity stopu zamiast jednego. Jeśli można skonfigurować „oznaczenie parzystości”, spowoduje to dodanie dodatkowego dodatkowego czasu. Transmisja np. 115200-8-M-2 pozwoli na dłuższy czas przetwarzania niż 57600-8-N-1, nawet jeśli dane będą przesyłane ponad 1,6 razy szybciej.

supercat
źródło
1

Możesz po prostu użyć styku we / wy komputera. Jedyną rzeczą przy przełączaniu lub przesyłaniu danych na tych pinach powinna być częstotliwość pinów podwójna do prędkości transmisji. W ten sposób normalnie działa UART, próbkuje sygnał bitowy na środku.

nitin
źródło