Ź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...
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.
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]
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ż?
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...
Dziękuję. A czy te cuda :) nie robią za ten ATOMIC BLOCK, o którym pisałeś? Pozdrawiam :)
Albo wręcz zrobić naked i wykorzystać jakiś rejestr sprzętowy. Co prawda jest to 16 bitów. Ale można to zrobić albo w dwóch 8 bitowych- żeby było atomowo albo jako Atomic Block.
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]
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){...
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.
Na początek upewnij się, że żadna z używanych bibliotek nie używa timera używanego do PWM na wybranych przez Ciebie pinach. W ciemno można np. spróbować zamienić piny na inne z PWM (3, 5, 6, 9, 10,11 w UNO/NANO/PRO MINI). Druga sprawa to już zajrzenie do bibliotek, czy aby nie wyłączają przerwań, głównym podejrzanym byłby tu czujnik DS18B20 (ale to...
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...
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...
Wszystko co Ci proponują wydaje się zbyt trudne? Nic dziwnego. Web a mikrokontrolery to dwie różne rzeczy. Wielu informatykom wydaje się, że jak znają C/C++ to bez problemu poradzą sobie z mikrokontrolerem. Pierwsze kłody pod nogi gdy nie działa fopen np TTYS0, nie ma sterowników , później coraz trudniej. Przejście z mikroprocesorów 64 bit z dziesiątkami...
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....
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"....
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...
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...
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...
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...
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...
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,...
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...
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)...
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...
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.
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...
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?
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...
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)...
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
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;)
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.
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ą...
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 tym przykladzie potrzebujesz raczej atomowych operacji, a nie blokowania dostepu do zmiennych. Zwykle wylaczanie przerwan - w AVR-libc masz w tym celu makra ATOMIC_BLOCK jest wystarczajace. Freddie - jesli tak bardzo ci brakuje double to zainwestuj w komercyjny kompilator, ktory to obsluguje takze dla AVR, albo zrob cos dla ludzkosci i napisz to dla...
W trybie freerunning kolejne pomiary są wyzwalane automatycznie, po zakończeniu poprzedniego. Co do atomowości - nie, volatile zapewnia tylko to, że kompilator przy każdym dostępie do zmiennej odczyta/zapisze jej zawartość w pamięci RAM. Natomiast ty musisz zapewnić, aby przy dostępie, nie następował dostęp w tym samym czasie w innym miejscu programu...
Tak jak pisałem, cała operacja jest ukryta przed programistą i po prostu nie musisz się tym przejmować. Jak widziesz, w prezentowanym kodzie odczywana jest najpierw mniej znacząca, a potem bardziej znacząca część rejestru, resztą zajmuje się hardware MCU. Co do odczytu w main i przerwaniu, to jak zawsze należy zadbać o atomowość - czyli umieścić odczyt...
Tak już lepiej. Działa? Jeśli nie to sprawdź poniższą funkcję: [syntax=c] void OW_ResetPulse() { SET(DDR, OW_PIN); _delay_us(480); CLR(DDR, OW_PIN); } bool OW_WaitForPresencePulse() { ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { OW_ResetPulse(); _delay_us(30); unsigned char counter=0; while((counter<0xFF) && (GET(OW_PIN))) { _delay_us(1); counter++;...
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...
I niestety znowu mamy przykład że brak podania całego kodu na początku zgłaszania problemu powoduje niepotrzebną stratę czasu na szukanie błędu tam gdzie go nie ma. Tak, masz rację. Mea culpa, sorry. Niemniej jeddnak osobiście nie zabierałeś głosu w sprawie, więc mam nadzieję, że tego czasu nie straciłeś. Co zaś się tyczy sedna wypowiedzi...nie przyszło...
Jeszcze dodalbym, ze poniewaz np. g_KrokiZTablicy sa zadeklarowane jako uint16_t i sa volatile i porownywane w przerwaniu to ich modyfikacje w glownej petli nalezy wykonac z zablokowanymi przerwaniami - np. za pomoca macro ATOMIC_BLOCK. Przerwanie moze wystapic pomiedzy operacjami zmiany tej zmiennej, zmieniony bedzie tylko jeden bajt i w przerwaniu...
Zmienna wynik zadeklarowana jest jako int i zdaje się 16 bitowa. Dostęp do tej zmiennej jest możliwy z przerwania oraz z głównego programu ale nie widzę synchronizacji. Możliwe jest zatem ze głowny wątek odczyta jeden bajt ze zmiennej (w końcu mamy 8 bitowy procesor) po czym nastąpi przerwanie w którym 'wynik' zostanie zmodyfikowany, a po powrocie do...
Za czasów 8051 obsługiwałem 8 zewnętrznych usart (2x16c554) tyle, że w przestrzeni XRAM. Kto by pomyślał, że na AVR będę miał większe problemy. Problemy wynikają z tego, co koledzy wcześniej napisali - niezbyt przemyślanego projektu hardware. Trudno się nie zgodzić, że pomysł protezowania przy pomocy zewnętrznych UARTów jest słaby ;) No i do tego uparłeś...
No dobra to jedna rzecz już wyjaśniona, napisałem taka funkcje: [syntax=c] void uart_puts(char *s) { register char c; while ((c = *s++)) uart_putc(c); uart_putc('\n'); } [/syntax] teraz moja pętla główna w pliku main.c wygląda tak: [syntax=c] while(1) { ATOMIC_BLOCK(ATOMIC_FORCEON) { adc_temp=adc; } if(send_flag) { send_flag=0; uart_puts(utoa(adc_temp,...
Zminana na odczyt co 60s zmieni tylko tyle, że mignięcie będzie co 60s a nie co sekundę, niby lepiej, ale ciągle nie tak. Jeśli po włączeniu/wyłączeniu przerwań program idzie w maliny to znaczy, że masz w programie błąd. Najpewniej oprócz flagi I modyfikujesz także inne flagi tego rejestru. Zamiast modyfikować rejestr kontrolny procesora użyj sei/cli....
No tak-ten rozdział o przerwaniach to czytałem jak kryminał. Wydawało mi się że coś o tym wiem- a tu trup w każdej szafie... Ale przedtem wydawało mi śię że ATOMIC_BLOCK jest trochę mądrzejszy- że potrafi rozpoznać czy instrukcja jest wykonywana w jednym czy w paru cyklach. I potrafi je wykonać tak aby nie rozdzielić tych instrukcji. A tu- po prostu...
(at)kamil94goldman Ciągle w twoim kodzie nie widzę korekcji war_pom. Teraz to działa tak, że enkoderem zmieniasz wartość tej zmiennej. jeśli przekracza ona 3700 to wyświetlasz 3700, ale zmienna ciągle może rosnąć przy dalszym kręceniu enkodera. Podobnie w drugą stronę - jeśli jest mniejsza od zera, to wyświetlasz zero, ale zmienna może przyjmować co...
Dziękuje za odpowiedź. Tak to by się zgadzało, że za odpowiedni kod odpowiada w tym przypadku odpowiednia konfiguracja kompilatora. Czy mógłbyś zasugerować jakie ustawienia (oprócz oczywiście stopnia optymalizacji) należałoby wprowadzić w kompilatorze aby wygenerować taki "atomowy" kod jaki uzyskałeś. Samo włączenie optymalizacji (-Os) za bardzo mnie...
Tak czy inaczej pozostaje problem odczyt-modyfikacja-zapis. Będzie to realizowane w kilku operacjach, pomiędzy które może np. wejść przerwanie. I jeśli takie przerwanie zmieni coś w porcie to może być problem. A skąd pozostaje ten problem - ja tam go nie widzę. Tzn w tym sensie, że po pierwsze nikt tu nie pisał (tzn autor nie pisał) że przerwania będą...
Witam, Mam problem z przerobieniem kodu do obsługi DS18B20. Chodzi o nieszczęsne multipleksowanie. Wcześniej napisałem kod bez multipleksowania i działa bez problemu. Próby z multipleksowaniem powodują wyświetlanie 85. Macie jakieś sugestie? [syntax=c]#ifndef F_CPU #define F_CPU 8000000 #endif #include <avr/interrupt.h>// Definicje nazw pinow...
Spróbowałem odblokowania przerwań na czas opóźnień w resecie i działa to bardzo dobrze. Nie ma błędów komunikacji, a na silniku nie słychać już żadnych przerw - praca jest płynna. Czyli chyba problem rozwiązany. Ja korzystałem z tego opisu Atmela, do którego dołączony był przykład: http://www.atmel.com/images/doc2579.pdf . Napisany co prawda na Atmegi,...
Znalazłem inną bibliotekę taką w której można określić pin sterujący podświetlaniem. Problem w tym że podczas kompilacji daje jakiś dziwny błąd którego nie mogę zlokalizować. [syntax=c] Arduino:1.8.5 (Windows 10), Płytka:"NodeMCU 1.0 (ESP-12E Module), 80 MHz, 4M (1M SPIFFS), v2 Prebuilt (MSS=536), Disabled, None, 115200" In file included from C:\Program...
Assemblera na ARM? Na AVR piszesz w ASM? Nie, czasami robię wstawki w przerwaniu, ale głównie sprawdzam co mi kompilator wypluł bo juz kilka razy miałem że program mi nie mnie chodził jak chciałem przez nadmierną optymalizację kompilatora. W ARM takich problemów nie ma. Wstawek ASM nie trzeba robić ani poprawiac kompilatora. Więcej ram, SPI, I2C, RAM,...
Zasadniczy błąd to usypianie w przerwaniu. Wyłączone są przerwania, a ty usypiasz i procesor się nie wybudzi. Ja nigdy nie usypiam w przerwaniu. Ustaw sobie pomocniczą flagę, którą w pętli głównej odczytaj i wtedy uśpij. Jak chcesz zaoszczędzić na bateriach to dołącz cli() i sei() w przerwaniu jak ty masz jest nie potrzebne, bo to jest już robione z...
Od kiedy praca dyplomowa jest tajna? Pytam z ciekawości- kiedyś była jawna na całym etapie pisania. Dlaczego w pętli głównej blokujesz przerwania- potem wykonujesz sporo obliczeń- a potem odblokowujesz? A co będzie jak w tym czasie pojawią się dwa przerwania? Jedno pójdzie się kochać. Do tego wykorzystuje się ATOMIC_BLOCK jak naprawdę trzeba. Co kryje...
Ponownie odświeżam. Z braku czasu, nie miałem kiedy dokończyć programu. Dalej mam problem z resetami. Wyciąłem obsługę DS, bo to nie ona powoduje restarty. Przyczyna może leżeć w źle ustawionych przerwaniach? [syntax=c]#ifndef F_CPU #define F_CPU 8000000 #endif #include <avr/interrupt.h>// Definicje nazw pinow uk³adu #include <avr/io.h>...
Witam. W przykładach do książki Tomasza Francuza jest obsługa USART w przerwaniach. Kod: [syntax=c] #define MAX_CMD_LEN 10 //Maksymalna długość polecenia w bajtach void USART_init() { PORTC_OUTSET=PIN3_bm; PORTC_DIRSET=PIN3_bm; //Pin TxD musi być wyjściem USARTC0.CTRLA=USART_RXCINTLVL_LO_gc | USART_TXCINTLVL_LO_gc; //Odblokuj przerwania odbiornika i...
jedyne co mogę jeszcze dołożyć to definicja struktury [syntax=c] struct connections { uint8_t detect : 3; //nr. detektora uint8_t triac : 3; //nr. triaka uint8_t setFlag : 2; //znacznik ustawienia fazy }; // zmienna connections ma zapisane w sobie // kolejności występowania faz oraz przyporządkowuje // do fazy detektor i triak volatile struct connections...
Witam. Piszę aplikację w języku C służącą do komunikacji mikrokontrolera AVR XMEGA32A4 poprzez interfejs UART/USART. Docelowo interfejs ten ma być połączony z modułem Bluetooth i służyć do komunikacji z telefonem. Aplikacja na telefonie sterowałaby mikrokontrolerem i urządzeniami peryferyjnymi podpiętymi pod niego poprzez wysyłanie odpowiednich komend....
Cześć, programowanie embedded nie przestaje mnie zaskakiwać. Mam program, ogólnie dość rozbudowany, na procesor xmega. Program między innymi odtwarza dźwięk. Zajmując się czym innym chciałem sobie czasowo mrugać ledem, więc do sprawdzania czasu korzystam z funkcji millis(), która wygląda tak: [syntax=c] long millis() { long result; ATOMIC_BLOCK(ATOMIC_RESTORESTATE)...
Witam [syntax=c] #include <avr\io.h> #include <stdio.h> #include <avr\interrupt.h> #include <util\atomic.h> #include <string.h> #include <util\delay.h> #include "KS0108lib.h" #include "graphics.h" #define NOOFSAMPLES128 volatile uint32_t ADCVal; ISR(ADC_vect) { static uint32_t ADCaccum; static uint8_t sampleno; ADCaccum+=ADC;...
Ciągle jest wiele rzeczy do poprawienia - z banalnych - nie używaj sekwencyjnego odwoływania się do rejestru IO, np. ADMUX, tylko przypisz mu od razu nową wartość. Ponieważ rejestry IO są volatile, więc każde odwołanie do nich generuje odpowiedni ciąg instrukcji. Powstaje mega długie przerwanie, zupełnie niepotrzebne. Poza tym, po co ci osobny licznik,...
Silne 1 zapewniam przez rezystor połączony z linią danych i linią vcc. Co do sum crc - nie ma ich w tym kodzie podobnie jak wielu innych rzeczy - skoro miałem probem chociaż z odbiorem bajtu innego niż stałe "1" nie było mowy o liczeniu crc. Finalna aplikacja posiadać będzie sprawdzanie sum. Nie rozumiem, dlaczego mam problemy z zachowaniem czasu okien...
A skąd taki wniosek? Pozostałe linie działają bez zmian. [syntax=c] #define CLEAR_1W(port, bit) port|=(1<<bit)//_BV(bit) // 1 - wy #define SET_1W(port, bit) port&=~(1<<bit)//_BV(bit)// 0 - we unsigned char RESET_PULSE(volatile unsigned char *port, unsigned char pin) { unsigned char PRESENCE; CLEAR_1W(DDR(*port), pin);//CLEAR_1wire; _delay_us(500);...
Witam Znów mam pytanie dotyczące kodu który pozwala na współbieżną obsługe lcd z main i przerwania przedstawiam tylko plik .c [syntax=c] #include "LCD_trans.h" #include <avr/interrupt.h> #include <string.h> #include <util/atomic.h> #include "defines.h" #include "hd44780.h" #include "Alloc_safe.h" #include "PinMacros.h" typedef struct...
[syntax=c]#include <stdio.h> #include <stdlib.h> #include <avr/io.h> #include <util/delay.h> #include <util/atomic.h> #include "HD44780.h" #define NOSAMPLES 128 // usrednianie wyniku co 128 probek volatile uint16_t ADCwynik; // zmienna zawierajaca wartosc ADC co 128 probek void init_adc(void) { ADMUX = (1 << REFS0);...
Warto aby autor przeczytał https://forbot.pl/blog/kurs-arduino-ii-w... ARM ma timer systemowy problem przepełnienia znany z millis() można rozwiązać używając timera 64-bit. Powstanie problem odczytu zmiennej 64-bit używanej w przerwaniu i programie głównym, można rozwiązać to przez __disable_irq() i __enable_irq()....
Ale odpowiedź... Nie powiem żebyś "zapunktował" takim tekstem... 4\/3!! No coz, gdybym chcial zapunktowac to zostalbym politykiem :) Niemniej uwazam, ze merytorycznie odnioslem sie do problemu, czyli jest ok. A swietych wojen nie lubie, nie widze sensu w udowadnianiu komus, ze cos co lubi jest be i powinien polubic to co ja lubie bo to jest ok. Co...
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...
Witam wgrałem poniższy kod do megi32 i będę sobie testował oscyloskop [syntax=c] #include <avr/io.h> #include <avr/interrupt.h> #include <util/atomic.h> #include <string.h> #include <stdlib.h> #include "lcd44780.h" #include <avr/pgmspace.h> void timer_init() { TCCR1B=_BV(ICNC1) | _BV(ICES1); //Włącz filtrowanie ICP,...
Witam, Korzystam z książki Tomasza Francuza i na swojej Atmedze32 próbuje skompilować kod, którym odczytam wypełnienie PWM sygnału. Podczas kompilacji dostaje błąd: Error1'GTCCR' undeclared (first use in this function) Error4'ICIE1' undeclared (first use in this function) Error3'PSRSYNC' undeclared (first use in this function) To jest ten kod: [syntax=c]#include...
Witam Już od dłuższego czasu nie mogę poprawnie uruchomić termometru ds18b20. mikrokontroler to ATMEGA32A, F_CPU 16Mhz Próbowałem już na wiele sposobów, ostatecznie jednak korzystam z kodu zamieszczonego w książce tmfa. http://obrazki.elektroda.pl/9838684200_1... Każda próba kończy się odpowiedzią " No Presence Pulse" Jestem początkujący...
A jak jest z kompilatorami na AVR-y są darmowe czy płatne ? AVR-GCC, bezpłatny kompilator C/C++. GCC popularny jest także wśród ARM. Na start z AVR dobre jest Arduino (tez korzysta z AVR-GCC). Arduino obsługuje tez PIC32 (ale to chyba ARM). Arduino dobre jest do pobawienia się, szybkiego sprawdzenia jakiegoś układu peryferyjnego, wyswietlacza, czytnika...
Podziałam dzisiaj wieczorem i dam znać co z tego wyszło. Kod do analizy/weryfikacji poniżej: /* * Atmeta4808_PomiarSily.c * * Created: 24.02.2025 23:00:58 * Author : Waldek */ #define F_CPU 20000000UL // wewnętrzny kwarc 20Mhz #include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h> #include <util/atomic.h>...
hmmm... a da się jakoś uzyskać przerwanie od systemu QDEC? Mogę zrezygnować z przerwań od USART, ale muszę jakoś sprawdzać kiedy zliczona ilość impulsów osiągnie wartość zadaną wartość. Da się jakoś wpisać ISR i uzyskać obsługę przerwania? Dodano po 54 Znalazłem taki kod ( Dodano po 9 Jeszcze jedno: Czy używając union (jak w [url=http://www.avrfreaks.net/forum/usin...
Dostosowuję program przykładowy z książki "AVR Praktyczne projekty" dotyczący USART-DMA. Jest tam całkiem fajna funkcja która zamienia napis na numer indeksu tego napisu w tablicy. Nie mogę jednak zrozumieć w czym tkwi ograniczenie polegające na niemożności zwiększenia ilości wpisów w tabeli. Fragment oryginalnego kodu: [syntax=c]#define MAX_CMD_LEN...
Różnica może wynikać z użytej wersji kompilatora, albo czy wgrana jest wersja Debug a może Release. Piszę o tym ponieważ natknąłem się na coś niedobrego ze strony kompilatora kompilując ze źródła programu w Microchip Studio. Nie jestem pewien ale wydaje mi się, że znalazłem błąd w kompilatorze avr-gcc w trybie Release z włączoną flagą "-Os". Wyszczególniłem...
Zredukowalem trochę program tylko do odczytu z ADC bez przyciskow i wyswietlacza. Deklaracja zmiennych [syntax=c] #include<avr/io.h> #include <util/delay.h> #include <avr/interrupt.h> #include <stdint.h> #include <avr/sleep.h> #include <avr/eeprom.h> #include<util/atomic.h> #define przycisk PINC #define ELEKTROMAGNES...
Witam. Mam problem z jednoczesnym używaniem portów. Do komunikacji z komputerem chce użyć emulacji portu szeregowego, na USB. Bazując na artykule ze strony [url=http://mikrokontrolery.blogspot.com... uruchomiłem komunikację z komputerem. Wszystko jest ok. Połączenie...
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...
Ad 1 Chciałbym poprzez tranzystory IGBT przełączać 230VAC Myślalem nad zastosowaniem takiego rozwiązania OCRx--->driver IGBT--->para tranzystorów. To w ogóle ma szanse się powieść przy silniku o mocy max 1,5A największy ?? Problem: Gdy przetwornik działa w trybie Free Running i wciśnięciu przycisku podłączonego pod PC4 w timerze 2 zmienia się...
Początek zabawy, i bliski jestem stwierdzenia, że to nie dla mnie. A więc, albo ktoś podpowie, albo pogryzę tego procka. Problem jest następujący: Po przerwaniu, program zapala leda i wychodzi z pętli WHILE (zaczyna main()) czyli mój LED zgaszony. Lub bez przerwania, prog. wchodzi do petli WHILE opuszcza ją i zaczyna od main(). czyli na terminalu widzę...
Witam, Temat wałkowany już 100 raz, ale od paru dni próbuje i nie wiem jak to rozwiązać:/. Mam podłączonego DS18B20 do atmega8a, kwarc wewnętrzny 8MHz. Początkowo układ nie chciał w ogóle współpracować i zwracał standardowe 85 C. Po modyfikacji sterowania pullup zgodnie ze wskazówkami mirekk36 z http://www.elektroda.pl/rtvforum/topic14... układ...
co i jak wysyla, moze w przykladach cos bedzie, -> patrz załączony kod w pierwszym poście, co i jak. Zapewne masz na poczatku inicjalizacje matrycy, czyli ilosc wierszy i kolumn, tego nie widze. o tym również pisałem: Najważniejsze to wyłączyć dekodowanie, ustawić skanowanie na wszystkie cyfry. Nic więcej istotnego w inicjalizacji nie ma. Dodano...
Witam, naskrobałem taki oto kod z wykorzystaniem operacji atomowych, semafory i wywaliłem z funkcji pomiarów z czujników delaye. Rozbiłem te funkcje na mniejsze, a czas oczekiwania na zakończenie konwersji odliczam timerem i wystawiam do main odpowiednią flagę pozwalającą na pobranie wartości. Funkcje dtostrf wrzuciłem w blok atomowy, dzięku czemu skończył...
Napisałem w LabVIEW wywołanie funkcji napisanej w C. Jest to dość proste: na Block Diagram wybiera się Functions > Connectivity > Libraries & Executables > Call Library Function Node, podaje się nazwę pliku z biblioteką, definiuje się nazwę funkcji i parametry, i to działa. Spróbowałem napisać funkcję, która dodaje liczbę do zmiennej (w C instrukcja...
Witam, Próbuję napisać prostą klasę (DBConnector), która będzie odpowiedzialna za przesyłanie danych do bazy danych(mysql). Klasa tworzy osobny wątek w którym co jakiś czas odbywa się operacja `INSERT` zbuforowanych danych to bazy. Wszystko śmiga pięknie poza funkcją "disconnect". Funkcja ta jest wywoływana z innego wątku i ma za zadanie przerwać połączenie...
uszkodzona: 15A U-Boot 2013.10.0-AK_V3.1.00 (Jun 30 2021 - 14:56:45) ramsize: 08000000 DRAM: 128 MiB efuse_read:0x00000007 Block:... Chip:8MB Bus:1 Name:FM25Q64 should_load_env cdh:... line:564 load env_relocate total partitions: 8 In: serial Out: serial Err: serial Net:...
atomic marvel atomic painlusta atomic ecc83
podgrzanie płyty przepięcia zabezpieczyć detektor przewód ściana
powietrzna pompa ciepła ustawienia radio pioneer
Lokalizacja przycisku reset w piecyku Beretta Junior Optymalna obudowa i strojenie B&C 15PS100-4