Po prostu uzywamy zmiennej typu volatile, gdy chcemy miec zawsze biezaca wartosc zmiennej, i cos innego moze nam ja zmienic w polowie wykonywania fkcji. Jesli masz na przyklad fkcje czytajaca z klawiatury na timerze (a wiec na przerwaniu), oraz glowny program, wykonujacy jakies zadania w zaleznosci od tego, co zostalo wcisniete - nalezy uzyc zmiennej...
Co jest źle? To co zwykle, to co zawsze, to o czym pisane jest w 95% tematów o problemach z przerwaniami. http://en.wikipedia.org/wiki/Volatile_va... 4\/3!!
Czy z przerwania mogę zwrócić daną do głównego programu (jako dana globalna) ?? Tutaj znajdziesz odpowiedź: http://mikrokontrolery.blogspot.com/2011...
Witam, Przyczyn jest kilka: 1.stosowanie procedury _delay_ms() Ponieważ procedura ta ma atrybut "always_inline" to w momencie gdy jej użyjesz w swoim programie nastąpi wstawienie całego kodu tej procedury w każdym miejscu jej użycia. Czyli użyjesz 20 razy to 20 razy zostanie powielony kod. Usunięcie _dalay_ms zmniejsza kod do ok 1800 bajtów. Ponieważ...
Pisane z głowy i na szybko. [syntax=cpp] volatile int8_t stan; ISR (INT0_vect) { if (stan == 1) stan = 0; else stan = 1; } int main(void) { DDRD=0xff; PORTD=0x00; DDRC=0xff; stan = 0; MCUCR |= (1<<ISC01);//poczytaj o tym GICR |= (1<<INT0);/// i o tym sei(); uruchamia mozliwos uruchamiania przerwan while(1) { if (stan == 0) { while(1) { cośtam...
Nie mam takiego sprzętu. Napisałem coś takiego: [syntax=c] volatile uint8_t i=0; // LICZBA PRZERWAN volatile uint8_t freq=0; // CZESTOTLIWOSC volatile uint8_t pr=0; // ZMIENNA USTAWIANA CO PODSTAWE CZASU 0,025 S int main(void) { lcd_init(); // INICJALIZACJA WYSW. sei();// GLOBALNE PRZERWANIA TCCR2=(1<<WGM21)|(1<<CS22)|(...
twój program doskonale miga diodą zgodnie z zamierzeniem ale musisz poczekać nie sekundę a kilka minut bo z powodu niezerowania licznika count kolejne mrugnięcie zachodzi dopiero po przekręceniu inta :) (btw. w tej sytuacji volatile jest niepotrzebne)
(at)dawid.barracuda Na pewno nie powinieneś robić na siłę samemu. Potrzebujesz modułu, który implementuje algorytm FIFO aby w elegancki sposób obsłużyć UARTA. Warto się posłużyć implementacją, która już działa. Możesz pokusić się o własną implementację ale mimo wszystko wzorować się na czymś sprawdzonym. Taki moduł będziesz mógł sobie w przyszłości...
Teraz zauważyłem, że trochę się machnąłem (dwa odejmowania jedynki). Oczywiście, że możesz tak zrobić - ja wydzieliłem dodatkową zmienną ze względu na optymalizację: aby uniknąć dwóch odczytów zmiennej volatile. Różnica będzie w dosłownie czterech czy pięciu cyklach. Jak chcesz, to możesz nawet napisać tak: [syntax=C]ISR(TIMER...) { if(cnt_busy && --cnt_val...
Jeżeli odwołujesz się do zmiennej w pętli głównej i w przerwaniu zadeklaruj ją jako volatile .
Oto kod: Nie wiem, czy to może być przyczyną, ale taka deklaracja oznacza "wskaźnik na ulotne dane", a potrzebny jest "ulotny wskaźnik" czyli [syntax=c] char * volatile wskaznik; [/syntax] Oczywiście volatile z przodu też może być niezależnie.
Jeszcze przy zmiennych występujących w przerwaniach dodaj modyfikator volatile .
Nie mam teraz kodu przed oczami ale mniej wiecej wyglada to tak w duzym skrocie, wszystkie ustawienia timera itd sa poprawnie zainicjowane: unsigned int timovf; SIGNAL (SIG_OVERFLOW0) { timovf++; } void initialize(void) { //ustawienia timera,przerwan,wlaczenie wszystkiego timovf = 0; } int main(void) { initialize(); for(;;) { if(timovf == 15) { timovf...
Niestety problem znów się pojawił: Program nie wchodzi do pętli while, gdzie warunek jest niespełniony dopiero po zatrzymaniu dopiero co ustawionego rejestru licznika, próbowałem jeszcze inny sposób, z bitami zmiennej flag ustawianymi w przerwaniach - do przerwania wchodzi, ale jak wróci do programu to nie wychodzi z pętli - tak jakby warunek był cały...
Dzięki wielkie- ale to nie do mnie pisałeś. O Atomic_Block dowiedziałem się w czwartek- sprawdziłem- od czwartku jest to pierwsza wiadomość na ten temat. A wracając do tematu Fir3man- wymyśliłem taki schemat programu: #include <stdint.h> #include <avr/io.h> #include <stdlib.h> #include <avr/interrupt.h> volatile uint8_t dol;...
Pomoglo i juz wszystko ladnie hula nie wiem czemu ale volatile jakos zwykle kojazylo mi sie ze zmniennymi wspoluzywanymi w procedurach obsl przerwan no coz... czlowiek sie cale zycie uczy i umiera ... Dzieki za pomoc!
Witam volatile struct _sTime { volatile uint8_t uiHours; volatile uint8_t uiMinute; volatile uint8_t uiSecond; }; ... ... if((60*sTime.uiMinute + sTime.uiSecond)>=600) { eMAIN_AutomatState = SERVICE_accepted; } if(true==volatileEverySecondsToggle && FREE==TxBufor_0.eTxStatuss)//tylko do spr. że...
Bzdura. Zmienna jest volatile. Twój "optymalny kod" nie ma nic wspólnego z założeniami. Prawdopodobnie nie wiesz co znaczy volatile I dlaczegozostal użyty. Twój "super kod" idealnie się nadaje do sprawdzania zmiennej w przerwani u
Nie umiem arduino i zrobiłem na rejestrach dla UNO z megą 328/328p. Powinno działać. Dla mega wystarczy zmienić nazwy rejestrów w funkcjach startujących i zatrzymujących timer. Obsługa opóźnienia zrealizowana na timerze pierwszym. [syntax=c]#include <avr/interrupt.h> volatile int timer_cnt=0; // tutaj definiujesz co po jakim czasie przekaznik...
[syntax=c] ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {Time_out=0;}; int x; do { ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { x=Time_out;); } while (x < 1000); [/syntax]
Powód jest bardzo prosty: zmniejszenie zmiennej w pamięci nie jest operacją atomową. Co prawda za każdym razem następuje odczytanie zmiennej, zmniejszenie jej a następnie zapis, to jeśli przerwanie wystąpi pomiędzy odczytem a zapisem, to utracisz zmianę dokonaną w przerwaniu. W przypadku gdy przerwanie i funkcja main konkurują o jeden zasób, musisz...
Właściwie nie musi mieć. Jeśli przerwania są co kilka-kilkanaście ms to eliminacja drgań robi się niejako przy okazji.
a co jest nie tak z pętlą while(1) bo nie mogę się dopatrzeć To, że jest pusta. Stan zmiennej flaga sprawdzasz tylko raz na początku programu, po czym zapętlasz go w pustej pętli. Poza tym sprawdzanie if(flaga=1) jest błędem, zapewne miało być if(flaga==1) - przeczytaj ostrzeżenia kompilatora generowane w czasie kompilacji.
Najprościej to chyba tak: [syntax=c] #include <avr/io.h> #include <avr/interrupt.h> #define TIMERSTART 6 volatile uint8_t FLAGA_50 = 0; volatile uint8_t FLAGA_1000 = 0; // funkcja obslugi przerwania TIMER0_OVF 8MHz / 64 * 250 wychodzi co 2ms // dla innego taktowania nalezy ustawic inny preskaler i/lub inne liczniki stawiania flag ISR(TIMER0_OVF_vect)...
Problem tkwi w miejscu gdzie są inicjowane wartości zmiennych do odnierzania czasu. Niestety nie :( Problem tkwi tu: /* TIMSK = 130; // globalne odblokowanie przerwań /* TIMSK |=(1<<TOIE1); Skąd wytrzasnąłeś te 130 :?: Piotrek PS A jaki to proc :?:
I funkcje opóźniające w przerwaniu to trochę głupia rzecz. Prócz tego poczytaj może o słowie kluczowym volatile.Oczywiście jak już poprawisz te wcześniej wspomniane rejestry...
Chciałbym zmierzyć jak długo wykonuje się przerwanie od DMA po zakończeniu transmisji z I2S. Myślałem nad uruchomieniem jakiegoś timera, który będzie zliczał mikrosekundy, ale kiedy wykonuje się jedno przerwanie z najwyższym priorytetem to inne są hamowane. Dobrze kombinujesz! Ale trochę przekombinowujesz :). Nie potrzebujesz żadnych dodatkowych przerwań...
https://obrazki.elektroda.pl/7496355900_... Niby nic szczególnego, 120 ledów uC Mega324 taktowana 18,4321MHz. Schemat jest bardzo prosty, więc sobie go daruję (procek, kwarc, bramka NOT), nietypowe jak na AVR mega jest sterowanie przez USART na przerwaniach. Poniżej istotny fragment kodu: W sumie to mogą być włączone przerwania SIGNAL...
1/ jak kolwiek brakuje Ci w kodzie wywolania usart_init() 2/ brakuje tez brakuje zalaczenia przerwan: asm volatile("sei"::... 3/ kolejna sprawa, to ze niewiem, czy zmienna "events" jest z atrybutem volatile - jesli nie, to: while(!events) { }; skompiluje sie do czegos takiego: if(!events) while(1)...
Potrzebuję pomocy w przerwaniu pętli while (linijka 146) założenie jest takie jeżeli BlutoothDane=s to ma wykonać tą pętle a jeżeli BlutoothDane=d to ma ją przerwać. problem jest taki, że nie przerywa pętli cały układ ma działać jako sterownik Led na bluetooth. Proszę o szybką pomoc. Masz tu kilka nieprawidłowości; Jakie znaczenie i zastosowanie ma...
Wystarczy policzyć. 19200 bps = 1920 znaków na sekundę, czyli znak co ~0,5 ms. Przy taktowaniu 4MHz masz +/- 2080 cykli procesora pomiędzy przerwaniami od UARTa, czyli duuużo czasu na wykonywanie instrukcji w pętli głównej. Na Twoim miejscu skupiłbym się na przetwarzaniu tekstu np. linia po linii - przerwanie wypełnia bufor, a po wykryciu sekwencji...
Mam do zrobienia program o następującym działaniu: przerwaniem zewnętrznym (INT0) uruchamiam całą machinę - czas zaczyna być mierzony, kolejnym przerwaniem zewnętrznym (INT1) robię STOP, i w tym momencie wynik powinien być wyświetlony na wyświetlaczu LCD. Niestety jak chce odpalić program już na płytce to się nic kompletnie nie dzieje. Zapewne coś jest...
1. Do tego co napisał Fredy wyżej: http://mikrokontrolery.blogspot.com/2011... 2. Zmienną akt_wyswietlacz zdefiniuj sobie jako lokalną statyczną w funkcji przerwania. 3. F_CPU definiuj w opcjach, a nie w kodzie: http://mikrokontrolery.blogspot.com/2011... 4. W jakim celu zerujesz TCNT2 w przerwaniu...
http://4programmers.net/C/Volatile , kolejność jest taka język c i konsola na kompie , a później mikro kontrolery , bo będziesz się bujał z takimi głupimi błędami
Raczej doczytał, bo wstawił przed deklaracjami zmiennych, a jeśli rozwiązaniem jest wstawienie volatile też wewnątrz struktury, to raczej nie jest to oczywiste bez doświadczenia z C.
myślałem że mogę wpisać praktycznie częstotliwość taktowania procka. Po zastanowieniu wiem że to niemożliwe. Podzielnik przez 8 można włączyć. Dodano po 4 Nie każdy pływa z zamiarem udziału w olimpiadzie ;-) Jest coś takiego jak hobby, ciekawość... na różnym poziomie wiedzy. Tu użyj CubeMX. Prosto, szybko i przyjemnie. Dużo kursów jest na Forbocie,...
Przepraszam ze nie odpisałem ale nie miałem zupełnie czasu. Wymyśliłem coś takiego (program ma dzialac na Atmega99PA czestotliwość zegara to ok 100kHz: [syntax=c] #include <avr/interrupt.h> . . . /*przerwania*/ volatile unsigned int licznik=0; uint8_t przerwanie=1; ISR (INT0_vect) { if (przerwanie==1) { TCNT1=0; EICRA=_BV(ISC01)|_BV(ISC00); /*Reakcja...
W pętli głównej robisz operację R-M-W na rejestrze EICRA, który modyfikujesz też z przerwania. Do tego Twoja funkcje ustaw_wyzwalanie_poziomem() i ustaw_wyzwalanie_zboczem() na 100% nie robią tego co chcesz, bo aby to robiły to musiałbyś zerować też kilka innych bitów, a nie tylko używać "|=". Spojrzałem jeszcze raz w dokumentacje. Okazało się że pomyliłem...
Zmienną 'flaga' ustalasz w przerwaniu wiec powinna być volatile. p.s. Samych rejestrów nie sprawdzalem.
Wydaje mi się że po prostu użyj jakieś flagi i zmiennej globalnej która zapamięta wartość PORTC w momencie wejścia do przerwania. Aby rzeczywiste wartość ta była zachowane użyj zmiennej volatile char to znaczy wchodząc do przerwania funkcja będzie wykonywana na tej zmiennej a nie na jej kopii.
Nie chcę grać roli lokalnego guru (zwłaszcza korzystającego z cudzych stron WWW), ale widzę następujące błędy: F_CPU nie defniuje się w kodzie -> http://mikrokontrolery.blogspot.com/2011... Twoje zmienne używane w przerwaniu powinny być volatile -> http://mikrokontrolery.blogspot.com/2011... Nie...
Kliknij tutaj: [url=http://avr-libc.nongnu.org/user-man...
a słyszałeś kiedyś o zmiennych typu volatile ???? poczytaj sobie do czego służy słówko volatile a na pewno szybko poradzisz sobie z tym problemem
Uwaga! 1) Jeżeli zmienną licznik będziesz miał zadeklarowaną wewnątrz funkcji obsługującej przerwanie to przykładowa deklaracja powinna wyglądać tak: static uint8_t licznik = 0; 2) Jeżeli natomiast zmienną licznik zadeklarujesz gdzieś w programie głównym, wtedy powinieneś ją przykładowo zadeklarować jako: volatile uint8_t licznik = 0; po co te "przedrostki"...
i jak zwykle, odpowiedz standardowa - volatile. ile razy bedzie musiala jeszcze pasc, aby forumowicze znajdywali ja w wyszukiwarce, a nie pytali o nia co chwile? 4\/3!!
Jeśli wartość OKRES nic nie zmienia, to masz gdzieś gruby błąd. Prawdopodobnie skrzyżowałaś różne kawałki kodu i wyszło coś, nad czym nie panujesz. W moim kodzie 3 kanały są ciągle mierzone przez ADC, a wartość OKRES reguluje tylko to, jak często czytasz/przetwarzasz te pomiary. Tak to się robi w rzeczywistych zastosowaniach, gdzie zwykle musisz mieć...
Poczytaj o zmiennych globalnych typu volatile. Zamykam
Wyrzuć te delay'e. Zmienną licznik jak radzili koledzy zmień na volatile. Zmień sei(); na SREG |= (1<<7); Jeśli będzie działać, to zapytam jakiej wersji avr studio używasz? [syntax=cpp] #include <avr/io.h> #include <avr/interrupt.h> volatile uint8_t Count = 0; ISR(TIMER0_OVF_vect) { Count++; TCNT0 = 0; } int main(void) { DDRB = 0xFF;...
Tego rodzaju kod najprościej Ci będzie opisać za pomocą automatu, może kod nie będzie aż tak szybki, ale na pewno będzie się go dało zrozumieć :) setjmp/longjmp też może być, ale to działa raz (tj. dla jednego przerwania), struktura sigjmp_buf zajmuje 23/24 bajty na AVR a zapamietanie/wykonanie skoku też zajmuje kilkanaście instrukcji. Szkielet implementacji...
Witam, Zmienna l (i wszystkie inne uaktualniane w przerwaniach) powinna być zadeklarowana jako volatile: volatile unsigned int l; Dzięki temu kompilator wie, że może ona zmienić wartość poza kontrolą kompilatora np. w przerwaniu. Takiej zmiennej kompilator np. nie usunie podczas optymalizacji Twojego programu :) PS. w PHP operatory wyglądają tak samo,...
optymalizacje mam na -OS, przestawić na O2 lub O3 ?? Przy tak minimalnym kodzie nic to nie zmieni Spróbuj z taką procedurą przerwania: [syntax=c]ISR(INT0_vect, ISR_NAKED) { asm volatile( "pushr24" "\n\t" "inr24, 0x09" "\n\t" "pushr0" "\n\t" "inr0, 0x3f" "\n\t" "pushr0" "\n\t" "pushr1" "\n\t" "pushr25" "\n\t" "pushr30" "\n\t" "pushr31" "\n\t" "ldsr25,...
Dopisz "volatile".
Procedura obliczenia() musi być wykonana po każdym przepełnieniu timera i tylko po przepełnieniu timera (musi się wykonać dokładnie tyle samo razy ile razy wystąpiło przerwanie timera). Wymagana jest też w szybka reakcja na inne przerwania - szybsza niż trwają obliczenia() Prawie dobre rozwiązanie nr 1(pseudokod): Proszę wytknięcie błędów, opinie który...
#include <avr/io.h> #include <avr/interrupt.h> // funkcje sei(), cli() #include <stdlib.h> volatile int a=0; ISR(TIMER0_OVF_vect) { a+=1; } int main( void ) { //rejestry od timera 0 TCCR0 = _BV(CS02)|_BV(CS00);//pr... 1024 TIMSK = _BV(OCIE0); //włącza przerwanie...
Nie masz dostępu do zmiennej, czy po prostu odczyt zawsze zwraca tą samą wartość (efekt braku volatile przy deklarowaniu zmiennej używanej przez przerwanie)? Bez "volatile" kompilator zoptymalizuje odwołania do zmiennej "status" w funkcji main - zmienna nie jest nigdy odczytywana (kompilator nie uwzględnia tego, że może przyjść przerwanie - widzi tylko...
Wpisać magiczne "volatile" volatile int sekunda=0;
1. Zbędny atrybut volatile w deklaracji AdcVal. 2. Czy AWD jest jedynym źródłem przerwania ADC? 3. Kasować bit zgłoszenia przerwania należy na początku procedury obsługi przerwania. nie wiem, aj to jest W STM32, ale w wielu innych Cortexach Zgłoszenie przerwania nie zdąży się w takiej sytuacji skasować i powtórnie wejdziesz w obsługę przerwania.
Nie wiem, skąd jest ten przykład "wzięty", ale odbieranie danych przez klienta I2C powinno być realizowane w funkcji receiveEvent() (wywoływana z ISR), a nie w pętli loop(). [syntax=c] volatile byte buf [32]; // called by interrupt service routine when incoming data arrives void receiveEvent (int howMany) { for (byte i = 0; i < howMany; i++) { buf...
o volatile się zapomniało :P // no tak w przerwaniu :P a ruszasz coś układem? może źle jest cuś przylutowane ? Z taktowaniem może też coś nie tak? Może z zasilaniem? Może to wpływ wiatrów słonecznych ?
Wkleję cały program: = 0x33" naprawiło problem, więc gdzieś tu tkwi szkopuł. Bo jeśli dobrze rozumuję , to: bajt XX10 XX11 & ~0x33 1100 1100 ( czyli ~(0011 0011)) bajt XX00 XX00 PD7 jest niepodłączone. PD6 to wyjście na tranzystor (przez rezystor). Nie mam schematu, ale układ elektrycznie działa ok. PD2 i PD3 to switch'e zwierające do masy. Drugi...
obsłużyć wydarzenie jakim jest skonczenie odbierania znaku ? Chodzi mi to to aby program w pętli głównej robił co do niego należy, nie wiedząc kiedy ma spodziewac się znaku, jednakże cały czas byłby na to gotowy-aby go odebrać. tak na szybko algorytm: volatile char bufor[50]; volatile int ilosc_znakow; volatile char bufor_2[50]; int...
Czesc Program ma za zadanie mierzyc szerokosc impulsu za pomoca przerwania INT1. W skrocie dziala to tak ze podczas zbocza narastajacego wykonuje sie przerwanie ktore wlacza timer. Timer ma swoje wlasne przerwanie od przepelnienia i zlicza pelne cykle przepelnienien. Gdy pojawi sie zbocze opadajace to wylacza timer i zapisuje jego wartosc ktora nastepnie...
Load Timer0 = 45 - jak sądzę oznacza nadanie wartości początkowej timerowi. Oznacza to, że powinieneś załadować tę wartość do rejestru TCNT0. Zakładam, że funkcja inicjująca BASOM inicjuje go w tryb normalny (czyli mode 0). W funkcji przerwania: - Incr A, Incr B - po prostu dodaj jeden do zmiennych A i B lub wykonaj inkrementację - If A = 305 Then ......
ps. w manualu wyczytałem, że TIM0_OVF_vect jest tylko dla atiny. Dla atmegi32 jest TIMER0_OVF_vect pomyliłem się, sorki. i jest błąd bo volatile uint8_t overflow; uint8_t to 0-255, nie wiem jak to wygląda po skompilowaniu. if (overflow < 512) { PORTC = 1 << 1; } else { PORTC = 1 << 2; } if (overflow >...
Czy pamiętałeś o włączeniu portów w ODPOWIEDNIM rejestrze APBENR? volatile nie ma nic wspólnego z AVR. Tego atrybutu używa się np. wtedy, kiedy zmienna modyfikowana przez obsługę przerwania jest testowana przez inny fragment kodu. Pokaż kod procedury przerwania, bo coś tam narozrabiałeś.
Zmienna sek powinna być volatile: http://mikrokontrolery.blogspot.com/2011... ssek natomiast zrób statyczną w funkcji przerwania: unsigned tam gdzie liczby nie będą ze znakiem. Wprawdzie ani godziny, ani minuty, czy też sekundy nie przekroczą maksymalnych ich wartości, ale porządek warto mieć. Poza tym, taktujesz swój mikrokontroler...
Dałem pętlę while(1) w main i dioda nadal nie miga. Gdze ją dodałeś? U mnie działa. [syntax=c] #include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h> #define LED_PIN (1<<PD7) #define LED_TOG PORTD ^=LED_PIN volatile int licz; int main(void) { DDRD |= LED_PIN; TCCR0 |= (1<<CS02); TIMSK |= (1<<TOIE0);...
Tak jak piszą koledzy - utworzyć lokalną kopię zmiennej counter, żeby nie była volatile w przerwaniu. Ale prawdziwa optymalizacja to zmiana algorytmu - jak pamiętam chodzi ci o 12-kanałowy PWM. Lepiej więc zrobić tablicę przechowującą stan kanałów w danej jednostce czasu, wtedy 16-kanałowy PWM to będzie tylko PORTB=channel[counter].lo; PORTD=channel[counter].hi....
Spróbuj zrobić od przepełnienia. W proteus'ie też port zmieni raz stan i nic. volatile int flaga; #include <avr/io.h> #include <avr/interrupt.h> int main (void) { DDRC = 0xff; // Ustaw jako wyjście LED TIMSK = 0x04; // Włącz przerwania przepełnienia (1 <<TOIE1) SREG = 0x80; // włącz przerwania globalne sei()...
1. Na poczatku użyłeś obecnie obowiązująca formę w odniesieniu do przerwania INT1 : ISR(INT1_vect) a teraz starszą w odniesieniu do przerwania INT0 SIGNAL(SIG_INTERRUPT0) Czy zainstalowałeś starszą wersję WinAVR ? 2. O co chodzi z : asm volatile ("WDR"::); i jak to się ma do _delay_ms(); skoro w programie...
a _delay_ms i _delay_us Ci nie wystarcza ? Do opóźnień nie trzeba wykorzystywać koniecznie przerwań timera. Można wykorzystać flagi timera (o ile się da, ale wszystko zależy). Poza tym, zmienna deb w Twoim programie zapewne nie jest volatile, ale wrzuciłeś nam NIC, także pomoc też nijaka
słowo kluczowe "volatile"
W poradniku Szczywronka opis konfiguracji zegara był dokładnie opisany dla STM32F103. Przepisanie kodu stamtąd powinno dać Ci poprawny wynik konfiguracji. Teraz piszę z pomocą CMSIS". Pracę z STM zaczynam zawsze od przygotowania funkcji SystemClockConfig() jak to opisano w poradniku, posiłkuję się zarazem schematem z zegarów z CubeMX . Całość odbywa...
Witam, jestem w trakcie pisania programu dla line follow'era i chciałbym za pomocą switcha włączać i wyłączać robota (konkretnie serwa), coś na zasadzie przycisku on/off. Do tego celu chcę użyć przerwań zewnętrznych w ATmedze8 i switcha, za pomocą którego będę zmieniał stan na pinie PD2 (INT0). Program niestety nie działa jak należy. Raz na kilka przypadków...
Dla przyszłych czytelników tego tematu - warto przeczytać: http://mikrokontrolery.blogspot.com/2011...
Prawie że na kolanie napisane: #include <avr/io.h> #include <avr/interrupt.h> #define USART_BAUDRATE 57600 #define BAUD_PRESCALE (((F_CPU / (USART_BAUDRATE * 16UL))) - 1) // maksymalna liczba znaków polecenia #define UART_MAXBUFF 16 // bufor znaków polecenia (UART_MAXBUFF znaków + jeden pod znak zero)...
Witam, Mam problem z obsluga przerwan od przepelnienia licznikow. W projekcie wykorzystuje 3 liczniki w atmega8, timer2 wykorzystuje do generacji sygnalu 40kHz natomiast pozostale dwa maja zliczac czas od nadania sygnalu do otrzymania echa. Narazie napisalem osobną obsluge kazdego z timerow i dzialalo. Po wrzuceniu wszystkiego do jednego projektu dziala...
temp powinno być volatile. Inaczej się optymalizuje w pętli głównej, spójrz na wygenerowany kod asemblerowy. Dodano po 1 Zarówno "temp" jak i "i" powinny być volatile. i nie musi. Jest wykorzystywane tylko w przerwaniu. Za to powinno być zadeklarowane jako static w funkcji obsługi przerwania. Dzięki za szybką odpowiedź, ale to chyba nie jest problemem......
Sporo się namęczyłem, zanim ruszył mi slave transmitter w STM32F103. W 107 będzie tak samo. Po pierwsze zobacz do errat - tam między innymi napisali, że przerwanie i2c musi mieć najwyższy priorytet, bo inaczej się wiesza. Poza tym przykłady nie zadziałały mi od razu, a problemy mają też inni, o czym możesz poczytać na main.c // main.c main()...
Zgadza się, jeśli zmienna jest volatile, to kompilator musi bezwzględnie realizować wszystkie dostępy bez buforowania odczytu ani opóźniania zapisu. Jak by nie patrzeć, kompilator optymalizuje kod zakładając liniowy(sekwencyjny) sposób wykonywania: w obrębie danej funkcji (jaka by ona nie była: program główny, przerwanie czy cokolwiek innego) można...
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...
Dla przypomnienia: volatile: GWARANTUJE: odczyt sensownej liczby, tj wszystkie bajty z tej samej chwili czasowej, i jest to jedyna gwarancja Niezupełnie. Kwalifikator volatile instruuje kompilator, że zmienna ma być przechowywana tylko w pamięci (a nie np. w rejestrach MCU), przez cały czas jej życia w programie. Operacje na zmiennych volatile nie...
1. Komentuj bogato swój własny kod, bo sam się w nim pogubisz, a i nam trudniej analizować, nie wiedząc co chcesz w danym fragmencie zrobić. 2. deklarujesz zmienną globalną cod , w przerwaniu nadajesz jej wartość cod=code : 2a. ale jej nie używasz w pętli głównej i nigdzie indziej - do czego więc jest? 2b. aby ją wykorzystać w pętli głównej cod musi...
... w dodatku tutaj jest błąd: Szkoda, że artykuł zupełnie pomija kwestie dostępu RMW oraz użycie volatile - dwie kluczowe sprawy. http://mikrokontrolery.blogspot.com/2011...
Ojej... rzeczywiście strasznie głupi błąd. Po prawdzie kod był pisany na szybko i nawet nie przyszło mi do głowy że to może być wina umieszczenia całej funkcji w przerwaniu. Dzięki wielkie Panowie :D. Wrzucam kod, być może komuś się kiedyś przyda. [syntax=c]#include <avr/io.h> #define F_CPU 16000000 #include <util/delay.h> #include <avr/interrupt.h>...
Witam, jak w temacie, mam problem z wykrywaniem przerwań od transoptora PC817C. Napięcie to 3.3V a emiter transoptora (nóżka nr. 3) mam podłączoną do ESP32 z pinem GPIO35, z zewnętrznym pulldownem w postaci rezystora 10K Ω podłączonym do GND. Ustawiłem ten pin jako INPUT a tryb przerwania jako FALLING. ESP32 wykrywa przerwanie ale nie jest synchroniczne,...
Jeśli nie potrzeba dużej precyzji bo to ma machać tylko w te i w tamte ;) to jeden licznik do obu silników w przerwaniu. Jedno przerwanie jest lepsze niż dwa ponieważ każde wywołanie zużywa czas na wejście i wyjście, nawet jak się pisze w C. Z resztą z tego powodu, przy tak czestych przerwaniach, można tylko tikać w przerwaniu np: [syntax=c]volatile...
Próbowałem kilka dni uruchomić FreeRunning - niestety bez skutku. Stwierdziłem, że może lepie pójdzie mi z Timerem ale tutaj też klapa. Czy ktoś mógłby mi "łopatologicznie" wyjaśnić gdzie popełniam błąd? Teraz mam taką sytuację, że tylko raz dokonywany jest pomiar i wyświetlony, w dodatku na obu liniach LCD. [syntax=c] #define wej_2 PC2 #define wej_3...
Mam taki problem: chcę w programie wykorzystywać przerwania od przepełnienia dwóch timerów (0 i 1). W timer0 mam obsługę wyśw. LED i opóźnienie dla klawiatury a w timer1, z założenia wywoływanym co 100ms, coś jakby zegar z minutami i sekundami, choć nie jest to najważniejsze bo to program testowy. Problem w tym, że przerwanie od timer1 wcale się nie...
Na szczęście zbliżamy się już do końca, udało się wytworzyć stabilne przebiegi właśnie z użyciem Float. [syntax=c] volatile float X, dX; volatile float Y, Y0, Y1; int16_t TAB[VCO_MAXPOINT]; volatile uint32_t X0, X1; int main(void) { dX=153.72; while(1) void SysTick_Handler(void) //podprogram przerwan { X0=X; //pierwszy element X1=X + dX; //następny...
Obsługa tego w przerwaniu wynika z tego, że układ będzie zasilany bateryjnie i będzie pozostawał w uśpieniu do czasu wywołania przerwania INT. Aby uniknąć drgań styków mam zamiar zastosować kondensator. Mój aktualny pomysł wygląda następująco: [syntax=c] volatile char click=0; ISR(INT0_vect,ISR_NOBLOCK){ timer=0; // click++; while(timer<100 &&...
Witam ! Tworzę mały sterownik do auta i mam problem. Dotyczy on pomiaru częstotliwości (a właściwie czasu trwania stanu niskiego lub wysokiego) na Atmedze 128, która po dalszych przeliczeniach będzie mierzyć obroty silnika. Sygnał , który będzie mierzony to prostokąt o wypełnieniu 50% i częstotliwości w granicach 15-150Hz. Jak w tytule pomiar ma się...
Pytałem o to samo zadanie w innym temacie, ale zmieniłem koncepcję i już do tamtego tematu się to nie nadaje. Dlatego zakładam nowy temat. W przerwaniu wygenerowanym przez USART_RXC_vect odczytuję wartość wysłana przez port szeregowy. Chcę tą wartość wynieść do main'a. Poniższy napisany przeze mnie kod nie działa: [syntax=c] #define F_CPU 1000000ul...
Zmagam się z odczytaniem czasu układu PCF8583. Napisałem krótki kod na podstawie instrukcji napisanych w manualu Atmegi, który ma odczytać wyłącznie wartość sekund. Problem jaki się pojawił to zatrzymanie programu na funkcji oczekiwania odbioru flagi przerwania po zakończeniu transmisji instrukcji startu magistrali TWI: [syntax=c]while (!(TWCR &...
Witam. Jestem w trakcie pisania bootloadera po magistrali CAN dla STM32F103VE. Opieram się głównie na publikacji AN2557 zamieszczonej na stronie ST. Potrafię przesłać aplikację użytkownika po magistrali CAN do uC i zaprogramować pamięć Flash od wybranego adresu w górę. Na wstępnie odblokowuje pamięć Flash (FLASH_Unlock(); ) następnie podgrywam aplikację...
Witam, Pracuje nad kodem programu do komunikacji przez UART (mikrokontroler <-> komputer) i zastanawiam się nad sposobem implementacji w przerwaniach. Na razie zrobiłem to w taki sposób: - Nadawanie danych wykonuje w taki sposób, że w programie głównym zmieniam w wskaźniku adres początku tablicy którą aktualnie przesyłam przez UART, w przerwaniu...
OK, ale sam program po wyrzuceniu wszystkich dodatków to nadal prawie 500 linii. Więc zamieściłem tylko część inicjującą. Czy coś przeoczyłem? static volatile unsigned char key1=0, key2=0, key3=0, key4=0; static volatile unsigned char odczyt_keys=0; static volatile unsigned char odczyt_time=0; SIGNAL(SIG_INTERRUPT6) { if(!(PINB&0x01))...
Rozwiązanie 1 jest złe. Gdy sygnał A przyjmie poziom aktywny (niski), obsłużysz przerwanie a po chwili sygnał B poziom aktywny w sytuacji gdy A cały czas ma poziom niski, to ne zauważysz sygnału B. Podobnie gdy B aktywny, obsługa przerwania, B i A aktywny. W takich sytuacjach będziesz widział tylko jeden z sygnałów. Co do gubienia przerwania INT 1,...
Przerwanie nie modyfikuje SP (z punktu widzenia przerwanego kodu). Wartość SP po powrocie z przerwania jest taka sama, jak przed wywołaniem. I tu właśnie problem, bo też tak myślałem, dlatego pisałem wcześniej że błędu w logice nie ma. Mój kod nie jest błędem. Dodałem brakujące CLI i kod od godziny chodzi bez zarzutów. Spójrz na to: zapamiętaj SREG...
Witam wszystkich! Mam problem, otóż stworzyłem prosty projekt, którego zadaniem jest wyświetlanie temperatury/wilgotności z DHT-11 na wyświetlaczu i zliczanie impulsów. Niestety, coś jest nie tak - zliczane są jakieś dziwne wartości, przypuszczam, że błąd wynika z mojej niewiedzy, lub z jakiegoś błędu w składni. Przerwanie działa poprawnie - zapala...
czestotliwosc przerwan priorytet przerwan przycisk przerwan
czujniki leuze prosty regulator oświetlenia dekodowanie pliku
zgrzewarka transformatorowa renault mascott
Budowa wzmacniacza lampowego z lampami EL84 Kalibracja czujnika skrętu Mitsubishi Outlander 3