Wlacz / wylacz o okreslonym czasie


Witam!
Mam problem z zapisaniem czasu walczenia i wyłączenia urządzenia.

   If Godziny = Godz_glowne(1) And Minuty = Min_glowne(1) Then Reset Out2       '      'zapalanie swiatla glownego
 
 
        If Godziny = Godz_glowne(2) And Minuty = Min_glowne(2) Then Set Out2       'gaszenie swiatla głównego

o ile to poprawnie działa gdy jest cały czas zasilanie.Jednak po zaniku zasilania procesor nie wie czy ma się świecić czy zgasić.Kombinowałem z dodatkowymi flagami ale to na nic.Jest jakiś sposób na zapisanie tego,czy pozostaje ,tylko zasilanie awaryjne.Pisze program do sterownika akwarium i wolałbym ,aby to działało poprawnie




Portret użytkownika kaktus

chymmmm

zauważ co napisałeś:

Quote:
Mam problem z zapisaniem czasu walczenia i wyłączenia urządzenia.

a później piszesz:

Quote:
o ile to poprawnie działa gdy jest cały czas zasilanie

a teraz mi powiedz co sobie ma pomyśleć czytelnik? Jakiej porady się podziewasz, kiedy nie zreferowałeś co robisz i z czym masz problem.

Generalnie zwróć uwagę że minuta trwa minutę i TYLKO wtedy przerz ten okres będzie spełniony Twój warunek. Nie wiem na jakim działaniu programu Ci zależy bo nie napisałeś ...

A jak myślisz co ma robić ?C, skoro on też w myślach nie czyta ...

-

"Cierpliwym być musisz, by wiedzę zgłębiać tajemną, gdyż ciemna strona mocy niszczącą i silną jest.".

Portret użytkownika Grzeniu 73

Sorry :) No w sumie napisalem

Sorry :) No w sumie napisalem ,widocznie nie całkiem zrozumiale

Quote:
Jednak po zaniku zasilania procesor nie wie czy ma się świecić czy zgasić
Teraz tłumacze dokładniej. Ta funkcja ,którą napisałem wyłączy lub włączy urządzenie gdy będą zgadzały sie godziny i minuty.To jest ok gdy jest cały czas zasilanie.Jednak gdy zniknie zasilanie i pojawi chociażby o minute później warunek nie zostanie spełniony.Przykład:
włączenie nastawione na 22:20
aktualny czas 22:20 i urządzenie sie włącza
teraz brak zasilania i pojawia sie o godzinie 22:22 i już sie nie włączy
jak to rozwiązać?
Braki w zasilaniu są sporadyczne ,ale jeżeli ma to być automat to powinien być przygotowany na wszystkie ewentualności

Portret użytkownika kaktus

Dwa sposoby

Taki problem możesz rozwiązać na conajmniej dwa sposoby:
1. podtrzymanie zasilania co najmniej jednostki głównej (?C),
2. konstruując odpowiedni algorytm.

np przekroczenie stosownego czasu nastawia flagę, jej stan zapisujesz w nieulotnej pamięci
wyjście terujące synchronizowane jest z tą flagą,
flaga jest zerowana po skończonym limicie czasu.

Oczywiście, każde z zaproponowanych rozwiązań, ma wady i zalety. Istotną dysfunkcją rozwiązania 2 może być duża ilość przełączeń flagi, w krótkim czasie z wiadomego powodu - ograniczona ilość cykli zapisu pamięci nieulotnej.

;-)

-

"Cierpliwym być musisz, by wiedzę zgłębiać tajemną, gdyż ciemna strona mocy niszczącą i silną jest.".

Portret użytkownika Grzeniu 73

Dzieki za

Dzieki za zainteresowanie.Pierwszy sposób znam,co do drugiego nie wiem ,czy dobrze zrozumiałem.Robiłem sposób z flaga w ten sposób: gdy czas ustawiony i aktualny się zrównał to flaga =1.Napiecie znika ,później sie pojawia i dzięki fladze dalej działa do momentu zmienienia jej gdy w programie zrównają sie czas ustalony do wyłączenia i aktualny.Niestety gdy zasilanie wróci jak już czas aktualny jest późniejszy od nastawionego to dzięki fladze dalej działa.Wydaje sie banalny problem ,ale nic mi do głowy nie przychodzi więcej.Chyba najłatwiej będzie zasilanie awaryjne zrobić.

Portret użytkownika kaktus

przypadek braku zasilania

Quote:
Niestety gdy zasilanie wróci jak już czas aktualny jest późniejszy od nastawionego to dzięki fladze dalej działa

czyli zakładasz tutaj, że czas awarii zasilania będzie dłuuuugi i może przekroczyć moment gdy minie czas wyłączenia tak?

W takim wypadku, przy starcie sterownika przed pętlą główną programu dodaj test flagi, na wypadek przekroczenia tego zdarzenia i po sprawie.

-

"Cierpliwym być musisz, by wiedzę zgłębiać tajemną, gdyż ciemna strona mocy niszczącą i silną jest.".

Portret użytkownika Grzeniu 73

Nie musi być długi.Wystarczy

Nie musi być długi.Wystarczy ze się wyłączy 5 minut przed ustawiona godzina.Testowanie flagi tez nic nie da,bo on odczyta z eeprom stan poprzedni,a powinien być już zmieniony .Tez mi się wydawało ,ze to będzie proste:)No chyba ze nie rozumię.

Portret użytkownika kaktus

no więc tak

rozważmy kilka zdarzeń

1. powrót zasilania po zaniku

krok pierwszy program ma odczytać z EEPROM stan znacznika
krok kolejny program ma sprawdzić czy znacznik ma prawidłową wartość (czy już przypadkiem nie upłynął czas zadziałania czegoś tam)

w kolejnym kroku zaczyna się pętla główna programu ...

2. koniec zdarzeń szczególnych
ciągłe działanie programu

Grzeniu73 jak te cyferki przy nick'u to twój rocznik, to jesteśmy takie same "stare pierdoły" i powinno nam się łatwo dogadać ... (-;
Tak że powinieneś wszystko rozumieć bo staram się gadać jasno i opisowo. ;-p

pozdrawiam kaktus

-

"Cierpliwym być musisz, by wiedzę zgłębiać tajemną, gdyż ciemna strona mocy niszczącą i silną jest.".

Portret użytkownika Grzeniu 73

ano rocznik:)Programować

ano rocznik:)Programować zacząłem nie tak dawno i robię to tylko z nudów i dla satysfakcji.
Właśnie cały problem jak sprawdzić ,ze już upłynął czas.Powiedzmy,ze mam 8.00 włączenie i wyłączenie 20.00.światło sie włącza o 8.00 i sobie świeci flaga_światło zmienia stan na 1 i się zapisuje.Teraz zasilanie znika o 19.00 i pojawia o 20.05 i z eeprom odczytuje ze flaga_światło jest dalej 1 i zapala światło.Tu moge zastosować if godzina ustawiona >aktualnej to flaga_światło =0,tylko ze jak braknie przed godzina 8.00 to jak zapisze if godzina ustawiona < aktualnej to flaga_swiatlo =1 to działa ,tylko ze po północy jest godzina 0.00 i wszystko sie sypie. Dalem sobie z tym spokój ,bo chyba nic nie wymyśle już.Zorbie awaryjne zasilanie dla procka.Ale ,az dziwne,ze nie znalazłem żadnego przykładu w necie. Masz może jakieś doświadczenie ze sterowaniem PID? Teraz mam zrobione sterowanie grupowe ale znalazłem przykład w Samplach Bascoma,ale nic nie mogę z tego skumać.P.s jakie stare pierdoły?!:)

Portret użytkownika kaktus

Wszystko to obliczenia

Można np tak godzina przełączenia 8:00 niech jest reprezentowana przez 8*60+0,
godzina wyłączenia jako 20*60+0,
po starcie programu odczytujesz znacznik przeliczasz godzinę (np 15:23) 15*60+23, porównujesz z "miejscem" załączenia i wyłączenia, korygujesz lub nie znacznik. KONIEC Program sobie pomyka dalej.
Przejście przez 24:00 a 00:00 nic tu nie powinno komplikować, jedynie kod trochu spuchnie bo "duże" zmienne trzeba zadeklarować i będą też operacje na tych "rozlazłych" typach danych.

Ja też późno zacząłem bo kupe czasu podchodziłem do ?C jak do byka z wielgaśnymi rogami, a szkoda ...

Z PID nie miałem nic wspólnego ale to też pewno tylko obliczenia ...

-

"Cierpliwym być musisz, by wiedzę zgłębiać tajemną, gdyż ciemna strona mocy niszczącą i silną jest.".

Portret użytkownika Grzeniu 73

I to chyba jest właśnie to!

I to chyba jest właśnie to! Pomysł z dodawaniem tez sprawdzałem ,ale nawet nie przyszło mi do głowy żeby to najpierw mnożyć. Sprawdzę ten pomysł w praktyce. Na wielkości kodu mi nie zależy bo nie przekroczę pojemności mega32.Wielkie dzięki!

Portret użytkownika kaktus

proszę bardzo

(((-;

Przeanalizuj jeszcze dokładnie zapis do eeprom, tak aby odbywał się tylko jeśli to będzie niezbędne, znaczy po zmianie, a nie za każdym przebiegiem pętli głównej programu ...

-

"Cierpliwym być musisz, by wiedzę zgłębiać tajemną, gdyż ciemna strona mocy niszczącą i silną jest.".

Portret użytkownika kaktus

zauważ jedno

Quote:
Ta funkcja ,którą napisałem wyłączy lub włączy urządzenie gdy będą zgadzały sie godziny i minuty

i tu jesteś w błędzie ..
ten warunek będzie spełniony przez całą minutę i w ciągu tej minuty program za każdym przebiegiem będzie wykonywał czynności po spełnionym warunku a nie tylko jednorazowo!

-

"Cierpliwym być musisz, by wiedzę zgłębiać tajemną, gdyż ciemna strona mocy niszczącą i silną jest.".

Portret użytkownika Grzeniu 73

ale jakoś działa:)to znaczy

ale jakoś działa:)to znaczy dobrze działa. Zapis mam wywoływany w przerwaniu i nie zdąży się drugi raz zapisać.Jak na razie wszystko działa tak jak chciałem. Teraz jeszcze muszę dodać PH meter, ale na razie nie mam jak testować ,bo nie mam sondy.Jak cos to wrócę z tematem:)