Szkoda tylko, że ta zmienna pokazana w pierwszym poście wcale nie musi być globalna... Wszystko zależy od "kontextu". 4\/3!!
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.
1. Pooglądaj sobie nagłówek inttypes.h 3. Wewnątrz funkcji zmienna volatile będzie traktowana jako zwykła - ze wszystkimi konsekwencjami. 4\/3!!
http://www.elektroda.pl/rtvforum/topic35...
Po pierwsze do jak wklejasz taki kod - to DAJ go w znacznikach CODE ! bo czyta się to delikatnie mówiąc tragicznie. Po drugie twoje domysły co do volatile są nietrafione. Po trzecie to nawet nie wiadomo z twojej wypowiedzi jaki jest problem poza tym, że w układzie coś tam nie działa - ale co nie działa poprawnie ??? a gdy wrzucisz fragment kodu do przerwania...
To nie żaden problem z kompilatorem/debugerem tylko niestety problem ze zrozumieniem co i jak powinno działać. Po pierwsze nie wyłączaj żadnej optymalizacji bo po co??? Chyba, że tobisz ten program, żeby działał po wsze czasy tylko w symulatorze to wtedy możesz się bawić w takie tam. Analizując od góry, po co ci: volatile char jjj; tzn po co to volatile...
volatile unsigned char UART0recv, UARTBuffer[BUFF_SIZE], UARTCount, UARTGet, rx_counter; A czy przypadkiem tylko pierwsza zmienna będzie volatile przy takiej deklaracji?
ten kod który przesłałeś wygląda chyba OK. Ale mogą być inne przyczyny, np. jakieś niespodziewane RESETy po drodze, złe ustawienia USARTa, itp.
Może bitfield: volatile typedef struct{ u8 PB0:1; u8 PB1:1; u8 :6; }Bits; u8 zmienna = 0; Bits *STICK =(volatile Bits*) &zmienna; STICK->PB0 = 1;
Jak zadeklarujesz zmienna znak jako volatile unsigned char to powinno byc lepiej ;)
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...
Chodzi o to, że zmienna volatile cały czas odczytywana jest z pamięci i ładowana do rejestru a zmienna bez volatile, ładowana jest tylko raz? Czy dobrze myślę? Dobrze myślisz. Ogólnie zmienna globalna volatile ma sens w sytuacji, gdy ze zmiennej korzystasz jednocześnie w programie głównym i w procedurze obsługi przerwania. W Twoim przypadku, gdy korzystasz...
wilk125: jeszcze mam takie pytanie, jeśli kwarc zew. mam 8MHz i preskaler ustawiony jest na 8, to jeden takt timera1 w tym przypadku będzie odpowiadał 1us ? Tak Tak powinno być TCCR1B, moja pomyłka Przy odczycie wartości z TCNT1, sróbuj najpierw odczytac TCNT1L(młodszy bajt TCNT1), i następnie TCNT1H (starszy bajt). Chociaż odczyt jak wyżej tez powinien...
Dopisz "volatile".
Mam jednak wciąż pytanie co do drugiej części, jeżeli zmienna jest volatile to dlaczego konieczne jest wyłączanie obsługi przerwań? Czy wynika to z tego, że to 4-bajtowy typ long i przerwanie może nastąpić w trakcie porównywania i zmienić wartość niesprawdzonych jeszcze bajtów? Dokładnie o to chodzi. Tu lepsze sa 32 bitowe procki, przy porównaniu long...
Zmienna count powinna być volatile .
Juz tlumacze :-) Zmienne volatile to takie, ktorych uzycia nie chcemy by kompilator optymalizowal. Zalozmy, ze uzywasz jakiejs zmiennej. Za chwilke chcesz cos na niej wykonac. Kompilator wyprodukowal kod, w ktorym ta zmienna jest w jakims rejestrze. Wiec stwierdzi, ze odwoalnie do pamieci jest niepotrzebne i je usunie, zakladajac, ze rejestr posiada...
[syntax=C] unsigned int ADRES=0x.......; unsigned int zmienna; *((volatile unsigned int*)ADRES)=zmienna; //zapis pod "ADRES" zmienna=*((volatile unsigned int*)ADRES); //odczyd spot "ADRES" [/syntax]
Pokaż nieco większy fragment programu. Czy zmienna Status1 jest zadeklarowana jako "volatile"? Jeśli nie - czym prędzej to zrób :) http://mikrokontrolery.blogspot.com/2011...
jeżeli zmienna 'a' jest zadeklarowana jako globalna i jako volatile, to jest to ta sama zmienna zarowno dla main() jak i dla przerwania, więc w main() nie bedzie sie zerowac (no chyba ze wpiszesz ze a = 0 to oczywistym że sie wyzeruje)
Jeśli zmienna / rejestr jest volatile to działa, używam takich zapisów już od dawna i nie ma z tym problemów.
Pomijając to, że zasada działania tego programu jest dziwna i wypadałoby trochę rzeczy zmienić, to problemem w tym przypadku jest fakt, że zmienna speed nie jest typu volatile.
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...
No właśnie problem w tym, że operuję na polu bitowym i nie mogę przypisać go do wskaźnika. Nie na pojedyncze pole tylko na całą strukturę [syntax=c]typedef struct { uint32_t semafor : 2; uint32_t inne_pola : X; } Xtyp; Xtyp Zmienna; volatile Xtyp *pZmienna; pZmienna = (volatile Xtyp*)&Zmienna; Zmienna.semafor = x; // Dostęp do nie volatile pZmienna->semafor...
nieulotna to volatile ... Jesteś pewien, że "nieulotna"?
po prostu jedna z możliwych implementacji niepoprawnego wyrażenia, w którym mamy wielokrotne odwołanie do tej samej zmiennej volatile. A w czym jest ono niepoprawne? mozesz np chcieć podnieść do kwadratu zmienna volatile. volatile są jak przestrzenie nieeuklidesowe :) przy volatile niekoniecznie to jest prawdziwe x+x+x == x*3
bo jest volatile a przecież ta funkcja ma związek z przerwaniami więc zmienna, która się podaje jako argument powinna być volatile. Nie musi. Nie wiem, dlaczego nie chcesz po prostu zrobic jak Ci napisałem. Masz gotowe dwa handlery. Dodatkowym plusem jest to, że będzie działać dwukierunkowo.
if(warunek niespelniony) { zmienna ++ } zmienne rzecz jasna volatile
A nie prościej użyć break w pętli while który będzie wywoływany jeśli jakaś tam zmienna globalna się ustawi? Do tego przypominam że musi to być zmienna volatile.
Moim zdaniem powinno działać. Jak zadeklarowana jest zmienna k? Spróbuj dodać do deklaracji atrybut "volatile".
To, co kompilator zrobi ze zmienną, zależy od fantazji jego autora, wybranego stopnia optymalizacji, liczby zmiennych zadeklarowanych w procedurze i 10 innych czynników. Nie należy polegać na tym, że w jakiejś sytuacji kompilator potraktował daną zmienną w określony sposób (np. umieścił w rejestrze). Teoretycznie np. zmienna volatile może też być w...
witajcie ,w asemblerze nie bardzo wiem co i jak wiec kiepsko będzie z analizą kodow w c przydąłyby się jakieś rysunki , mam nadzieje że ten post stanie się pomocny dla takich jak ja początkujacych , zdefiniowana zmienna volatile- nie wedruje do rejestru ale operacjie na niej są przeprowadzane na niej z poziomu ramu tam też zachodzą zmiany które zachodzą...
buffor_rx to zmienna : volatile char buffor_rx która zmienia stan w przerwaniach UART ,poniewaz tel. przy wysyłaniu sms przez port rs232 ,dzieli go na dwa stringi ,a w przerwaniach odczytuje stringi zakonczone znakiem 0x0D
RCC_CFGR_PPRE2_DIV1 Chyba kolega coś pomylił: Ustawiam RCC_CFGR_ PPRE1 _DIV2 , a nie drugi raz rejetr PPRE2 _DIV1 Właśnie się odnosiłem do tego, żeby w ogóle nie "ustawiać" RCC_CFGR_PPRE2_DIV1 więc się nie pomyliłem. Jak zmienna i będzie volatile to też tyle samo trwa ? Masz tam wpisane wartości opóźnień na sztywno i optymalizator mógł stwierdzić,...
Zadeklarować ZMIENNA jako volatile? Albert
o co chodzi z tą optymalizacją? Jeśli pętla zostanie wstawiona do kodu ale w środku nic nie będzie się działo, czyli pętla będzie iteracyjnie się zwiększała bez efektu to zostanie pominięta? Tak się zdarza. Można dodać asemblerowe NOP do środka, lub zwiększać zmienna typu volatile.
nie wiem w jakim celu są te 2 minusy Operator predekrementacji. Zmniejsza div_1s o jeden. jakiego typu ma być ta zmienna div_1s? volatile? Może być np. unsigned short. Lokalna statyczna w procedurze obsługi przerwania. 50Hz jest wystarczające, aby oko ludzkie, nie wyłapało zmiany. Nie jest wystarczające (no, może dla żarówek... :D ). Jak mam ją zainicjować...
volatile jest TYLKO prośbą aby kompilator nie optymalizował do zmiennej rejestrowej Jeśli tak rozumiesz volatile, zaliczam to do do tego co nazwałeś popularnym odczuciem. Nie ma podstaw, dlaczego zmienna volatile nie mogłaby być umieszczona w rejestrze. Czemu mają służyć te wynurzenia bo nie rozumiem? Sprowokowania, aby po raz setny na elektrodzie...
Jeśli zmienna nie jest oznaczona jako "volatile", to kompilator jeśli zdecyduje, że zmienna na nic nie wpływa, może ją zoptymalizować (czytaj: usunąć). Kompilator nie sprawdza, czy zmienna jest używana w przerwaniach, gdyż dla niego są to osobne funkcje, które muszą być wywoływane (a te nie są w twojej funkcji wywoływane). Masz dwa rozwiązania: zmienną...
Zmienna licznik powinna być przy inicjalizacji poprzedzona słowem: volatile .
Szczerze bardzo duża, ja zaczynałem, będąc po technikum w trakcie studiów co prawda (ale w połowie), i zadecydował test wiedzy z elektroniki i ogólna rozmowa, czy wiem, o czym mówię, więc tak, jest szansa i to nawet duża. ;) Hmm, raczej podstawy z zadań, tak na prawdę wystarczy człowieka zapytać, jak działa tranzystor, i uwierzcie, nawet ludzie z doktoratami...
Zmienna cel nie powinna być volatile? Jeżeli zmienna cel będzie volatile wtedy występują błędy podczas kompilacji.
Nie panimaju. Ja rozumiałem tak: Osiagajac koniec pętli, sprawdzanay jest warunek (PIN(PORTD) & 1<<2) który przyjmuje wartość 1 lub 0. "powinno byc volatile" tz. że mam zadeklarować zmienna volatile, w petli ja sprawdzć, i podstawiac w warunku wyjscia z "do". Tym bardziej nie rozumiem . Bo w drugim menu, pomimo takiego samego kodu nic sie...
Docelowo niepotrzebne usuwam. docelowo od tego miejscu wszystko wyleci. Po tylu wyrzuceniach za wiele nie zostanie. ;) Zdajesz sobie sprawę że jak zerujesz w pętli sekundy, nie naliczy ci minut i godzin w przerwaniu? Pomine kwestie atomowości. Też czasem mam dylematy drabinkowe Możesz też dołączyć bibliotekę z typami, ja bym napisał: [syntax=c] #include...
no to ja mam znow pomysl na garsc poprawek [; w przerwaniu: 1. if (nr > 1) {nr = 0;} jak widze nr oznacza u ciebie jakby 'faze' danego bitu. zamiast wiec kombinowac z ta cala inkrementacja i sprawdzaniem, zrob po prostu XOR'a: nr^=1; tym sposobem bedzie ta zmienna rowna na zmiane 1 i 0. niemniej jednak zauwaz, ze twoja zmienna nr to jest ... ostatni...
Już prawie masz to, co trzeba. Jeśli zmienna timer zwiększana jest co 20 ms, to zrób: if (timer >= 2) { /* albo więcej, ale 40ms to i tak dużo */ uint8_t zmiany = debounce(); /* wersja freddiego */ timer = 0; if (zmiany & _BV(PIN_MINUS)) servonumber -= 1; if (zmiany & _BV(PIN_PLUS)) servonumber...
Ale z drugiej strony im więcej zmiennych typu volatile, tym gorsza optymalizacja. Dlatego, jeżeli wszystkie pola struktury są volatile, to można zdefiniować ją na dwa sposoby: z volatile zewnętrznym lub wewnętrznymi. Jeżeli jednak część z tych zmiennych nie jest typu volatile, to lepiej definiować jako zmienne tylko te, którą muszą takie być. Kompromisem...
Z tym volatile w tym przypadku to pewne przegięcie, bo zarówno pola struktury (czemu nie sama struktura?), jak i zmienna o tym typie są volatile, co jest lekko bez sensu, acz nie jest błędem. Natomiast nie zgodzę się, że volatile nie powinno się definiować wewnątrz struktury. Jeśli dane pola wskazują np. na zasoby sprzętowe, albo w inny sposób ze swej...
int zmienna = 0; Zmień na [syntax=c]volatile int zmienna = 0;[/syntax]
1. Oznaczenie zmiennej "volatile" jest potrzebne jeśli dana zmienna globalna jest wykorzystywana zarówno w przerwaniach jak i funkcji "main()". Jeśli tego oznaczenia nie ma to w przerwaniu będzie używana zmienna z RAM, która jednak nie jest aktualizowana przez funkcję "main()". 2. Zmienna "volatile" jest aktualizowana w RAMie przez "main()" na końcu...
NIGDY nie inkludujesz nigdzie plikow C. w pliku naglowkowym danego modulu dodajesz po prostu deklaracje funkcji w postaci (na przyklad) int uart_init(void); pliki h dolaczasz do swoich modulow c tak, aby byly one autonomiczne. zmienne robisz globalne za posrednictwem 'extern' w pliku c jakiegos modulu deklarujesz wiec zmienna np: volatile int zmienna;...
Poza tym do przekazywania wartości do ISR użyj GPR, powinno być szybciej. To dobry pomysł. Dzięki. Przyszło mi do głowy, jak nieco zoptymalizować kod. Otóż zmienną Status, która jest volatile i jest często testowana w ISR wczytam na początku do zmiennej lokalnej, na niej będę wykonywał operacje a przed wyjściem z ISR zaktualizuję zmienną globalną....
Proponuje umieścić deklarację typu: volatile uint8_t DZIESIATKI, JEDNOSTKI; przed funkcją main. Tak zadeklarowana zmienna powinna być widoczna w przerwaniu oraz każdej innej funkcji.
Zmienna jest typu: volatile float obrabiam ją w przerwaniu.
Zmienna softTimer to globalna zmienna typu volatile Nie ma takiego typu. Podaj jej definicję oraz zawartość ISR. Może to mieć wpływ przy nieatomowym dostępie. Albert
Nie no to jakas sieczka jest delay ms(20) w przerwaniu? ta obsługa to chyba długa praca typu aby działało. Obsługę takiej klawiatury najlepiej zrobić w przerwaniu jakiego timera, np co 50ms. 2 kolejne równe odczyty równoznaczne z wciśniętym klawiszem. Zadem problem dorobić opcje dla długiego przytrzymania klawisza. n kolejnych równych odczytów. A reszta...
volatile zmienna. lub użyj gotowych opóźnień:]
Czy zmienna kierunek jest globalna i volatile? Już po pierwszym przerwaniu powinna przyjąć wartość 1 lub 2, a nie być cały czas 0. Czy zaobserwowałeś zwiększanie wartości zmiennej enkoderA ?
A czy zmienna PRZEPELNIENIE jest volatile? Tak, jest volatile.
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
Witam, dziękuję za komentarze :D Zmienne globalne : nie najlepszy pomysł, gdyby zaczynało brakować miejsca zoptymalizował bym kod biorąc (...) Nie tylko chodzi o zajętość RAM, ale także o szybkość działania programu. Zmienna volatile będzie zawsze wykonywana tak (trzy operacje na zmiennej): - załaduj zmienną z RAM do rejestru - wykonaj operację - zapisz...
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
Taki zapis ( definicja )powinien być w jednym pliku C (zmienna globalna) volatile unsigned char stan = CZEKAJ; w pliku headera (chyba sensor.h) tylko deklaracja extern volatile unsigned char stan; w żadnym wypadku nie można dawać w headerze (pliku *.h) includowanym do wielu plików *.c definicji zmiennej statycznej static unsigned char stan = CZEKAJ;...
Problem rozwiązany, powodem była zmienna niezadeklarowana jako volatile.
hej moze sprobuj sprintf, volatile unsigned char TX_buffer[30]; ... sprintf(TX_buffer,"%x",zmi... printf(TX_buffer);
Po pierwsze zapomniałeś po ustawieniu bitu ASCC poczekać na zakończenie konwersji, czyli: [syntax=c]while(ADCSRA & (1<<ADSC)); //czeka na zakończenie konwersji [/syntax] Ustawiłeś napięcie referencyjne 2,56V. Jaki sygnał napięciowy na wyjściu daje twój czujnik? W jakim zakresie napięć? Zmienna pomiar nie musi być w Twoim przypadku volatile,...
Czy zmienna state jest typu volatile? Owszem.
Każda zmienna wykorzystywana w przerwaniu i pętli głównej lub w 2 przerwaniach musi być typu volatile. Normalnie zmienna jest kopiowana do rejestru i program operuje już na ty rejestrze. Przerwanie może zostać wywołane w każdej chwili wobec czego program nadal wykorzystuje ten rejestr mimo zmiany wartości zmiennej w przerwaniu. Jeśli zmienna jest typu...
Zmienna rozkaz powinna być volatile.
To popatrz na to tak - lokalna zmienna volatile ma tylko jedno zastosowanie - uniknięcie optymalizacji. Przykładowo po to, żeby zrobić tępą pętlę opóźniającą albo łatwo podejrzeć zmienną w debuggerze. Tak wiec bardzo dobrze że kompilatory nie optymalizują tego tak jak proponujesz, bo byłoby to dokładnie w przeciwnym kierunku od oczekiwań programisty....
Tak na windowsie, program może działać tyle ile chce, mogę mieć nawet 50k elementów, które będą się poruszać itd, mogę w ciąż dodawać nowe elementy i dość do większej liczby. Jednak kiedy ilość elementów zacznie spadać i dojdzie np do 300 to program się sypie, czasami przy 300 czasami przy 3000. Sprawdzałem w którym miejscu błąd wywala, niestety za...
Ładne przewody, gdzie można takie dostać? electropark - tam kupiłem wszystko, ale podejrzewam, że każdy e-sklep takie posiada, Zrobiłem ten program zupełnie od nowa, hmm nie mam pomysłu i działam na "czuja" w oparciu o zbliżone programy. Poniżej wrzucam kod programu, który... nie działa, ale myślę,że jestem blisko i muszę doczytać na temat MUX-ów ,...
Możesz zmieniać ją w dowolnym miejscu programu o ile będzie to zmienna typu volatile. Przerwanie w takim przypadku należy zablokować na czas modyfikacji w pętli głównej jeśli zmienna jest co najmniej 2 bajtowa. Uchrania do przed przypadkiem wywołania przerwania pomiędzy zapisem kolejnych bajtów.
Dzieje się tak, ponieważ po wyjściu z ostatniej pętli czyścisz ekran, zmieniasz wartość zmiennej "a" i kończysz program - wracasz z funkcji main(). Zapomniałeś dodać pętlę nieskończoną, while(1). Rozpoczyna się ją za wstępną inicjalizacją. W twoim przypadku, będzie to za ekranem powitalnym. Skoro zaczynasz przygodę z programowaniem, to napiszę jeszcze...
Witam, Piszę program na Atmega8 który wyświetli mi liczbę float na wyświetlaczu BCD. Sama zmienna globalna float nie zajmuje za dużo miejsca. Moim sposobem na wyświetlenie tej liczy jest: [syntax=c] int pom; volatile float zmienna = 34.9; volatile int jednosci, dziesiatki, setki; i dalej: pom = (zmienna*10); // 34,9 zamieniam na 349 jednosci = (pom%100)%10;...
Dobrze. Zmienna value_adc0 nie musi być volatile , chyba, że odwołujesz się do niej jednocześnie w programie głównym i w przerwaniu (przerwaniach).
Prawdopodobnie źle używam zmiennych volatile przerwa. Zmienna ta jest chyba gubiona. Jeśli zamiast if (przerwa == 0) wpiszę jakąkolwiek inną wartość układ pobiera cały czas te 5 nA
Witam, zadeklaruj zmienną d jako: volatile unsigned char d; kompilator będzie wiedział, że zmienna ta może zostać zmieniona z zewnątrz(przerwanie). Poczytaj o volatile to się wyjaśni. Pozdrawiam wojt
Zmienna "a" musi być "volatile".
to while wyrzucony nie będzie (bo to statement with no effect, więc kwalifikowałby się). Tylko widzisz jeśli by taki while był wyrzucany nie ważne czy dana zmienna jest volatile czy też nie, to by nie miało by wtedy sensu, a tak to możemy powiedzieć kompilatorowi, że nie chcemy wyrzucać pętli dodając volatile. W końcu takie konstrukcje są często stosowane...
Zdefiniuj jako volatile int
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...
...proszę o sprawdzenie i korektę błędów z komentarzem... //--------------------------------------... // >>>>>>>>>>... V O L T O M I E R Z <<<<<<<<<<... //--------------------------------------... //##################...
Kod programu poprawiłem na taki i dalej jest tak jak przy klawiszu raz dodaje 1 raz 2 a nieraz nawet doda 6 razy transoptor to LTH301A a przegrodę zasłaniam czarnym kawałkiem plastiku [syntax=c] #include <avr/io.h> #include <avr/interrupt.h> #include <avr/pgmspace.h> #include <string.h> #include <stdio.h> #include <util/delay.h>...
volatile gdy zmienna używana jest w przerwaniu czy przez dma i w programie głównym. static zachowuje się jak zmienna globalna ale widoczna jest tylko w funkcji, w której została poowłana.
Tu kiedy zmienna globalna jest NIE volatile to tylko nie aktualna zmienna może się zdarzyć ? kiedy akurat trafi się pomiędzy operacje atomowe przypisania w pętli loop ? Wcześniej złe wysłałem. te liczba++; widzę tak: 1. pobranie liczba do zmiennej tymczasowej. 2. w zmiennej tymczasowej dodanie 1 3. przypisanie do liczba; a przerwanie wykona się pomiędzy...
Zacznę od końca - jeżeli nie ma ostrzeżenia, to byłby to błąd gcc (znaczy, brak ostrzeżenia). Nowa składnia obsługi przerwań: http://www.nongnu.org/avr-libc/user-manu... Priorytety przerwań - teoretycznie, ponieważ w przerwaniu od timera masz delay(), to sei() mogłoby mieć uzasadnienie. Ale jeżeli warunki są takie, że następne...
Pamiętaj że sama transmisja też swoje trwa :) a poza tym nie pokazałeś funkcji printf (może ona bawi się w _delay_ms() ?) Zauważ również że przerwanie występuje niezależnie od transmisji, może dochodzić do takiej sytuacji ze raz przerwanie zmienić Ci wartość zmiennej tuż przed transmisją a raz tuż po niej i to spowoduje Twoje opóźnienia. Spróbuj blokować...
Oczywiście tak, masz rację - Psu na budę volatile :lol:
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...
Witam. Jeśli chodzi o zmienna typu volatile to często używam tego oznacznika. Moje pytanie dotyczyło bezpośrednio utworzenia wskaźnika w pliku nagłówkowym gdyż było dla mnie to nie jasne dlaczego odwołując się do niego nie otrzymujemy poprawnej odpowiedzi w programie. Koledzy macie w 100% racje z tym, że stworzyłem tylko wskaźnik, a nie zmienna. Problem...
W życiu bym nie wpadł na to że kompilator zoptymalizuje program, tak że nie będzie działać. Raczej szukałem problemu w moim kodzie i logice działania. W planie procesor ma obsługiwać wyświetlacz, przerwania zewnętrzne (pomiar prędkości maszyny) oraz sterowanie PWM i przekaźnikami. Wracając do tematu powinienem zadeklarować całą strukturę jako volatile...
O ile się nie wywali na aktualizowaniu zmiennych bez *volatile* ze środka przerwania, bo aż tak głeboko nie wnikałem Zmienna wymaga kwalifikatora volatile tylko wtedy, gdy jest używana zarówno w przerwaniu, jak i w programie głównym. No właśnie. A tutaj previous_millis jest aktualizowane z update(), więc w tym wypadku wewnątrz przerwania, oraz w attach()
Tak na szybko - niektóre zmienne powinny być volatile, np. zmienna "i"
Proponuję zapoznać sie z manualem avr-libc np tutaj : http://www.nongnu.org/avr-libc/user-manu... Pierwszy punkt FAQ : "My program doesn't recognize a variable updated within an interrupt routine " musisz zdeklarować zmienną jako volatile : volatile uint8_t flag; Wtedy kompilator nie zoptymalizuje dostępu do tej zmiennej.
int normalnie jest domyślny. W C prawidłowe są takie kombinacje: int zmienna; volatile zmienna; long zmienna; long int zmienna; int jest wymagany jeśli nie ma żadnego innego modyfikatora. short long - krótki długi to taki sam wynalazek jak 24 bitowy procesor
Program i założenia są złe. Te przerwanie nie powinno być wyzwalane od niskiego poziomu. Powinno reagować na każdą zmianę poziomu. Powinna zostać wprowadzona zmienna globalna volatile, która będzie przyjmować wartości zależne od stanu tego przycisku. W pętli głównej powinny być wykonywane działania w zależności od stanu tej zmiennej. Oczywiście można...
Zrób to sobie programowo np. weź timer0 i ustaw podstawę czasu tak aby co określony czas timer zgłaszał przerwanie czy to przepełnienia czy porównania w tym przerwaniu umieść np. taki kod [syntax=c] //gl_OCR1 to zmienna globalna pełni funkcje identyczną jak OCR1 uint16_t volatile gl_OCR1 ; ISR(wektor) { static uint16_t zm; if(zm<gl_OCR0) PORTA&=~(1<<PA0);...
atmega volatile zmienna volatile przerwać typedef volatile
astra pompa wyciek paliwa konstrukcja stalowa electrolux piekarnik wyświetlacz
yamaha xj600 schemat yamaha xj600 schemat
Iveco Daily IV - Kod błędu P0380: Usterka świec żarowych KuKirin G3 – resetowanie licznika kilometrów, TRIP i ODO, firmware, procedura 99