A czy mógłbyś napisać coś więcej w jaki sposób można by to lepiej wykonać? 1. Praktycznie cała twoja aplikacja funkcjonuje w USART2_IRQHandler(); 2. Przerwania w miarę możliwości powinny być jak najprostsze, więc wywoływanie w nich funkcji atoi/itoa jest słabym pomysłem; 3. USART powinien wysyłać ciąg znaków, ich serializacja powinna być w wyższej...
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)...
(at)BlueDraco Co do zasady zupełnie się z tobą zgadzam. Tylko odpowiadam na pytanie autora, że jeśli bardzo chce to można. (at)ASMnauka_ W dokumentacji masz opisane źródła (triggery) dla DMA. Jednym z nich jest zdarzenie odebrania bajta. A DMA do odbioru konfigurujesz tak jak do nadawania, z tym, że adres źródła to rejestr odbiornika danych USART,...
No bez przesady. Myślisz, że przejściówka o której pisze Daniel880 ma konwerter poziomów? Nic na ten temat nie wspominał. Przejściówka jaką posiadam jest oparta na pl2303 i jak wynika z noty to pracuje na poziomie napiec TTL. Jeśli wyjścia z niej są TTL to moim zdaniem tak właśnie jest.
Witam wszystkich Problem wygląda następująco, nie mogę odebrać żadnych danych za pomoca uarta1 atmegii 128 (poprawnie wysyła ale nic nie odbiera ;/ ) Prosiłbym o wszelką pomoc, poniżej wklejam programy inicjalizacji i odbioru: [code][syntax=c]void USART_Init( unsigned int ubrr, unsigned int port) { switch (port) { case 0: /* Set baud rate */ UBRR0H...
Problem leży tu: SIGNAL(USART_RXC_vect) { if(UDR=='$') zapis=1; if((i<14)&&(z... { buf[i]=UDR; i++; } if(i>=14) { k=1; zapis=0; i=0; } } Otóż odczyt z rejestru UDR powoduje jego wyzerowanie a następnie załadowanie następnego odebranego znaku (jeżeli...
Przerwanie bym raczej właczył przed odpaleniem DMA. Odbiór przez DMA to raczej tylko w przypadku kiedy masz zawsze tę samą ilość danych. nie wiem jak w Twoim przypadku bo nic o tej "ramce" nie piszesz. Rozmiem że ma dokładnie 30 bajtów. Jezeli ma więcej lub mniej o choćby jeden bajt to Twój algorytm nie zadziała. - jezeli mniej np o 5 bajtów to odbierze...
Wygląda na problem z ustawieniem szybkości transmisji - częstotliwość zegara UART jest inna, niż Ci się wydaje. Podejrzewam, że to nie jedyny problem, ale na wszelki wypadek nie pokazałeś więCej kodu, w tym deklaracji zmiennych.
Na razie chciałbym sprobować zrobić bez przerwań. Wysyłam z programu. [syntax=c] #define F_CPU 8000000UL #include <avr/io.h> #include <util/delay.h> #define BAUDRATE 9600 #define BAUD_PRESCALLER (((F_CPU / (BAUDRATE * 16UL))) - 1) //Declaration of our functions void USART_init(void); unsigned char USART_receive(void); void USART_send( unsigned...
Nie, powinien odpowiadać na zapytania rozgłoszeniowe ARP who-has Albert
Bez przerwań ten wyświetlacz też da się obsłużyć, w iteracji pętli byłyby zmiana numeru znaku i obrazu znaku, a także odczyt klawiszy i portów zewnętrznych, w przypadku gdy są używane. To może sie udać jak obsługuje się powolne układy peryferyjne, jak np klawiaturę i interfejsy synchroniczne gdy jest sie masterem. Gdy np mam obsłużyć odbiór USART,...
Musi być coś co polaryzuje linie w spoczynku. Zwykły transceiver RS485 musi mieć sygnał różnicowy>200mV, poniżej tej wartości działanie jest niezdefiniowane. Dodatkowo przy braku takiej polaryzacji każde zakłócenie generuje odpowiedź, co właśnie obserwujesz. Daj rezystor od A do Vcc i od B do GND, wartość około 680 om.
Przypuszczam, że to Enable() robi "machnięcie" linią w górę i w dół. Inaczej wogóle by nie działało. Ciekawe, czy robi też wymaganie opóźnienie (i jakie)... Za to zupełnie nie widzę sprawdzania stanu BUSY wyświetlacza lub wymaganego opóźnienia po wysłaniu każdego znaku.
A gdyby tak... [syntax=c]void USART1_IRQHandler(void) { u8 data; if(USART_GetITStatus(USART1,USART_IT_RXN... { USART_ClearITPendingBit(USART1,USART_IT_... data = (USART_ReceiveData(USART1) & 0x7F); USART1_Putc(data); } }[/syntax]
Usuń całkowicie Waitms z pętli odbiornika a w nadajniku zwiększ wartość Waitms. Jak nie pomoże to zrób odbiór na przerwaniu od URXC.
Bigfoot: Przecież link działa, jak nie to wpisz sobie Bray terminal w google.
No dobra. Wywal wszystko na linii Tx telefonu do Rx procesora. Ma być połączenie bezpośrednie. Na drugim kierunku zostaw tak jak masz. Poniżej kod do testów. Powinien działać. [syntax=basic4gl]$regfile = "m32def.dat" $crystal = 16000000 $baud = 19200 Config Lcd = 16 * 2 Config Serialin = Buffered , Size = 100 Enable Interrupts 'Declare Sub Oproznij_bufor...
W HAL odbiór po USART jest napisany źle. Problem pojawia się, gdy w czasie nadawania (na przerwaniach) pojawią się dane do odbioru. Nie miałem siły aby HAL poprawiać. Najlepiej zrobić na rejestrach. HAL to działa jak Arduino. Jak uruchamia się jedną funkcję jest ok, jak kila to porażka. Na razie w I2C nie znalazłem błędów (niedomagań) a w USART, RTC,...
Wydaje mi się , że funkcja wysyłająca znak na LCD jest zbyt czasochłonna i poprostu gubisz część znaków wysłanych przez telefon.Spróbuj zapisać je do tablicy , a potem wyświetlić na LCD , pamiętając o pominięciu znaków o kodach < niż np. 0x20.Najpewniejszym wyjściem z sytuacji , jest jednak bufor FIFO , zaimplementowany w procedurze obsługi przerwania...
Witam, 1. Tak, to dobry pomysł pod warunkiem, że odbiornik i nadajnik radiowy mają zaimplementowany własny algorytm przesyłania danych, a Ty komunikujesz się z nimi za pośrednictwem UART. 2. Jeżeli chodzi tylko o odbiór danych to tak, nie będą się zakłócały. Pozdrawiam, Piotr.
Witam, mam krótkie pytanie: czy modbus rtu możemy odbierać (nadawanie mnie nie interesuje) poprzez USART tak jak tryb ASCII i jak jest to opisane w datasheet Atmegi?
Otóż nie może być w przerwaniu bo wtedy kolidowało by to z innymi przerwaniami, które się cyklicznie powtarzają. Problem jest taki, że czas obsługi tych przerwań jest różny, a więc czas poświęcony na odbiór danych też jest różny. Mogę jedynie próbować oszacować jaki przedział czasu jest przeznaczony na odbiór.
Fatalna wiadomość? Kurcze, nawet nie wiedziałem, że od kilku lat miałem problem :D 1. Pokaż ten program nadający znaki - możliwe, że jeśli nie masz nadawania opartego na buforze kołowym i przerwaniach to znaki nie są upakowane maksymalnie gęsto. 2. Jeśli znaki są odbierane z opóźnieniem po stronie ETHERNETU (znaczy badasz ich odbiór za konwerterem uart->ethernet)...
Jak używasz sprzętowego USART to nie musisz w zasadzie liczyć czasu jaki jest potrzebny na odbiór/nadanie bajtu. USART robi to sprzętowo i ładuje do bufora, a można go tak ustawić że po odebraniu bajtu zgłasza przerwanie, i wtedy odpowiednio reagujesz. Co innego z programowym, tu już timingi mają znaczenie.
Można tak, a dla danych binarnych np. pierwszy odebrany bajt może zawierać długość ramki. Wtedy kończysz odbiór w momencie odebrania określonej przez pierwszy bajt ilości bajtów. Wygodnie jest też jako ostatni bajt umieścić CRC, wtedy CRC całej ramki powinno wynosić 0, jeśli nie to mamy błąd.
Jako że SIGNAL już się nie powinno używać, chodzi Ci zapewne o ISR(USART_RXC_vect)
Przerwanie przyda się jedno odbiór ramki USART - będzie adres urządzenie + komenda, przejście w tryb nadawania. Można by i pewnie zrobić to w pętli ale jakoś wolę przerwanie jak i tak nie wykorzystam zasobów uC. Myślałem jeszcze o innym rozwiązaniu. Użyć transcriverów RS485 na każdej linii SPI, ale 8xMAX485 (po 4 w nadajniku i odbiorniku) wyjdzie zdecydowanie...
Zauważyłeś, że masz odzielne zmienne 'i' i 'bit_rx' w funkcji obsługi przerwania, niezależne od globalnych, na których działa main()?
w RxData jednak zawsze znajduje sie wartość różna od tej co wysłałem z PC. Wysyłam np 100, otrzymuję 49. Wysyłam 10 otrzymuję także 49. a jak wyślesz 2xx to otrzymujesz 50?
Czy taki bufor posiada tylko ten procesor z tej rodziny czy wszystkie :?:
Nie wszystkie procki od ST mają to sprzętowo zrobione. Z F0 to mają STM32F0x1/STM32F0x2/STM32F0x8, podobnie jak rodzina F303. W rejestrze USART_CR2 jest pole ADD: "This bit-field gives the address of the USART node or a character code to be recognized". Oczywiście należy włączyć przerwanie od znalezionego znaku: USART_CR1_CMIE// Character match interrupt...
Wystarczy że w tym samym czasie pracują dwa nadajniki , i jest problem . Możliwe że po takiej sytuacji któryś z układów zostanie uszkodzony i zwiera linię transmisyjną . Kolejnym problemem jest nieprawidłowe sterowanie sygnałem nadawanie odbiór .
UCR = 1 << TXEN | 1 << RXEN | 1 << RXCIE; sei(); Musisz tylko dorzucić bit odpowiadający za generowanie przerwań, no i włączyć przerwania. W zależności od kompilatora działa różnie UCSRB = 1<<RXCIE | 1<<TXCIE | 1<<RXEN; sei(); albo to, albo to pozdrawiam
Witam! Obsługa przerwania trwa z reguły krócej, niż odbiór pojedyńczego bitu przez USART. Drugim zabezpieczeniem jest bufor FIFO - odbierze kolejny znak, zanim odczytasz poprzedni. Pozdrawiam!
Obstawiam kłopot z wykonaniem funkcji uart_printf. Na czas jej wykonania masz blokowane wszystkie przerwania. Sprawdź flagę stanu USART - pewnie masz błąd buffer overrun. Jeśli potrzebujesz szybkości dużo wyższych niż 9600bps, to pomyśl też o XMEGA, w której odbiór danych z USART możesz zrealizować przez DMA, dzięki temu i kilka Mbps nie jest problemem.
for(;;) return 0; Zbytnio poprawna ta pętla nieskończona nie jest: w pierwszej iteracji nastąpi wyjście z funkcji main. Jeśli dobrze pamiętam, to po wyjściu z main następuje automatyczne zablokowanie przerwań oraz wejście do pętli nieskończonej. Żeby nie być gołosłownym, fragment jakiegoś kodu po skompilowaniu: 000000b2 <.do_clear_bss_start>:...
Nie wiem co masz za przejściówki, ale ważne jest sterowanie nadawanie/odbiór. W przypadku pc, zdarza się że jakieś CTSy (dodatkowe linie) są używane. Skoro masz tam kontroler, to weź dowolny scalaczek który z rs232 ttl robi rs485 i ogarnij programowo sterowanie nadawanie/odbiór. Przykład: SN65HVD82, SN65LBC184 jest tego więcej.
Witam, Moja przejściówka USB - RS232 okazała się być jakimś chińskim szajsem więc nie mogę chwilowo sprawdzić poprawności kodu. Czy ktoś mógłby rzucić okiem i stwierdzić czy poniższy kod ma szansę funkcjonować? ATmega jedynie odbiera jeden bajt po RS'sie i w zależności od tego czy jest to 1 czy 0, ustawia cały port C w stan aktywny bądź niski. Mikrokontroler:...
Witam, szukam już od dłuższego czasu programu do odbioru i nadawania znaków na atmege16 do WINAVR w języku C, ale wszystko co znajduje to albo nie działa albo widać nie jest dostosowane tylko odbioru (np. stosowane są sbi, a WINAVR tego nie zna). Czy ktoś mógłby skrobnąć kod wzorcowy, nawet dla potomnych, żeby od razu zadziałał na ATMEGA16 z rezonatorem...
Witam Chciałbym przez rs232 zapisywać zmienne z pliku txt do zewnętrznej pamięci eeprom np. 24Cxx z których będzie korzystał mikrokontroler atmega128. Od czego zacząć? Czy to będzie bardziej rozwiązanie polegające na programie w mikrokontrolerze zasysającym dane z txt i wczytującym je do eeproma czy zrezygnować z drogi mikrokontrolera i programować...
1. Nie wywołuje się samo. być może masz śmieci na linii RXD. Jeśli nic nie nadaję, to przerwanie nie wywołuje się. Atmega do komputera jest podłączona, przez ft232. Wykluczyłem zwarcie między rx,tx. Jeśli odłączę usb od komputera, to przerwanie przestaje się wywoływać. 2. Coś to za dziwna maniera, żeby najpierw włączyć nadawanie i odbiór, a potem dopiero...
Fajfer2, zanim uznasz temat za zamknięty przejrzyj ten wątek: http://www.elektroda.pl/rtvforum/topic16... Ze szczególnym uwzględnieniem uwag Freddiego i moich, bo może się okazać, że to co odbierasz na PC to będzie totalna kaszana. Prawda jest niestety bolesna i jeśli bez żadnych dodatkowych założeń chcesz przesyłać floaty na PC to najlepiej...
Po tej zmianie zrobiłeś bardzo niebezpieczny algorytm polegający na czekaniu w przerwaniu na odbiór znaku z USART. Zdefiniowałeś funkcję USART_Receive() z while() w środku i używasz jej nawet 2 razy pod rząd w przerwaniu. To zaprzeczenie istoty przerwań i potencjalne miejsce powstawania błędów. Mam propozycję. Narysuj algorytm tego co chcesz osiągnąć,...
Nadal polecam włączyć wyświetlanie ostrzeżeń przez kompilator i je wszystkie wyeliminować. Dokładniej to w taki sposób: 1) Pierwszy warning: jeśli odbiór ramki ma coś zwracać, to niech zwraca coś z sensem, a jak nie to niech nie zwraca w ogóle (void). 2) Drugi warning: odbior_ramki(d, ramka, a) -- bez gwiazdki przed d. 3) Pętla w odbior_ramki: użyć...
Witam, Proponuje koledze postąpić troszkę inaczej. Rozbudować ramkę danych dodając znak startu i znak stopu. Odbieramy znaki i pakujemy je do bufora w przerwaniu a w programie głównym sprawdzamy czy odebraliśmy bajt start i stop oraz czy liczba bajtów w buforze jest prawidłowa. Kiedyś napisałem coś takiego z tym ze miałem o tyle łatwiej że bajty start...
Z tego co mi wiadomo to w przerwaniu od odbiory poprzez USART w atmegach trzeba w ogole przeczytac rejestr UDR !! Na pierwszy rzut oka ponieważ flaga przewrwania nie jest czyszczona ( warunkiem jest odczytanie UDRn ) i zanim funkcja od LCD zdazy cokolwiek zrobić wywolywane jest kolejne przerwanie od odbioru.
Przerwanie od odbiornika jest wywoływane w momencie kiedy dana jest gotowa w rejestrze, więc ta pętla do while jest niepotrzebna (zresztą ona jest wręcz nie wskazana bo wydłuża obsługę przerwania o nie wiadomo ile czasu). Poza tym proponuję jeszcze w M8 sprawdzac rejestr UCSRA, w nim są zgłoszone ewentualne błędy (szczegóły w manualu). Poniżej działająca...
jeśli chodzi o przerwania korzystaj z SIGNAL a nie ISR (a dlaczego? to już sobie sam doczytaj) Wycinek z <avr/interrupt.h> z najnowszego AVR-GCC #if defined(__DOXYGEN__) /** \def SIGNAL(vector) \ingroup avr_interrupts \code #include <avr/interrupt.h> \endcode Introduces an interrupt handler function that runs with global...
Wysłanie danych ja ma tak: [syntax=c]USART_SendData( USART1, dane ); while( USART_GetFlagStatus( USART1, USART_FLAG_TC ) == RESET );[/syntax] A odbiór danych zrób sobie z przerwaniu.
Przy kompilacji tego programu nie masz żadnych ostrzeżeń? Dziwne. W każdym razie jeśli odebrane_dane są typu tablicowego, a funkcja USART_Transmit (char data) przyjmuje jako argument typ char, który w żaden sposób z tablicą jest niekompatybilny to masz problem. Najpewniej kompilator generuje co najmniej ostrzeżenie w tym momencie, bo to co robisz to...
Zrób odbiór na przerwaniu, a w pętli głównej tylko sprawdzaj jakąś zmienną, ustawianą w przerwaniu, czy coś przyszło, jeśli nie, to goń procka do innej roboty... ;) Acha, jak już wszystko będzie odczytane to tą zmienną sobie zerujesz... Ogólnie to można zrobić bufor, a ta zmienna będzie licznikiem nieprzetworzonych bajtów.
Były to programy na Windowsa Podn Windę nie odwołujesz się bezpośrednio do układów peryferyjnych. Robisz to za pośrednictwem sterowników. Otwierając COM nie interesuje Cie czy to VCOM na USB, port na PCI itp. Nie konfigurujesz rejestrów układu, np SPI czy I2C. Inaczej było pod DOS. Myślę że dał bym radę zaprogramować zamiennik. Kwestia czasu. Arduino...
Veni, Vidi tak, Vici nie koniecznie. W programie, który załączyłeś nie ma konfiguracji i uruchomienia USART'a (str. 139 dokumentacji). Trochę dalej przedstawiono odbiór na przerwaniu (jeżeli USART jest wyłączony to flaga przerwania zawsze zero). Spróbuj skompilować prosty kod na przerwanie od timera, ale ze wszystkim, tzn. nie tylko uruchomienie ale...
Sprawdź CKDIV8. Jakim terminalem się komunikujesz? Czy są jakieś objawy np. odbiór śmieci? Zrób na razie prosty program w pętli wysyłający co np. sekundę jakiś bajt, by sprawdzić odbiór przez terminal. Przy okazji - wiesz, że to nie ma sensu: [syntax=c]UCSR0C |=(0<<UMSEL00)|(0<<UMSEL01)| ...[/syntax] http://mikrokontrolery.blogspot.com/2011...
Kompilator i funkcja generują prawidłowe wartości ustawień. I tutaj problemu nie szukaj. Może problem jest z terminalem?? Uruchom jakiś inny terminal (zwykły HyperTerminal) i sprawdź możliwość odbioru.
http://obrazki.elektroda.pl/8659817100_1... WSTĘP Inercyjna jednostka pomiarowa o 9 stopniach swobody do określania orientacji w przestrzeni. To mały projekt czysto edukacyjny, a jego celami były: -przypomnienie sobie jak sie pisze aplikacje na PC w Qt Creator -zapoznanie się z FreeRTOS i jego implementacja na procesorze -zapoznanie...
Witam. Od dwóch dni próbuję odebrać dane z komputera na procesor. Próbowałem wysłać liczbę np: "11" odebrać ją na procesorze, dodać do niej liczbę np:"1" i ponownie wysłać na terminal (używam Realterm). Problem w tym, że nie potrafię odebrać danych z komputera. Zepsuty kabel ani układ nie wchodzi w grę bo jest echo po zwarciu maxa232 na pinach 11 i...
Cześć. Mam taki kod: sei() po wywołaniu wyświetlania tekstu na ekranie: [syntax=c]lcd_puttext_P(PSTR("Trwa lokalizowanie!"));[/syntax] Nic się nie dzieje. Jeśli jest tak jak teraz (//sei()), na wyświetlaczu pojawia się napis. Dodam, że jest to wyświetlacz na kontrolerze HD44780 podłączony do Atmegi32 w porty PD3-PD7 oraz PC0 i PC1. Fragment jest z deklaracją...
1. Jakie prędkości masz po obu stronach? 2. Nie możesz tego zrobić sprzętowo? 3. Programowo robisz odbiór i nadawanie na przerwaniach i przepisujesz z jednego bufora dane do drugiego... 4. Jakie funkcje ma pełnić Atmega? Czy ma to być tylko monitor połączenia czy co?
na początku wyświetla BOOT później cztery kreski i później wyświetla mi się na tunerze cały czas taki napis UCR stało się to po zwarciu w insalacji elekrtycznej, nie reaguje na żadne klawisze. Napięcia sprawdzone niby wszystko gra, czy problem jest w oprogramowaniu? znalazłem opis tego błędu niby znaczy UCr : Odbiór z tunera analowego ale nie wiem czy...
Witam, Tak jak w poprzedniej odpowiedzi pisałem USART działa. Jednak pojawił się problem, że nie działają mi przerwania w USART. Za pomocą kodu: ;***************************************... USART0_Receive: ; Odbiór USART0 ; czekaj aż bufor odbiorczy będzie pełny sbis UCSR0A, RXC0 rjmp USART0_Receive ; załaduj dane z rejestru...
Wiem, że HAL ma dużo błędów ale łatwo w min skonfigurować zegar, peryferia. Nie trzeba używać funkcji HAL do obsługi np USART gdzie odbiór ma niedociągnięcia. HAL SPI dadaje sie do transmisji dużych bloków danych i prościej napisac dwie linijki używając rejestrów. I2C działa całkiem dobrze. Ja nie walczę dwa dni z np konfigurowaniem EXTI, których używam...
Witam, mam dziwny problem, pomoże mi ktoś go rozwiązać? Chodzi o to, że buduję urządzenie, które na żądanie będzie mierzyło temperaturę układem DS18B20. Żądanie odbywa się poprzez naciśnięcie odpowiedniego przycisku na pilocie RC5. Całe moje urządzenie to dwa AVR: Atmega8 (jako dekoder RC5, który wysyła odebrany adres i komendę poprzez USART do drugiego...
Po co masz przewanie od odbioru USART i DMA za jednym zamachem? Masz mieć włączone przerwanie od DMA a nie od USART-a. Włącz przerwanie od DMA - ty tego nie robisz. Całkowity kisz misz - nie te przerwania co trzeba. Nie ma prawa działać.
Też mam nie mały programik na ATmega32 i urzywam multum przerwań: Timer0 Timer1 USART nadawanie i odbiór Comparator i jak narazie zero problemów. Przerwania mają jedną zasadniczą zaletę, elestyczniej wykożystują zasoby systemowe. Oczywiście należy przeliczyć zależności czasowe, bo jak przerwania będą się zbyt długo nakładać to system będzie musiał paść.
Zajrzyj tu: http://www.mcselec.com/an_126.htm http://www-ccs.cs.umass.edu/~shri/iPic.h... http://home19.inet.tele.dk/websc166/prod... http://www.propox.com/prod_page_pl.htm http://members.vol.at/home.floery/electr... http://dunkels.com/adam/uip/
przy okazji - przerwanie zakłóca działanie millis() z tego co wiem Przeglądałem ten link i tam było napisane, że millis() jest sprzętowe. Jeśli tak to przerwania nie wpływają na pracę timera, chyba, ze "sprzętowe" to ściema. Wszystko wskazuje, ze ściema, bo jeśli i micros() jest sprzętowe to dwa timery zostają zużyte. Dodano po 1 Przerwania powinno...
Musisz całkowicie zmienić obsługe slave. Po pierwsze musisz wprowadzić synchronizację, czyli machać linią SS. Po drugie odbiór w slave należałoby oprzeć na przerwania SPI - SPI nie ma wielostopniowego bufora, kolejne bity nadpisują poprzednie. W efekcie musisz mieć pewność, że zdążysz z odbiorem. To w miarę gwearantują ci przerwania, na pewno nie delaye...
Witam. Chciałbym zrobić odbiór danych z rs232 w przerwaniu. Programuje w C w WinAVR. Nie mogę znaleźć uchwytu przerwania od USART, jest jedynie od UART i nie chce działać. Nie wiem co robie źle. Dziękuję za wszelką pomoc. #include <avr/io.h> #include "delay.h" #include <avr/interrupt.h> #include <avr/signal.h> #define FOSC 16000000//...
Jak widać masz transmisję 9 bitów. Bez problemu odbierze to usart z '51 a czy z PC-ta, to nie wiem.
A może inaczej. Konwersja BIN->BCD jest czasochłonna, więc może od razu liczyć w BCD? Korekta dla BCD przy inkrementacji binarnej jest banalna, a AVR ma flagę przeniesienia z młodszej tetrady, co ułatwia liczenie. Przerwanie odbioru USART przepisuje wartość licznika do tablicy i tyle.
Temat można potraktować jako zamknięty. Problem polegał na tym, ze flagi od przerwania odbioru USART co prawda były kasowane automatycznie, ale zanim zostały skasowane przychodziło już nowe przerwanie... Dodatkowo CLK na USART2 był uruchamiany dwa razy i jak się okazało ma to duży wpływ na pracę tego ukłądu. Dlaczego? nie wiem ...
Ja mam u siebie troche inaczej. Ale najlepiej skorzystać z datasheeta bezczelnie kopiując kod. Po co Ci to L po określeniu taktowania? Piszesz w WinAVR czy czymś innym? Init: #define FOSC 8000000// Clock Speed #define BAUD_GPS 9600 #define MYUBRR_GPS FOSC/16/BAUD_GPS-1 ////////////////////////////////////////... void USART_Init( unsigned...
- może podpowiesz dlaczego funkcja wykonuje się jeden raz? Wpierw warto zrozumieć co dokładnie robi ten kod. Twoje zrozumienie może pomóc w lepszym zdiagnozowaniu problemu. Przyjrzyjmy się więc kluczowym elementom: 1. Funkcja `usart_inicjuj` jest odpowiedzialna za inicjalizację modułu komunikacji szeregowej (USART). Ustawia prędkość transmisji (BAUD),...
A jak to ma wg ciebie działać? Jednocześnie odblokowujesz przerwania odbioru USART i czytasz UDR w wątku głównym. To nie ma prawa działać, musisz się zdecydować - albo przerwania albo pooling. Druga sprawa - już we poprzendim wątki pisałem ci, że rejestr UDR odczytujesz raz dla każdego odbieranego bajtu. a w twoim ISR masz UDR odczytywane dwukrotnie.
Mieliście rację sprawdzałem nie ten bit przy odbiorze: Teraz bibliotekę zapisał tak: [syntax=c]//----------------------------... // odbiór danych //--------------------------------------... char USART_Receive(void) { unsigned char data; while (bit_is_set(UCSRA,RXC))//czekanie na zwolnienie buforu danych...
Zacznij od opisania formatu danych. Po czym odbiorca ma poznać, że zakończono przesyłanie liczby? Tego ne napisałeś powyżej. Odbiór łatwo zrobisz w przerwaniu, pisząc obsługę przerwania w konwencji automatu. Najpierw poczytaj, co oznacza poprzednie zdanie. Potem możesz zacząć pisać automat. Potrzebne tylko dwa stany: - oczekiwanie na 'L' - skanowanie...
A fusebity prawidłowo ustawione na 8 MHz? Bo wygląda to na nieprawidłowe ustawienie prędkości przesyłania. Sprawdź jeszcze odbiór przy innych prędkościach - mniejszych.
Dzięki , to z tablicami to moja pomyłka pisałem to na szybko.Jak miałem tablice 10 elementowe to było to samo.Co do wartości w TxBuf to nie mają one żadnego znaczenia gdyż chce poprostu wysłać cokolwiek. Co się tyczy USART1->CR1&=~(1<<2); to tak ma działać, czyli: 1. Odbieram dane, 2.Blokuje odbiór, 3.Aktywuje wysyłanie, 4.Wysyłam 5.Wyłączam...
coś kolega kit ciśnie ... jak się nie różnią z punktu widzenia softu ? Choćby adresy przerwań (w tym transmisji układu USART czyli rs232) są inne, i wiele innych rzeczy. Przemyśl to. Możliwe oczywiście, że to nie będzie miało wpływu akurat na Twój przypadek jednak stwierdzenie, że są to identyczne ukłądy z punktu widzenia softu - nie jest prawdziwe....
Tak, jeśli używasz przerwania to nie potrzebujesz tej funkcji. Procesor wcale nie musi się resetować, może wpadać w nieokreśloną martwą pętlę po skoczeniu do przerwania od RX (które jest nieokreślone). Program działa więc tak: wykonuje wszystko aż do napotkania funkcji USART_ReceiveByte, wchodzi do niej i oczekuje na zakończenie odbioru bajtu przez...
Jest jeszcze jedna możliwość: program, którym odbierasz dane, przerywa odbiór po odebraniu bajtu równego zero. Co jest po drugiej stronie kabla?
Absolutnie nie posiadam przykładów w Bascom, mam tylko Helpa i co nieco pamiętam, co było juz na forum... ;) Na codzień używam asm - ma mniej poleceń do zapamiętania ;) Pewnie w ATmega128 bedziesz potrzebował użyć URXC1 zamiast URXC . Ostatnio, jak oprogramowywałem odbiór USART, to zrobiłem bufor w RAM "okrężny", z którego w wolnej chwili procedurki...
Podłączasz i nic się nie pali :) W większych modelach FT są USART1, 3-5
Witam, problem po godzinach zmagań został rozwiązany dzięki Waszej pomocy. Rzeczywiście uC nie nadążał odbierać. PC wysyłał zanim uC wykonał inne czynności przed odbiorem. Pozdrawiam!
Jeśli możesz użyć biblioteki to polecam http://homepage.hispeed.ch/peterfleury/a... jeśli nie to możesz się na niej wzorować. Ma bufor kołowy, odbiór/nadawanie w przerwaniach, przykład z parsowaniem danych też znajdziesz w google. Wyświetlając komunikat zachęty powinieneś ustalić ściśle akceptowalny format, np. Time:RR-MM-DD-GG-MM-SS,...
W jaki celu w przerwaniu odbioru usart wywyłujesz funkcję USARTReadChar()? [syntax=c]char USARTReadChar() { while(!(UCSRA & (1<<RXC))) { //Do nothing } return UDR; } ISR(USART_RXC_vect) //przerwanie od odbioru danej { b = USARTReadChar(); USARTWriteChar(b); if (b == '1' ){flaga = 0;} else if (b == '2' ){flaga = 1;} else {flaga = 1;} //wysłanie...
No ok, to naprościej jak mogłem wymyślić, port B (pin 1) ustawiam jako wyjście (DDRB=0x01), a w przerwaniu takie cos: [syntax=c] volatile char znak; ISR(USART_RXC_vect) { //flaga=1; PORTB=0x01; //ustawiamy 1 pin portu B, znak=USART_Receive(); // odbiór znaku USART_Transmit(znak); } [/syntax] W przerwaniu próbuje ustawić pin, odebrać znak i wysłać go...
Przyczyn szukaj w błędnym kodzie ew. braku połączenia mas. Ani sensownej części kodu, anie schematu nie pokazałeś. Kod źle sformatowany i przez to nieczytelny, inicjowanie UART dziwne, nadawanie błędne, odbiór przez krótką chwilę a potem w krzaki (chyba, bo końca kodu nie widać). Niby jaki odstęp pomiędzy bajtami ma dawać taka pętla? Potrzebujesz odstępu...
Hej, Chciałem wysłać 3 znaki z VB do atmegi i wrzucić je na lcd. W VB stworzyłem sobie przycisk, który wykonuje następującą operację: MSComm5.Output = "123". Atmega odbiera to za pomocą kodu: [syntax=c]unsigned char odbior; int main(void) { odbior=USART_Receive(); LCD_write_char(odbior); } unsigned char USART_Receive( void ) { while ( !(UCSR0A &...
Skoro nikt mi nie potwierdził że schemat jest dobrze to ja sam potwierdzę (jest dobrze, przetestowałem na żywo). Atmega16, zewnętrzny rezonator kwarcowy 16MHz. Rzeczywiście max to 1Mbps. Teraz kolejne pytanie. Transmisja asynchroniczna działa bez problemu, natomiast jak chcę przesłać dane wykorzystując transmisje synchroniczną to odbierane są krzaki......
Witam, chce uruchomić transmisje szeregową na podanym w tytule uC i tutaj napotkalem na problem, poniewaz dokumentacja do 48 jest bardzo uboga :/ Zaimplementowalem cos, ale nie dziala. jaka uboga? o czym ty mówisz ? skąd ty takie ubogie dokumentacje bierzesz? wejdź na stronę www.atmel.com i pobierz z tamtąd pełną notę PDF do jakiego zechcesz tylko...
Raczej na odwrót - A powinno być spoczynkowo >=200 mV większe od B, wtedy na wyjściu transceiwera mamy stan wysoki. Przy odwrotnym podłączeniu jest niski, co sprawia kłopot bo odbiornik USART interpretuje to jako bit startu i mamy wieczny odbiór zer. Ok, dzięki za poradę, u mnie to nie sprawia problemów, ale i tak poprawię.
Obsługa UARTa z przerwaniami jest dużo bardziej skomplikowana niż to co pokazałeś. Szczególnie nadawanie jest problematyczne, ponieważ nie można mieć non-stop włączonego przerwania, chyba że naprawdę chcesz NON-STOP wysyłać znaki. Zwykle trzeba to zrobić tak, że jak masz do wysłania paczkę, to pierwszy bajt wysyłasz "ręcznie" i dopiero wtedy włączasz...
Prawdopodobnie nie włączyłeś przerwania odbioru danych w USART - bit RXNEIE w rejestrze CR1. A poza tym . oczekiwanie w procedurze obsługi przerwania to nie jest dobry pomysł, a właśnie to robisz. Masz poniżej tablicę do zainicjowania USART z przerwaniem odbioru w STM32F0 - adresy rejestrów i ich zawartości - wychodzi to sporo krócej niż przy użyciu...
Ja bym zaproponował takie coś : [syntax=c] if ((USART3->SR & USART_SR_TXE) && ( USART3->CR & USART_CR_TXEIE)) . . . [/syntax] I analogicznie dla pozostałych flag przerwań od UARTu.
Może i naprostuje, o ile przetłumaczysz na polski poniższe zdania: "W terminalu działa. Uart1 ma za zadanie wysłać odebraną wartość z UART0 do aplikacji PC, obecnie terminala." To, jak używasz przerwań, kompletnie nie ma sensu - wyrzuć te przerwania i zrób odbiór danych z aktywnym oczekiwaniem. Inicjowanie UART jest skopane, ale zapewne jakimś cudem...
Tak by wyglądało "przerwanie RX" w pętli głównej: if(bit_is_set(UCSRA,RXC)) { odb_x=UDR; odb_flaga = 1; } Następny etap pracy to odbiór danych przez uC z ustawieniami pracy wentylatorów użytkownika, a nie jak dotąd liczonymi ze wzoru w uC.
Atmel udostępnia gotowe noty katalogowe z opisem i kodem (w asemblerze, ale to nie problem) realizacji programowego USART. Swoją droga po co się w to bawić, nie prościej wybrać procka, który ma więcej USARTów?
W urządzeniu było mało USART, został użyty układ SC16IS760IPW. Teraz musze dodać kolejny SC16IS762IPW czyli dwa USART. Procek z USARTEM komunikuje się po SPI. Komunikacja to wysłanie adresu rejestru i zapis/odczyt danej. Teraz wszystko odbywa sie w pętli głównej, muszę jednak odbiór przenieść na przerwania. Jak sie łatwo domyśleć, nie może byc tak,...
odbiór usart atmega8 stm32 usart odbiór odbiór odbiór słaby
uniwersalne sterowniki karty graficznej wymiana cabrio elektryczna tylna klapa
Oznaczenia kabli na prądnicy SHL M17 Gazela Struktura pliku MIDI: nagłówek i ścieżki