Witam,
Piszę ten post ponieważ nie mam już pomysłów na obejście problemu. Problem prawdopodobnie jest prosty do rozwiązania ale, że jestem początkującym w temacie nie widzę tego rozwiązania...;/ Mianowicie chodzi o program do okapu (padł silnik w okapie i musiałem zdecydować się na zamiennik ponieważ oryginału nie dostałem i tutaj byłem zmuszony zmienić również elektronikę nim sterującą).
Założenia programu:
- Sterowanie silnikiem 3 przyciskami KEY2 - pierwszy bieg, KEY3 - drugi bieg, KEY4 - trzeci bieg
- Sterowanie 3 światłami LED'owymi jednym przyciskiem KEY1
- Po wyłączeniu silnika, zewnętrzny wentylator(wyciągowy) chodzi przez określony czas
- Po przytrzymaniu przez 2 sekundy przycisku KEY2 - samodzielna praca wentylatora przez określony czas dłuższy niż ten w poprzednim punkcie
- dodatkowe 2 diody jako sygnalizacja (osobny temat którym się teraz nie przejmuje - myślę, że nie będzie ciężko)
Ważną rzeczą jest to, że silnik może pracować tylko na jednym biegu (uzwojenie z odczepami - a żeby było śmieszniej silnik sterowany jest N'ka (przewodem neutralnym)
Rozwiązałem powyższe zadania w ten sposób że KEY1 po pierwszym wciśnięciu włącza nam 1 przekaźnik do którego podłączona jest 1 żarówka LED,
po drugim wciśnięciu wyłącza nam 1 przekaźnik i włącza drugi gdzie podłączone 2 żarówki LED, po trzecim wciśnięciu włączają się obydwa przekaźniki, w efekcie święcą 3 żarówki LED - To założenie udało się zrealizować.
Sterowanie silnikiem rozwiązałem w ten sposób, że jeśli naciśniemy któryś z KEY2, KEY3, KEY4 to włączy się odpowiedni przekaźnik, po ponownym jego wciśnięciu się wyłączy ale jeżeli naciśniemy jeden przycisk sterowania po czym wciśniemy inny to w efekcie poprzedni bieg musi się wyłączyć i włączyć ten odpowiadający przyciskowi który nacisnęliśmy. Tutaj udało mi się to osiągnąć ale tylko na KEY3 i KEY4.
Mój problem polega na tym, że przy użyciu funkcji superdebounce kolegi ANTYSTATYCZNEGO, nie chce mi działać wyłączenie biegu po ponownym naciśnięciu KEY2 (ponieważ na KEY2 jest tylko użyty Superdebounce) - tak jakby funkcja w programie s1_stop() działała.
Wyłączanie wentylatora zewnętrznego po czasie jeszcze nie do końca opracowałem. Jest w programie delikatny zarys funkcji do której przekazuje czas po którym powinno nastąpić wyłączenie - sprawdziłem to tylko czy działa.
Od razu mówię, że kody wykorzystane w programie są zaczerpnięte w dużej mierze z książki bluebook oraz z forum od kolegi ANTYSTATYCZNEGO - przepraszam ale sam jeszcze nie opracowałem swoich bibliotek.
Jakby ktoś mógł spojrzeć i doradzić jak się za to zabrać byłoby fajnie.
Zaznaczam, że dopiero się uczę i tak na prawdę jest to mój pierwszy poważny program.
Program pisany w oparciu o zestaw ATB 1.04 na układzie ATMEGA16 taktowanym kwarcem 11059200.
main.c :
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
common.h:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Niektóre zmienne w programie są kompletnie niepotrzebne ale nie robiłem porządku z nimi bo przydają mi się one do "kombinowania" no i sprawdzam po kolei jak to działa, jak to się je, po prostu testuje.
Również biblioteka do obsługi wyświetlacza jest Pana Mirka dlatego jej nie wrzucam.
Mogłem coś chaotycznie wytłumaczyć, w razie co mogę to dokładniej opisać albo najlepiej rozrysować.
Z góry dziękuję za pomoc.
Nie wiem dlaczego zjadło mi przypisanie pinów w common.h podczas pisania normalnie je widać ;/