Stos dla przerwań ustawiłeś? 4\/3!!
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...
...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 ,...
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...
(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...
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.
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.
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ść...
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.
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.
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...
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().
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)
Masz 376 postów i nie znasz Sleep() ? To już znasz :) include windows.h niebardzo moge uzyc windows.h - kozystam juz z allegro... Moze allegro oferuje tego typu funkcje??
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...
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...
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ś...
Wiem, mistrzem kodowania nie jestem, do profesjonalisty też mi daleko Nie chodzi o mistrzostwo ale o dosyć elementarne zasady. Wołasz z przerwania dużą funkcję, która wywołuje różne inne funkcje, również "delay". Te inne funkcje wołane są również z innych miejsc programu, powinny zatem być wielobieżne a napisanie takiej funkcji nie jest bardzo proste....
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ć.
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...
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.
Zasada działania ? każda instrukcja wykonywana jest określona ilość cykli zegarowych. Więc opóźnienie realizuje się zajmując procesor na określoną ilość czasu czymś co nie da żadnych efektów. Możliwości uzyskania dowolnego czasu opóźnienia. Jednak funkcje z tej biblioteki np delay_ms ma ograniczenia takie ze powyżej pewnej wartości jej dokładność maleje...
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...
Racja, przy obsludze LCD czasy opoznien sa ograniczone tylko od dolu. W takim razie wykorzystaj te funkcje ktora juz masz. Daje ona w przyblizeniu opoznienie rowne 26 * useconds * czas wykonania jednej petli wewnetrznej. Ja nie znam MicroBlaze wogole wiec nie bede sie wymadrzal, ale jako czas wykonania jedej petli przyjalbym np. 5 taktow zegara (instrukcje...
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]...
Witam, jestem zielony jesli chodzi o programowanie ARMów a potrzebuje napisać kod implementujacy RC5 na ten procek. Problem polega na tym jak najłatwiej i zarazem elegancko napisać funkcje delay czekającą dokladnie 888 us. Generalnie nie wiem jak sie zabrać za odmierzanie tak krótkich odcinkow czasu i którego timera do tego uzyc
Bardzo ładny projekt. Możesz schemat udostępnić? Nie przejmuj się funkcją delay 😉
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.
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...
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...
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);
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...
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...
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
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...
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...
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...
#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 */ /***************************************...
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 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.
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.
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ś...
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.
Czy w wywołaniu funkcji delay() nie występuje przekroczenie zakresu int?
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();...
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().
Jakbyś poczytał dokumentację tej metody, albo przeszukał forum, to byś się dowiedział, że te funkcje przyjmują tylko stałe i wymagają włączonej optymalizacji. Więcej można poczytać [url=http://www.nongnu.org/avr-libc/user...
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ć...
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.
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()...
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 ?
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...
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...
w pierwszej fnkcji zadeklaruj "u" jako volatile, druga nie powinna być optymalizowana. 4\/3!!
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...
Nie używaj delay() tylko timera lub funkcji millis(): https://www.arduino.cc/en/Reference/Mill...
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ść...
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...
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...
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.
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...
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...
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...
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ć.
Po trzecie primo: w funkcji _delay_ms() nie stosuje się zmiennej jako argumentu (tu wyjaśnienie: http://mikrokontrolery.blogspot.com/2011...
rzemyk90 Dałeś czadu :D "Funkcja delay nie wchodzi w grę. "
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...
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ć.
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...
Ma przecież główną funkcję delay i funkcję przerwania dekrementującą zmienną.
trochę łopatologicznie - ale teraz zaskoczysz o co chodzi A po co te funkcje delay()?
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.
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,...
Ale teraz jak mam funkcje do migania diodą co sekundę to znowu miga jak powalona :/ jak sobie tą funkcje umieszcze w while i tam mam ze ma zmieniac co sekunde stan. No to porównaj, to co dołożyłem, z tym co było i dorzuć w swoim programie tak samo odpowiedni plik nagłówkowy na początku oraz <wdt_reset();> na początku pętli głównej, albo wyłącz...
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....
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
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...
Lepiej w pętli na zmiennych bez używania funkcji "delay"
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...
Ale teraz w ogóle nie używam funkcji delay - czy to nie jest równoważne delay(0), czyli teraz powinno działać najszybciej jak się da?
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()....
funkcja delay przerwanie delay relay delay
fiesta podciśnienie prowadnica kulkowa gniazdka angielskie
Demontaż pompy wtryskowej S231 1HC102 - instrukcja Głośne zawory w silniku K4J - przyczyny i rozwiązania