Źle myślisz. Jeśli przerwanie wystąpi akurat w trakcie funkcji atomic block jego obsługa troszeńkę się opóźni. I objaw będzie podobny to faktu obsługiwania wielu przerwań. Dlatego też jak wielokrotnie powtarzano, obsługo przerwania jak najkrótsza. atomic block również. W sumie powinien składać się wyłącznie z odczytu zmiennej typu volatile do zmiennej...
Bitbanding służy tylko do bitów. Atomic block w AVR po prostu wyłaczą przerwania na ten czas. Chodzi o to aby coś w tle nie zmieniło tej lokacji w trakcie czytania / pisania. Dotyczy to zresztą tylko operacji wykonujących w wiekszej ilości operacji niż jedna. Dodano po 3 o dzięki, szukałem dzisiaj tego bitu w PM, ale nie mogłem znaleźć. Naprawdę? http://www.st.com/content/ccc/resource/t...
[syntax=c] ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {Time_out=0;}; int x; do { ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { x=Time_out;); } while (x < 1000); [/syntax]
Czasem Arduino do czegoś się przyda Dodano po 2 Możesz dać przykład takiej krytycznej czasowo operacji? Problem jest a raczej był związany z buforem nadawczym uarta. Mam funkcję: Blokuj tylko przerwania od UART.
Opanowałem całkowicie wyświetlanie na wyświetlaczu LED liczby w formie zmiennej uint16_t, z wyłączeniem wyświetlaczy na których jest "0" (oprócz cyfry jedności) oraz z wyświetlaniem segmentu "minus" w zależności od zmiennej znak. Poniżej funkcja "oblicz", może komuś się przyda, może też ktoś ją ulepszy. Zastosowałem tam dodatkową zmienną lokalną "liczba1"....
Jeśli 1 bajtowa nic się nie stanie. 2 bajtowa wystarcza 2 kolejne odczyty które dadzą ten sam wynik lub zastosowanie atomic block. to jak zmienić tą konstrukcję : while (_co20ms < 1000) { rób coś tam} ? Czy tak jest dobrze: [syntax=c]while(kopia_co20ms < 1000) { cli(); kopia_co20ms=_co20ms; sei(); rób coś tam }[/syntax] Atomic Block u mnie w...
Koledzy posiadam rejestrator MSJ-NVR-6116 PRO lecz z hasłem administratora. Producent w Polsce nie odpowiada, oczywiście to brand chińczyka. Szukałem wszędzie wsadu do flash'a lecz nigdzie nie ma, a jak już jest to albo w wersji 9 kamer, a jak znalazłem w wersji 16 kamer to na flash 256 oryginalnie na płycie jest 128. Kupiłem nawet 256 i niestety wtedy...
W takim przypadku można usunąć jedno maskowanie: [syntax=c] uint8_t x = 5 DataOut(x); void DataOut(uint8_t data){ data=data<<4; //przesuwam data na najstarsze bity (7-4) ATOMIC_BLOCK(ATOMIC_RESTORESTATE){ PORTx = (PORTx & 0x0F) | data; } }[/syntax]
Dziś wróciłem do sprawy po krótkiej przerwie. Zastosowałem się do rady: Jeśli układ nadrzędny nadaje te dwa bajty jeden po drugim, to może się okazać, że przerwa między bajtami jest zbyt mała i okazało się, że transmisja zaczęła śmigać znacznie lepiej. W LPC2148 pomiędzy wysyłanymi bajtami dałem minimalne opóźnienie w postaci pustej pętli for X100....
Cześć, zagłębiam się trochę w wykorzystanie pamięci eeprom i flash i przeglądając avrowe funkcje nvm natknąłem się na takie stwierdzenie: The functions in this module are modifying the NVM.CMD register. * If the application are using program space access in interrupts * (__flash pointers in IAR EW or pgm_read_byte in GCC) interrupts * needs to be disabled...
Dlaczego wykorzystałeś drugie rozwiązanie zamiast pierwszego (IMHO - znacznie lepszego)? Wykorzystując takie zmienne jako flagi prowadzisz do niepotrzebnego komplikowania kodu i utrudnienia kontroli dynamicznie rozwijającego się programu :) Jedna z propozycji rozwiązania problemu: [syntax=c]char SPI_MasterTransmit(char cData){ char spi_return; ATOMIC_BLOCK(ATOMIC_RESTORESTATE){...
[syntax=bash][ 0.447367] ... value mask: 000000ffffffffff [ 0.447424] ... max period: 000000007fffffff [ 0.447453] ... fixed-purpose events: 3 [ 0.447453] ... event mask: 0000000700000003 [ 0.447453] signal: max sigframe size: 1440 [ 0.447453] rcu: Hierarchical SRCU implementation. [ 0.447453] NMI watchdog: Enabled. Permanently consumes one hw-PMU counter....
Dzieki za zainteresowanie. Jednak powiem krótko-nie rozumiem. I jesli mozna bardziej łopatologicznie to wytłumaczyć to bardzo prosze. W tej chwili inicjuje UART jako pierwszą funkcje w main(). Przerwania globalne są wyłaczone. O ile rozumiem przytoczony text z noty to odczytać UCSRC mogę w nastepnym cyklu zegara, przy wyłaczonych przerwaniach globalnych....
Funkcje OneWireReset_1, OneWireReset_2, OneWireWriteByte_1, OneWireWriteByte_2, OneWireReadByte_1 i OneWireReadByte_2 obuduj tak: unsigned char OneWireReset_1() { cli(); ... ... ... sei(); return(0); } A jeszcze lepiej to obuduj makrem ATOMIC_BLOCK.
Co "toto" jest? ISR_NO_BLOCK(TIMER0_COMP_vect) Wyszukiwarka nie działa? Czemu kolega strzela na ślepo? Ja rozumie "dawno, dawno temu, za siedmioma górami, za siedmioma lasami, gdy nie było Internetu..." Ale teraz? https://www.nongnu.org/avr-libc/user-man... Tak ciężko znaleźć? Przy okazji. Chce kolega koniecznie dziedziczyc...
No tak doczytałem o dokładności taktowania w rozdziale 24. Zaniepokoiło mnie jednak to, że wymagane jest do 1WIRE poprzez USART wykorzystanie pinu D0. Ja mam tam podpięte katody wyświetlacza (całe 8 bitów portu D). Mam w związku z tym kilka pytań: 1. Czy darować sobie w takim razie 1W po USART i bawić się z _delay'ami? mam dwa czujniki podpięte pod...
W przerwniu i programie głównym używasz zmiennych zadeklarowanych jako word. Myślę, ze tu leży pies pogrzebany. W C wystarczy użyc volatile i atomic_block. W Bascim? Był taki na Elektrodzie (niveasoft) co wiedział w jaki tajemniczy sposób Bascom zarządza takimi zmiennymi. Myślę, że nie masz wyjścia, tylko przed odczytej w programie głównym zmiennej...
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...
Zgadza się, kwadratowy pin to Rx, wyżej Tx, wyżej GND. Rejestrator z tego co się orientuję to rebrand Dahua XVR5104C. Sprawa wygląda tak: - rejestrator ma adres IP 192.168.1.108. mam dostęp do Telneta, jednak z otwartych portów jest tylko 23 - ponoć na porcie 3800 powinien nasłuchiwać aktualizacji firmware z takich narzędzi jak ConfigTool. Przy łączeniu...
Odnoszę się do kodu z postu #24. Zmienne 'wyslij' oraz 'ilosc' powinny mieć kwalifikator volatile ponieważ są używane w programie oraz w procedurze obsługi przerwania. [syntax=c] volatile int ilosc; volatile bool wyslij; [/syntax] Wywołanie funkcji serial() w pętli loop() może być wielokrotnie "przerwane" przez obsługę przerwania ENKODER_ISR() jeżeli...
Na oscylogramie widać podstawę czasu przypadającą na działkę więc wrzuciłem aby ktoś porównał to z tym jak ma być, więc dlaczego twierdzisz że nie jesteś w stanie odczytać zależności czasowych? Co mi da wrzucenie przez kogoś swojego oscylogramu z działającej komunikacji? Ano to że wówczas dokonam właśnie porównania z timingami które ja mam u siebie...
Masz poniżej zawartość dwóch plików, które trzeba podmienić: [syntax=c] #include <util\atomic.h> #include <util\delay.h> #include <avr\io.h> #include "1wire_basic.h" uint8_t Error; uint8_t PinMask; void OW_SendBit(bool bit) { ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { DDRB |= PinMask; _delay_us(3); if(bit) DDRB &= ~PinMask; _delay_us(60);...
A dlaczego kolega ma ustawiony bit ADLAR w ADMUX ( ADMUX = 0b00100000; )? Przecież to włączenie wyrównania do lewej w rejestrze ADC, więc trzeba to chyba później uwzględnić w obliczeniach. Chciałbym jeszcze zauważyć, że sprintf() operuje na zmiennej czterobajtowej, która w każdej chwili może zostać zmieniona przez przerwanie od ADC przykładowo w czasie...
Witam. Posiadam router Asus RT-AC58U. Problem taki, że nie wstaje po próbie wgrania OpenWRT. Po podpięciu po UART: Format: Log Type - Time(microsec) - Message - Optional Info Log Type: B - Since Boot(Power On Reset), D - Delta, S - Statistic S - QC_IMAGE_VERSION_STRING=BOOT.BF.3.1.1-00... S - IMAGE_VARIANT_STRING=DAABANAZA S - OEM_IMAGE_VERSION_STRING=CRM...
W OW_Reset po wyslaniu RESET_PULSE (ktory zreszta powinien trwac 480us, a nie 450) za dlugo czekasz pomiedzy koncem RESET_PULSE a poczatkiem badania PRESENCE_PULSE. Kolejna rzecz - po wykryciu PRESENCE_PULSE nie dawaj stalego opoznienia tylko probkuj magistrale az wroci do "1" - oczywiscie z zabezpieczeniem przed zwarciem do "0" - zeby program sie nie...
Jak kolega wyżej słusznie zauważył, potrzebna jest funkcja operująca na RAM. Domyślam się że korzystasz z przykładowych kodów z książki "AVR. Praktyczne projekty"? Nie ma tam buforowanej funkcji UART czytającej stringa umieszczonego w RAM, a więc trzeba sobie taką funkcję dopisać (można też zmodyfikować istniejącą korzystając z tzw named address spaces)....
Przykładowy program który wyświetla jakąś liczbę: [syntax=c]volatile uint16_t disp=0; uint8_t buff[]={0b11000000, 0b11111001, 0b10100100, 0b10110000, 0b10011001, 0b10010010, 0b10000010, 0b11111000, 0b10000000, 0b10010000, 0b10001000, 0b10000011, 0b11000110, 0b10100001, 0b10000110, 0b10001110}; ISR(TIMER0_OVF_vect) { static uint8_t dig=0; static uint16_t...
/var/log/kern.log Jun 22 23:21:17 Nas kernel: [ 0.000000] Booting Linux on physical CPU 0x0 Jun 22 23:21:17 Nas kernel: [ 0.000000] Initializing cgroup subsys cpuset Jun 22 23:21:17 Nas kernel: [ 0.000000] Initializing cgroup subsys cpu Jun 22 23:21:17 Nas kernel: [ 0.000000]...
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ć....
Kolega sulfur nie doczytał, nie pisałem o WinAPI, tylko o swoim okienkowym API na AVR, a że jest podobny do WinAPI z czasów W3 to nie dziwne. Pominąć zdarzenia możesz nie tylko w przypadku okienek, także w technicznych zastosowaniach. Np. czekasz na naciśnięcie przycisku, nerwowy użytkownik naciska go 3 razy, ale ciebie interesuje tylko fakt, że go...
Przykład dla dwóch kanałów Przed wpisaniem tego kodu musisz odpowiednio ustawić Bity w rejestrach ADMUX i ADCSRA Jeśli chcesz mieć próbkowanie co określony czas to musisz odpowiednio ustawić rejestry zegara. Pisałem trochę z pamięci mogłem gdzieś zgubić klamrę przecinek lub średnik [syntax=c] //SET_BIT(ADCSRA, ADSC); - moje makro ustawiające bit w rejestrze,...
Kod poniżej. Zmieniłem parametr w Serial.begin() na 115200 - trzeba przestawić monitor portu szeregowego.[syntax=c]#include <util/atomic.h> volatile int32_t licznik = 0; volatile int32_t licznik_old = 0; volatile int32_t roznica = 0; volatile int32_t roznica_old = 0; void setup() { Serial.begin(115200); pinMode(2, INPUT_PULLUP); attachInterrupt(digitalPinToInterrupt(2)...
W tym trybie timer po prostu zlicza impulsy zegarowe do niego doprowadzone, jeśli przekroczy zakres to zgłasza przerwanie overflow (nadmiaru) i rozpoczyna zliczanie od nowa. Funkcja obsługi tego przerwania zlicza je zwiększając liczniki f - przechowujący czas z rozdzielczością <1ms i m przechowujący liczbę milisekund. W programie należy korzystać...
Czyli początkujący w C- tak jak ja może na początek zapamiętać: "Stąd też praktycznie tylko zmienne globalne powinny mieć atrybut volatile" A w drugim przypadku korzystać z Atomic_Block w main(). Czy tak? W tym Atomic_Block nie mogę dojść do różnicy w _Forceon i _Restorestate.
uuidgen - nie można stosować sei() i cli(), bo prowadzi to do nieokreślonych skutków na wszystkich poziomach optymalizacji z wyjątkiem O0. Należy stosować makro ATOMIC_BLOCK. A możesz coś więcej powiedzieć na temat tych błędów? Bo, że sei/cli pozwalają na popełnienie głupich błędów (jak nie włączenie przerwań) to się zgodzę, ale: 1. Zarówno cli jak...
Nie zastanawiać się i zawsze wstawiać atomic block? Etam... Można sobie wyobrazić funkcję zabezpieczoną blokiem z atrybutem RESTORE, która jest wyoływana zarówno w mainie jak i przerwaniu. I co? Można sobie zrobić kuku, nieprawdaż?
Jak zapisuje się do EEPROMU w Atmedze liczbę typu integer? Zaznaczam, że nie chcę korzystać z gotowych funkcji (eeprom_read_word). Poniższy kod oparty o dokumentacje Atmegi32 bez problemu zapisuje zmienne 8-bitowe. [syntax=c] void ZapisDoEpromu (unsigned int adres, unsigned char dane) { ATOMIC_BLOCK(ATOMIC_FORCEON) { while (EECR & (1<<EEWE));...
AVR-libc oferuje makro ATOMIC_BLOCK.
Właśnie do tego masz ATOMIC_BLOCK. Instrukcje w takim bloku będą chronione. Bardziej elegancko można to zrobić w C++, no ale to inna bajka.
W avr-libc są makra do operacji atomowych: #include <util/atomic.h> ATOMIC_BLOCK(ATOMIC_RESTORESTATE)... { /* zrób coś */ } [url=http://www.nongnu.org/avr-libc/user... Pozdrawiam, Dr.Vee
To prawidłowo powinno być tak: [syntax=c] volatile int counter; delay(x) { ATOMIC_BLOCK(ATOMIC_FORCEON) { counter = 0 } while(counter<x){/* waits */} } ISR() { count++; } [/syntax] To takie rozwiązanie nie będzie miało większego wpływu na mój zegar Jeżeli dam opóźnienie 60s to nie zatrzyma mi się zegar na 60s ?
[syntax=c]memcmp(Tablica,(void*) &struktura[index].Tab, 8);[/syntax] Działa. Rozumiem, że w tym przypadku, gdy funkcja używana jest w ISR to tylko kwestia zapisu, zaś w innym przypadku (gdy byłaby używana w main) należałoby zastosować: [syntax=c]ATOMIC_BLOCK(ATOMIC_RESTORESTA... { memcmp(Tablica,(void*) &struktura[index].Tab, 8); }[/syntax] robiw
Nie znalazłem gotowca z wykorzystaniem TWIE czyli przerwania od TWI. Ani nic podobnego do gotowca. Te petle while trwają krótko- kilkadziesiąt mikrosekund- teoretycznie. A próbowałeś z ATOMIC_BLOCK?
Wybacz, ale nie rozumiem współpracy tych linii kodu. Zastanów się nad użyciem [syntax=c]ISR(TIMER0_OVF_vect) { timer0_licz--;[/syntax] i dalej, cała funkcja [syntax=c]void delay_500ms(void) { ATOMIC_BLOCK(ATOMIC_FORCEON) { TIFR |= _BV(TOV0); //zerowanie flagi przerwania (zapis 1) TIMSK |= _BV(TOIE0); //aktywacja przerwania od przepełnienia TIMER0 (OVF)...
Za późno, już zrobiłem i działa:) Po 20 sek. wyłącza podświetlanie wyświetlacza, po 1 min. wyłącza urządzenie. Naciśnięcie dowolnego klawisza włącza podświetlanie ekranu i kasuje liczniki timera:) Ale zajrzę do ATOMIC_BLOCK, bo może rzeczywiście wyskoczą obelgi;)
Gdzieś na forum był już podobny temat przerabiany. Instrukcja skoku do przerwania trwa z tego co wiem 4 cykle zegarowe. W trakcie obsługi jednego przerwania inne nie jest obsługiwane. Zostanie wykonane dopiero po zakończeniu obsługi poprzedniego przerwania. Jeżeli co najmniej dwa przerwania wystąpią w tym samym czasie to zostanie obsłużone to z niższą...
To jest jak ustawienie flagi w przerwaniu- ale nie ma prologu i epilogu wejścia w przerwanie. Jest szybciej. Z tym że odczyt rejestrów w takim przypadku należy chyba robić w Atomic_block. A- ale to jest w asm. No to trzeba zablokować/odblokować przerwania.
Skorzystalem z Twojego kodu: [syntax=C]#define SET(what, x) (what |= (1<<x)) #define CLR(what, x) (what &= ~(1<<x)) #define DDRDDRC #define OW_PIN7 #define PORT PORTC #define OW_NoPresencePulse 1 #define OW_BusShorted 2 #define OW_SearchNoResponse3 #define OW_OK 100 #define OW_CONVERT 0x44 #define OW_SkipROM 0xCC #define OW_MatchROM0x55...
OK, udało mi się wyizolować problem - wysypuje się dodawanie znaków do stringa żeby zawsze miał identyczną długość: [syntax=c]while(strlen(bufstr) < 4) append(bufstr," ",0);[/syntax] Po zakomentowaniu zawsze działa dobrze. Wygląda mi na to że gdzieś w tej funkcji wycieka mi pamięć. Funkcja append: [syntax=c]void append(char subject[], const char...
W celu uzyskania "atomowości" zainclude'uj sobie <util/atomic.h> . Jest w nowym WinAVR. Jest tam kilka makr, Ciebie pewnie zainteresuje taka konstrukcja: ATOMIC_BLOCK(ATOMIC_RESTORESTATE)... (jakieś operacje) } . Dobrze wiedziec, żę coś takiego jest w nowym WinAVR. Ja czasami używam takiej takiego rozwiązania: unsigned...
eltax atomic atomic clean atomic marvel
oporność głośnik zmywarka bosch demontaż spód carel modbus
harman kardon avr255 harman kardon avr255
Blaupunkt ESC 910 - problem z wypadaniem bolca złącza Brak komunikacji z modułem wykonawczym - diagnostyka