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ś...
Brak wspólnej masy?
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...
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.
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...
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ś.
Ź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.
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
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.
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ć.
Witam, Przejściówka od chińczyków za 5zł. http://obrazki.elektroda.pl/9250235300_1... Na innym temacie już się o niej rozpisywali, także odnośnie sterowników przy błędzie "USART receive framing error".
Oscylator wewnętrzny nie nadaje się do wykorzystywania, kiedy w układzie działa USART. Jest on mało stabilny. I stąd pewnie masz błędy. Algorytmy dla CRC są trudne dla implementacji w C# i AVR? No bez przesady. Ale, żeby nie było, że jestem taki zły ;) Dodaj do Atmegi zewnętrzny kwarc (Dobierz odpowiednią wartość zgodnie z datasheet'em). Proste CRC....
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
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ć...
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%
Problem rozwiązany. Miałem błędy w połączeniach przy gnieździe DB9. Teraz działa i wysyłanie i odbieranie. Dzięki wszystkim za pomoc. Zamykam temat.
Nie. Kwarc "okrągły" nie "uart-friendly" powoduje tylko okazjonalne błędy transmisji, względnie łatwe do wychwycenia i skorygowania. Jak dużo? Jest kalkulator do tego. Tutaj był inny problem.
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...
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)...
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%.
Przy wysyłaniu zmiennej innego typu niż unsigned/signed char mogą się dziać dziwne rzeczy podczas konwersji typów... W tym przypadku nie bardzo wiem co jest grane... Robiłem ostatnio rejestrator i po licznych próbach doszedłem do czegoś takiego... bajt startu - liczba zamieniona na ciąg znaków - bajt next - liczba... - bajt stop W związku z tym, że...
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...
W dziele Transmisja danych znajdziesz przykład USART na przerwaniach z buforem: http://mikrokontrolery.blogspot.com/p/sp...
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...
Jeśli bitowi chcesz nadać wartość 0 to po prostu nie nadajesz mu wartości 1 - proste, prawda? Oczywiście tylko w sytuacji w której stosujesz zapis np. UCSRC=, a nie UCSRC|=. Co do błędów w symulatorze to jakie masz na myśli? Dobra rada - dopóki nie osiągniesz istotnego stopnia wtajemniczenia, porzuć myśl o błędach w kompilatorze, symulatorze itd. Jeśli...
Jeśli np. z niektórych zmiennych korzystasz tylko w module usart a nie w main to możesz je zrobić jako global static (chyba te zmienne const się do tego nadają) i wtedy nie trzeba ich też extern robić bo main z nich nie korzysta const musi być znany podczas kompilacji a nie jest. Przerzuć te zmienne do pliku cpp i będzie ok. Ja może wyjaśnię w czym...
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...
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...
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...
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ę...
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 Jest to pierwszy taki szerszy mój projekt w tej dziedzinie. Mam AT8, która generuje sygnał zegarowy 1 MHz. Ten sygnał taktuje pewien układ i ten układ zwraca sygnał analogowy o częstotliwości około 1MHz (w każdym razie musiałbym próbkować co 1 us). Jednocześnie musiałbym te wyniki gdzieś przesyłać dalej. Mianowicie USART, dane podglądam na bieżąco...
A mogę prosić o wyjaśnienie? Bo nie potrafię się doszukać w tym kodzie błędu.
Jest to urządzenie odbiorcze i nadawcze transmisji DMX-512. https://obrazki.elektroda.pl/7875710200_... https://obrazki.elektroda.pl/1473579200_... Drugi tester wyglądał tak: https://obrazki.elektroda.pl/1506942700_... https://obrazki.elektroda.pl/1505487800_... https://obrazki.elektroda.pl/3619195400_...
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()...
Co najmniej 3 błędy popełniłeś. Pierwwszy to włączasz przerwanie Uart Data Register Empty, a nie wstawisz chociaz reti pod wektor obslugi tego przerwania. Tu na pewno program się wykracza i nie wiadomo co procesor zrobi, najprawdopodobniej RESET. Drugi to włączenie sterowania sprzętowego. Co prawda w przypadku odbierania to nie ma znaczenia, ale w przypadku...
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...
Dondu, Twój skrypt ze strony http://mikrokontrolery.blogspot.com/2011... działa. Wiem :) Na jego podstawie poprawiłem ten mój nieszczęsny i też zaczął działać :) Zmieniłem ... Masz na myśli, że działa na ATmega8? Bo jeśli na ATmega328 to przypadek, bo bity te nie występują w ATmega328. Jak więc się to ma do komunikatów...
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...
Dobrze TMF mówi, USART wykłada dane z rejestru bufora niezależnie od reszty systemu, jeśli ta dana jest poprawna to nie powinno być błędów. Jaką masz częstotliwość kwarcu? Może jesteś na granicy tolerancji błędów przez odbiornik i stąd cały ten ambaras. Spróbuj z kwarcem 18,432MHz jeśli zależy Ci na małym błędzie transmisji przy dużej prędkości działania...
piszesz, że masz zewn kwarc 12MHz - a skąd wziąłeś albo jak sobie ustaliłeś wartość którą zapisujesz do UBRRx - od której zależy prędkość transmisji RS232 i dokładnie jaką prędkość ustawiłeś? po drugie odblokowujesz przerwania a w miejscu gdzie są wektory obsługi przerwań masz "pustkę" zamiast chociażby samych rozkazów reti dzięki czemu już z tego powodu...
Zastanawiam się jeszcze nad kwarcem dla uC. Jaką wartość najwygodniej użyć? Prędkość transmisji nie musi być wysoka. Jeśli wystarczy ci standardowa prędkość 9600 to w ogóle nie potrzebujesz kwarca zewnętrznego no chyba że układ będzie pracował co jakiś czas w skrajnie różnych temperaturach to wtedy można pomyśleć. Jeżeli w takiej samej temperaturze...
Tak, sprawdzałem. Obliczałem wg tej tabelki z wzorami (wartosc w typie calkowitym: 51): http://wstaw.org/m/2011/04/25/tab.PNG , zatem potwierdza się ze sztywno podanymi w tabeli: http://wstaw.org/m/2011/04/25/51.PNG a tutaj screen z docklight'a z błędami w transmisji. http://wstaw.org/m/2011/04/25/Przechwyty... Dodam, że jak resetuję kontroler...
Hej, układ jest zrobiony tak jak tu: http://www.elektroda.pl/rtvforum/topic19... + połączenia TX-RX. Programuje się bez problemów. Kod programu jak zaznaczyłem jest wzięty z dokumentacji: #define FOSC 1000000 // Clock Speed #define BAUD 4800 #define MYUBRR FOSC/16/BAUD-1 void main( void ) { USART_Init ( MYUBRR ); while(1)...
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!...
Rozumiem że jest błędna ale wg mnie powinna działać chociaż jest z lekka prymitywna.Stworzyłam ją bardziej do testowania . Wcześniej starałem się wysyłam znaki w przerwaniu - "ISR(USART_TX_vect)" ale bardzo dużo śmieci mi się pojawiało na ekranie.
Witam wszystkich mam następujący problem, otóż chciał bym stworzyć funkcję która pobiera z portu rs232 cały napis, który następnie mógł bym przekonwertować do postaci integer, czy double lub inne zmiennej liczbowej. Próbowałem to zrobić w oparciu o własną funkcje uart_get_string ale funkcja pobiera tylko jeden znak. Powyższe potrzebne mi jest do np....
Wielokrotnie była o tym mowa - w ATMega generator RC nie ma wystarczającej stabilności, aby bez dodatkowych procedur kalibracyjnych wykorzystać go do transmisji UART. Oczywiście może to działać, ale zapewne efekt będzie taki, że raz działać będzie, a raz nie. Gdzie się takich bzdur naczytałeś Tomku po wpisaniu w odpowiedni rejestr wartości kalibracji...
Aha i jeszcze taka mała rada na przyszłość. W programie miałem ustawione, że ten uP który nadaje, sygnał XCK bierze z drugiego uP. Najlepiej sygnał taktujący ustawić na sztywno z mikroprocesora, który ma niższy kwarc. Nie zaobserwowałem wtedy błędów w transmisji ;)
bez problemu powinno działać , a dla większej pewności możesz zastosować jakąś kontrolę błędów .
Konwerter jest do bani - nie da się go tak skonfigurować by naprawić ten błąd w transmisji.
Witam! Zrobiłem sobie układ oparty o uP ATmega 8L (taktowany wew 1MHz). Procesor ma wysyłać i odbierć dane po łączu szeregowym USART. O ile z wysyłaniem nie ma problemu (zawsze wysyłane są jednorazowo 2 bajty) o tyle sprawa komplikuje się przy odbiorze danych. Dane "dochodzące" do uP nie mają stałej długości (czasami są to 4 bajty, czasami 10 itd)....
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...
Wszystko zaczyna się łączyć w jedną całość kiedy "odkryłem" USART w atmedze. Początkowo niemądry chciałem sam stworzyć cała transmisje szeregową zwyczajnie zmieniając stan jednego z pinów na porcie. Mam w związku z tym pytanie: Czy jeżeli ustawiłem długość słowa na 8bitów to bufor UDR przyjmie każda 8bitową liczbę? Powiedzmy coś w tym stylu: int dana;...
Program ma spełniać prostą funkcje. Odczyt z ADC i wysłanie tej wartości do terminala po UARCIE. Planuje by efekt koncowy tego fragmentu wyswietlal na terminalu, wartość z adc oraz tekst poniżej załączam inicjalizacje uarta oraz dwie funkcje wysylające. [syntax=c] void UART_sendbytes(char * bajty, int count) // wysyłanie jednego bajtu { // aby ograniczyć...
No dobra to zacznę jeszcze raz. Za pierwszym razem chyba umieściłem swoje zapytanie w złym dziale bo jakoś po kilku odpowiedziach temat umarł, a nie wszystkie moje problemy się rozwiązały. Za zadanie mam zbudować układ który będzie mierzył wartość wilgotności powietrza, następnie drogą radiowa przesyłał te informacje do głównego układu. Tam otrzymane...
. Czy to wina ze nie mam podpietego zewnetrznego kwarcu ? Tak ale o odpowiedniej częstotliwości. Datasheet dla twojego procka zawiera tabelkę błędów z jakimi komunikujesz się po usart dla różnych prędkości zależnie od częstotliwości procka. Jednym z magicznych kwarców jest np 11.0592 który pozwoli tobie na pracę aż po 115200 z bodajże zerowym błędem...
http://obrazki.elektroda.pl/7090663600_1... Prawidłowe dane, odczytane zarówno bascomem jak i arduino to: -pierwszy bajt nieistotny -C1 = 50963 -C2 = 50412 -C3 = 30121 -C4 = 28181 -C5 = 32047 -C6 = 26849 -CRC - jeszcze nie używałem A poniższy kod odczytuje poprawnie tylko C3 do C6. http://obrazki.elektroda.pl/9124086500_1...
(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......
Witam! Problem jak w temacie. Zakupiłem moduł bluetooth BTM 112, zrobiłem pod niego płytką z wszelkimi potrzebnymi elementami (wg. schematu z datasheeta) i wyprowadzeniem sygnałów na goldpiny. Po podaniu zasilania moduł się włącza i przechodzi w stan "mrugającej diody połączenia". Od strony PC mogę się bez problemu połączyć i następnie wysyłać do modułu...
Nie widziałem na elektrodzie czegoś podobnego, ale zrobiłem jakiś czas temu link do przesyłania NMEA po koncentryku, zasilanie i dane w jednym drucie, więc jeśli chodzi o warstwę fizyczną to zrobić się to da bez problemu. Pomyśl teraz nad protokołem jakim to będziesz przesyłał. Chyba najwygodniej będzie użyć oklepanej transmisji synchronicznej (usart)...
wszystko w porządku poza 'UBRR' undeclared (first use in this function) Przepraszam za pomyłkę. W przypadku mikrokontrolera ATmega8, rejestry UBRRH i UBRRL nie są połączone w jeden rejestr UBRR. Zamiast tego, są to dwa oddzielne rejestry, które są używane do ustawiania prędkości transmisji UART. Dlatego powinieneś zamiast "UBRR" użyć "UBRRH"...
kwarc w transmisji rs232 lub rs485 ma znaczenie ponieważ korzystasz z USART - ustawienie parametrów transmisji np 1 MHz błąd w transmisji 7,5% przy prędkości 9600, 1,11 MHz błąd w transmisji 3,1% przy prędkości 9600, 1,84 MHz błąd w transmisji 0,2% przy prędkości 9600, itd.
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...
Właśnie skończyłem budować taki układ ale oparty o transmisję radiową na modułach MOBOT RCRv2 (bez problemów zasięg z piwnicy na 2 piętro, takze w otwartym terenie też nie powinno być problemów) Koszt jednego modułu to blisko 50zł ale w razie awarii jeden stacji nie pada cały system jak to się czasem dzieje przy rs485 (znam z autopsji z pracy w dużej...
panowie chce polaczyć zasilacz (sterowany mikrokontrolerem ATMega) z komputerem przez złacze RS232. działałby na zasadzie wysylania z komputera odpowiednich kodów w ASCII a mikrokontroler by sobie je odpowiednio dekodował i ustawiał według tego napiecie czy prąd ew. wysyłał aktualne wartości na komputer. tyle że nie do końca rozumiem sposob obsługi...
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...
jeszcze nie zapomnij o samym USARC-ie, który może byc w stanie błedu - bo obsluga DMA była właczona, ale DMA nić nie zabierało. Możesz rozwinąć, bo nie rozumiem, dlaczego włączenie DMA dla USART miałoby powodować błędy, jeśli dane nie przyjdą? (at)kamil94goldman : W HAL to jest taka funkcja: Lecz w jaki sposób mogę zrobić odbieranie danych przez UART...
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.
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.
Twój kod a także same założenia są już pełne błędów. Zatem to co obserwujesz jest tylko wypadkową tego wszystkiego co robisz źle. 1. co to za inkludowanie plików *.c ???? Inkluduje się TYLKO pliki nagłówkowe *.h 2. co to za rozbicie inicjalizacji nadajnika i odbiornika ? Choć teoretycznie mogłoby tak być - ale nie robi się w ten sposób 3. w inicjalizacji...
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...
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...
No to właśnie skoro ma być dobrze dopasowany do prędkości transmisji - i to praktycznie dowolnej - to weź sobie sprawdź tabelki na ostatniej stronie rozdziału USART swojego procka. I rzuć okiem na procenty błędów transmisji przy takich właśnie kwarcach jak : 11,0592MHz albo 18,432MHz i podobnych i zobacz czym się różnią od np taktowania 1MHz czy 8MHz...
Podstawowy błąd to taktowanie USART z wewnętrznego generatora. On nie ma wystarczającej stabilności i transmisja po RS jeśli działa to tylko przypadkiem. Zmień na kwarc i problemy znikną.
(at)szelus Oczywiście DE i RE są połączone razem (zworka). Inaczej nie miałbym transmisji zwrotnej albo trzeba by podłączyć do dwóch różnych pinów ATMEGI. Zwłoki po przełączeniu się z nadawania na odbiór (20ms) i odwrotnie wydają się być i tak przydługie - jakby były przeznaczone dla starej elektroniki analogowej... ;-) Testowałem też różne odstępy...
Kończę pewien projekt i przy kosmetyce muszę poprawić pewne błędy. Błędy mam z komunikacją poprzez RS'a 232. Dla mastera utworzyłem własną ramkę danych mającą postać: Nr bajtu - wartość //opis 1 - 0x01 //numer urządzenia 2 - //komenda 3 - //dane 4 - 0x0D //znak końca ramki Slave po otrzymaniu takiej ramki danych poddaje ją analizie i w przypadku jeśli...
Dziękuję za pomoc, oczywiście błędu szukałem wszędzie tylko nie tam. Teraz wszystko działa tak jak powinno.
Niestety dokumentacje tej firmy nie są najwyższych lotów. Czy masz jakieś doświadczenia z transmisją LoRa? Pozdrawiam JarekC
Witam, Mam problem z transmisją przez USART. Gdzie tu jest błąd ? [syntax=c] //zegar 1MHz, dla prędkości 9600b/s, 8data, 1stop UBRR0H = 0; UBRR0L = 12; UCSR0A &= ~(1<<U2X0); UCSR0B = (1<<RXEN0)|(1<<TXEN0); UCSR0B = (1<<RXCIE0); UCSR0C = (3<<UCSZ00);[/syntax] Fragmenty kodu obsługi: [syntax=c] void uart_znak( unsigned...
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...
Jeśli to jest w jednym pliku, zadbaj o kolejność deklaracji. Jeśli w dwóch (średni pomysł w tym przypadku, bo nie jest to logiczna dekompozycja), to w tym, w którym odwołujesz się do danej z innego modułu na poziomie zewnętrznym umieść deklarację skopiowaną z z definicji, z dodanym z przodu słowem kluczowym extern. char TxBuf to coś zupełnie innego...
http://obrazki.elektroda.pl/1890330400_1... Witam, Sterownik pompy ciepła. Żeby tanio grzać trzeba nie tylko posiadać dobra pompę, ale bardzo sprytnie nią sterować. Ponieważ na rynku w ogóle nie ma sterowników, które choć trochę spełniałyby moje wymagania, wykonałem swój własny. W zaszłym sezonie dwa takie urządzenia pracowały przez...
Witam Bardziej profesjonalnie jest wszystkie układy potraktować jako slave . Każdy słucha i czeka na przerwanie z uarta , jak je otrzymuje odbiera zawartość z udr porównuje i albo odbiera dalej albo ignoruje i czeka na kolejny adres . Atmel wyposażył układy w tryb multimaster ,który się do tego świetnie nadaje i warto o nim przeczytać w dokumentacji...
Zamieszczam kod programu do komunikacji ciągłej w dwie strony, może komuś cię przyda bo na elektrodzie takiego czegoś chyba nie ma. Działanie jego jest takie, że posiada dwa bufory FIFO dla danych odbieranych i wysyłanych. Każda wysyłana paczka danych zawiera bajt CRC i gdyby dane były wysyłane bezpośrednio z bufora danych to mogło by się tak zdarzyć...
Napisałem program i mam pewne problemy z jego działaniem, w skrócie napiszę jak działa program: Mikroprocesor oczekuje na zbocze opadające po czym wywołuje przerwanie, w przerwaniu tym za pierwszym razem zerowany jest timer 1, po czym wychodzi z przerwania po kolejnym zboczu opadającym odczytywana jest wartość timera1 i zapisywana jako ref_time czyli...
Witam! napisałem program który powinien wysyłać "1" na terminal co sekundę jednak na terminalu wyświetla się co jakiś czas wskazana 1 lecz w większości "ą" #include <avr/io.h> #include <util/delay.h> #define F_CPU 1000000UL #define UART_BAUD 19200 #define UART_CONST (F_CPU/(16ul*UART_BAUD)-1... void USART_Transmit( unsigned...
Zła szybkość transmisji - przy oscylatorze 1 MHz możesz transmitować na 4800 - przy 9600 i błędnym wzorze na podzielnik UBRR masz 9% błędu, a przy poprawnym miałbyś 7% (powinno być max 2.5%, żeby była pewna transmisja). Wyłącz podział częstotliwości - przy 8 MHz możesz transmitować do 38400.
W moim układzie, w którym pracuje MAX232CPE prawidłowo do 230400 bps, na pompkach ładunkowych mam 4µ7 tantalowe, a pozostałe 10µ. Jeśli masz pod ręką woltomierz, to po prostu sprawdź napięcie na 6 wyprowadzeniu, powinno wynosić co najmniej -8V (względem GND), a jeśli jest -10V to jest wręcz idealnie. Prościej byłoby sprawdzić transmisję z...
UART ruszył! Błąd w ustawieniu rejestru od konfuguracji USARTa - copy&paste z ATMEGA8 nie zadziałało ;/. Pozdrawiam!
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...
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...
Jak za pomocą tego zapisać dane do tablicy? W sensie, jaka funkcja zwraca odebrany bajt? [syntax=c]ISR(USART_RX_vect) { bajt = UDR0; // odczytany z RX }[/syntax]W jednym ISR zostanie odczytany tylko jeden bajt.
Bo globalnych stałych nie definiuje się w pliku .c Ale dobrze że podejrzewasz błąd kompilatora (; Już dawno nikt nie sugerował, że problemem jest kompilator (; 4\/3!!
Przecież genetix już pisał, że działa i podał gdzie jest błąd, więc po co się dodatkowo rozpisywać ??? Pozatym dla 1M kalibracja jest automatyczna...
Korzystam z tego [url=http://www.tme.eu/pl/details/wsh-47... RS485 bazującego na układzie SP3485 ([url=http://www.waveshare.com/w/upload/... a nie jak pisałem MAX3485. Wyprowadzenia /RE oraz DE odpowiadające za kierunek transmisji są ze sobą połączone. Wykorzystuje zestaw...
Witam!! Mam problem z ożywieniem rs232 na ATmega 128. Wykorzystałem kod z książki Mirosława Kardasia "Mikrokontrolery AVR język C podstawy programowania". [syntax=c]#include <avr/io.h> #include <util/delay.h> // deklaracja funkcji nadawczej void USART_Transmit( unsigned char data ); //główna funkcja programu int main (void) { //w tym miejscu...
https://obrazki.elektroda.pl/5705909000_... NA WSTĘPIE Wiem, wiem, ktoś zaraz powie, że układów aktywnego obciążenia nie sposób zliczyć i kolejny taki projekt przyczynia się do klęski urodzaju… 8-) Mimo wszystko chciałbym przedstawić projekt aktywnego obciążenia. Aktywne obciążenie samo w sobie nie jest czymś szczególnym, ale...
Schemat: http://tuxgraphics.com/common/src2/artic... Nie ustawiałem fusebitów, ale mam pewność, że częstotliwość się zgadza, gdyż odliczanie sekundy z przerwania działa idealnie (kod z jednego z programów autora schematu). Co do kodu do UARTa, oczywiście zmieniłem 8 na 12,5. Generalnie na sprzęcie ładnie hula serwer HTTP, klient...
błędy transmisji błędy transmisji rs485 bufor transmisji
canon mp210 błąd skrzypi amortyzatory phoenix programator karta
ericsson calculator pralka programator mruga
Najtańsze sprężyny tylne RIDEX, MAXGEAR do Renault Laguna II 1.6 16V kombi – montaż i podkładki Spalony warystor w płycie indukcyjnej Bosch, Siemens, Samsung – objawy, wymiana, dobór MOV