Mirek masz racje nie 1kHz tylko 10Hz. Dziękuje. Timery programowe przyznaje to dla mnie nowość, ale spędziłem już trochę czasu na nich testując różne polecenia wykorzystując debugowanie za pomocą diody led. Załapałem jak działają.
Co chce zrobić, już tłumacze logikę działania urządzenia, naciśniecie przycisku ma powodować takie działania:
1. uruchomienie silnika (krokowy) o zadany kąt
2. zatrzymanie silnika
3. wysłanie ramki podczerwieni (z falą nośną 38kHz)
4. powtórzenie punktu 1,2,3 trzydzieści sześć razy
Taka logika wymusza (moim zdaniem) zastosowanie wielowątkowości. Wykorzystuje timer programowy w ten sposób:
1. np. timer2 ustawiam na wartość 10, ta wartość jest sprawdzana co 10ms. Wartość 0 pojawi się po 100ms i wówczas wykona się polecenie uruchomienia silnika. Pierwszym warunkiem if steruje ile razy ma się zatrzymać silnik (ilość cykli), drugiem if'em steruje ilość kroków na dany cykl. Co 100ms wykonują się te if'y. Zmieniając wartość timera2 z 10 na 50 - steruje szybkością silnika.
I teraz najważniejsze to punkt "3", w momencie gdy silnik zrobi jeden cykl (przesunie sie o dany kąt i zatrzyma), ma się wygenerować ramka z falą nośna 38kHz, inaczej mówiąc ma się pojawić logiczna jedynka przez 2000us z nośną falą 38kHz, potem logiczne zero przez 27830us i tak dalej. Czas całej ramki to 36190us.
Generowanie ramki wygląda i działa wyzwolenie migawki w aparacie w oddzielnym projekcie. Teraz chce ten kod wpakować, dokładnie polecenie nikon(); do if'a po wykonaniu pierwszego cyklu. Gdy timer2=0 to raz migawka aparatu się wyzwoli, jeśli timer2=10 lub inna wartość, nie działa wyzwolenie migawki. Mam wrażanie że jest to związane z tym że, gdy timer2=10 to mamy 10Hz i to wpływa na Timer0 sprzętowy (do generowania fali nośnej).
Tu tego nie łapie, połączenie timera programowego z timerem sprzętowym. Jak to powinno logicznie działać. Nie mam oscyloskopu, bo może bym doszedł do jakiś wniosków - jeszcze
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.