Skocz do zawartości

Software'owy UART


Pomocna odpowiedź

Napisano

Witam,
Potrzebuje napisać transmisje UART, lecz nie wykorzystując portów RxD i TxD atmegi. Chciałbym to zrobić na dowolnym innym pinie poprostu zmienijąc jego stan (TxD) lub odczytując stan pin (RxD). Wszystkie znalezione przez mnie kody są robione na rejestrach UART'a, czy da się jakoś prostu zrobić to bez korzystania z nich?

Chciałbym również nie korzystać z timerów tylko wyłącznie z opóźnień czasowych _delay_ms();

Bardzo proszę o pomoc.

Moim zdaniem jest to niemożliwe przy warunku wykorzystania delay'ów, ponieważ oczekując jakiś czas przy na przykład wysyłaniu blokujesz sobie całą pracę uC (w tym odbieranie). Więc delay moim zdaniem przekreśla software'owy UART, jeśli chodzi o równoczesne nadawanie i odbieranie.

Jeśli jednak naprawdę chcesz to zrobić, to nie powinno być takie trudne, chyba, że coś przeoczyłem. Co prawda będzie to totalnie nieefektywne, ale skoro się upierasz... Otwierasz jakąś specyfikację transmisji UART i do dzieła. Na przykład tutaj są ładne obrazki 🙂

TUTAJ!

Podstawowe pytanie - po co potrzebujesz to zrobić w ten sposób?

W teorii jest to możliwe, ale bez analizatora stanów logicznych lub oscyloskopu nie podejmowałbym się takiej zabawy, bo można życie stracić.

Inna kwestia, że jeżeli cokolwiek innego (trochę czasochłonnego) dzieje się w tle to jest to od razu skazane na niepowodzenie.

Szkoda że kolega nie napisał jaka ATMega, bo są wersje ATMegi z 2 USARTAmi sprzętowymi, wiec może się okazać że wystarczy podmienić chip i po sprawie. USI bodaj też umie symulować USART ?

Programowo na upartego też wykonalne, tylko wymaga znania zaawansowanych metod programowania, ogólnie musi to działać w jakiś przerwaniach Timera, w czasie rzeczywistym. To właściwie eliminuje problem co tam się dzieje obok, bo taki USART działa w przerwaniach, niezależnie od wątku głównego. Przy czym wtedy ciężko będzie przeskoczyć szybkość 19200b/s, ale to zależy jak bardzo zajęty system będzie innymi rzeczami.

Wykonalne jest to na pewno, bo widziałem kiedyś bibliotekę umożliwiającą programową obsługę UART'a pod Arduino. Jak dobrze poszukać pod C też pewnie coś się znajdzie.

Pod arduino masz biblioteke NewSoftSerial, ale pewnie ktoś zrobił port pod zwykle c-avr. Sama biblioteka działa bez zarzutów - testowałem wielokrotnie:) jedyne z czym jest problem to z przerwami, tzn nie można ich używać - ale to dość oczywiste, bo inaczej się posypie timing.

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...