Witam. Jak zrealizować opóźnienia na przekaźnikach, próbowałem wielu sposobów,ale jak na razie to leże... '#############################marekszy@op.pl#################################### $regfile = "m8def.dat" $crystal = 8000000 Config Portb = &B11111111 : Portb = &B11111111 Config Portc = &B11111111 : Portc = &B00000000 Config Portd = &B00000000 : Portd = &B11111111 Config Lcdpin = Pin , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.4 , Db7 = Portc.5 , E = Portc.1 , Rs = Portc.0 Config Lcd = 16 * 2 Cls Cursor Off Noblink Config Timer0 = Timer , Prescale = 256 Enable Timer0 : On Timer0 Prztimer0 Config Timer1 = Timer , Prescale = 256 Enable Timer1 : On Timer1 Prztimer1 Enable Interrupts '******************************aliasy****************************************** Pk_0 Alias Portb.5 Pk_1 Alias Portb.4 Pk_2 Alias Portb.3 Pk_3 Alias Portb.2 Pk_4 Alias Portb.1 Pk_5 Alias Portb.0 '********************************zmienne*************************************** Dim Flaga_4ms As Byte , Flaga_100ms As Byte , Flaga_1s As Byte 'flagi Dim Flaga_10s As Byte Dim Dzielnik_1 As Byte 'dzielnik Timer0 Dim Dzielnik_2 As Byte 'dzielniki Timer1 Dim Sw As Byte , Stan_sw As Byte , Licznik_sw As Byte Dim Program As Byte Dim Stan_pracy As Byte Dim Wysw_ok As Byte '***************************petla glowna*************************************** Readeeprom Stan_pracy , 2 If Stan_pracy > 6 Then 'gdy stan_pracy wiekszy od 6 wczytaj 0 Stan_pracy = 0 End If Do If Flaga_4ms = 1 Then Flaga_4ms = 0 Gosub Przyciski Gosub Sterowanie Gosub Wyswietlanie End If If Flaga_100ms = 1 Then Flaga_100ms = 0 Select Case Program Case 0: Locate 2 , 1 : Lcd "POZYZCJA MENU-0 " Case 1: Locate 2 , 1 : Lcd "POZYZCJA MENU-1 " Case 2: Locate 2 , 1 : Lcd "POZYZCJA MENU-2 " Case 3: Locate 2 , 1 : Lcd "POZYZCJA MENU-3 " Case 4: Locate 2 , 1 : Lcd "POZYZCJA MENU-4 " Case 5: Locate 2 , 1 : Lcd "POZYZCJA MENU-5 " End Select End If Loop End '***************************przerwanie timer0********************************** Prztimer0: Timer0 = 132 Flaga_4ms = 1 Incr Dzielnik_1 If Dzielnik_1 = 25 Then '25*4ms = 100ms Dzielnik_1 = 0 Flaga_100ms = 1 End If Return '***************************przerwanie timer1********************************** Prztimer1: Timer1 = 34287 Flaga_1s = 1 Incr Dzielnik_2 If Dzielnik_2 = 10 Then '1s x 10 =10sek Dzielnik_2 = 0 Flaga_10s = 1 End If Return '**************************sterowanie poczatek********************************* Sterowanie: Select Case Stan_pracy Case 0: Locate 1 , 1 : Lcd "PROGRAM-0 " Set Pk_0 Reset Pk_1 Reset Pk_2 Reset Pk_3 Reset Pk_4 Reset Pk_5 Case 1: Locate 1 , 1 : Lcd "PROGRAM-1 " Reset Pk_0 Set Pk_1 Reset Pk_2 Reset Pk_3 Reset Pk_4 Reset Pk_5 Case 2: Locate 1 , 1 : Lcd "PROGRAM-2 " Reset Pk_0 Reset Pk_1 Set Pk_2 Reset Pk_3 Reset Pk_4 Reset Pk_5 Case 3: Locate 1 , 1 : Lcd "PROGRAM-3 " Reset Pk_0 Reset Pk_1 Reset Pk_2 Set Pk_3 Reset Pk_4 Reset Pk_5 Case 4: Locate 1 , 1 : Lcd "PROGRAM-4 " Reset Pk_0 Reset Pk_1 Reset Pk_2 Reset Pk_3 Set Pk_4 Reset Pk_5 Case 5: Locate 1 , 1 : Lcd "PROGRAM-5 " Reset Pk_0 Reset Pk_1 Reset Pk_2 Reset Pk_3 Reset Pk_4 Set Pk_5 End Select Return '*****************************wyswietlanie************************************* Wyswietlanie: If Wysw_ok = 1 Then Locate 1 , 14 : Lcd "OK " Wait 2 Wysw_ok = 0 End If '*****************************przyciski**************************************** Przyciski: Sw = Pind And &B00000111 'maskowanie nieużywanych pinów If Sw <> &B00000111 And Stan_sw = Sw Then Incr Licznik_sw If Licznik_sw = 100 Then Licznik_sw = 0 Select Case Stan_sw Case &B00000110: 'poz menu(6 pozycje 0/1/2/3/4/5) Incr Program If Program = 6 Then Program = 0 Readeeprom Stan_pracy , 2 'wczytanie z pamieci eeprom End If Case &B00000101 Select Case Program Case 1: Wysw_ok = 1 Stan_pracy = 1 Writeeeprom Stan_pracy , 2 Program = 0 Case 2: Wysw_ok = 1 Stan_pracy = 2 Writeeeprom Stan_pracy , 2 Program = 0 Case 3: Wysw_ok = 1 Stan_pracy = 3 Writeeeprom Stan_pracy , 2 Program = 0 Case 4: Wysw_ok = 1 Stan_pracy = 4 Writeeeprom Stan_pracy , 2 Program = 0 Case 5: Wysw_ok = 1 Stan_pracy = 5 Writeeeprom Stan_pracy , 2 Program = 0 End Select End Select End If Else Stan_sw = Sw Licznik_sw = 80 End If Return a zasada załączania przekaźników powinna wyglądać Case 2: Locate 1 , 1 : Lcd "PROGRAM-2 " 'czekamy np.10s Reset Pk_0 Set Pk_1 Reset Pk_2 Reset Pk_3 Reset Pk_4 Reset Pk_5 'czekamy np.10s Reset Pk_0 Reset Pk_1 Set Pk_2 Reset Pk_3 Reset Pk_4 Reset Pk_5 'taki stan zostaje do czasu zmiany na inny program Case 3: Locate 1 , 1 : Lcd "PROGRAM-3 " 'czekamy np.10s Reset Pk_0 Set Pk_1 Reset Pk_2 Reset Pk_3 Reset Pk_4 Reset Pk_5 'czekamy np.10s Reset Pk_0 Reset Pk_1 Set Pk_2 Reset Pk_3 Reset Pk_4 Reset Pk_5 'czekamy np.10s Reset Pk_0 Reset Pk_1 Reset Pk_2 Set Pk_3 Reset Pk_4 Reset Pk_5 'taki stan zostaje do czasu zmiany na inny program 'i tak kolejne Case 4/5: dodam, że Wait tutaj jest do niczego, program się zapętla (cały czas zmienia PK z zadanym czasem) i nic już nie można zrobić, If flaga_10s = 1 Then flaga_10s = 0 Reset Pk_0 Set Pk_1 Reset Pk_2 Reset Pk_3 Reset Pk_4 Reset Pk_5 end if też nie działa,jak wstawię kilka razy w opóźnienia ..
|
|||
RE. sterownik wentylatora
Witam. Pomogę koledze wieczorem, ale chciałbym jeszcze zastanawiając się nad tym jak do tego podejść żebyś sprecyzował: Co to dokładnie ma robić? Czy to sterownik zamiast już istniejącego? Czy ma wznowić prace po zaniku zasilania sam poczynając od zera czy dopiero po wczytaniu ostatnio ustawianej predkości. Po co ,(w moim mniemaniu STOP) ,jest przekaźnik Pk_0? Po co drugi przycisk skoro można pokolei naciskać jeden?
Samo przejście przez biegi jest banalnie proste jednak chciałbym poznać jaką to ma pełnić rolę użytkowa.
PS. Dwa Timery dla kogoś kto dla flag używa BYTE zamiast BIT to już pewne kłopoty, tak jak mając przerwania kazać stanąć programowi na 2 sekundy. Użycie Pb.0 jako PK_0 i dalej do.. Pb.5 jako Pk_5 rozjaśniło by program a przewody podłączysz do wyprowadzeń silnika.
BARTek
Moja strona
RE. sterownik wentylatora
Najłatwiej było by gdyby kolega wstawił jakiś schemat.
Moja strona w powijakach
ster.biegów wentylatora
Mam już swoje lata (w tym roku będzie pół wieku)także uważam za sukces moje zainteresowanie procesorami AVR, ale niestety nie idzie mi tak prosto jak młodym ludziom.
Odpowiem na pytania:
1.jest to dodatkowy sterownik do już istniejącego, w chwili obecnej jest na przełączniku mechanicznym
0/1/2/3/4/5
działa to na zasadzie zał.1 wentylator lekko się rozbiega, przełączamy na 2 dalej czekamy chwilę aż nabierze obrotów nast.3 itd. Zależnie na jakim biegu zostawimy takie ma obroty.
Teraz po co PK-0, otóż po zaniku zasilania i ponownym powrocie trzeba ponownie wrócić przeł. do zera aby zresetować stycznik zasilający wentyl.i zacząć od początku (stycznik zabezpiecza przed startem po powrocie zasilania np.z 5 biegu).
2.Układ ma za zadanie automatycznie wznowić pracę po powrocie zasilania (sterownik też będzie bez zasilania,po powrocie zasilania załaduje program i ma ustawić na zapamiętaną pozycję)
3.Po ustawieniu biegu na sterowniku także ma automatycznie wystartować (ustawiam 3 bieg, potwierdzam i startuje),kwestia jeszcze takiego typu - np.mam na biegu 3 to po ustawieniu 4 lub 5 nie ma przechodzić całego cyklu (stop,czas,1,czas,2....tylko 4,czas,5 i w drugą stronę - mam 3 po ustawieniu 1 schodzi
do 2,czas,1)
4.Czemu użyłem timer0 i timer1, otóż łatwiej mi zastosować osobny timer do odmierzania czasu potrzebnego
tylko do opóźnienia.A odnośnie BYTE zamiast BIT to już inna sprawa,tak wyszło,mój błąd..
5.Mam 2 przyciski ponieważ łatwiej się tym operuje, SW_1 przechodzi przez wybór biegu (programu),natomiast SW_2 potwierdza wybór, zapisuje,i MENU wraca do "0",w "0" MENU startuje wybrany program Readeeprom..,i to samo przy włączeniu zasilania wczytuje Readeeprom.
6.Gdzie podłączę przekaźniki to faktycznie tylko kosmetyka w programie, może być PK_0 na Pb.0 itd
Schemat z uwzględnionymi poprawkami:
RE. sterownik wentylatora
Pytając o schemat bardziej chodziło mi o info co przełączają przekaźniki ?
Moja strona w powijakach
ster.biegów wentylatora
PK_0 załącza na chwilę stycznik (później jest już podtrzymanie na stykach stycznika)
PK_1 do PK_5 przełącza uzwojenia coś ala autotransformatora który ogranicza prąd na wentylator
Proszę ..wentylator
Kiedy pisałem ten program nie było jeszcze odpowiedzi co do Pk_0.
Niemniej ten program startujac odczytyje zadana ostatnio predkość, ale startuje wentylatorem od zera.
Zrobiłem też łagodne zejście z obrotów np z 5 na 2 bedzie hamował co 10 sec. To samo tyczy sie Zera więc jeśli chcesz go zatrzymać natychmiast to sobie dopisz. Na menu możesz szybko klikać ale dopiero po 2 sec uzna to za wybrana predkość i zapisuje. Zamieniłem przekaźniki ale chyba się domyślisz że Portb.0 to Pk_0 i tak dalej. Jak chcesz to po prostu jedynki z zerami zamieniaj w sterowaniu. Flagi 500ms zostawiłem na "bajery" typu miganie i może sie przydadzą. Program się kompiluje bez błędów ale nie testowałem :D Daj znać co i jak.
Błędy mogą być, pisany przy kawie w przerwach od pracy. Jak się czegoś dopatrzę to dam znać. Pozdrawiam
EDYTOWANO
By nie było przerostu formy nad treścią przepisałem program też na małego Attiny2313 i zajmuje w nim 78% Flasha więc jeszcze duzo miejsca bo najwięcej tam to obsługa wyświetlacza. W Atmega ten program ma 18% flasha.
BARTek
Moja strona
ster.biegów wentylatora
Dzięki wielkie, to co Ty napisałeś w przerwie na kawę mi zajęłoby pewnie tydzień a program wyglądał koszmarnie. Wszystko działa tak jak powinno, w pętli głównej ustawiłem dla przycisku flagę_500ms ponieważ przy 4ms był nie do ogarnięcia (za szybki). Z PK_0 poradzę sobie już bez problemu, jednak skłaniał bym się do użycia drugiego przycisku do potwierdzenia (zapisu i startu), w obsłudze będzie to bardziej praktyczne (mam czas zastanowić się co chcę ,ewentualnie zrezygnować).Pierwsza wersja miała być właśnie na attiny2313, ale program zaczął mi się za bardzo rozrastać, ale teraz na pewno do niego wrócę. Proszę jeszcze o ten drugi przycisk.
Re.sterownik wentylatora
Tak jak pisałem nie testowałem bo szkoda mi czasu na łaczenie tego. Błąd przycisku bo "adoptowałe" go z mojego projektu w którym jest centralny przycisk impulsatora ..no i przepisując..
Trzeba jedno
End If
przesunąć w obsłudze przycisku i powinno działać zamierzenie.Co do dwóch guzików.. zrobie sobie kawę :D bo już fajrant i pomyślę jak zrobić żeby było ładnie.
BARTek
Moja strona
Wentylator wer.2
W tej wersji, teoretycznie :D, (bo błąd mógł się wkraść) działa następujaco:
Startuje jak wczesniej. Po nacisnieciu przycisku wyboru predkosci NOWA wartość tylko miga i jeśli nie naciśniesz Enter do 6s to przestanie migać i pokaże stara wartość. Jeśli w ciągu 6s nacisniesz Enter to przyjmuje nową wartość, przestaje migać i zapisuje do Eeprom.
Jeśli chcesz wyłączać wentylator bez opóźnienia to dopisz:
zaraz po zapisie do EEpromu. Czyli wybierasz prędkość Zero i Enter
Nie wiem do końca jak będzie zachowywać sie wyświetlanie przy tym odświeżaniu co 4ms(przez czas migania), ale w razie problemów coś wymyślisz i się podzielisz mam nadzieję :D
BARTek
Moja strona
Wentylator wer.2
Wielkie dzięki ,na pewno po analizie Twojego kodu wiele się nauczę,piszesz to bardzo przejrzyście i zrozumiale.
Odnośnie wyświetlacza to zachowuje się prawidłowo ,ale jest problem z przejściami w wyborze-aby przejść dalej z 1 do 2 z 2 do 3 itd. muszę za każdym razem potwierdzić, inaczej tylko mruga wybrany numer i nie powraca (po 6s) do poprzedniej pozycji.
Poprawiony Wentylator wer.2
Za dużo naraz do ogarnięcia było i przedobrzyłem w Autopowrocie odgapiając z innego projektu. Tu wystarczy chyba tak..
ALE w IFie obsługujacym ENTER trzeba dopisać zerowanie Autopowrotu (bo zeruje się sam tylko jak sie wypełni a jak kończysz wcześniej Enterem to może już w nim być wartość np.2)
I tak patrzę że trzeba wyizolować pobieranie kopii zmiennej Zadana do Chwilowa tylko do pierwszego naciśnięcia żeby można było ja zwiększać (teraz ciągle za wzór bierze Zadaną i dodaje do niej jeden)
Więc trzeba dopisać że tylko jeśli jeszcze nic nie naciśnięto to za wzór weź Zadana a potem zwiększaj już Chwilową.
Hahaha może to kiedyś zagada :D
BARTek
Moja strona
ster.biegów wentylatora
To już za pierwszym razem gadało tak jak powinno, a teraz gada tak jak ja chciałem, ale żeby nie było za prosto jeszcze trzeba trochę dopracować z wyświetlaniem.
Miganie działa natomiast jak nie potwierdzę to na wyświetlaczu pozostaje wartość "chwilowa", przestaje migać jednak nie wraca do wyświetlania prędkości zadanej.
No ale zostawiam to sobie na jutro (tzn.dzisiaj).
Wentylator - spróbuj tak :D
Jako że Menu napisane od początku tak a nie inaczej to trzeba z tego jakoś wyjść :D
Po komendzie
Else
wykonywane są polecenia gdy powyższe warunki nie zostały spełnione. Spróbuj tego IFa migania tak przepisać:By to też spowolnić można to przesunąć do flagi "co 500ms" ale za "Mig = Not Mig"
Teraz kombinuj bo to Ty masz płytkę gotową :D
BARTek
Moja strona
ster.biegów wentylatora
Wielki szacun i podziękowania dla kolegi, program gada tak jak powinien i z wyświetlaniem nie ma problemu,spełnia wszystkie założenia. Analizując Twój sposób pisania programów można znacznie uprościć sobie życie, na pewno wykożystam taką wiedzę niejednokrotnie.
Program w Atmega8 zajmuje 20%, natomiast w Attiny2313 po zmianie portów 81% także śmiało można przesiąść
się na Attiny.
Załączam kompletny kod:
Dopisałem jeszcze przy autopowrocie (pod flaga_2ms) Chwilowa = Zadana, ponieważ jak nie zatwierdziliśmy wyboru biegu wyświetlanie powracało do zadanego,jednak pamiętana była wartość chwilowa i naciśnięcie "zatwierdz" (już po wyjściu z wyboru) powodowało start i zapis tego co wcześniej mrugało.
Podziękowania Marekszy
Wentylator - schemat
Zapomniałem zawsze zapytać w czym Kolega narysował ten schemat. Taki prosty i na szybko by mi się często przydał. Teraz rysuję w darmowym DesignSpark, układy wszystkie, a jak czegoś u siebie nie masz to połączony z serwerem i ściąga do siebie. Tyle że przy braku wprawy trochę czasochłonny i mało czytelny.
Cieszę się że maszyna ruszyła. Pomagając sam się uczę. Odpowiedź może być na GG 3100706. Pozdrawiam
BARTek
Moja strona
Wentylator - schemat
Niestety w zwykłym paint przez kopiuj-wklej i łączę.przygotowałem sobie małą bazę potrzebnych rysunków i z tego kopiuję potrzebne elementy lub część układów.Idzie szybko i sprawnie.