W twoim main brak jest na koncu petli i procesor sie resetuje. Po drugie jeli korzystasz z przerwan to musisz zdeklarowac ile bajtow jest do wyslania np. w sposob w jaki pokazalem w swoim kodzie. NAQ tym to polega wskazujesz skad wyslac dane(bufor), w jakiej ilosci i procesor zajmuje sie czyms innym np. kolejnymi obliczeniami nie martwiac sie o obsluge...
Build started 6.4.2014 at 00:25:04 avr-gcc -mmcu=atmega16 -Wall -gdwarf-2 -std=gnu99 -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT Proba_10.o -MF dep/Proba_10.o.d -c ../Proba_10.c avr-gcc -mmcu=atmega16 -Wl,-Map=Proba_10.map Proba_10.o -o Proba_10.elf avr-objcopy -O ihex -R .eeprom -R .fuse -R .lock -R .signature...
Bit RXNEIE włącza przerwanie od dwóch flag: RXNE i ORE (overrun) - patrz tabelka USART interrupt requests . Odczyt z DR kasuje RXNE. ORE jest kasowane przez (cytat z opisu bitu ORE): "an read to the USART_SR register followed by a read to the USART_DR register".
A może masz gdzieś funkcję obsługi tego przerwania? Dodano po 4 Dodam, że korzystam z programowego bufora cyklicznego, który w przerwaniach odbiera dane od UDR. Jedyne co mi przychodzi na myśl to to, że przerwanie tak szybko się wykona (odebranie danych do bufora i skasowanie flagi RXC), że część programu: while ( !(UCSRA & (1<<RXC)) ); nawet...
kardynalny błąd -> oczekiwanie na co, na TC==1 ? Oczekiwanie na cokolwiek w przerwaniu jest kardynalnym błędem. Przeciez w notce katalogowej zalecają poczekać po zakonczeniu transmisji na TC. Czy aby napewno piszą to w kontexcie przerwań, czy może poczekania przez wyłączeniem danego modułu peryferyjnego? Poza tym nie odpowiedziałeś na moje pytanie,...
Jak widzisz na załaczonym obrazku nie masz ustawionych wektorów. Ale akurat mam coś takiego gotowego i Ci podeślę :) Zainstaluj Cube. Plik z wektorami weź stamtąd. Możesz też zaimportować projekt i wyrzucić HAL - będziesz miał przy okazji najświeższy CMSIS
Jeżeli Twoja funkcja transmisji wygląda podobnie jak ta: ... niektóre przerwania przestają się wykonywać. A konkretnie są tracone, jeżeli były zgłoszone wielokrotnie w czasie, gdy nie zostały obsłużone. Tak na wszelki wypadek: http://mikrokontrolery.blogspot.com/2011... Rozwiąż to także flagami, a wtedy okaże się czy to było...
Po pierwsze enkoder możesz obsługiwać sprzętowo na XMEGA - w tym celu konfigurujesz event system na QDEC, a dowolny timer będzie ci zliczał impulsy i pracował jako enkoder. Co do transmisji USART - można paczki odbierać przez DMA, co jest wygodne, można to zrobić w oparciu o przerwania. W tym celu odblokowujesz przerwanie RXComplete sygnalizujące gotowy...
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...
Format ramki wygląda na zaprojektowany specjalnie dla utrudnienia odbioru - patrz np. p.3 Twojego algorytmu. Proponuję wprowadzić znacznik początku ramki, a po nim np. bajt długości i zanegowany bajt długości - w ten sposób masz proste wykrywanie początku na podstawie 3 kolejnych bajtów. Potem mogą być dane i jakaś suma kontrolna albo CRC8 Obsługę przerwania...
Na jakiej podstawie twierdzisz, że problemem są priorytety przerwań? Przerwania występują na tyle sporadycznie, że nie ma tutaj miejsca na problemy. Jeśli wysyłany jest znak '2', to porównanie (i==2) jest błędne TCCR2 = 1<<CS00 | 1<<CS02 | 0<<CS01 ; proponuję zapisać tak: TCCR2 = (1<<CS00) | (1<<CS02) |...
Nie mogę znaleźć uchwytu przerwania od USART, jest jedynie od UART i nie chce działać. O ile mi wiadomo to nie ma żadnego rozróżznienia między przerwaniem od USART a UART. Niewazne czy Uklad transmisji szeregowej pracuje synchronicznie czy asynchronicznie i tak zawsze jest to samo przerwanie generowane. A moze by tak odblokowac przerwania od odbioru...
Nie pokazałeś całego kodu. W obsłudze przerwania nie stosuje się numerów z LCD i czymkolwiek czasochłonnym. Co do realizacji odczytu USART w przerwaniu to podpowiedź brzmi " bufor kołowy". Dodam też że po około 30min wysypują też się atmego8A, No ja się wcale temu nie dziwię, w ogóle nie dbasz o zapisanie SREG ani używanych rejestrów w obsłudze przerwania.
1. Poza tym zapis EEPROM w przerwaniu to też niedobry pomysł - to kilka ms/zapis. Od tego EEPROM generuje swoje przerwania, żeby zapisy buforować i zapisywać do EEPROM niezależnie. 2. Poza tym mieszanie ISR i SIGNAL czyli starej i nowej obsługi przerwań tez nie jest zalecane. 3. Wysyłanie znaku przez USART w obsłudze przerwania też może nie być dobrym...
Nie da się na to pytanie odpowiedzieć nie widząc kodu. USART obsługujesz w przerwaniach? Pamiętaj, że na czs jego wykonania inne przerwania są blokowane, użycie nieblokujących handlerów przerwań wymaga głębszej analizy. Ale generalnie spójrz na to w ten sposób - procesor przez 40% czasu się nudzi. Więc dla 16MHz masz sytuację taką, jakbyś miał cały...
co do odbioru masz 2 mozliwosci albo czekac az cos przyjdzie albo uzyc przerwania ".org 0x00B ;USART, RXC USART, Rx Complete" w momencie odebrania jednego bajta nastapi przerwanie. w obsludze przerwania nalezy odczytac np "in r16, UDR" a nastepnie mozemy sobie zapisac r16 np do ramu i "reti". jak bedziesz mial problem pisz na gg jestem praktycznie caly...
Zmienne globalne zajmują...... Pewnie ram dla led jest rezerwowany w chwili uruchomienia biblioteki przez memalloc. Gdybyś sam pisał obsługę led to użyłbyś tablicy o określonym rozmiarze dzięki czemu wiedziałbyś ile ram zajmuje program. Poszukaj jak wyświetlić ilość wolnej pamięci ram w czasie działania programu. Jakiś freemem jest. Trochę oszuka ale...
Mnie wychodzi, że to nie jest tryb CTC tylko normalny. Po drugie na przerwanie compare trzeba zezwolić w rejestrze TIMSK - bit OCIE0 - masz < zamiast << stąd problem. Jak masz jakieś wątpliwości co do konfiguracji, to użyj symulatora AVR Studio. Można sobie w nim też ustawić tryb pracy i odczytać wartości rejestrów kontrolnych dla niego i potem...
Domyślnie Atmel Studio w czasie debugowania blokuje przerwania podczas śledzenia krok po kroku, co ma za zadanie ułatwić śledzenie funkcji. Dodatkowo przerwanie od USART wystąpi bardzo późno - dopiero po wysłaniu bajta, co może trwać nawet kilka tysięcy cykli CPU.
Jeśli wysylasz male porcje danych i rzadko mozesz zastosowac takie roziwazanie. W inym przypadku proponuje wykorzystac przerwania i zrobic jakis buforek nadawczy/odbiorczy.
Hint : przesuniecia bitowe ( co_posuwamy_w_prawo>>o_ile lub co_posuwamy_w_lewo<<o_ile )... BTW Problem był również w nazwie przerwania (zamiast SIG_USART_RXC powinno być SIG_UART_RECV )
Na pewno z tego powodu przerwania nie mogły przestać działać. Przebudowałeś cały projekt?
... Dlaczego tak się dzieje? :/ Dlatego, że przerwanie ISR(TIMER1_COMPA_vect) jest wywoływane co 128 taktów zegara, a wykonanie procedury przerwania timera1 zajmuje ~200 taktów. Po zakończeniu wykonywania przerwania od timera, gdy uC wraca do programu głównego, ma już ustawioną flagę od OCR1 i ewentualnie flagę RXC. Ponieważ timer "stoi wyżej" w hierarchii...
Zacznijmy od pytań: 1. Które bity według Ciebie ustawiłeś w TCCR2B : Autor tematu pisał, że stosuje gotową bibliotekę do obsługi jakiegoś panelu dotykowego. Z tego, co zrozumiałem, to przerwanie to znajduje się we "wnętrzu" tej biblioteki. Takie efekty są oczywiście normalne, gdy ktoś mało świadomy tego, co się dzieje w jego programie stosuje gotowe...
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...
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...
Schematu nie widzę. Napisałem Ci już jakie tranzystory możesz tam zapakować. Kosztują <0,50PLN/sztukę w TME, więc tanio. W dokumentacji do wyświetlaczy sprawdź maksymalny prąd i na początek ogranicz prąd maksymalny do tej wartości (prawdopodobnie 20-60mA). Program do napisania od nowa. 1. Po co zewnętrzny prescaler, jeżeli licznik TIM0 ma wbudowany...
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...
No to szukaj błędu w ustawieniach zegara - skąd bierzesz przebieg wejściowy, częstotliwość (sprawdź czy dobrze ustawiona w module startowym), wywołanie SystemCoreClockUpdate itp... Prosty test: zaprogramuj timer i procedurę przerwania od niego an miganie diodą z częstotliwością 1Hz i zmierz sekundnikiem czas np. 60 mignięć.
1. Masz odpowiednie definicje rejestrów i wartości do wpisania w nagłówkach CMSIS. 2. Nie. Wpisujesz bit PENDSVSET i przerwanie jest pending ;) 3. Nie ma najniższego priorytetu. Trzeba ustawić. Jeżeli pytanie pierwsze jest przeczące to czy dobrze rozumiem, że wystarczy wpisać 1 w PENDSVSET a wychodząc 1 w PENDSVCLR ? Clear sie sam robi po wykonaniu...
W przerwaniu USART_RXC musisz odczytać UDR niezależnie od warunków umieszczonych w kodzie, najlepiej, kopiując wartość tego rejestru do lokalnej zmiennej, tuż na początku funkcji. Jeżeli tego nie zrobisz, procesor zakolejkuje kolejne przerwanie. Piszę to na podstawie dokumentacji AVR8. W Twoim przypadku, gdy bufor odbiorczy się zapełni i nadejdzie kolejny...
Zastanówcie się Koledzy, co się będzie działo, kiedy wrzucicie do UDR ostatni bajt do nadania. Kto i kiedy skasuje zgłoszenie przerwania TXD po wysłaniu tego bajtu? W obsłudze przerwania to nie nastąpi, więc przerwanie pozostanie zgłoszone i będzie obsługiwane na okrągło - patrz granica stron 137/138 aktualnej wersji (aa) doc2486.pdf Flaga przerwania...
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...
3) Generalnie na początku makra SIGNAL wyłączane są przerwania (funkcja cli), a na końcu są odblokowywane (sei), tak więc nie ma zagnieżdżenia przerwań, po prostu niektóre pomiary gubisz. 2) wg noty katalogowej do masy przez kondensator 1) jeśli ich nie używasz, to należy je ustawić jako WYJŚCIE, i można na nich ustawić stan 0. Nie powinny wisieć w...
USART sprzętowo nadaje cały bajt, wraz z bitem startu, stopu i parzystości. PRzerwanie w czasie takiej transmisji nic nie zakłóci. Co najwyżej do nadania kolejnego bajtu minie jakiś czas, ale to nie problem, gdyż każdy bajt ma swój bit startu, w efekcie odbiornik to poprawnie odbierze.
Co do programu na megę328: 1. Niepotrzebnie dołączasz sfr_defs.h 2. O F_CPU w kodzie było już miliony razy na forum. 3. Dla ułatwienia obliczeń prędkości polecam util/setbaud.h 4. W rejestrze UCSR0C ustawiasz bity, które po resecie są ustawione. 5. W UCSR0B nie włączasz przerwania od odbioru (bit RXCIE)! Dodatkowo niepotrzebnie stosujesz sumę bitową...
Witam, Gdy próbuje skonfigurować dwa USART i przerwania do nich powstaje konflikt. Wystarczy, że odłącze kabel od USART1 i wtedy wysłanie komendy do komputera wraca do normy. Definiowanie: [syntax=c]RCC_AHBPeriphClockCmd(RCC_AHBP... ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_US... ENABLE); RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIO... ENABLE);...
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...
To, co nazywasz "liczba" po polsku nazywa się "cyfra". Aby uzyskać wartość cyfry musisz odjąć od niej kod zera, czyli wartosc = znak - '0'; Obsługa przerwania odbioru transmisji powinna działać w min. 2 stanach: oczekiwania na cokolwiek i skanowania liczby. W stanie podstawowym po napotkaniu pierwszej cyfry zerujesz liczbę (albo i nie), zapisujesz w...
Kolejny raz widzimy to samo. Zamiast dobrać kontroler do zadania, to próbujesz na siłę dopasować zadanie do kontrolera leżącego w szufladzie. Tutaj o tyle gorzej, że nawet się nie zastanowiłeś ile zasobów potrzebujesz, tylko od razu przyjmujesz 2 albo 3(!) kontrolery do w sumie bardzo prostej aplikacji. Moim zdaniem wszystko zrobisz na jednym uC i może...
1. W jaki sposób piszecie kod do obsługi peryferiów występujących pojedyńczo w mikrokontrolerze? Np RTC, LCD, RNG, czy CRC. Najzupełniej normalnie, czyli jako zwyczajną klasę. Jeśli jest tylko jeden taki układ peryferyjny, to w projekcie po prostu mam jeden taki obiekt. Z pewnością nie bawię się w żadne singletony czy klasę w której wszystko jest statyczne....
Witaj a nie masz czasem "wiszącego" wyprowadzeni rx bez włączonego wewnętrznego podciągania ? To wygląda jak by wyprowadzenie było wiszące i nigdzie nie podłączone bo bez względu na błąd prędkości jeśli zachowa taki sam stan uart nie odbierze ani jednego znaku .
Zapytaj profesora (ma tytuł profesora?) po co ta wiedza? 8253 ciężko już kupić (bi i po co, chyba, że ktoś chce składać PC XT), 8051 jest coraz mniejszy wybór. Biorą pod uwagę czas nauki i zmiany na rynku elektroniki, w szkole powinni uczyć o najnowszych uC a nie tego, czego za 5 lat nie będzie na rynku. Każdy współczeny uC zawiera bardziej zaawansowane...
Nie znam tego kompilatora ale skoro to działało na ATmega8 to tylko się w 128 zmieniły adresy rejestrów oraz wektorów przerwań. Sprawdź to a najlepiej zobacz w listingu czy jest właściwie umieszczony wektor przerwania.
(at)tmf - dziękuję za miłe słowa :) Właśnie takie było założenie co do grupy "docelowej". Myślę, że jeszcze długo ATmegi i ATtiny będą punktem startowym dla hobbystów ze względu na nawał informacji w Internecie i mocno zakorzeniony pogląd jakoby wszystko inne było drogie/trudne itd. W sumie chciałem, żeby w poradniku było trochę więcej nawiązań do...
Domyślnie są wyłączone, a co robi z nimi SPL - to już tajemnica jej twórców. Rozsądni ludzie nie korzystają z bibliotek typu SPL, a jeśli korzystają - to nie używają nadmiarowych wywołań, które mają za zadanie wpisać do rejestru to samo, co już tam jest. Poprawne zainicjowanie UART bez SPL - to jakieś 4..5 linijek kodu. ClearITpendingBit jest bez sensu...
Mam jeszcze takie pytanie. Czy komunikacja poprzez USART powinna działać w oparciu o przerwania czy w oparciu o zwykłe funkcje też może być? Chodzi mi oto czy w bardziej zaawansowanym projekcie nie napotkam później jakiś przeszkód i nie będę musiał przerabiać całości. Pozdrawiam Można zrobić to na oba sposoby z tym że na przerwaniach jest znacznie...
Mówiąc uboga mialem na mysli to, ze do ATmegi8 czy ATmegi16 dokumentacje sa znacznie bardziej dokladne, np. rejestr UCSRC w ATmedze8 jest dobrze opisany, a do ATmegi48 znlazlem tylko tyle, ze nazywa sie UCSR0C... , ale mniejsza o to. no ale właśnie nie żadna mniejsza o to, tylko zassij sobie pełnego PDF'a gdzie wszystko masz dokładniusieńko opisane....
Niestety ale stosowanie funkcji do wyświetlania na LCD w przerwaniach nawet w celach diagnostycznych może nie być poprawnym podejściem do tematu przerwań ;) Jaki jest powód, że chcesz zastosować bufor cykliczny? [url=http://www.sadistic.pl/pics/2_baed7...
A globalną flagę przerwań odblokowałeś?
przerwania usart atmega16 przerwania usart usart przerwania stm32
naprawa biosu compaq programowanie pilotów alarmu skoda automatyczne przełączanie sygnału
odzyskiwanie srebra delonghi zawor spieniacza
Jak odpalić traktorek kosiarkę na krótko? Asus – odmowa gwarancji, laptop nie włącza się i nie ładuje baterii, diagnoza uszkodzenia mechanicznego