Alarm i ustawienie w menu lub cos podobnego


Witam
Mam problem a raczej nie wiem jak zrobić możliwość włączenia na dany czes i wyłączenia na dany czas jednego pinu w atmedze.Dodam ze w układzie mam PCF8583,ale nie mam bladego pojęcia jak zrobić takie ustawianie.Czy wykorzystać do tego PCF8583 czy Timer z atmegi ?
Chodzi o takie coś
Włącz na 10 minut wyłącz na 3 godziny i ponownie włącz na 10minu i wyłącz na 3 godziny i tak w kolko.
Oczywiście ustawiane w menu czas i częstotliwość włączeń
USTAW CZAS PRACY = 15min -tu nastawianie co minuty
USTAW CZAS PRZERWY = 3godz -tu nastawianie co godziny
Dopisałem obsługę timer1 do programu z przerwaniem co 1s
Cykle pracy (włącz na 10 min i wyłącz na 3 godz) nie mają nic wspólnego z porą dnia (określona godzina ) lub kalendarzem i nie są mi potrzebne chyba do porównania z PCF.Myślałem raczej o zastosowaniu Timera1 który będzie odpalał przerwanie co 1s.
Przerwania będą zliczane i wrzucane do wora co 60 impulsów przerwan czyli 60s=minuta
następnie minuty na godziny 60min=1hour
idea była taka jeśli teraz ustawimy w menu na to ze włącz na 3minuty wyłącz na 5godzin to to się stanie nie ważne co jest czy to jest niedziela czy wojna czy 12 w nocy lub 4rano tak jak ustawimy tak będzie się działo cyklicznie wkoło do tego próbuje doprowadzić swój kod prosił bym o jakieś wskazówki jak mam zastosować ten Timer1 do zliczania minut i porównania ich z ustawionymi w menu wartościami zmiennych
Prosił bym bardziej doświadczonych kolegów o pomoc lub jakieś sugestie jak to ugryźć

$regfile = "m16def.dat"                                     'Konfigruacja procesora
$crystal = 16000000                                         'Konfigruacja oscylatora
$hwstack = 64
$swstack = 64
$framesize = 64
 
Config Lcd = 20 * 4                                         'Konfigruacja LCD 20x4
Config Lcdpin = Pin , Rs = Porta.2 , E = Porta.3 , Db4 = Porta.4 , Db5 = Porta.5 , Db6 = Porta.6 , Db7 = Porta.7
 
 
 
 
 
Config Portb.0 = Output                                     'Konfigruacja UP
Set Portb.0
Up Alias Pinb.0
Config Portb.1 = Output                                     'Konfigruacja OK
Set Portb.1
Ok Alias Pinb.1
Config Portb.2 = Output                                     'Konfigruacja DOWN
Set Portb.2
Down Alias Pinb.2
 
 
 
Config Portd.4 = Output                                     'Konfigruacja WATER PUMP
Water Alias Portd.4
Water = 1
 
 
 
Declare Sub Set_water_on
Declare Sub Set_water_off
 
Dim Ustaw_water_on As Integer
Dim Ustaw_water_off As Integer
 
 
 
 
 
 
 
 
Config Timer1 = Timer , Prescale = 256                      'deklaracja timera jako czasomierza'z prescalerem 256   16000000/62500=256
On Timer1 Przerwanie_co_1s                                  'deklaracja jaka etykieta obs³uguje'przepe³nienie od timer0
 
 
 
Dim Licznik As Integer                                      'zmienna licznikowa
 
Enable Interrupts                                          'odblokowanie globalnych przerwañ
 
Enable Timer1                                               'odblokowanie przerwania od przepe³nienia timer0
 
Timer1 = 62500                                              'wpisanie wartoœci pocz¹tkowej 62500 do timera,'czyli timer bêdzie zlicza³ (256+1) impulsów
 
Licznik = 0                                                'wyzerowanie zmiennej licznikowej
 
 
 
 
Cls
 
Cursor Off
Cls
 
 
 
 
 
Do
 
     Readeeprom Ustaw_water_on , 2
 
 
     If Licznik = Ustaw_water_on Then
     Water = 0
     End If
 
 
 
 
If Ok = 0 Then Gosub Set_water_on
 
            Waitms 50
            Locate 1 , 1
            Lcd "SET TIME WATER PUMP"
            Locate 3 , 1
            Lcd "SET TIME ON: " ; Ustaw_water_on ; " Min"
            Locate 4 , 1
            Lcd "SET TIME OFF:" ; Ustaw_water_off ; " Hour"
            Waitms 50
 
 
 
 
Loop
 
 
 
 
 
 
Sub Set_water_on
 
 
     Cls
 
     Do
 
            Waitms 50
            Locate 1 , 1
            Lcd "SET TIME WATER PUMP"
            Locate 3 , 1
            Lcd "SET TIME ON: " ; Ustaw_water_on ; " Min"
            Locate 4 , 1
            Lcd "SET TIME OFF:" ; Ustaw_water_off ; " Hour"
            Waitms 50
 
 
 
     If Up = 0 Then Incr Ustaw_water_on                     ' UP
     Waitms 250
     If Down = 0 Then Decr Ustaw_water_on                   ' DOWN
     Waitms 250
 
 
     Writeeeprom Ustaw_water_on , 2
 
 
     If Ok = 0 Then Exit Do                                 ' EXIT DO
 
     Loop
 
 
     Cls
 
 
 
     Gosub Set_water_off
 
 
     End Sub Set_water_on
 
 
 
 
 
 
 
Sub Set_water_off
 
 
 
     Cls
 
     Do
 
            Waitms 50
            Locate 1 , 1
            Lcd "SET TIME WATER PUMP"
            Locate 3 , 1
            Lcd "SET TIME ON: " ; Ustaw_water_on ; " Min"
            Locate 4 , 1
            Lcd "SET TIME OFF:" ; Ustaw_water_off ; " Hour"
            Waitms 50
 
 
 
     If Up = 0 Then Incr Ustaw_water_off                    ' UP
     Waitms 250
     If Down = 0 Then Decr Ustaw_water_off                  ' DOWN
     Waitms 250
 
     Writeeeprom Ustaw_water_off , 4
 
 
     If Ok = 0 Then Exit Do                                 ' EXIT DO
 
     Loop
 
 
     Cls
 
 
 
 
 
Rem Return
 
 
     End Sub Set_water_on
 
 
 
Przerwanie_co_1s:                                           'podprogram przerwania od przepe³nienia timer0 Wywolywanego Co 1s
 
 
Counter1 = Counter1 + 1                                     'ustawienie pocz¹tkowej wartoœci timera1 poprzez
                                                            'dodanie do niego wartoœci 1 (odliczone zostanie
                                                            'dok³adnie kolejne 256+1 impulsów)
Incr Licznik                                                'zwiêkszenie licznika
 
If Licznik = 1 Then                                         'jeœli zmienna licznik równa siê 1 (czyli'odliczone zosta³o 1sek), to
 
Toggle Water                                                'zmieñ na przeciwny stan wyjœcia led
 
 
Licznik = 0                                                 'wyzeruj zmienn¹ licznik
 
 
 
End If
 
Return                                                      'powrót z przerwania
 
 




Portret użytkownika mirley

Re: Timer

Nie wnikam w pozostałą część kodu, ale po pierwsze, nie dodawaj tej obsługi bezpośrednio w przerwaniu.... zrób sobie zmienna np F1s as bit i ustawiaj ją w przerwaniu, w pętli głownej napisz:

if F1s =1 Then
  F1s=0 
  if TrybPraca = 0 Then
    if Licznik >= Czas_wyl Then
      'przechodzi do zalaczenia
      Licznik = 0
      TrybPraca = 1
      'tutaj sterowanie wyjściem, np set portx.y
    Else
      incr Licznik
    End if
  Else
    if Licznik >= Czas_wl Then
      'przechodzi do wylaczenia
      Licznik = 0
      TrybPraca = 0
      'tutaj sterowanie wyjściem, np reset portx.y
    Else
      incr Licznik
    End if
  End If
End If

Zmienne:

Dim TrybPraca as Bit    '1 praca, 0 przerwa
Dim Czas_wl, Czas_wyl as Long   'czas wł i wył w sekundach 
Dim Licznik as Long    'licznik

Ja zawsze do takich liczników daje zmienne od razu liczące w sekundach, jest prościej, w menu do takiej zmiennej dodaje +3600 jak chce dodac godzinę i +60 jak chce dodać minutę

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika kulamario

Alarm i ustawienie w menu lub cos podobnego

Witam
Po pierwsze za pamięci nie wiem jak dodać plik na forum np rar lub zip
A teraz do tematu nie za bardzo rozumiem i wiem jak mam zrobić to na sekundach?
Zrobiłem to troszkę inaczej a mianowicie to ze do ustawienia włączenia wody potrzeba tylko ustawień na minuty zrobiłem jedna zmienna która pobiera sekundy z Timera1 (co 60s = 1minuta)następnie ta zmienna jest porównywana ze zmienna z ustawień ON/OFF jeśli się zgadza to ON następnie trzeba było coś wymyslec co by tez jakoś wyłączyć ten stan ON zrobiłem kolejna zmienna która zlicza minuty z Timera1 (co 60minut = 1godzina) a to ze nawadnianie będzie co jakiś dłuższy odstęp czasu zrobiłem to godzinowo.Po odczekaniu danej przerwy zmienne pobierające dane z Timer1 zerują się i tak w kolko.
Nie wiedziałem jak wyjść z drugiego podprogramu do pętli głównej bo cały czas wracał mi do podprogramu numer 2 i tam zastosowałem watchdog co by bez problemu wyskoczyć do Do...Loop.
Wiem ze tak tego nie powinienem robić ale to był jedyny mój pomysł jak opuścić drugi podprogram i znaleźć się w pętli głównej Do...Loop.
Zrezygnowałem z przycisków i zrobiłem to na enkoderze ale nie wiem jak mam dołączyć cały projekt bo do obsługi enkodera mam dodatkowe biblioteki i ze by uruchomić i zobaczyć jak lata trzeba je posiadać.
Daje sam listing pliku Main.bas

'POMPA HYDROPHONIC
 
 
$regfile = "m16def.dat"
$crystal = 16000000
$hwstack = 32
$swstack = 32
$framesize = 32
 
 
$include "Config_Encoder.bas"
 
Config Watchdog = 512                                       'reset co ok 0,5s
 
Config Lcd = 20 * 4                                         'Konfigruacja LCD 20x4
Config Lcdpin = Pin , Rs = Porta.2 , E = Porta.3 , Db4 = Porta.4 , Db5 = Porta.5 , Db6 = Porta.6 , Db7 = Porta.7
 
Cursor Off
 
'ZMIENNE GODZINY,MINUTY,SEKUNDY USTAWIENIE CZASOW ON/OFF
 
Dim H As Byte
Dim M As Byte
Dim S As Byte
 
 
Config Pind.4 = Output                                      'Konfigruacja Wentylatora wywiewu cieplego powietrza
Fan Alias Portd.4
Fan = 0
 
'TIMER1
 
 
 
Dim Timer_1 As Byte
 
 
Config Timer1 = Timer , Prescale = 1024
 
 
On Timer1 Licznik
 
Timer1 = 1
 
Enable Interrupts
 
 
Enable Timer1
 
 
Counter1 = 50211
 
Cls
 
 
 
 
 
Dim Time_setings_minutes As Byte
Dim Time_setings_hours As Byte
 
 
 
 
 
 
 Declare Sub Water_on
 Declare Sub Water_off
 
 
 Dim Time_run_water As Byte                                 'run time  preset -min  (zadany czas pracy)
 Dim Time_brk_water As Byte                                 'stop time preset -godz (zadany czas przerwy)
 
 '*******************************************************
 'odczytane z EEprom przykladowe wartosci ustawienia czasow:
 
 Time_run_water = 0
 Time_brk_water = 0
 
 
 
 Time_setings_minutes = 0
 Time_setings_hours = 0
 
 Readeeprom Time_run_water , 1
 
 Readeeprom Time_brk_water , 2
 
 ' ******************************************************
Cls
 
 
 '=========================================================
 
 
 
  Do
 
        Locate 1 , 1
         Lcd "RUN =  " ; Time_run_water ; " Min"
         Locate 2 , 1
         Lcd "BREAK= " ; Time_brk_water ; " Godz"
 
 
 
         Locate 3 , 1
         Lcd "minuty " ; Time_setings_minutes
         Locate 4 , 1
         Lcd "godziny " ; Time_setings_hours
 
 
 
 
 
 
 
 
 
    If Time_setings_minutes = Time_run_water Then           'RUN
    Portd.4 = 1
    End If
 
 
 
 
 
 
 
    If Time_setings_hours = Time_brk_water Then             'BREAK
 
    Portd.4 = 0
    End If
 
 
 
 
 
    If Time_setings_hours = Time_brk_water Then             'BREAK
    'Reset Timer1
    Time_setings_minutes = 0
    Time_setings_hours = 0
    Cls
    End If
 
 
 
 
 
 
 
 
    Stan_enc = Sprawdz_encoder()                            ' odczyt stanu enkodera
 
    If Stan_enc = Enc_enter Then
        Gosub Water_on
    End If
 
 
 
 
 
 
  Loop
 
 
 
 
  'PRZERWANIE LICZNIKA
 
 
 
 
Licznik:
 
 
Counter1 = Counter1 + 50211
 
 
Incr S
If S = 60 Then
Time_setings_minutes = Time_setings_minutes + 1
S = 0
 
If Time_setings_minutes = 60 Then Time_setings_minutes = 0
 
 
 
 
 
Incr M
If M = 60 Then
Time_setings_hours = Time_setings_hours + 1
M = 0
 
If Time_setings_hours = 24 Then Time_setings_hours = 0
 
 
 
 
End If
End If
 
 
Return
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
'SUB WATER ON
 
 
 
 
Sub Water_on
 
 
     Stan_enc = 0                                           ' WA?NE!!! wyzerowa? zmienn? na pocz?tku podprogramów w których p?dzie wykorzystany encoder
 
     Waitms 250
 
      Locate 1 , 1
            Lcd "SET TIME WATER PUMP"
            Locate 3 , 1
            Lcd "SET TIME ON: " ; Time_run_water
            Locate 4 , 1
            Lcd "SET TIME OFF: " ; Time_brk_water
     Do
 
        Stan_enc = Sprawdz_encoder()                        ' odczyt stanu enkodera
 
        If Stan_enc = Enc_next Then Incr Time_run_water
        If Stan_enc = Enc_prev Then Decr Time_run_water
 
        If Time_run_water < 0 Then Time_run_water = 0
        If Time_run_water > 180 Then Time_run_water = 180
 
        Locate 3 , 14 : Lcd Time_run_water
 
        If Stan_enc = Enc_enter Then Gosub Water_off
 
 
 
 
        Stan_enc = 0                                        ' WA?NE!!! na ko?cu p?tli wyzerowa? zmienn?  Stan_enc
 
 
 
 
     Loop
 
 
 
     Cls
 
     Stan_enc = 0                                           ' WA?NE!!! wyzerowa? zmienn? na ko?cu podprogramów w których p?dzie wykorzystany encoder
 
     End Sub
 
 
 
 
 
 
'SUB WATER OFF
 
 
 
Sub Water_off
 
 
     Cls
 
     Stan_enc = 0                                           ' WA?NE!!! wyzerowa? zmienn? na pocz?tku podprogramów w których p?dzie wykorzystany encoder
 
     Waitms 250
 
      Locate 1 , 1
            Lcd "SET TIME WATER PUMP"
            Locate 3 , 1
            Lcd "SET TIME ON: " ; Time_run_water
            Locate 4 , 1
            Lcd "SET TIME OFF: " ; Time_brk_water
     Do
 
        Stan_enc = Sprawdz_encoder()                        ' odczyt stanu enkodera
 
        If Stan_enc = Enc_next Then Incr Time_brk_water
        If Stan_enc = Enc_prev Then Decr Time_brk_water
 
        If Time_brk_water < 0 Then Time_brk_water = 0
        If Time_brk_water > 12 Then Time_brk_water = 12
 
        Locate 4 , 15 : Lcd Time_brk_water
 
        If Stan_enc = Enc_enter Then Exit Do
 
 
 
 
     Loop
 
 
     Writeeeprom Time_run_water , 1
 
     Writeeeprom Time_brk_water , 2
 
 
     Cls
 
 
     Start Watchdog
     Powerdown
 
 
 
     Stan_enc = 0                                           ' WA?NE!!! wyzerowa? zmienn? na ko?cu podprogramów w których p?dzie wykorzystany encoder
 
 
 
End Sub
 
 
     Stan_enc = 0                                           ' WA?NE!!! na ko?cu p?tli wyzerowa? zmienn?  Stan_enc
 
 
 
$include "Encoder.bas"