Skocz do zawartości

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


GAndaLF

Pomocna odpowiedź

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
Link do komentarza
Share on other sites

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

Link do komentarza
Share on other sites

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

Link do komentarza
Share on other sites

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.

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

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.

Link do komentarza
Share on other sites

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.

Link do komentarza
Share on other sites

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ść?

Link do komentarza
Share on other sites

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 😉

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Gość
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.