Skocz do zawartości

[Programowanie] Port szeregowy i interfejs USART - część II


Pomocna odpowiedź

Napisano

Poprzednia część praktycznie w całości została poświęcona tworzeniu programu od strony komputera. Teraz przyszła pora zająć się mikrokontrolerem. W tej części dokonałem przeglądu prostych technik programistycznych związanych z pisaniem programu na AVRa. W planach było również coś bardziej zaawansowanego. Niestety nie miałem ostatnio za dużo czasu.

UWAGA, to tylko wstęp! Dalsza część artykułu dostępna jest na blogu.

Przeczytaj całość »

Poniżej znajdują się komentarze powiązane z tym wpisem.

t_usbrs_902.jpg.a8fb6ffae5a0d16ba508de1a851474d1.jpg

  • Lubię! 2
  • 3 miesiące później...

Mam takie pytanie odnośnie komunikacji przedstawionej w artykułach. W jaki sposób w trakcie działania programu na uC zmienić prędkość transmisji - Baud Rate?

Załóżmy, że chcąc połączyć się z PC z BR 115200:

1. Łączę się najpierw z uC z BR 19200.

2. Wysyłam komunikat o zmianie BR.

3. uC konfiguruje UART.

4. PC się rozłącza i ponownie łączy z BR 115200.

Problemem jest punkt 3. Próbowałem wykonać zmianę prędkości na uC w taki sposób:

1. Wyłączenie przerwań po odebraniu komunikatu o zmianie BR.

2. Ustawienie rejestrów BR w UART.

3. Uruchomienie przerwań i inicjacja UART.

Niestety po ponownym połączeniu PC z prędkością BR 115200 przy transmisji uC się wiesza albo wpada gdzieś w pętlę.

Fajnie, że wreszcie ktoś napisał o wysyłaniu z zastosowaniem przerwań.

Ostatnio przygotowywałem taki przykład na instrukcję laboratoryjną.

Rozumiesz dokładnie różnicę między tymi dwoma przerwaniami przy nadawaniu (bufor pusty i ostatni znak czy jakoś tak)?

Pozdrawiam

Zuk

Tomek zmiana prędkości UART w locie powinna się odbywać właśnie według takiej procedury jaką podałeś. Być może błąd masz gdzieś w kodzie. Musisz pamiętać, że przy powtórnej inicjalizacji rejestry konfiguracyjne mają już jakieś wartości, więc dla bezpieczeństwa trzeba je najpierw wyzerować, albo użyć operacji = zamiast |= aby jedynki w rejestrze nie przekłamywały ustawienia.

Jeżeli chodzi o różnice między tymi dwoma przerwaniami to wiem na czym polega w teorii jednak podczas działania programu nieraz mi różne dziwne rzeczy wychodziły więc nie mam co do tego pewności. Generalnie rejestr wysyłający jest buforowany i może mieć jedną daną w trakcie wysyłania i drugą oczekującą. Przerwanie TX jest aktywowane kiedy dana się wyśle, natomiast UDRE kiedy dana z bufora zostanie wzięta do wysyłania. Jednak w praktyce miewałem z tym problemy. Generalnie do wysyłania ciągów danych lepiej wykorzystywać przerwanie UDRE. Można też dodawać warunek, żeby przerwanie się wyłączyło przy wysyłaniu ostatniej danej, a włączać je w funkcji inicjalizującej transfer.

Co do zawartych tutaj kodów źródłowych - mam już nowe ulepszone rozwiązania które stworzyłem przy okazji pisania inżynierki. Tak samo z realizacją po stronie komputera. Jak się ogarnę z dyplomem i rekrutacją na studia magisterskie to może rozwinę temat.

  • 4 tygodnie później...
Mam takie pytanie odnośnie komunikacji przedstawionej w artykułach. W jaki sposób w trakcie działania programu na uC zmienić prędkość transmisji - Baud Rate?

Załóżmy, że chcąc połączyć się z PC z BR 115200:

1. Łączę się najpierw z uC z BR 19200.

2. Wysyłam komunikat o zmianie BR.

3. uC konfiguruje UART.

4. PC się rozłącza i ponownie łączy z BR 115200.

Problemem jest punkt 3. Próbowałem wykonać zmianę prędkości na uC w taki sposób:

1. Wyłączenie przerwań po odebraniu komunikatu o zmianie BR.

2. Ustawienie rejestrów BR w UART.

3. Uruchomienie przerwań i inicjacja UART.

Niestety po ponownym połączeniu PC z prędkością BR 115200 przy transmisji uC się wiesza albo wpada gdzieś w pętlę.

Pamiętaj, że aby wpisać wartość do UBRRH musisz wyzerować bit URSEL w rejestrze UCSRC.

  • 9 miesiące później...

Zrealizowałem to w taki sposób że w obsłudze przerwania ISR(USART_RXC_vect) sprawdzam czy UDR == zmiana BR, case (zmiana BR) UBRRL = np.19200 i hula wzystko pięknie.

Na PC BaudRate wybieram przez comboBox i jeśli Index ComboBoxa się zmienia to wyyłana jest odp wartość do uC a obsługa tej wartości wygląda jw w przerwaniu.

  • 3 lat(a) później...

Witam serdecznie! Proszę o pomoc w zrozumieniu przykładu z buforem cyklicznym. Nie widzę w nim bowiem instrukcji, która zerowałaby zmienną bufor.początek po przekroczeniu rozmiaru bufora. Bufor.koniec jest zerowany w funkcji bufor_dopisz po osiągnięciu wartości ROZMIAR ale co, jeśli bufor.początek przekroczy tę wartość?

  • 5 miesiące później...
Tomek zmiana prędkości UART w locie powinna się odbywać właśnie według takiej procedury jaką podałeś. Być może błąd masz gdzieś w kodzie. Musisz pamiętać, że przy powtórnej inicjalizacji rejestry konfiguracyjne mają już jakieś wartości, więc dla bezpieczeństwa trzeba je najpierw wyzerować, albo użyć operacji = zamiast |= aby jedynki w rejestrze nie przekłamywały ustawienia.

Jeżeli chodzi o różnice między tymi dwoma przerwaniami to wiem na czym polega w teorii jednak podczas działania programu nieraz mi różne dziwne rzeczy wychodziły więc nie mam co do tego pewności. Generalnie rejestr wysyłający jest buforowany i może mieć jedną daną w trakcie wysyłania i drugą oczekującą. Przerwanie TX jest aktywowane kiedy dana się wyśle, natomiast UDRE kiedy dana z bufora zostanie wzięta do wysyłania. Jednak w praktyce miewałem z tym problemy. Generalnie do wysyłania ciągów danych lepiej wykorzystywać przerwanie UDRE. Można też dodawać warunek, żeby przerwanie się wyłączyło przy wysyłaniu ostatniej danej, a włączać je w funkcji inicjalizującej transfer.

Co do zawartych tutaj kodów źródłowych - mam już nowe ulepszone rozwiązania które stworzyłem przy okazji pisania inżynierki. Tak samo z realizacją po stronie komputera. Jak się ogarnę z dyplomem i rekrutacją na studia magisterskie to może rozwinę temat.

Przydałby się jakiś mini tutorial jak poprawnie zrobić komunikację AVR-PC, najlepiej dwustronną. Jak uporządkować dane w ramki, jak wyciągać z nich informację itp.

Jeśli miałbyś czas i chęci to byłoby mega przydatne 😉

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...