jeśli chodzi o inne przerwania od układów peryferyjnych to poza ustawieniem rejestrów tego układu muszę włączyć to przerwanie i czy tu wystarczy funkcja z core_cm3 np. NVIC_EnableIRQ( RTC_IRQn ); tak I dlaczego nie musiałem włączyć globalnych przerwań żeby SysTick działał?;] Przerwanie SysTick jest w grupie exceptions, ich się nie da wyłączyć w NVIC....
...więc się zgadza wszystko... Wprost przeciwnie - nic się nie zgadza :!: K ma być 8 bitowa wartością wpisana do rejestrów 16-31 :) No właśnie , a Ty jako argument K , podajesz time , który to jest adresem(wskaźnikiem) do komórki pamięci RAM i na dokładkę , ten adres w procesie kompilacji nie jest znany , bo time jest zmienną lokalną. Argument K ,...
Zmienną używaną w przerwaniu deklaruje się jako volatile (wykluczona z optymalizacji), inaczej będzie cyrk... volatile unsigned char licznik Ładniej by to wyglądało scalone... tzn... void czekaj(void) { licznik = 30; TCCR0 = 0x05; do{}while(licznik); } ISR(TIMER0_OVF_VECT) { licznik--; TCCR0 = 0; //wypadałoby...
Ja tam nie mam żadnego problemu żeby go skompilować, ściągnij sobie najnowszą wersje arduino, między 1.0 a wcześniejszymi trochę pozmieniał się kod. Ja mam 1.0 i wszystko działa [syntax=c]int buttonPin = 2; int ledPin = 13; int buttonState = 0; void setup() { pinMode(ledPin, OUTPUT); pinMode(buttonPin, INPUT); } void loop(){ buttonState = digitalRead(buttonPin);...
Jeśli dana funkcja się kilka razy, to zwykle nie zwraca się na optymalizację kodu, a jeśli okazuje się, że wykonuje się to wiele razy, wtedy zaczyna mieć spore znaczenie. Optymalizacja algorytmów to przydatne zagadnienie ;)
Niestety program sie nie kompiluje bo wyskakuje mi błąd "Type 'RCC_APB2Periph_GPIOB' undeclared (first use in this function)" Tam był przykład dla STM32F1 dlatego zmień na: RCC_AHBPeriph_GPIOB Najprościej opóźnienie realizuje się tak: [syntax=c]for (volatile uint32_t i = 0; i < 0xFFFFF; i++);[/syntax]
temat wałkowany już kilka krotnie. funkcje delay mają argument typu float jeśli podajesz zmienna jako argument do dodajesz również operacje zmiennoprzecinkowe na tej funkcji które .... dają efekt jaki uzyskałeś
Pierwszy z brzegu - http://fabrykaelektryka.pl/przekaznik-cz...
Ta funkcja wcale nie jest dziwna. Ot po prostu 32-bitowe odejmowanie. Śmiał możesz to zastąpić inną funkcją delay. Weź też pod uwagę, że transmisja z SGT jest transmisją synchroniczną, taktowaną generowanym przebiegiem CLK, w związku z tym opóźnienia są tylko po to, aby zwolnić transmisję do wartości akceptowanych przez czujnik.
(at)ienecode A nie sorry, czasówka TOF podtrzymuje sygnał przez zadany czas po zaniku sygnału sterującego. Gdybyś podał sam impuls to spełniłoby twoje zadanie. Najlepiej skonstruować sobie funkcję, która będzie realizowała takie zadanie. Zboczem opadającym Setujesz zmienną pomocniczą typu bit. Z tego samego bitu zasilacz czasówkę z opóźnionym załączeniem...
ChatGPT wyłączyli? :) unsigned long poprzedniCzas6 = 0; // czas poprzedniego pomiaru dla przycisku na pinie 6 unsigned long poprzedniCzas5 = 0; // czas poprzedniego pomiaru dla przycisku na pinie 5 const unsigned long opoznienie = 300; // czas opóźnienia w milisekundach int zw_na_warstwe = 0; void zwoje() { unsigned long aktualnyCzas = millis(); if...
Twoim problemem jest wykorzytanie funkcji delay która jest niczym innym tylko pętlą o określonej ilości iteracji. Poczytaj o licznikach i przerwaniach.
Kod masz tak napisany, że odebranie jakiekolwiek kodu wyłącza przekaźnik, a tylko odebranie 4472242 go załącza, po tym jak go dajesz na HIGH masz delay 1000 i już go nie wyłączasz, nie ma kolejnego polecenia digitalWrite(13,LOW);. Poza tym możesz być już wdzięczny, bo funkcja delay działa prawidłowo.
Jak napisać program z uwzględnieniem wejścia "Pin 5" oraz licznika który mam w programie nie zatrzymując całego programu "delayem". Odliczać czas przy pomocy millis() w pętli loop() zamiast stosowania delay(). https://www.norwegiancreations.com/2017/...
Przeanalizuj(zastosuj) przykładowy szkic "blink without delay". Zrezygnuj ze stosowania funkcji delay na rzecz millis , micros.
użyłem funkcji "delay" lecz zatrzymuje ona cały program na określony czas a wolałbym aby było to niezależne od czasu tylko od wyboru innego przycisku. Poczytaj o millis().
Niestety nie znam się na STM, ale wygląda mi to cały czas na problem z delayem przed inicjalizacją wyświetlacza. Mikrokontrolery zwykle startują zanim ustali się pełne napięcie na linii zasilania. W takich sytuacjach należy zaczekać trochę dłużej przed startem wyświetlacza. Czy jesteś pewien, że delay działa poprawnie (do sprawdzenia z zegarkiem na...
Wystarczy użyć jakiejś funkcji delay albo sobie samemu napisać. http://support.microsoft.com/kb/212667 Pare przykładów jak to zrobić...
To w czym widzisz problem ;) Na początku, przy załączeniu spryskiwacza, setujesz jakiś merker, np. M1.0. W następnym networku wstawiasz warunek, że jeśli M1.0 jest=1 to startujesz timer TON. W kolejnym networku Warunek, że jeśli timer TON=1 to resetujesz M1.0. I na koniec oczywiście wykorzystujesz M1.0 do sterowania wyjściem Q spryskiwacza.
void funkcja(delay){ PORTD=1; sleep(1); PORTD=2; sleep(1); PORTD=3; sleep(1); PORTD=4; } (moduł DOS.H)
Tak się objawiają uszkodzone czujniki. Sprawdź go jeszcze raz w bascomie. Pozatym masz jakieś dziwne te delay'e czemu używasz funkcji owire_delay przecież masz _delay_ms? Trochę wróżąc z kodu wnioskuje że funkcja delay odmierza 0,25us * przekazany argument. Piszesz w komenarzach że niby ta pętla for + funkcja poniżej jej trwa 470ms. Jak nie przestawiałeś...
Ponieważ jest sobota i jestem leniem to gotowego programu pisał nie będę. Poza tym cała frajda z Arduino to napisać własny program, który będzie działał. funkcja Delay jest najgorszym z możliwych rozwiązań, bo podczas jej wykonywania program stoi. Proponowałbym zapoznać się z funkcją timer. Proste przykłady są tutaj https://playground.arduino.cc/Code/Timer...
funkcja sleep(x) x-czas w miliskekundach Sleep służy do opóźniania wykonywania pętli. -- :arrow: następnym razem poszukaj na google lub na elektrodzie, troszkę wysiłku w poszukiwaniach nie zaszkodzi, a napewno pomoże :!::!:
Najlepiej zapomnij o używaniu funkcji delay i używaj timerów/liczników oraz przerwań. Na tym Forum wyszukasz wiele tematów na ten temat. Na innych stronach będzie tego miliony. Na przykład tutaj: http://www.elektroda.pl/rtvforum/viewtop...
Dobry wieczór wszystkim. Mam problem z Arduino Nano, w moim kodzie gdzieś musi tkwić szkopuł, który nie pozwala na wykonanie funkcji z attachInterrupt. Robię projekt do mini szklarni, i aby przekaźniki od rezystora grzejnego co chwilę nie włączały i nie wyłączały się, musiałem wstawić delay, jako opóźnienie przy nagrzewaniu i chłodzeniu powietrza. Jednak...
jak wobec tego zmierzyć czas trwania cyklu procesora ? sa na to jakieś metody ?
A po 2wszystkoe piny cyfrowe mam zajete Każdy pin może być "cyfrowy", to znaczy działają na nim "cyfrowe" operacje. Mógłbyś również zrezygnować z funkcji "delay", które blokują działanie programu. Można używać "millis" albo "micros", jest przykład "blink without delay", który mógłbyś sobie twórczo zmodyfikować.
Teraz podnieś poprzeczkę i zrób nieblokującą obsługę klawiatury. W tym celu funkcję delay musisz zastąpić sprawdzaniem warunku powiązanego z timerem. W obecnej postaci w chwili gdy wciśniesz klawisz cały program jest zatrzymywany. W większości aplikacji nie zrobi to różnicy, ale są zastosowania gdzie ma to znaczenie.
Niestety nadal występuje ten sam problem :cry: Problem wystąi niezależnie czy naciśniesz F10 czy F11 bo funkcje delay są inlinowane, więc co prawda tego nie widzisz, ale ich ciało jest osadzane w miejscu wywołania. Najlepiej ustawić breakpointa za delay i dać F5. A jeszcze lepiej zrobić tak, żeby dla celu debug przy symulacji preprocesor wywalał delay.
Nie ma bufora. Operacja (od wywołania funkcji do jej zakończenia) trwa tyle, ile potrzeba na zapis do EEPROMu całego bloku danych podanych w argumencie. Dla przykładu, wywołujesz zapis: [syntax=c]#include <EEPROM.h> void setup() { uint8_t var[5] = {1,2,3,4,5}; EEPROM.put(0, var); } void loop() {}[/syntax] Wtedy kompilator tworzy funkcję z szablonu...
Nie znam się na bascomie, ale czy w petli do loop nie powinno być Pwm1a = X, b tak jak zostało napisane to wygląda jak by było z czytywanie raz z addc raz z pwm. I takie pytanie co do zadeklarowania częstotliwości czy to coś w ogóle da, w zasadzie funkcje delay i inne wykorzystujące opóźnienia po prostu wykonają się szybciej, czyli tak jak by zmniejszyć...
Witam serdecznie! Uczę sie programować uC w C. Mam napisana funkcje Delay: void Delay(WORD czas) { BYTE timerS; timerS = czas; for (timerS=0;timerS<czas;timerS++... {} } Ma ona robic opóźnienie. Jednak zależy ono od tego jakim kwarcem taktujemy uC... Pytanie ile taktów potrzeba dla wykonania się jednej pętli? I najważniejsze...
Zacznij od sprawdzenia fusebitów i innych ustawień dot. zegara (jeżeli są, bo nie znam tego układu), by sprawdzić, czy masz wybraną prędkość zegara jak deklarowana #define F_CPU 1000000 Swoją drogą powinna wyglądać tak: #define F_CPU 1000000 UL Nie bardzo rozumie jak komentarz pasuje do tej funkcji: [syntax=c]delay(1); // czekanie pol sekundy[/syntax]...
Post był raportowany. Przeniosłem z: Mikrokontrolery
PIT- Głownie do przełączania wątków czas miedzy 0,03 us a 0,3 sek. Taktowanie ma z kwarcu. Jest małe ale, pamiętaj że ten czas zależy jeszcze od opcji kompilacji, nie pamiętam teraz dokładnie ale chyba chodzi o optymalizacje kodu. RTT - on jest taktowany z generatora RC. Podstawę może mieć od 100 us. Na mim można zrobić dokładny zegar. PWM może mieć...
Gdzie ostatecznie określasz częstotliwość taktowania? W avrstudio robi się to Project->properies->general pole frequency. I spróbuj zdefiniować sobie własną funkcję do delaya w takiej postaci. [syntax=c]void my_delay(int a){ for(int k=0;k<a;k++) _delay_ms(1); }[/syntax] Funkcja _delay_ms/_delay_us przyjmuje tylko stałe.
Witaj. Może przy okazji programowania zmieniłeś fusebity i zablokowałeś mikrokontroler, albo podczas programowania nie kasujesz pamięci FLASH. Doinstaluj AVR Studio 4.18 lub 4.19 i w nim pisz swoje programy - oprócz takich zalet jak automatyczne tworzenie makefile (które często jest przyczyną problemów) dostajesz dodatkowo symulator AVR, a to bardzo...
Bardzo ładny projekt. Możesz schemat udostępnić? Nie przejmuj się funkcją delay 😉
Dzięki za pomoc nie pomyślałem, że mogę skorzystać z symulatora i obliczyć czasy na jego podstawie. Takie jeszcze jedno pytanko z jakiego symulatora korzystasz? Bo mi w AVR Studio 4 wyszło do opóźnienia ok 480 us : ow_delay_us(200); ow_delay_us(182);
A po co nam dajesz źródła pliku C? Sprawdź co generuje kompilator w plikach wynikowych *.map. Tam masz cały kod z C przerobiony na assemblera i od razu widać co się dzieje. Tak jak kolega zauważył - jak kompilator coś za bardzo zoptmalizuje (np. funkcję delay, bo stwierdzi, że jej działanie nic nie zmienia w wyniku) to nagle się okazuje, że czasowe...
Moja funkcja delay wygląda tak: void delay_us(unsigned int delay) { while (delay--) { __delay_cycles(8); } } 8 bo wybieram zegar 8MHZ czyli 8*10^6 hz i zeby uzyskać czas w us dziele przez 10^6. A dekrementacja zmiennej, badanie warunku i skok do początku pętli to niby bez cykli się wykonują? Albert
oraz jeszcze: 1. stosujesz stare funkcje obsługi przerwań a nowe wektory - stosuj nowe funkcje ISR(): http://nongnu.org/avr-libc/user-manual/g... i wywal nagłówek #include <avr/signal.h> 2. returny w funkcjach ISR() i main() są zbędne. 3. Ostatnia uwaga kol Zaquadnik jest baaaardzo istotna. Nie dość, że czekasz w funkcji...
Masz dwa potężne narzędzia, FPGA i soft-procesor, dlaczego nie zrobić tego zgodnie z sztuką, czyli zaprojektować IP Core, który będzie obsługiwał sprzętowo 1-wire jako kolejny układ peryferyjny jak przykładowo UART, I2C czy SPI ? Ten Twój sposób jest nie elegancki i bardzo mało praktyczny.
teraz zrobiłem tak nie widać wydłużenia czasu miedzy mrugnięciami atmega8 działa bez zew kwarcu na wew oscylatorze.Jak wy byście to zrobili skopiujcie nanieście poprawki i wklejcie kod. #define F_CPU 1000000UL #include <avr\io.h> #include <util\delay.h> int main(void) { /* Ustawienie wyjść */ DDRD = 0x07; for(;;) {...
Masz 2 błędy: 1. Funkcja delay nie jest static. 2. Przekazujesz do _delay_ms wartość nie znaną na etapie kompilacji. [syntax=c]static inline void delay(uint16_t cnt) { #if !DEBUG while (cnt--) _delay_ms(1); #endif }[/syntax] BTW: Wklejając tutaj kod + komunikaty błędu kompilacji będziesz miał większe szanse na uzyskanie pomocy niż w przypadku screen...
Z volatile ma to prawo dzialac, bez - nie. Kompilator taka petle powinien wyrzucic bo jest pusta i nic nie robi. Nie wiem skad ten upor i zabawa z petlami, skoro jest od tego funkcja delay. No i w prawdziwym procesorze przy petli do 10000 to migania nie zobaczysz, nawet jesli go popedzisz w wewnetrznego RC to masz w zaleznosci od proce 1,2-8MHz, czyli...
Pomiar odległości wykonywany jest dziesięciokrotnie z półsekundowymi przerwami między pomiarami, co daje łączny czas trwania tej sekwencji = 5 sekund. To prawda. Rozwiązanie to zastosowano zapewne dla lepszego zobrazowania zmian odległości w terminalu. Dla prób może zostać ale w docelowym kodzie lepiej wykonywać jeden pomiar w każdej iteracji pętli...
To zależy co masz na myśli, delay też nie blokuje przerwań, ale jest uznawana za funkcję blokującą. Jak w loop wywołasz pulseln() i będziesz będziesz mierzył impuls 500ms to w tym czasie żadna funkcja z loop się nie wykona, tak samo jak z delay().
Jak byś był tak uprzejmy podesłać kod to byłbym bardzo wdzięczny Proszę bardzo, kod lda M88 8MHz Dodano po 2 Nie twierdzę, że są super. Prostuję jedynie wprowadzanie w błąd. Może konkretny przykład a nię że jest inaczej niz pisałem? <ciach> Post raportowany. Uprzedzam kolegę, że jeśli w kolejnych wypowiedziach lub tematach po raz n-ty kolega...
#include <avr/io.h> /***************************************... Definicje stałych ****************************************... #define F_CPU 1000000 /* 1MHz zegar procesora */ #define CYCLES_PER_US ((F_CPU+500000)/1000000) /* cpu cycles per microsecond */ /***************************************...
Problem masz gdzieś indziej. W kompilatorze Codevision funkcja systemowa delay ma wewnątrz kasowanie watchdoga. Spróbuj zamienić ją na pętlę while(1); a powineś zuważyć efekt zadziałania watchdoga.
To jest program pierwszy który działał do tej pory bez zarzutów ale są te nieszczęsne delay() i nie mogłem zastosować WDT do resetu bo przekracza 8 Sek. Skoro działa bez zarzutu, a chciałby zastosować WDT, to możesz użyć własnej wersji funkcji delay(): [syntax=c]void myDelay(unsigned long ms) { uint32_t start = micros(); while (ms > 0) { wdt_reset();...
Na przyszłość: w600 sdk zawiera również funkcję delay in us (https://github.com/openshwprojects/Open... Nie mam układu w600, więc nie mogę sprawdzić, czy działa poprawnie w800 tego nie ma, ale może da się to przenieść z w600.
Czy w wywołaniu funkcji delay() nie występuje przekroczenie zakresu int?
jak zmienisz _delay_ms((PIND & _BV(0))? 1000: 200); na _delay_ms(200); to zobaczysz, że tyle nie zajmuje. Dlaczego ? Pytanie konkursowe o złote gacie dla Ciebie :) i jeszcze spróbuj włączyć optymalizację w jakichś opcjach projektu (nie użuwam avr studio więc dokładnie nie powiem), bo o makefile'u pewnie nie słyszałeś...
Nawet z uwzględnieniem zmniejszenia dokładności (które przy wykorzystaniu aktualnej wersji avr-gcc przy typowych opcjach kompilacji nie występuje – patrz fragment If the avr-gcc toolchain has __builtin_avr_delay_cycles(unsigned long) support w dokumentacji) te funkcje (jako same w sobie) są całkiem niezłe. W praktycznych zastosowaniach ich niedokładność...
Wklejaj kod używając znacznika SYNTAX. Możesz zrobić np.: [syntax=c] #include <LiquidCrystal.h> #include <util/delay.h> // by korzystać z funkcji delay LiquidCrystal lcd(0,1,2,3,4,5); int czas; void setup() { pinMode(6,OUTPUT); pinMode(10,INPUT_PULLUP); lcd.begin(16,2); lcd.clear(); } void loop () { if (digitalRead(10) == LOW) { czas +=1000...
Na pierwszy rzut oka nie zdołasz tego zrobić jeśli używasz funkcji delay(). Jeśli masz zamiar zrobić tak by wszystko razem działało to musisz zastąpić delay() czymś własnym z użyciem millis() ale to nie jest takie proste żeby to zrobić w 5 minut bo jeszcze trzeba jakoś zintegrować oba efekty migania i pwm w jednej pętli, pobrać sobie czas funkcją millis()...
W pierwszym kodzie w funkcji delay ręcznie podaje 250 ms, w drugim kodzie podaje za argument zmienną 'time', co zjada ogromną ilość pamięci.
Musisz w swojej aplikacji dodać gdzieś swoją własną funkcje HAL_Delay(), która po prostu będzie wywoływała task-delay z FreeRTOSa.
void Delay_50us(int Delay) { int i,j; for (i=0;i<Delay;i++) { for (j=1;j<20;j++); asm("WDR"); } } może coś takiego ?
Zanim napiszesz kolejny post zaczynający się od "dlaczego mi nie działa", warto rozważyć, czy tak na prawdę użycie Arduino jest a) możliwym rozwiązaniem zadania, które sobie postawiłeś b) mieści się w zakresie Twojej wiedzy i umiejętności. Ten wątek utworzyłem, w celu pomocy udzielenia odpowiedzi na te dwa pytania, i zebrania w jednym miejscu linków...
https://obrazki.elektroda.pl/9666499900_... Tego ptaszka musisz odznaczyć.
Taki efekt powstaje każdym razem przy zmianie wartości rejestrów sterujących segmentami (bezwładność). Można zmienić częstotliwość wyświetlenia ramki. Można dokonać jeszcze zmiany dotyczącej częstotliwości taktowania mikrokontrolera (funkcje delay dostarczają połowę nastawianego czasu). Powodem jest nieprawidłowa definicja #define _XTAL_FREQ 8 000 000...
Faktycznie wygląda to na problem z timmingami. Jak masz ochotę się pobawić to trzeba by spróbować zmienić wartości opóźnień w procedurach void write_onewire(u08 bit) i/lub u08 read_onewire(void) . Pisząc opóźnienia mam na myśli wartości dla funkcji delay - zmienić o kilka w górę lub w dół. W write jest dwa razy delay(30) - zmienić trza oba na raz np...
w pierwszej fnkcji zadeklaruj "u" jako volatile, druga nie powinna być optymalizowana. 4\/3!!
Delay nie chcę użyć ponieważ on mi zablokuje wykonywanie innych instrukcji jak chociażby obsługę wejść (potencjometr, switch). Chyba nie do końca dobrze ująłem w pierwszym poście co chcę uzyskać. Chciałbym zablokować jedno wyjście arduino na czas 0,2 sek (tak aby było nieaktywne) tuż przed przystąpieniem do pomiaru temperatury. O ile wiem jak wykonać...
Nie używaj delay() tylko timera lub funkcji millis(): https://www.arduino.cc/en/Reference/Mill...
Kilka uwag: - korzystaj z funkcji i rozbijaj program na funkcje. Niektórzy twierdzą, że jeśli blok ma więcej niż 10 instrukcji to należy go wyrzucić do funkcji. Moze to przesada, ale ułatwia czytanie kodu. - nie zostawiaj niewykorzystanych pinów jako wejścia w układzie - łapią zakłócenia, co w centralce alarmowej nie jest zalecane. - wewnętrzny pull...
chodzi mi głównie o to (delay--) Pętla z każdym przejściem odlicza 1ms i odejmuje od delay-- jedynke aż doliczy do 0 i wychodzi z pętli? Dokładnie tak. Inaczej pisząc "podstawa czasu" to 1 ms. Czas w pętli "zostanie odmierzony" jako wielokrotność 1ms, wielokrotność zależy od wartości początkowej (przekazanej do funkcji) w "delay" Ta forma z "while"...
Są gotowe paski LED z diodami WS2812B - są to paski RGB ( czyli mogące świecić "dowolnym" kolorem ). Sterowane są właśnie 1Wire. W dodatku można ustawiać ich jasność a także sterować kolorem i jasnością poszczególnych diod w taśmie a nie tylko całą taśmą. Są oczywiście dużo droższe od taśm "zwykłych". Co do kodu - bardzo, bardzo martwi mnie duża ilość...
Dziwna rzecz z tym delay'iem. O ile proste miganie ledem nieznacznie przyspiesza po optymalizacji o tyle taki delay w funkcjach obsługi LCD jest "na oko" 20-30 razy szybszy. Nawet jeśli te dwie rzeczy występują w tym samym programie. Przy włączonej optymalizacji ten delay sprowadza się do wywołania PUSTEJ funkcji, bo cały "środek" zostanie zoptymalizowany....
W zasadzie program działa, ale... to wszystko. Można to zrobić o wiele lepiej. podobno nie powinno stosować się funkcji delay w celu realizacji opóźnienia. Tak. O wiele lepiej jest to zrobić na przerwaniu timera. Poza tym, lepiej jest zadeklarować tablicę z której będziemy wczytywać wartości portów, a w funkcji obsługującej to wszystko tylko przesuwać...
Używam płytki Arduino PRO z podłączonymi czujnikami z którymi komunikuję się po i2c. Czujniki włączam co jakiś czas na okres pomiaru poprzez ustawienie stanu wysokiego na odpowiednich pinach. Do obsługi czujników używam dedykowanych libek. Jakie konkretnie czujniki, modele? Jakie konkretnie biblioteki chcesz zastosować? doświadczalnie dobrałem czas...
opoznienie bedzie wynosic w przyblizeniu 256*100*2 czyli 51200 cykli instrukcji, takie to proste :) Wynika to z tego, ze 100 razy wywolujemy petle, ktora wykonuje 256 razy instrukcje djnz a ta instrukcja trwa 2 cykle. Teraz w zaleznosci od zegara twojego procesora i od ilosci cykli jakie potrzebuje twoj procesor na wykonanie tych instrukcji bedzie zalezec...
Należy zmienić sposób włączania LEDów na nieblokujący procesor (bez użycia funkcji delay() w pętli głównej) i liczyć czas od początku cyklu włączenia pierwszego LEDa, np. tak: [syntax=c]void loop() { static byte state = 0; // state 0 - rogatka podniesiona // state 1 - rogatka opuszczona static long blinkTimeCounter = 0; checkIfSw1ButtonIsPressed();...
Tak jak koledzy wyżej napisali. Być może usterka jest bardziej prozaiczna i masz w programie zadany za krótki czas na obrót serwa. Ale bez wglądu w kod to zgaduj zgadula. Spróbuj jednak wydłużyć czas jak mniemam zgadując w funkcji "delay(xxx)". Za xxx podstaw na przykład 200 albo 1000.
Bardziej pokręconego kodu na delay to chyba nie widziałem. Ten delay to widzę, że ma być "nieblokujący" chyba, że taki skomplikowany :D bo jeśli nie to nie można poprostu czegoś takiego: [Psuedokod] [syntax=c] volatile int counter; delay(x) { counter = 0 while(counter<x){/* waits */} } ISR() { count++; } [/syntax]
Może wyrzuć tę linię? To generuje te ponizsze bledy to wyglada jakby to byla bibloteka dla funkcji delay.
Gdzieś czytałem, że funkcja delay "zajmuje" cały procesor, jednakże na chwilę obecną nie mam pojęcia jaką funkcję użyć dla opóźnienia. Za jakąś godzinę będę w domu, więc wyzwania ciąg dalszy :) Dziękuję za podpowiedź, spróbuję coś przerobić.
Witam do (klona arduino) pomiaru co 1ms, dlatego używam funkcji delay(1) Ale zdajesz sobie sprawę, że funkcja _delay(x) nie służy do generowania taktu a do wstrzymywania programu na "x" ms? Zresztą mówimy tu o "jakimś wirtualnym programie" więc trudno się nawet odnieść. Pozdr.
Coś mi się wydaje że przesadziłeś z "delay". Funkcja przyjmuje argument unsigned int a więc max 65535...a ty wywołujesz ją z argumentami nawet 300000 :wink:. I dla pewności proponuje zrobić opóźnienie na timerze....kompilator czasami takie "puste takty" potrafi zignorować.
rzemyk90 Dałeś czadu :D "Funkcja delay nie wchodzi w grę. "
Zacznij od świadomego migania diodą w Arduino po naciśnięciu przycisku. Świadomego, to znaczy bez używania funkcji delay(). Potem ogarnij, jak przy pomocy tego przycisku albo dwóch zmieniać czas migania diody, tak, żeby układ reagował na manipulację przyciskami w czasie rzeczywistym. Jak ją zapalać i gasić jednym naciśnięciem (debouncing). I potem...
ciekawi mnie to, że obojętnie co [/quote] Coz... njaprawdopodobnije kompilator mysli za Ciebie i pusta petle po prostu pomija. Rozwiazanie: Albo napisz petle w asemblerze, albo przed dekalracja zmiennych w funkcji: void delay(unsigned int us) wstaw magiczne slowo volatile np: volatile unsigned int delay_loops; Poza tym jak cos nie dzial to zajrzyj...
Skoro sam napisałeś ten program, to czemu innych pytasz co oznaczają 0x7F i 0x80? Śmiem wątpić w twoje autorstwo, ale odpowiem: - 0x7F to maska bitowa, w której jedyny skasowany bit to bit 7. 0x80 to maska bitowa, w której jedyny ustawiony bit to bit 7. O pojęciu maski, bitu i bajtu nie będę pisał. - Maski te są wykorzystywane przy ustawianiu odpowiedniego...
Ma przecież główną funkcję delay i funkcję przerwania dekrementującą zmienną.
Nie działa Ci z to z millis bo może źle używasz. Jak masz przez 200ms kręcić kołem to wstawiasz w loop funkcję, która włącza kręcenie kołem i zapisuje czas startu, w kolejnych wywołaniach sprawdza czy już minęło od chwili startu 200ms i ewentualnie wyłącza kręcenie kołem. Jak coś zablokuje loop na np. 20ms to o tyle będzie maksymalny błąd pomiaru, z...
Z tego co pamiętam to jest funkcja delay(wartość czasu w ms)
bo dane na porcie szeregowym pojawiają się dopiero po zakończeniu ruchu( domyslam się, że to przez funkcję delay) i to w "bliżej nieokreślonym" języku. Tak jakbym pomylił się w określeniu prędkości w Serial. begin . Drugą częścią komplikacji jest to, że nie ma mam pojęcia ( gdy uda mi się rozgryźć enkoder ) jak opisać ograniczenie obrotu. To co jest...
czy tamtego nie da się naprawić Na początku tego tematu wrzuciłem Ci poprawki do programu. Poniżej cały program - z kodu początkowego. Nie uwzględnia korekcji zaproponowanych przez bota. Zwróć uwagę na uproszczenie całości przez dodanie jednej funkcji. Delay zostawmy na później żeby Ci nie mieszać. W tym przypadku za jego pomocą decydujesz jedynie,...
trochę łopatologicznie - ale teraz zaskoczysz o co chodzi A po co te funkcje delay()?
Zmiana czasu albo dodanie kolejnej funkcji delay nie zmienia nic . Próbowałem coś x tym wymyślić Niepotrzebnie. Funkcja delay() z Arduino HAL nie blokuje przerwań, więc jeżeli enkoder jest obsługiwany tylko w obsłudze przerwań, to co wstawisz w pętle loop() nie ma znaczenia. Oczywiście, o ile nie będziesz blokował świadomie tych przerwań w loop()....
A ta druga funkcja delay jest w porządku?
O ile dobrze zrozumialem autora to przecież to mozna zrobić bez przerwan na trzech "switchach". Bez użycia funkcji delay i musi dzialac. Wielowatkowasc do sterowania światłem? Bez przesady
Lepiej w pętli na zmiennych bez używania funkcji "delay"
Na początek możesz przejrzeć te tematy: [url=http://www.elektroda.pl/rtvforum/to... 16 serw na ATmega16 plus komunikacja przez RS232 i [url=http://www.elektroda.pl/rtvforum/to... Sterowanie wieksza iloscia serw, do tego warto przejrzeć ten [url=http://www.educypedia.be/electronic... Tutaj...
A to w bascomie nie ma jakieś funkcji delay?
To jak robić pauzę dłuższą niż 10s? Bez użycia funkcji delay().
Problem pewnie leży w procedurze. therm_read_temperature(temp); Tam zapewne masz jakiegoś delay-a ustawionego (na czas potrzebny na konwersje temperatury przez DS-a). Musiał byś pokombinować, żeby przebudować tą funkcję a delay-a wbudować najlepiej w obsługę przerwań z timera z którego korzystasz. Np. Timer przerywa częściej, za każdym razem...
funkcja delay arduino stm32f4 funkcja delay przerwanie delay
automat dzwoniący kyocera drukuje białe kartki nokia upadek
Najlepszy olej do mieszanki paliwowej piły spalinowej – STIHL HP Ultra, Husqvarna XP, Castrol 2T Toyota Prius C1345 – błąd Linear Valve Offset, kontrolki ABS/VSC świecą po procedurze