ster.biegów wentylatora


Witam.
Tworze program do sterowania wentylatorem 230V~ który ma 5 biegów,kolejne biegi zmieniane są za pomocą przekaźników.
Problem jest z opóźnieniami przy przełączaniu przekaźników.
Działa to na zasadzie:
SW na PD.0 wchodzę do 5-cio pozycyjnego MENU gdzie wybieram za pomocą SW_2 PD.1 program który ma być realizowany (1-5) i automatycznie następuje zapis,
start programu i powrót MENU do 0.

Jak zrealizować opóźnienia na przekaźnikach, próbowałem wielu sposobów,ale jak na razie to leże...

oto cały program:

'#############################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 ..




Portret użytkownika EDC

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

Portret użytkownika matrix

RE. sterownik wentylatora

Najłatwiej było by gdyby kolega wstawił jakiś schemat.

Portret użytkownika marekszy

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:

Portret użytkownika matrix

RE. sterownik wentylatora

Pytając o schemat bardziej chodziło mi o info co przełączają przekaźniki ?

Portret użytkownika marekszy

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

Portret użytkownika EDC

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.

$regfile = "m8def.dat"
$crystal = 8000000
 
Config Portb = &B11111111 : Portb = &B00000001              'domyslnie przekaznik Pk_0 wlaczony
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
 
Ip Alias Pind.0                                             'alias przycisku
 
Config Timer0 = Timer , Prescale = 256
Enable Timer0 : On Timer0 Zegar
 
Dim Dzielnik(3) As Byte , Flaga_4ms As Bit , Flaga_500ms As Bit , Flaga_2s As Bit , Flaga_10s As Bit
Dim Zadana As Byte , Aktualna As Byte
Dim Ip As Bit , Licznik_sw As Byte , Autosave As Bit , Przycisnieto As Bit
 
 
 
Readeeprom Zadana , 2
If Zadana > 5 Then Zadana = 0                               'zabezpieczenie gdy czysty eeprom i odczyta FF
 
Enable Interrupts
Aktualna = 0
Autosave = 1
Przycisnieto = 0
Lcd "Zadana pr. :" ; Zadana
Lowerline
Lcd "Aktualna pr. :" ; Aktualna
 
'***START***
 
Do
''''''''''''''''''''''''''''''''' co 4ms
If Flaga_4ms = 1 Then
   Flaga_4ms = 0
 Gosub Przycisk
   If Przycisnieto = 1 Then                                 'jesli po powrocie ze sprawdzanie przycisku
      Przycisnieto = 0
      Locate 1 , 15 : Lcd Zadana                            'wyswietlaj wybor
      End If
End If
''''''''''''''''''''''''''''''''' co 2s
If Autosave = 0 Then
   Autosave = 1                                             'masz 2 sec na zastanowienie czy przycisnac dalej
   Writeeeprom Zadana , 2                                   'dopiero zapamietuje, a nie co przycisniecie
End If
 
''''''''''''''''''''''''''''''''' co 10s
If Flaga_10s = 1 Then
   Flaga_10s = 0
 
 If Aktualna <> Zadana Then                                 'jesli predkosc zadana rozna od aktualnej
   If Aktualna < Zadana Then                                'podwyzszaj co 10sec  jesli nizsza
   Incr Aktualna
   Gosub Sterowanie
   End If
                                                             'zmniejszaj co 10sec jesli wyzsza
   If Aktualna > Zadana Then
   Decr Aktualna
   Gosub Sterowanie
   End If
 End If
End If
''''''''''''''''''''''''''''''''''
Loop
 
 
 
Przycisk:
 If Ip = 0 Then
   Incr Licznik_sw
   If Licznik_sw = 68 Then
   Licznik_sw = 0
 
 
    End If
    Reset Flaga_2s                                          'kasuj gotowosc do zmian
    Reset Flaga_10s                                         'kasuj gotowosc
    Reset Autosave
    Incr Zadana                                             'krec MENU wyboru w kolko
    If Zadana = 6 Then Zadana = 0
    Przycisnieto = 1
 Else
 Licznik_sw = 60
 End If
Return
 
 
Zegar:
 Timer0 = 132
 Set Flaga_4ms
 Incr Dzielnik(1)
  If Dzielnik(1) = 125 Then
  Dzielnik(1) = 0
  Set Flaga_500ms
  Incr Dzielnik(2)
   If Dzielnik(2) = 4 Then
   Dzielnik(2) = 0
   Set Flaga_2s
   Incr Dzielnik(3)
    If Dzielnik(3) = 5 Then
    Dzielnik(3) = 0
    Set Flaga_10s
    End If
   End If
  End If
Return
 
Sterowanie:
  If Aktualna = 0 Then Portb = &B00000001
  If Aktualna = 1 Then Portb = &B00000010
  If Aktualna = 2 Then Portb = &B00000100
  If Aktualna = 3 Then Portb = &B00001000
  If Aktualna = 4 Then Portb = &B00010000
  If Aktualna = 5 Then Portb = &B00100000
 
  Locate 2 , 15 : Lcd Aktualna
 
Return

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

Portret użytkownika marekszy

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.

Portret użytkownika EDC

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.

Przycisk:
 If Ip = 0 Then
   Incr Licznik_sw
   If Licznik_sw = 68 Then
   Licznik_sw = 0
    Reset Flaga_2s                                          'kasuj gotowosc do zmian
    Reset Flaga_10s                                         'kasuj gotowosc
    Reset Autosave
    Incr Zadana                                             'krec MENU wyboru w kolko
    If Zadana = 6 Then Zadana = 0
    Przycisnieto = 1
    End If
 Else
 Licznik_sw = 60
 End If
Return

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

Portret użytkownika EDC

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.

$regfile = "m8def.dat"
$crystal = 8000000
 
Config Portb = &B11111111 : Portb = &B00000001              'domyslnie przekaznik Pk_0 wlaczony
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
 
Ip Alias Pind.0                                             'alias przycisku
Zatwierdz Alias Pind.1
 
 
Config Timer0 = Timer , Prescale = 256
Enable Timer0 : On Timer0 Zegar
 
Dim Dzielnik(3) As Byte , Flaga_4ms As Bit , Flaga_500ms As Bit , Flaga_2s As Bit , Flaga_10s As Bit
Dim Zadana As Byte , Aktualna As Byte , Chwilowa As Byte
Dim Ip As Bit , Licznik_sw As Byte , Autopowrot As Byte , Przycisnieto As Bit , Mig As Bit , Zatwierdz As Bit
 
 
 
Readeeprom Zadana , 2
If Zadana > 5 Then Zadana = 0                               'zabezpieczenie gdy czysty eeprom i odczyta FF
 
Enable Interrupts
Aktualna = 0
Autopowrot = 0
Przycisnieto = 0
Lcd "Zadana pr. :" ; Zadana
Lowerline
Lcd "Aktualna pr. :" ; Aktualna
 
'***START***
 
Do
''''''''''''''''''''''''''''''''' co 4ms
If Flaga_4ms = 1 Then
   Flaga_4ms = 0
   Gosub Przycisk
 
   If Przycisnieto = 1 And Mig = 1 Then                     'jesli przycisnieto nowa wartość miga przez 6s
   Locate 1 , 15 : Lcd " "                                  'gaszenie cyfry
   Else
   Locate 1 , 15 : Lcd Chwilowa
   End If
End If
''''''''''''''''''''''''''''''''' co 500ms
If Flaga_500ms = 1 Then
   Flaga_500ms = 0
   Mig = Not Mig                                            'miga w rytm
End If
''''''''''''''''''''''''''''''''' co 2s
If Flaga_2s = 1 Then
   Flaga_2s = 0
    If Przycisnieto = 1 Then                                'tu odlicza czas do wyłaczenia migania
     Incr Autopowrot
     If Autopowrot >= 3 Then                                '3x2s=6s
     Przycisnieto = 0
     Locate 1 , 15 : Lcd Zadana                             'przestaje migac wstawiajac STARA wartosc
     Else
     Autopowrot = 0
     End If
    End If
End If
''''''''''''''''''''''''''''''''' co 10s
If Flaga_10s = 1 Then
   Flaga_10s = 0
 
 If Aktualna <> Zadana Then                                 'jesli predkosc zadana rozna od aktualnej
   If Aktualna < Zadana Then                                'podwyzszaj co 10sec  jesli nizsza
   Incr Aktualna
   Gosub Sterowanie
   End If
                                                             'zmniejszaj co 10sec jesli wyzsza
   If Aktualna > Zadana Then
   Decr Aktualna
   Gosub Sterowanie
   End If
 End If
End If
'''''''''''''''''''''''''''''''''
If Zatwierdz = 0 Then                                       'drugi przycisk
 Zadana = Chwilowa                                          'przypisanie nowej wartosci dla predkosci
 Przycisnieto = 0                                           'gaszenie migania
 Writeeeprom Zadana , 2                                     ' zapis   nowej wartosci do EEP
 Locate 1 , 15 : Lcd Zadana                                 'wyswietlenie NOWEJ wartosci
End If
''''''''''''''''''''''''''''''''''
Loop
'***KONIEC***
 
 
Przycisk:
 If Ip = 0 Then
   Incr Licznik_sw
   If Licznik_sw = 68 Then
   Licznik_sw = 0
    Reset Flaga_2s                                          'kasuj gotowosc do zmian
    Reset Flaga_10s                                         'kasuj gotowosc
    Reset Autopowrot
    Chwilowa = Zadana
    Incr Chwilowa                                           'krec MENU wyboru w kolko
    If Chwilowa = 6 Then Chwilowa = 0
    Przycisnieto = 1
    End If
 Else
 Licznik_sw = 60
 End If
Return
 
 
Zegar:
 Timer0 = 132
 Set Flaga_4ms
 Incr Dzielnik(1)
  If Dzielnik(1) = 125 Then
  Dzielnik(1) = 0
  Set Flaga_500ms
  Incr Dzielnik(2)
   If Dzielnik(2) = 4 Then
   Dzielnik(2) = 0
   Set Flaga_2s
   Incr Dzielnik(3)
    If Dzielnik(3) = 5 Then
    Dzielnik(3) = 0
    Set Flaga_10s
    End If
   End If
  End If
Return
 
Sterowanie:
  If Aktualna = 0 Then Portb = &B00000001
  If Aktualna = 1 Then Portb = &B00000010
  If Aktualna = 2 Then Portb = &B00000100
  If Aktualna = 3 Then Portb = &B00001000
  If Aktualna = 4 Then Portb = &B00010000
  If Aktualna = 5 Then Portb = &B00100000
 
  Locate 2 , 15 : Lcd Aktualna
 
Return

Jeśli chcesz wyłączać wentylator bez opóźnienia to dopisz:

If Zadana = 0 then Aktualna = 0

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

Portret użytkownika marekszy

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.

Portret użytkownika EDC

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..

''''''''''''''''''''''''''''''''' co 2s
If Flaga_2s = 1 Then
   Flaga_2s = 0
    If Przycisnieto = 1 Then                                'tu odlicza czas do wyłaczenia migania
     Incr Autopowrot
     If Autopowrot = 3 Then                                 '3x2s=6s
        Autopowrot = 0                        
        Przycisnieto = 0
     Locate 1 , 15 : Lcd Zadana                             'przestaje migac wstawiajac STARA wartosc
 
     End If
    End If
End If
''''''''''''''''''''''''''''''''' co 10s

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)

'''''''''''''''''''''''''''''''''
If Zatwierdz = 0 Then                                       'drugi przycisk
 Zadana = Chwilowa                                          'przypisanie nowej wartosci dla predkosci
 Przycisnieto = 0                                           'gaszenie migania
 Autopowrot = 0
 Writeeeprom Zadana , 2                                     ' zapis   nowej wartosci do EEP
 Locate 1 , 15 : Lcd Zadana                                 'wyswietlenie NOWEJ wartosci
End If

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ą.

Przycisk:
 If Ip = 0 Then
   Incr Licznik_sw
   If Licznik_sw = 68 Then
   Licznik_sw = 0
    Reset Flaga_2s                                          'kasuj gotowosc do zmian
    Reset Flaga_10s                                         'kasuj gotowosc
    Reset Autopowrot
    If Przycisnieto = 0 Then
    Chwilowa = Zadana
    End If
    Incr Chwilowa                                           'krec MENU wyboru w kolko
    If Chwilowa = 6 Then Chwilowa = 0
    Przycisnieto = 1
    End If
 Else
 Licznik_sw = 60
 End If
Return

Hahaha może to kiedyś zagada :D

-

BARTek
Moja strona

Portret użytkownika marekszy

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).

Portret użytkownika EDC

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ć:

   If Przycisnieto = 1 Then
    If Mig = 1 Then                                          'jesli przycisnieto nowa wartość miga  
    Locate 1 , 15 : Lcd " "                                  'gaszenie cyfry
     Else
    Locate 1 , 15 : Lcd Chwilowa
    End If
   End If
End If

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

Portret użytkownika marekszy

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:

'##################ster.went.V1-2przyciski dziala###############################
'#############################marekszy@op.pl####################################
$regfile = "m8def.dat"
$crystal = 8000000
 
Config Portb = &B11111111 : Portb = &B00000001              'domyslnie przekaznik Pk_0 wlaczony
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
 
Ip Alias Pind.0                                             'aliasy przyciskow
Zatwierdz Alias Pind.1
 
 
Config Timer0 = Timer , Prescale = 256
Enable Timer0 : On Timer0 Zegar
 
Dim Dzielnik(3) As Byte , Flaga_4ms As Bit , Flaga_500ms As Bit , Flaga_2s As Bit , Flaga_10s As Bit
Dim Zadana As Byte , Aktualna As Byte , Chwilowa As Byte
Dim Ip As Bit , Licznik_sw As Byte , Autopowrot As Byte , Przycisnieto As Bit , Mig As Bit , Zatwierdz As Bit
 
 
Readeeprom Zadana , 2
If Zadana > 5 Then Zadana = 0                               'zabezpieczenie gdy czysty eeprom i odczyta FF
 
Enable Interrupts
Aktualna = 0
Autopowrot = 0
Przycisnieto = 0
Lcd "BIEG ZAD.=" ; Zadana
Lowerline
Lcd "BIEG AKT.=" ; Aktualna
 
'***START***
 
Do
''''''''''''''''''''''''''''''''' co 4ms
If Flaga_4ms = 1 Then
   Flaga_4ms = 0
   Gosub Przycisk
 
   If Przycisnieto = 1 Then
    If Mig = 1 Then                                         'jesli przycisnieto nowa wartość miga
    Locate 1 , 11 : Lcd " "                                 'gaszenie cyfry
     Else
    Locate 1 , 11 : Lcd Chwilowa
    End If
   End If
End If
 
''''''''''''''''''''''''''''''''' co 500ms
If Flaga_500ms = 1 Then
   Flaga_500ms = 0
   Mig = Not Mig                                            'miga w rytm
End If
''''''''''''''''''''''''''''''''' co 2s
If Flaga_2s = 1 Then
   Flaga_2s = 0
    If Przycisnieto = 1 Then                                'tu odlicza czas do wyłaczenia migania
     Incr Autopowrot
     If Autopowrot = 3 Then                                 '3x2s=6s
        Autopowrot = 0
        Przycisnieto = 0
        Chwilowa = Zadana
     Locate 1 , 11 : Lcd Zadana                             'przestaje migac wstawiajac STARA wartosc
     End If
    End If
End If
 
''''''''''''''''''''''''''''''''' co 10s
If Flaga_10s = 1 Then
   Flaga_10s = 0
 
 If Aktualna <> Zadana Then                                 'jesli predkosc zadana rozna od aktualnej
   If Aktualna < Zadana Then                                'podwyzszaj co 10sec  jesli nizsza
   Incr Aktualna
   Gosub Sterowanie
   End If
                                                             'zmniejszaj co 10sec jesli wyzsza
   If Aktualna > Zadana Then
   Decr Aktualna
   Gosub Sterowanie
   End If
 End If
End If
'''''''''''''''''''''''''''''''''
If Zatwierdz = 0 Then                                       'drugi przycisk
 Zadana = Chwilowa                                          'przypisanie nowej wartosci dla predkosci
 Przycisnieto = 0                                           'gaszenie migania
 Autopowrot = 0
 Writeeeprom Zadana , 2                                     ' zapis   nowej wartosci do EEP
 Locate 1 , 11 : Lcd Zadana                                 'wyswietlenie NOWEJ wartosci
End If
''''''''''''''''''''''''''''''''''
Loop
'***KONIEC***
 
Przycisk:
 If Ip = 0 Then
   Incr Licznik_sw
   If Licznik_sw = 68 Then
   Licznik_sw = 0
    Reset Flaga_2s                                          'kasuj gotowosc do zmian
    Reset Flaga_10s                                         'kasuj gotowosc
    Reset Autopowrot
    If Przycisnieto = 0 Then
    Chwilowa = Zadana
    End If
    Incr Chwilowa                                           'krec MENU wyboru w kolko
    If Chwilowa = 6 Then Chwilowa = 0
    Przycisnieto = 1
    End If
 Else
 Licznik_sw = 60
 End If
Return
 
 
Zegar:
 Timer0 = 132
 Set Flaga_4ms
 Incr Dzielnik(1)
  If Dzielnik(1) = 125 Then
  Dzielnik(1) = 0
  Set Flaga_500ms
  Incr Dzielnik(2)
   If Dzielnik(2) = 4 Then
   Dzielnik(2) = 0
   Set Flaga_2s
   Incr Dzielnik(3)
    If Dzielnik(3) = 5 Then
    Dzielnik(3) = 0
    Set Flaga_10s
    End If
   End If
  End If
Return
 
Sterowanie:
  If Aktualna = 0 Then Portb = &B00000001
  If Aktualna = 1 Then Portb = &B00000010
  If Aktualna = 2 Then Portb = &B00000100
  If Aktualna = 3 Then Portb = &B00001000
  If Aktualna = 4 Then Portb = &B00010000
  If Aktualna = 5 Then Portb = &B00100000
 
  Locate 2 , 11 : Lcd Aktualna
 
Return

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

Portret użytkownika EDC

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

Portret użytkownika marekszy

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.