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