No to masz 4-bajtowy znacznik początku ramki, w dodatku niejednoznaczny, tylko po co? Przy automacie masz zmienną - stan automatu, którą elegancko robi się jaku enum, a dalej switch zapewniający obsługę kolejnego bajtu i przejścia pomiędzy stanami. Do obsługi tego początku, jaki masz, potrzebujesz czterech stanów automatu (piąty stan to odbiór danych)...
Brak wspólnej masy?
Kończę właśnie mojego Hexapoda. Rozbudowuje komunikację pomiędzy dwoma atmega16. Jeden to sterownik serw a drugi oblicza kinematykę i struje wyświetlaczem LCD. Otóż problem polega na tym że transmisja jest pełna błędów. Uśredniając to co 5-6 transmisja jest prawidłowa. Ustawienia USARTu: UBRRL=0x33; UBRRH=0; //ustawienie prędkości transmisji dla 9600...
Przestaw zegar na 8MHz. 7% błędów przy odczycie z 'obcego' urządzenia jest raczej nie do przyjęcia. Jeżeli komunikujesz się z urządzeniem które sam zbudowałeś, jesteś w stanie przewidzieć jakie dane otrzymasz, zastosujesz jakiś mechanizm sprawdzania poprawności otrzymanych danych, to te 7% nie jest jeszcze problemem. Ale w tym przypadku (zgaduję) jesteś...
Źle bo k to nie 1000 tylko 1024 115200 / 10 = 11520B/s 11520 / 1024 = 11.25kB/s Oczywiście zakładając brak jakichkolwiek odstępów miedzy bajtami - co w przypadku rozbieżności zegarów między nadawcą a odbiorcą spowoduje błędy transmisji.
Procedura "USART_Transmit" wykorzystuje sprzętowego USARTa ATmegi8. Działa ona w ten sposób, że najpierw sprawdza czy bufor w którym przechowywane są dane do transmisji jest pusty. Jeżeli nie jest pusty to czeka na jego wyczyszczenie, gdy stwierdza, że jest już pusty to wpisuje dana którą przekazujesz jako parametr do rejestru UDR, i transmisja odbywa...
Hejka Zobacz do pierwszego lepszego datasheet'a AVR-ów. W temacie USART, masz podane w zależności od zegara F_CPU prędkości komunikacji USART. Przy kwarcu 1.8xxMHz, duże prędkości transmisji wykazują duże błędy. Spóźniłem się, hihi
To znaczy że masz gdzieś indziej błąd. u mnie ta prędkość to od 230400 do 230400 * 5 Na każdej działa. HSE oczywiście. Dodano po 2 bo w DS piszą 10.5Mbps ale wiem, że to są bajki. Dlaczego tak myślisz? Masz pewnie błędy transmisji i dlatego wywala
Szukałem na internecie poradników do terminala UART i udało mi się zrobić coś takiego z kawałków znalezionych w sieci. Problem polega na tym, że mój kompilator wyrzuca błędy a nie pokazuje mi gdzie one są (i tym samym nie mogę ich skompilować) i jeśli ktoś może sprawdzić poprawność kodu w 1. i 2. main.c(są to dwa odzielne programy w dwóch projektach...
W datasheet od procesora sa dokladnie podane wartosci rejestrow dla różnych częstotliwości oscylatora i różnych prędkości. W tabelach tych podane są również procentowe błędy prędkości transmisji przy każdej konfiguracji. Polecam tam zajrzec. Gdzieś czytałem że procentowy błąd baudrate powienien byc poniżej chyba 5%.
Wygląda jakby przerwanie nie kasowało flagi ale żadna flaga nie jest ustawiona. Żadna flaga nie jest ustawiona? TXE na 100% jest ustawione (bo przecież nic nie wysyłasz), TC też by było ustawione na stałe tylko czyścisz ją ręcznie. Po skończonym transferze przerwania od tych źródeł należy wyłączyć. Żadne magiczne funkcje typu HAL_NVIC_ClearPendingIRQ()...
Nie potrzeba tego dławika przy AVCC a kwarce są wypisane w dziale USART w nocie katalogowej. Trzeba użyć takiego aby przy zakładanej prędkości transmisji błędy były 0%
A PC potrafi odbierać tak niskie boudrate? Nie wiadomo jaki jest błąd przy takich ustawieniach, ale obstawiam, że spory. Ponieważ baudrate zazwyczaj powstaje na skutek podzielenia częstotliwości taktowania USART przez podaną przez programistę wartość, to przy niskich wartościach różnice i błędy narastają lawinowo. W efekcie dwa układy, różnie taktowane...
I ostatnia rzecz. Takie same ustawienia jak w HyperTerminalu są w menedżerze urządzeń. Tyle że jeśli tam cokolwiek zmieniłem to to nie miało wpływu na komunikację, czyli te ustawienia można olać ? Przedewszystkim zmien hyperterminala na "Realterm", bedziesz widzial dokladnie co sie dzieje i od reki zmienisz wszystko w trakcie pracy..hyperterminal nie...
Zatem kabel prosty - nie krosowany. Zależy jak masz ustawiony UART bo teoretycznie (a w zasadzie wg. PDF''a) na 1MHz potrafią przy pewnych ustawieniach być błędy w transmisji nawet 8,5% USART mam ustatwiony tak ze baud rat mam na 2400 czyli bład powinien byc 0.2%. ALe z tego co widze to chyba spróbuje sie pobawic fuse bitami i przestawic na inna czestotliwosc...
Witam, Nie mam problemu z obsługą USART tylko takie pytanie, które mnie nurtuje bo chyba się zakręciłem i nie do końca coś rozumiem. O jakie podwójne zwiększenie prędkości transmisji chodzi przy ustawieniu bitu U2X na 1 ??? Tzn co to ma wspólnego ze zwiększaniem prędkości transmisjii ? Przecież po pierwsze chodzi tu tylko o dane odbierane i zdaje się...
Wygląda na to, że możliwe, że jest to któreś z proponowanych rozwiązań. Co do bufora wejściowego to zwiększałem go do 4048 i nic. Bardziej wygląda to na coś z pamięcią i ze stosem, ale jak to sprawdzić? Oczywiście nie można zrobić wektora 1500 bajtów w ATmega8 - tam próbowałem różne wartości, mieszczące się w pamięci, tak aby po kompilacji był komunikat...
Komunikuję się z komputera PC z atmega8. Kontroler pracuje na wewnętrznym oscylatorze ustawionym na 8MHz. Prędkość transmisji w celu minimalizacji błędów ustaliłem na 9600 baud. Problem polega na tym, że błędy w transmisji zdarzają się niemal stale:(. Średnio udaje mi się przesłać prawidłowo co 4-5 bajt. Co może być tego powodem? Czy może być to wina...
Witam Od pewnego czasu buduję urządzenie typu Pick&Place w oparciu o mikrokontroler Atmega16 oraz program sterujący PC w C#. Niestety, pomimo że wszystko działa błędy występujące w komunikacji USART uniemożliwiają przeprowadzenie dokładnego sterowania. Przesyłam dane z komputera w pakiecie 8x8 bitów bez żadnych zabezpieczeń. Niestety nie miałem do czynienia...
Witam Znalazłem na naszym szanownym forum kod w C do obsługi portu RS232 (na PC): #include <windows.h> #include <stdio.h> int main() { HANDLE hCom; //uchwyt portu DCB dcb; //konfiguracja portu BOOL fSuccess; //flaga pomocnicza BYTE RS_buf; //bufor danej DWORD RS_ile; //ilosc bitow wyslanych //otwarcie portu COM1 z prawami RW...
Witam, ostatnio zabrałem się za opanowanie interfejsu I2C (TWI). Staram się od dobrych 2 dni odczytać dane z układu PCF8583 (RTC). Napisałem gromadę funkcji do obsługi I2C, większość pochodzi z książki "Język C dla mikrokontrolerów AVR" więc sądzę że nie mają błędów. Pierwszym problemem jest adres jaki ma układ ma podłączone wejście A0 do zasilania...
Szkoda, że nie czytasz dokumentacji i nie korzystasz z moich porad. Program powinien być rozwijany w oparciu o kod, który wcześniej podałem. Nie zaś na przykładach z Google. Problem na 70 % związany jest i tak z zegarem. Oczywiście tu jest dość bezmyślny błąd: UCSR0B = (1<<RXEN0)|(1<<TXEN0) | (1<<RXC0); Powinno być tylko tyle: UCSR0B...
Biblioteka ta zakłada skrajne położenia serva o czasie trwania impulsu 544 usec i drugie skrajne 2400 usec Niezgodne z jakąkolwiek normą dla serw. Jak wszystko dla Arduino zrobione na od...... dlatego pisałem aby samemu napisać obsługę serwa. W końcu to nie szczyt możliwości uC wygenerować timerem odpowiednie impulsy. Obsługa timera w trybie PWM jest...
Testuje sobie nowe programy na zestawie uruchomieniowym i nadszedł czas na USARTa. Napisałem najprostszy kod pod słońcem na wysyłanie bajtu. Oczywiście są jakieś błędy w transmisji bo NIC nie dochodzi. Przesymulowałem program, i to co mi wyskoczylo: http://obrazki.elektroda.net/28_12209774... Do UBRRH wpisuje same zera, okazuje sie,że mam 0x8E!...
Niestety to jednak nie w tym tkwi problem. Zmieniłem troszkę program dlatego opisze jeszcze raz o co chodzi ;) Usunąłem wszystkie błędy programu i o dziwo komunikacja jako tako działa, ale oczywiście jest jedno "ale" z którym jakoś nie potrafię sobie poradzić i nie wiem dlaczego tak się dzieje. ATmega16 (do niej podłączony jest klawisz i LCD) mierzy...
(at)Asembler Wybacz ale takie rozwiązanie to prowizorka, nie nadaje się do rozwiązania komercyjnego (chyba że no-name;) ). OK, mam pewne skrzywienie, ponieważ większość moich urządzeń pracuje na RS485, a tam jeśli któryś z klientów zacznie gadać "niestandardowo" to skutki tego mogą (np. gdy brak sumy kontrolnej w jakimś starym firmware) być opłakane......
Przy RS485 masy układów zawsze muszą być połączone, ze względu na dozwolone napięcie wspólne dla transceivera TMF - wszystko zależy tutaj od konstrukcji zasilaczy naszych urządzeń. Jeżeli układy zasilane są z zasilaczy transformatorowych to połączenie może być ale nie musi. W przypadku zasilania urządzeń z wbudowanego zasilacza impulsowego wielokrotnie...
tak wyglądają błędy podczas kompilacji http://obrazki.elektroda.pl/3063708300_1... tu natomiast wklejam kod który pozmieniałem, a nie wiem czy dobrze ; Prosty program boot loader-a dla interfejsu RS-232 ; Rafał Baranowski (C) 2004 //**************************************... /* * Modyfikacja programu...
0xFF, to brak transmisji, ale 0xC0 świadczy o pewnym przesyle. Było by miło, gdybyś podłączył oscyloskop, bo mogli byśmy wyeliminować błędy transmisji. Połącz RxD z TxD mikrokontrolera i zobacz czy odbierasz to co wysłałeś.
Definiujesz .def zero=r2 , ale nie inicjujesz wartości tego rejestru. Po włączeniu procesora rejestr zawiera wartość przypadkową. Aby mieć pewność, że jego wartość jest równa zero musisz w kodzie dopisać (przed pierwszym użyciem tego rejestru) instrukcję clr zero .
Można przy wewnętrznym taktowaniu używać transmisji USART. Ale trzeba generator wewnętrzny skalibrować, używać zawsze w tej samej temperaturze i przy tym samym napięciu.
Tak. Po to właśnie jest nagłówek setbaud.h a funkcję go wykorzystującą już znasz i opisałem ją dokładnie w komentarzach. F_CPU ustawia się w opcjach: http://mikrokontrolery.blogspot.com/2011... W ten sposób setbaud.h będzie wiedział jaka jest częstotliwoć taktowania mirokontrolera, i funkcja usart_inicjuj() dobierze odpowiednie...
Przy 9600 masz 7% błąd więc mogą być przekłamania. Zainicjuj uarta na 4800bps u mnie działa z wewn. kwarcem 1Mhz (USART_Init(12)). Więcej nie pomoge. Powodzenia.
Tutaj popełniasz dosyć poważny błąd. Po odebraniu pierwszego bajtu zatrzymujesz transmisję na SPI na stosunkowo długi czas potrzebny na przesłanie tego bajtu poprzez USART. Nie to jednak jest najgorsze. Po dokładniejszym przeanalizowaniu noty ADIS16100 zauważyłem dwa dosyć ważne problemy. Pierwszy to taki, że stosunek czasu trwania stanu wysokiego...
Z DMA powinno być łatwiej a z pewnością mniej obciąża CPU. Oczywiscie ze nie. Jak zwykle kol. (at)LChucki wprowadza w błąd. Dla 2 znaków oczywiście to nie ma sensu. Trzeba po stronie odbierającej wykrywać koniec transmisji (np poprzez IDLE, przekróecenie bufora itd itd). Do tego trzeba zaimplementować odpowiednie mechanizmy synchronizacyjne. Sądząc...
A mogę prosić o wyjaśnienie? Bo nie potrafię się doszukać w tym kodzie błędu.
Z tego co widze działasz na internal RC 1MHz. USART może nie działać dla takiego źródła zegara. W datasheet masz tabelkę z ustawieniami UBRR dla danych częstotliwości oraz błędy transmisji.
Cały problem jest spowodowany tym, że procesor w tej chwili nie jest taktowany 8MHz - w tym przypadku to tak na oko 7,2MHz. Zmiany tej częstotliwości będą raczej niewielkie, w granicach zakładanej tolerancji, jeżeli MCU będzie pracować przy stabilizowanym zasilaniu i przy niewielkich zmianach temperatury. Znajomość obecnego taktowania pomoże rozwiązać...
Dlaczego nie napiszesz po prostu tak: UCSRC = 1<<URSEL | 1<<UCSZ0 | 1<<UCSZ1; - bez zbędnych operatorów i sztucznego pompowania objętości kodu zarówno źródłowego, jak i wynikowego. Dlaczego sekwencja |= nie działa - nie wiem. Czy nie działa na żywym uC, czy na symulatorze? Jeśli to drugie - to błąd symulatora, jeśli to pierwsze - niezgodność...
Ten terminal nie obsługuje transmisji 9 bitowej ale może odebrać dwa bity stopu co niestety może Ci powodować przeszkody w transmisji i generować błędy. Natomiast na mikro procesorach możesz to dowolnie odbierać.
Co ciekawe, gdy zrobię transmisję bez modbusa, wszystko jest ok No to już wiesz gdzie masz błąd. Szukaj innej biblioteki, napisz swoją lub popraw istniejącą (napisałem od najłatwiejszego do najtrudniejszego oczywiście IMHO). Możesz też wspomagać się pseudo debugowaniem po USART ale to nie jest wygodna metoda o czym już pewnie się przekonałeś.
w dokumentacji jest błąd, transmisję 8-bit uzyskuje się przy ustawionych UCSZ1 i UCSZ0. funkcje wyslij_znak i odbierz wyglądają poprawnie. W main zmień "odbierz" na "odbierz()". Jeśli MAX się grzeje, to znaczy, że jest źle podłączony, podrzuć jakiś schemat.
Pierwszy problem - to brak synchronizacji. Nadawane dane muszą mieć taką postać, żeby łatwo było zauważyć początek ich porcji. Może to być np. kod końca wiersza lub spacja pomiędzy liczbami. Użycie DMA do odbioru danych jest zdecydowanie złym pomysłem, przynajmniej dla początkujących. Dobrym pomysłem za to jest zrobienie wszystkiego w przerwaniu, pod...
Na 99% nie. Można kombinować z auto-reload i transmisją jednego bajtu, o ile uda się przekonać DMA, że docelowy UART jest pamięcią, a nie peryferialem i o ile będziesz miał pewność, że nigdy dane nie będą równocześnie nadchodziły w takim tempie, żeby zapchać nadajnik. Czyli: nawet gdyby się udało, to jest to rozwiązanie wysoce niepewne i zawodne. Co...
Chyba każdy usart jest synchronizowany podczas bitu startu - poto ten bit. Wydaje mi się, że problem błędów polega na transmisji ale po stronie usb gdzie procesor ma naprawdę dużo do przemielenia danych a nie po stronie uart gdzie procesor nic nierobi programowo.
O. To już coś działa. Wygląda na to, że albo masz źle policzoną wartość UBRR albo dobrze policzoną ale błąd jest zbyt duży do poprawnej transmisji. Problem polega na tym, że wartością UBRR ustawiamy dzielnik częstotliwości dla USARTa. Można go jednak ustawić tylko z pewną dokładnością. I tak dla niektórych częstotliwości i prędkości USARTa błąd jest...
Witam rcall nie przeszkadza USARTowi... i całe szczęście, bo musielibyśmy wyrzucić wszystkie AVRy do kosza ;) Problem jak zwykle tkwi w programie. W procedurze obsługi przerwania USART_TXC założyłeś, że możesz włożyć do UDR kolejny bajt, bez sprawdzania, czy jest on pusty. Poniekąd jest to założenie słuszne, ale nie w Twoim programie. A problem polega...
bez problemu powinno działać , a dla większej pewności możesz zastosować jakąś kontrolę błędów .
jak to wyliczyłeś? 14,745 / 14,7456 = 0,99995931. Do pełnej 1 brakuje zatem 0,00004069 czyli właśnie te około 40ppm. Rezonator chciałbym zastosować w uC by otrzymać 0% błędów w komunikacji przez USART. Będzie ona pracowała w trudnych warunkach. Akurat UART to dość mało wymagające zastosowanie. Oczywiście na tyle wymagające żeby wymusić zastosowanie...
Jest tu co najmniej kilka błędów. Pierwszy to taki, że funkcja uart_getc nie jest atomowa. W ogóle kolejka jest zrealizowana źle - nie uwzględnia, że odczyty/zapisy następują asynchronicznie, w związku z tym pewne operacje (np. uaktualnienie wskaźników początku i końca) muszą być robione atomowo. Przypadkowo to działa przy zapisie, bo ISR jest wykonywane...
błędy transmisji błędy transmisji rs485 bufor transmisji
zmniejszyć obrót klimatyzacja naprawa panela radia pioneer volvo silnika
lancia voyager suszarka samsung
Piekarnik Mastercook Dynamic nie wyłącza się po nagrzaniu Jak wymontować wyświetlacz lodówki Samsung RS7778HCWW?