Skocz do zawartości

Przeszukaj forum

Pokazywanie wyników dla tagów 'Timer'.

  • Szukaj wg tagów

    Wpisz tagi, oddzielając przecinkami.
  • Szukaj wg autora

Typ zawartości


Kategorie forum

  • Elektronika i programowanie
    • Elektronika
    • Arduino i ESP
    • Mikrokontrolery
    • Raspberry Pi
    • Inne komputery jednopłytkowe
    • Układy programowalne
    • Programowanie
    • Zasilanie
  • Artykuły, projekty, DIY
    • Artykuły redakcji (blog)
    • Artykuły użytkowników
    • Projekty - DIY
    • Projekty - DIY roboty
    • Projekty - DIY (mini)
    • Projekty - DIY (początkujący)
    • Projekty - DIY w budowie (worklogi)
    • Wiadomości
  • Pozostałe
    • Oprogramowanie CAD
    • Druk 3D
    • Napędy
    • Mechanika
    • Zawody/Konkursy/Wydarzenia
    • Sprzedam/Kupię/Zamienię/Praca
    • Inne
  • Ogólne
    • Ogłoszenia organizacyjne
    • Dyskusje o FORBOT.pl
    • Na luzie

Kategorie

  • Quizy o elektronice
  • Quizy do kursu elektroniki I
  • Quizy do kursu elektroniki II
  • Quizy do kursów Arduino
  • Quizy do kursu STM32L4
  • Quizy do pozostałych kursów

Szukaj wyników w...

Znajdź wyniki, które zawierają...


Data utworzenia

  • Rozpocznij

    Koniec


Ostatnia aktualizacja

  • Rozpocznij

    Koniec


Filtruj po ilości...

Data dołączenia

  • Rozpocznij

    Koniec


Grupa


Imię


Strona

Znaleziono 4 wyniki

  1. - dzieci zasypiają z włączonym oświetleniem globusa Albi. - fakt że pobiera tylko 2.5 W mocy ale po co ma się świecić całą noc. - dorobimy "timer" na 30 minut a potem deep sleep Uno. - poniżej wersja beta programu, ma te zaletę że działa u mnie. // 2023.12.14, bubu321, working // // piny PWM 3,5,6,9,10,11 // analogWrite(pins, dutyCycle); // dutyCycle 0..255 // pin PWM #include <avr/sleep.h> #define pins 9 unsigned long int czas15min = 1800000; // 1.800.000 30 minut unsigned long int czas30sek; int dutyCycle = 255; // -------------------------- subroutine --------------------------- // -------------- void enterSleep() { set_sleep_mode(SLEEP_MODE_PWR_DOWN); analogWrite(pins, 0); sleep_enable(); // attachInterrupt(digitalPinToInterrupt(2), wakeUpNow, LOW); sleep_mode(); /* The program will continue from here. */ /* First thing to do is disable sleep. */ // sleep_disable(); // detachInterrupt(digitalPinToInterrupt(2)); } // ----------------------------------------- setup -------------------- void setup() { Serial.begin(250000); Serial.println("start"); Serial.println(czas15min); pinMode(13, OUTPUT); analogWrite(pins, dutyCycle); // czas15min = millis(); // 15 minut; } // ------------------------------------------ loop -------------------------- void loop() { if (millis() > czas15min ) { Serial.println("sleeping ..."); delay(500); enterSleep(); // Enter sleep method! } digitalWrite(13, HIGH); delayMicroseconds(100); digitalWrite(13, LOW); delayMicroseconds(1000 - 100); if (millis() > czas30sek) { dutyCycle -= 10; czas30sek = millis() + 60000; // co 60 sekund if (dutyCycle < 10) dutyCycle = 0; Serial.println(dutyCycle); Serial.println(millis()); } analogWrite(pins, dutyCycle); } // ------------- end ---------------- -
  2. Witam, Po inicjacji Timera, ADC przestaje działać. Przed, oraz w trakcie inicjacji wszystko działa jak należy, co sprawdziłem pułapkami programowymi w postaci funkcji LED() (na piny ADC0-2 podpięte są przez przyciski dzielniki napięć które na wyjściu dają połowę napięcia). Wszystko przestaje działać po włączeniu przerwania Compare Match Timera 1. Początkowo myślałem, że problem tkwi w tym, że program wychodząc z jednego przerwania wchodzi od razu w drugie, jednak dioda po zainicjowanym timerze wciąż świeci połową jasności, po prostu już nie gaśnie. Czy przerwania ADC i timera się w jakiś sposób gryzą? Lub ma ktoś jakiś inny pomysł w czym może tkwić problem? Kod: #include <stdlib.h> #include <avr/io.h> #include <avr/interrupt.h> #include <avr/pgmspace.h> #include <util/atomic.h> #include <util/delay.h> volatile int adc; volatile int MUX_tmp; volatile char adc_arr[3]; void ADC_init(void) { ADMUX|= ( _BV(REFS0) ); ADCSRA|= ( _BV(ADEN) | _BV(ADIE) | _BV(ADPS2) | _BV(ADPS1) | _BV(ADPS0)); DIDR0 |= 0x3F; } void LED(void) { while(adc<=300) { PORTB|=_BV(PB0); PORTB=0; } while(adc>=500){}; PORTB=0; } void Timer_init(void) { TCCR0A|= (_BV(COM0A1) | _BV(COM0B1) | _BV(WGM00) | _BV(WGM01)); LED(); _delay_ms(32); TCCR0B|= (_BV(CS00)); LED(); _delay_ms(32); TCCR1B|= (_BV(WGM12) | _BV(CS10)); LED(); _delay_ms(32); OCR1AH|= 0b1001000; LED(); _delay_ms(32); TIMSK1|= _BV(OCIE1A); LED(); _delay_ms(32); } ISR(ADC_vect) { adc=ADC; MUX_tmp=ADMUX & 0xF; adc_arr[MUX_tmp]=adc; if(MUX_tmp <= 3) { ADMUX=(MUX_tmp+1) | _BV(REFS0); MUX_tmp= ADMUX & 0xF; } else { ADMUX=_BV(REFS0); } ADCSRA|= _BV(ADSC); } volatile int Flag=0; ISR(TIMER1_COMPA_vect) { Flag=1; } int main(void) { sei(); ADC_init(); ADCSRA|= _BV(ADSC); DDRB|= _BV(PB0); LED(); _delay_ms(32); LED(); _delay_ms(32); Timer_init(); LED(); _delay_ms(32); while(1); { LED(); _delay_ms(32); } } Nie widzę potrzeby w wrzucaniu schematu, do PB0 podłączona jest dioda, do pinów ADC wspomniałem wcześniej a reszta mikrokontrolera podłączona jest prawidłowo. Z góry dziękuję za odpowiedź 🙂 Pozdrawiam Ps: Jest to wycinek programu, więc niektóre zmienne mogą zdawać się bezużyteczne (jak np int Flag)
  3. Moja pierwsza w życiu biblioteka Arduino! Na samym początku naszej przygody z Arduino spotkaliśmy się z najsłynniejszym "migaczem": void setup() { pinMode(LED_BUILTIN, OUTPUT); } void loop() { digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level) delay(1000); // wait for a second digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW delay(1000); // wait for a second } Bardzo szybko możemy się przekonać o tym, że funkcja delay() blokuje wykonywanie innych zadań w międzyczasie. W wielu wypadkach może to stwarzać problemy. To tak jakbyśmy o godzinie 23:00 zaprogramowali siebie: WŁĄCZ SEN odczekaj(7 godzin) WYŁĄCZ SEN PÓJDŹ DO PRACY odczekaj(8 godzin) WYJDŹ Z PRACY i przekonali się, że odczekaj(8 godzin) całkowicie "zamraża" nas i uniemożliwia jakąkolwiek pracę. Doskonale opisuje to artykuł Kurs Arduino II – #9 – wielozadaniowość, opóźnienia z millis(). Znajdziemy tam też bardzo dobre rozwiązanie tego problemu: unsigned long lastTimeLCD = 0; void setup() { .... } void loop() { CAŁY CZAS PRACUJ if (lastTimeLCD == 0 || millis() - lastTimeLCD >= 1000) { lastTimeLCD = millis(); UAKTUALNIJ ZAWARTOŚĆ WYŚWIETLACZA } } Co jeśli chcemy wykonac funkcję określoną ilość razy? Możemy oczywiście dopisywać dalsze warunki i zliczać już wykonaną ilość iteracji. unsigned long lastTimePicture = 0; int iterationsDone = 0; void setup() { .... } void loop() { CAŁY CZAS PRACUJ if (iterationsDone < 3 && (lastTimePicture == 0 || millis() - lastTimePicture >= 1000)) { iterationsDone++; lastTimePicture = millis(); WYKONAJ ZDJECIE LUSTRZANKA PODLACZONA DO ARDUINO } } Taka potrzeba istnieje np przy interwałometrze WiFi podłączonym do lustrzanki cyfrowej (np mikrokontroler ESP8266 hostuje stronę WWW sterującą aparatem albo ESP32, które sterujemy poprzez Bluetooth za pomocą dedykowanej aplikacji na Androida). Może on dostać np zadanie: poczekaj 10s przed rozpoczęciem, wykonaj serię 15. zdjęć o czasie naświetlania 2s i interwale 5s. Oczywiście nadal problem rozwiążemy naszą słynną instrukcją warunkową if(....millis()... jakieś kolejne liczniki i warunki). Przy wielu różnych zadaniach wywoływanych asynchronicznie nasz kod stanie się mniej czytelny. O wiele łatwiej o pomyłkę. Nie możemy w końcu pomylić wielu różnych zmiennych odpowiedzialnych za przechowywanie czasu ostatniego wykonania zadania, interwały, ilość wykonanych iteracji, ilość oczekiwanych iteracji... Ten niekończący się wstęp powinien uzmysłowić Wam powód, dla którego napisałem Arduino Timer Library RZtimer. Przykład wykorzystania jej dwóch podstawowych metod: - wykonaj funkcję blinkLED() co każde 2000 ms: timer.addEverytime(2000, blinkLED); - wykonaj funkcję itWorks() dwa razy z interwałem 2000 ms, poczekaj 300 ms przed startem: timer.addTask(2000, 2, 300, itWorks); Kod w całości: #include "RZtimer.h" RZTimer timer; void blinkLED(); void setup() { Serial.begin(9600); pinMode(LED_BUILTIN, OUTPUT); timer.addEverytime(2000, blinkLED); auto itWorks = []()->void {Serial.print("It Works! "); Serial.print(millis()); Serial.println(" ms");}; timer.addTask(300, 2, 2000, itWorks); } void loop() { timer.run(); } void blinkLED() { Serial.print("ON "); Serial.print(millis()); Serial.println(" ms"); digitalWrite(LED_BUILTIN, HIGH); auto blinkLEDoff = []()->void {digitalWrite(LED_BUILTIN, LOW); Serial.print("OFF "); Serial.print(millis()); Serial.println(" ms");}; timer.addTask(1000, 1, 0, blinkLEDoff); } RZTimer timer; tworzy obiekt timer klasy RZTimer. Przykładowe funkcje wykonywane cyklicznie to blinkLED() oraz itWorks(). Pierwszą zdefiniowałem "klasycznie", drugą w celach edukacyjnych jako wyrażenie lambda (w takich zastosowaniach mogą się one okazać całkiem wygodne w użyciu). Nie zapomnijmy o wstawieniu timer.run(); gdzieś w pętli loop! Dodatkowym (i chyba unikatowym 😉 atutem jest możliwość usypiania mikrokontrolera przy równoczesnym asynchronicznym wykonywaniu zadań! Poniższy przykład będzie działać jedynie z mikrokontrolerami wspieranymi przez bibliotekę narcoleptic. #include "RZtimer.h" #include <Narcoleptic.h> //https://github.com/rcook/narcoleptic void delaySleep(unsigned long sleepTime) { delay(30); extern volatile unsigned long timer0_millis; noInterrupts(); timer0_millis += (unsigned long)(sleepTime - 30); interrupts(); Narcoleptic.delay(sleepTime - 30); } RZTimerWithSleep timer(delaySleep); void blinkLED(); void setup() { Serial.begin(9600); pinMode(LED_BUILTIN, OUTPUT); timer.addEverytime(2000, blinkLED); auto itWorks = []()->void {Serial.print("It Works! "); Serial.print(millis()); Serial.println(" ms");}; timer.addTask(300, 2, 2000, itWorks); } void loop() { timer.run(); } void blinkLED() { Serial.print("ON "); Serial.print(millis()); Serial.println(" ms"); digitalWrite(LED_BUILTIN, HIGH); auto blinkLEDoff = []()->void {digitalWrite(LED_BUILTIN, LOW); Serial.print("OFF "); Serial.print(millis()); Serial.println(" ms");}; timer.addTask(1000, 1, 0, blinkLEDoff); } Po drobnych modyfikacjach biblioteka powinna działać też w programach C++ uruchomionych na Raspberry Pi. Np zamiast "Arduinowego" millis() powinniśmy skorzystać z funkcji clock(), a same wartości zmiennych przechowywać w typie danych clock_t. Przykład zastosowania: kontroler akwarium. Co sekundę odświeża zawartość LCD. Włącza i wyłącza pompę "utleniającą wodę" o zadanej porze. Co dwa tygodnie sprawdza synchronizację czasu łącząc się z serwerem NTP.
  4. Witam, posiadam płytkę STM32F407G-DISC1. Celem mojego projektu jest stworzenie programu, który będzie inkrementował pewną zmienną z losowym czasem. Wartość średnia tego czasu będzie zadawana z potencjometru, odchylenie standardowe będzie proporcjonalne do wartości średniej. Jestem początkującym w programowaniu mikrokontrolerów i próbowałem to rozwiązać za pomocą aktualizacji prescalera dla timera lecz to chyba nie jest właściwie rozwiązanie. Czy ktoś z forumowiczów posiada wiedzę jak coś takiego zrobić?
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.