GAndaLF Napisano Wrzesień 30, 2011 Udostępnij Napisano Wrzesień 30, 2011 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. 2 Link do komentarza Share on other sites More sharing options...
tomekk_nt Styczeń 14, 2012 Udostępnij Styczeń 14, 2012 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 More sharing options...
Zuk Styczeń 15, 2012 Udostępnij Styczeń 15, 2012 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 More sharing options...
GAndaLF Styczeń 15, 2012 Autor tematu Udostępnij Styczeń 15, 2012 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 More sharing options...
Polecacz 101 Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Zarejestruj się lub zaloguj, aby ukryć tę reklamę. 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
davidpi Luty 11, 2012 Udostępnij Luty 11, 2012 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 More sharing options...
mikroice90 Listopad 29, 2012 Udostępnij Listopad 29, 2012 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 More sharing options...
Niejeden Grudzień 23, 2015 Udostępnij Grudzień 23, 2015 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 More sharing options...
paavo91 Maj 25, 2016 Udostępnij Maj 25, 2016 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 More sharing options...
Pomocna odpowiedź
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ę »