Układ ma odmierzać czas pracy przekaźnika, sygnalizować... i działa
No więc... wykonałem to jak do tej pory z Waszą pomocą tak;
A teraz proszę o uwagi...
Dalsze prace nad wyborem czasu trwania pracy przekaźnika za pomocą switch'y DP1
Układ ma odmierzać czas pracy przekaźnika, sygnalizować... i działa
No więc... wykonałem to jak do tej pory z Waszą pomocą tak;
Po wielu "przebojach", trudach i masie czasu spędzonego nad zaprogramowaniem uC do tego projektu, podaję końcowy (na obecną chwilę) kod;
Masz tak- zegar odmierzający 1s.
A co by szkodziło gdyby odmierzał co 100ms.
Albo co 10ms czy 1ms.
Wtedy w każdym przerwaniu można zwiększać jakieś zmienne i dopiero gdy osiągną zadaną wartość wykonywać jakieś funkcje.
Wtedy zamiast _delay() możesz sprawdzić czy zmienna osiągnęła jakąś wartość i dopiero wtedy wykonać jakąś funkcję.
Bo _delay() to jest wytrych który się później mści.
Wykorzystaj taki zegar systemowy o takiej dokładności jaka jest potrzebna.
janbernat napisał:Masz tak- zegar odmierzający 1s.
A co by szkodziło gdyby odmierzał co 100ms.
Albo co 10ms czy 1ms.
Wtedy w każdym przerwaniu można zwiększać jakieś zmienne i dopiero gdy osiągną zadaną wartość wykonywać jakieś funkcje.
Wtedy zamiast _delay() możesz sprawdzić czy zmienna osiągnęła jakąś wartość i dopiero wtedy wykonać jakąś funkcję.
Bo _delay() to jest wytrych który się później mści.
Wykorzystaj taki zegar systemowy o takiej dokładności jaka jest potrzebna.
as_szeroka napisał:Według LED przy 50 sekundach (stoper), LED ma już 51 mignięć. Możliwe że się tak faktycznie rozbiega, no cóż...
janbernat napisał:Masz tak- zegar odmierzający 1s.
A co by szkodziło gdyby odmierzał co 100ms.
Albo co 10ms czy 1ms.
Wtedy w każdym przerwaniu można zwiększać jakieś zmienne i dopiero gdy osiągną zadaną wartość wykonywać jakieś funkcje.
Wtedy zamiast _delay() możesz sprawdzić czy zmienna osiągnęła jakąś wartość i dopiero wtedy wykonać jakąś funkcję.
Bo _delay() to jest wytrych który się później mści.
Wykorzystaj taki zegar systemowy o takiej dokładności jaka jest potrzebna.
Co pewien wybrany przez Ciebie czas Timer generuje przerwanie.
Co jaki czas- mniej ważne, ważne żeby to był najmniejszy czas jakiego potrzebujesz.
W programie osługi przerwania umieszczasz jakieś zmienne- powinny one być zdeklarowane jako volatile przed main()- będą wtedy globalne i volatile.
Ja to robię tak- volatile uint8_t (albo uint_32_t) flaga1, volatile uint8_t flaga2 itd.- ile tych flag potrzeba.
Co przerwanie flaga się zwiększa- flaga1++, flaga2++ itd.
Teraz tak- w programie w głównej pętli sprawdamy czy flaga osiągnęła wymaganą wartość- czy czas się przepełnił.
Wtedy kasujemy flagę- od poczatku zacznie zliczać- i wykonujemy jakiś program.
if flaga1==ileśtam
{
skasuj flagę;
wykonaj program()
}
I tak dla każdej flagi.
Tak procedura się nazywa Round Robin- znajdź w sieci.(dzięki mirekk36 za podanie nazwy)
Najprostsza metoda zrobienia systemu wielowątkowego albo prawie czasu rzeczywistego dla wielu funkcji.
No to teraz mi "klina" zadaliście...
Po wyszukaniu informacji na temat round-robin wogóle nie wiem do czego to w tym projekcie zastosować,
nie ma tu wielu wątków.
Jedno przerwanie zewnętrzne, odmierzanie czasu i praca przekaźnika. Może nie rozumiem (a właściwie napewno nie rozumiem do czego mogę to zastosować), ale mniejsza z tym.
Co do tych zmiennych to rozumiem, tylko że nie potrzebuję uruchamiać wielu (instrukcji, podprogramów... czy jak to nazwać), w konkretnych odstępach czasu.
A zamianę _delay na formę zmiennej inkrementowanej można wykonać a to chyba nie jest nic w stylu round-robin.
A tak na koniec to poproszę o jakieś jasne wyjaśnienie gdzie i do czego mogłbym to zastosować.
A teraz zmusiliście mnie do przeskoczenia do strony 395 książki którą posiadam
Napewno coś wyczytam (pomimo iż tak daleko jeszcze nie doszedłem)
as_szeroka napisał:
A tak na koniec to poproszę o jakieś jasne wyjaśnienie gdzie i do czego mogłbym to zastosować.