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
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...
Nie jest to kod do jakiegoś Pentium. To prosta ATmega. A że, długo nie używałem i nie pisałem ,to stąd problemy. Jakby mógł Koś, zerknąć na kod i wytknąć błędy to będę cheppi. ( Program ma za zadanie, zmierzyć czas pomiędzy dwiema szczelinami na obracającym się kółku. wykorzystany transoptor) [syntax=c]#include <avr/io.h> #include <avr/interrupt.h>...
Witam, ustawienie rejestru DDR i PORT na 0 daje wejścia pływające (ATmega8 nie ma rezystorów ściągających do masy, tylko podciągające do plusa). Tak jak jest teraz łapiesz kolego zakłócenia. Należałoby albo dodać zewnętrzne rezystory między przyciskami a masą lub zmienić położenie przycisków (między pinem a masą) i włączyć wbudowane rezystory. O volatile...
Jeżeli odwołujesz się do zmiennej w pętli głównej i w przerwaniu zadeklaruj ją jako volatile .
(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...
Jeszcze przy zmiennych występujących w przerwaniach dodaj modyfikator 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.
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...
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...
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;...
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...
[syntax=c] ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {Time_out=0;}; int x; do { ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { x=Time_out;); } while (x < 1000); [/syntax]
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.
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 :?:
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ń...
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...
Zmienną 'flaga' ustalasz w przerwaniu wiec powinna być volatile. p.s. Samych rejestrów nie sprawdzalem.
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.
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...
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
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
Dopisz "volatile".
Kliknij tutaj: [url=http://avr-libc.nongnu.org/user-man...
Poczytaj o zmiennych globalnych typu volatile. Zamykam
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.
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"...
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.
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,...
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 ?
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ć...
#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...
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...
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
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...
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...
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()...
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 >...
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...
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...
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...
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!!
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,...
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,...
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;...
Witam. Chciałem zrobić program realizujący zliczanie poszczególnych impulsów enkodera oraz określenie kierunku obrotu tarczy - problem niestety tkwi w samej zasadzie działania programu - przy kręceniu w jedną stronę niekiedy pojawiają się błędne sygnały obrotu w drugim kierunku, a ponadto same zliczanie nie pracuje stabilnie - raz przy wolnym kręceniu...
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 i nie udało mi się tego zrobić na Timer0- on sie kręci bez przerwy a ja potrzebuję włączyć i wyłączyć timer. Tak że na razie na Timer1- szkoda bo 16 bitów- ale zrobię na Timer2. Spokojnie użyj Timer0, który będzie zgłaszał przerwanie np. co 1ms. W procedurze obsługi tego timera dekrementuj zmienną, jeśli osiągnie 0 to należy zatrzymać dekrementowanie,...
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;
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...
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()...
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);...
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ś.
U mnie (Katowice) z DCF77 nie ma problemu, oczywiście zdarza się, że przez jakiś czas nie działa, ale przecież nie musi - wystarczy że złapie sygnał od czasu do czasu. Z tego co zauważyłem, to strasznie przeszkadza w odbiorze DCF77 komputer. Kiedy miałem zasilane układy przez USB to generalnie był problem, gdy je zasilałem osobno - z sieci lub z baterii...
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....
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...
słowo kluczowe "volatile"
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)...
Witaj, O volatile kolega słyszał? Jeśli nie, to czas poczytać: http://mikrokontrolery.blogspot.com/2011... Stosuj nowe funkcje obsługi przerwań ISR(), tym bardziej, że używasz nowe ich wektory: http://www.nongnu.org/avr-libc/user-manu...
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...
Witam czy ktos moze mi wyjasnic dlaczego tak jest: napisalem sobie procedure obslugi przerwania z uzyciem SIGNAL. w obsludze zwiekszalem zmienna o 1. w petli glownej programu z uzyciem if czekalem az licznik osiagnie 15. Gdy osiagal 15 (patrzylem podczas debuggingu) nic sie nie dzialo, if w zasadzie nie widzial zaleznosci 15 == 15. Dopiero gdy zmienna...
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 ......
... 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...
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...
Co więcej, jeśli chciałbym zrobić prymitywną synchronizację za pomocą flagi volatile, to też przestają działać przerwania od DMA (cała reszta programu chodzi). EDIT: przy synchronizacji flagą jakimś sposobem gubione jest pierwsze przerwanie, więc jeśli za pierwszym razem nie czekam na flagę, to potem już idzie, tyle że się trochę UART sypie - po 14tu...
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...
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...
Dla przyszłych czytelników tego tematu - warto przeczytać: http://mikrokontrolery.blogspot.com/2011...
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...
Witam. Po dość długim czasie postanowiłem powrócić do programowania AVR ze względu na mały projekt który planuję w niedalekiej przyszłości. Zaopatrzyłem się w oprogramowanie, mikrokontroler i do dzieła. Po całym dniu oprogramowywania różnych peryferiów utknąłem na ADC. Otóż mam taki problem, że nie działa mi procedura obsługi przerwania od ADC umieszczona...
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,...
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...
Na 99% nie. Można kombinować z auto-reload i transmisją jednego bajtu, o ile uda się przekonać DMA, że docelowy UART jest pamięcią, a nie peryferialem i o ile będziesz miał pewność, że nigdy dane nie będą równocześnie nadchodziły w takim tempie, żeby zapchać nadajnik. Czyli: nawet gdyby się udało, to jest to rozwiązanie wysoce niepewne i zawodne. Co...
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...
Zapytaj bota Bardzo proszę. Inicjalizacja timera : Funkcja timerBegin(frequency) tworzy i uruchamia timer z określoną częstotliwością. W tym przypadku ustawiamy częstotliwość na 500 Hz, co odpowiada okresowi 2 ms. 2. Przypisanie funkcji obsługi przerwania : Za pomocą timerAttachInterrupt(timer, &onTimer) przypisujemy funkcję onTimer jako obsługę...
Sądzę, że problem pojawia się gdy przerwanie zostanie wywołane w trakcie zapisu lub odczytu zmiennej z RAM Bardzo słusznie sądzisz. 1. Czy jest to normalne zachowanie, czy raczej efekt źle skonfigurowanego środowiska Arduino? Nie ma pojęcia jak się zachowuje Arduino, bo nie używam, ale podejrzewam, że podobnie jak C czyli sam musisz się przed tym zabezpieczyć....
Witam 1. Poprzedź deklarację zmiennej "i" słowem "volatile". 2. Spróbuj ustawić rejestry, dotyczące INT0/1, na symulację poziomem logicznym zamiast zboczem narastającym.
Próbowałem dekrementować tą zmienną w przerwaniu co sekundę ale nie działa. Bo nie zdefiniowałeś jej jako volatile: http://mikrokontrolery.blogspot.com/2011... Po za tym, jeżeli piszesz że coś Ci nie działa, to pokaż cały program.
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...
Rozumiem że w trybie freeruning częstotliwość próbkowania będzie taka sama? Pamiętaj też, że przy zmiennych do których dostęp nie jest atomowy (np. uint16_t) istnieje konieczność zapewnienia atomowości przy możliwym jednoczesnym dostępie z dwóch wątków (gównego i ISR). Także dostęp w kodzie programu do adc_data powinieneś zamknąć w ATOMIC_BLOCK. tzn....
Witam Sprawdź czy masz funkcje obsługujące przerwania mogą być nawet puste, np: dla Atmegi 8: ISR(INT0_vect) { //coś } ... ISR(INT1_vect) { //coś } jeśli masz to zaremuj ciało tych funkcji, być może masz jakieś delay (za długo je obsługujesz). Problemem mogą być to też zmienne, które powinny być zadeklarowane jako...
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...
Wiem o tym, natomiast usunąłem w ten sposób zmienne volatile, docelowo tak nie będzie, to tylko w celach testów, jak tylko wrócę, narysuję algorytm. :D:D:D A w czym Ci przeszkadzały? Dla testów także nieodpowiednie. TMF pisząc: ... zmienne, które wykorzystujesz w przerwaniu są volatile, co sugeruje, że jeszcze gdzieś z nich korzystasz. ... ...miał...
ze zmęczenia nie dopatrzyłem się że zrobiłem tylko definicję preprocesora bez deklaracji ;) Ale tym niczego nie zdefiniowałeś tylko powiedziałeś aby preprocesor zastąpił slowo "UART_BUFOR" słowem "32" tekstowo. Jak w pliku .c zrobiłeś volatile char UART_BUFOR[UART_BUFOR_rozmiar]; to zastanów się co się z tym stanie i czy da się to skompilować. Jeżeli...
Zmienną TRYB nie dałem jako volatile, dlatego że wykonuję na niej operacje również w pętli głównej, a z tego co wiem volatile powinny być tylko te które wywoływane są przerwaniach. Podstawowy błąd: http://mikrokontrolery.blogspot.com/2011...
Wgraj poniższy program, otwórz monitor portu, kręć silnikiem który ma eknoder podpięty do pinu 2(lub impulsuj ręcznie) i patrz co się dzieje. Jak zrozumiesz jak to działa to reszta programu to pestka. [syntax=cpp]const int dioda=13; volatile int licznik; void setup() { pinMode(2, INPUT_PULLUP); attachInterrupt(0, zliczaj, FALLING); pinMode(dioda, OUTPUT);...
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...
takie coś działa bez volatile. robiłem coś takiego do obsługi gps i w mainie był parser/interpreter bufora. działało. (ostatecznie całość jest bez bufora i w przerwaniu)
Witam. Problem byc moze jest w deklaracji zmiennej global.Uzyj dyrektywy volatile unsigned int global. To powinno pomoc. pozdr.
Znalazłem coś takiego: [syntax=c] #define _POSIX_C_SOURCE 200809L #include <unistd.h> #include <signal.h> #include <time.h> #include <errno.h> #define TIMEOUTS 16 #define TIMEOUT_SIGNAL (SIGRTMIN+0) #define TIMEOUT_USED 1 #define TIMEOUT_ARMED 2 #define TIMEOUT_PASSED 4 static timer_t timeout_timer; static volatile sig_atomic_t...
Przyznam, że 99,99% moich programów zaczyna się od napisania przerwań od timera, najczęściej 1ms (w 8051 było to 10ms bo był koszmarnie wolny i rozbudowane przerwania wywyływane co 1ms zużywały 50% czasu procka). Do tej wypowiedzi. Nie uzależniasz przerwania od specjalnego pinu procesora, który bezwzględnie wymusza wykonanie konkretnych akcji. Tworzysz...
http://obrazki.elektroda.pl/6046366100_1... przecież mam ustawione volatile uint16_t adc2 albo czegos nie rozumie albo nie wiem :P wybacz
No po prostu w RAMie, nie mowmy juz w jakim, to nas zreszta nie interesuje, jesli mamy mikrokontroler z pamiecia wewnetrzna avrki chyba maja, prawda?? :wink: Wlasnie tak zostanie to wykonane. Dane beda w rejestrze i tam bede sie "dodawac", natomiast w samej pamieci bedzie siedziec stara wersja. Dopiero po zakonczeniu kompilator prawdopodobnie zapisze...
Dzień dobry Od dwóch dni walczę z obsługą TIMERA1 na Atmega2560 w przerwaniu external INT0. Na wejściu INT0 mierzę krótkie pakiety danych, cały jeden pakiet ma ok 8ms, gdzie najkrótszy bit ma ok. 40us Timer1 mam ustawiony na preskaler 8 (2Mhz), wejście INT0 mam ustawione na zbocze "Any" liczenie zaczynam od TIMERA1 = 0 W przerwaniu INT0 pobieram aktualną...
volatile przerwać volatile struct static volatile
przycisk stabilny obniżyć napiąć rezystor schemat schematy laptopów poszukiwane
metoda thevenina metoda thevenina
Dławik jako regulowany opornik dla prądu stałego: możliwości i ograniczenia Nieszczelny układ ssący w Opel Astra H 1.9 Diesel - przyczyny i diagnostyka