Elektroda.pl
Elektroda.pl
X
Relpol przekaźniki
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Czasowy włącznik (Timer) 6 kanałowy na mikrokontrolerze

30 Paź 2008 16:03 11815 61
  • Poziom 15  
    Witam,

    jakis czas temu wpadlem na pomysl wykonania sterowania 6 gniazdami 220V zgodnie z zaprogramowanymi cyclami czasowymi

    Wykonalem plytke w ktorej sterowanie gniazdami 220V obywa sie poprzez przekaznik ( moze w przyszlosci triak ).

    Pozostala mi czesc sterowania ( nie mala :-) )

    Pomyslalem o wykorzystani mikrokontrolera jednoukladowego ( np ATMEL )
    w ktorym za pomoca 6 wyjsc 1/0 moge podawac stany wlaczony i wylaczony i jak dlugo
    Do tego jakis generator czasu i metoda zapamietywania ustawien

    np.
    1 gniazdo wlaczamy o 19:00, czas pracy 10min i wylaczamy
    2 gniazdo wlaczamy o 20:20, czas pracy 9 min i wylaczamy
    itp itd

    wszystko pracuje w cyklu dziennym

    Pytanko do was jak do tego podejsc od strony programu do jednoukladowca? Gdzie zapisywac ustawienia?

    Napewno potrzebujemy timer uruchamiany po wlaczeniu kanalu
    i informacje o czasie, do tego sterowanie LCD i guziki do programowania.

    a moze robil ktos juz cos takiego ?
  • Relpol przekaźniki
  • Pomocny post
    Poziom 12  
    to wszystko można zrealizować na mikrokontrolerze (jak mówisz AVR najlepszy na początek ;) ) programując go jako "zegarek". Jak nie znasz żadnego języka to polecam bascoma, a w necie poszukaj czegoś w stylu "zegarek z alarmem na avr" tyle że zamiast alarmu Twoje gniazda 230V, i tu masz doskonały przykład, później tylko rozbudowac o kolejne "alarmy" (gniazda).
  • Poziom 15  
    cool, dzieki.

    Swego czasu dosc duzo programowalem w ATMEL'ach ale w C, nawet pare klimatyzacji budynkowych nadal chodzi na moich sterownikach :-)

    Ale potem zmienilem fach na bardziej informatyczny i wszystko zapomnialem :-(

    Ale dzieki za porade zaraz sie zapoznam ... z tymi AVR
  • Poziom 15  
    dark_sith,

    mam jeszcze prosbe bo widze ze tym bascomem ogarnie sie ten temat :-)

    Moglbys polecic jakis programator ( ale nie na LTP, COM lub USB ) oraz zestaw startowy/testowy

    Zestaw testowy musi posiadac LCD, pare guzikow i LEDy do badania stanu :-)

    dzieki za pomoc, nie chce sie motac na poczatku :-)
  • Pomocny post
    Poziom 13  
    poszukaj na allegro. Ja osobiście polecam sklep internetowy nestor-electronics. Strasznie drogo, ale mają fullwypas megabajery ;)
  • Relpol przekaźniki
  • Pomocny post
    Poziom 12  
    Hmm szczerze? ja sobie kupiłem płytke stykową :) czyli moge montować i rozmontowywać układy jak chce, bardzo przydatne, a kazdy element mozna wykorzystać ponownie, oraz nie trzeba inwestowac w cąła płytke tylko pokolei robisz moduły :) składasz to co chcesz w danym momencie wykonać, a potem rozkładasz. poszukaj na allegro "płytka stykowa". A co do programatora ja mam na LPT (najtańszy). I szczerze mówiąc nie mam pojęcia o innych programatorach :P poprostu sie nie bawiłem innymi...
  • Poziom 13  
    Jeśli wciąż jesteś zainteresowany tematem to możemy wymienić się doświadczeniami.
    Obecnie robię sterownik do terrarium 8 kanałowy (moim zdaniem to przesada), ale cóż, nie ja go będę używał. Obecna platforma to ATmega8515 (taki miałem pod ręką), lub ATmega16 (jeśli się nie zmieszczę z kodem). Mój układ pracuje w cyklu tygodniowym, oprócz zdarzeń czasowych ma też zdarzenia warunkowe - jak na razie tylko temperatura, aczkolwiek przewiduje, że będzie miał także warunki na stan innych kanałów. Dane przechowuje w EEPROMie niestety tylko 512B, wykorzystanie zewnętrznego EEPROMu jako pamięć odczytywana na bieżąco odpada (za wolne, a mam rozdzielczość sekundową zdarzeń). Jeżeli zdecyduję się jednak na rozdzielczość minutową to popularne kostki 24CXX powinny być ok. Do wprowadzania ustawień służy klawiatura 3x3 lub PC z moim oprogramowaniem - aktualnie łączność przez CP2102 (USB <-> RS232,wirtualny port szeregowy)

    Ja z kolei mam pytanie do Kolegów czy rozdzielczość sekundowa takiego urządzenia to nie jest przerost formy nad treścią? Jeśli nie minutowa to może co 10/15/20 sekund?
    Zdarzenia warunkowe sprawdzane są na bieżąco.
  • Poziom 15  
    super bylbym zaintersowany wspolpraca :-)

    Co do cyklow, wydaje mi sie ze co sek jest jak najbardziej OK, ja planuje na poczatku dac co 0,5 sek a potem co 0,1 sek
    chodzi o dokladne pomiary, do temperatory co sek wystarczy
    ale ja chce tez uzyc tego do dozowania plynow a tutaj co sek podawanie jest ok, ale potyrzebuje jeszcze pomiedzy sprawdzac eventy...

    jakby co pisz na mail smithpl[at]softnet.waw.pl
  • Poziom 13  
    No tak, tylko kolega nie planuje drażnić gekona w terrarium włączając/wyłączając mu np. światło co 1 sekundę ;)
    A pamiętaj co do pomiaru temperatury, że konwersja zabiera czas. Na DS18B20 jest to od niecałych 100 ms (9bit) do 750 ms (12bit) przy czym można wydać polecenie pomiaru temperatury i odczytać dopiero "za jakiś czas" czyli możesz otrzymać przesunięcie czasowe o czas rozdzielczości pomiaru (u Ciebie 1 sek). Myśle, że jeżeli jest konieczna rozdzielczość sterowania 0.1 sek to powinieneś od razu od takiej zacząć.

    EDIT: Nie wiem czy lepiej pisać PW / mail czy tutaj - zawsze ktoś jeszcze może skorzystać.
    Mój mail to dave /nienawidze spamu/ inter-c.pl
  • Poziom 15  
    chodzilo mi raczej o zapoznanie sie z twoja konfiguracja z PC
    :_)

    jakby co napisze mail,
  • Poziom 13  
    Do komunikacji z PC służy "moduł" (ten cudzysłów mocno wskazany :) ) wyciągnięty z kabla do podłączenia telefonu.
    Jest na ukladzie CP2102. Zaletą tego układu jest to, że jest bardzo prosty w konstrukcji (przy czym ja użyłem gotowca i tylko dolutowałem wtyczke). Nie planuje go montować do układu gdyż podniosłoby to cene, a raczej nie bedzie używane. Używam w celach "serwisowych".
    Program na PC napisany w C#, używany standardowy komponent portu szeregowego. Jeżeli chcesz to zamieszczę fotkę.

    Dodałem fotkę:
    Czasowy włącznik (Timer) 6 kanałowy na mikrokontrolerze
    Jak widać układ szału nie robi :D
    Zrobiony kiedyś na szybko działa do dziś.
  • Poziom 15  
    no dobra, udalo mi sie kupic pare fajnych zabawek, mam programator, testowy zestaw z wyswietlaczem nestor electornics.
    Teraz czs na soft.

    Zaczalem bawic sie bascomem avr
    wrzucilem na szybko prosty sofcik na atmega8 i chcialem w symulatorze zobaczyc jak chodzi - a tu zonk simulator startuje ale nie idzie do nastepnych linii.. wiecei moze czemu?

    o to listing:
    Code:

    $regfile = "m8def.dat"
    $crystal = 8000000
    '--------------------Ustawienie LCD------------------
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5

    Cls
    Cursor Off
    '----------------------------------------------------
    Lcd "Welcome"
    Dim I As Word
    Config Timer1 = Timer , Prescale = 256
    On Timer1 Times
    Enable Interrupts
    Enable Timer1
    Timer1 = 34285
    Do
    Loop
    End

    Times:
    Timer1 = 34285
    I = I + 1
    Cls
    Lcd I
    Return


    Powiem ze chce potrenowac na simulatorze bo latwiej w tym testowac niz na plytce

    Proszę używać znaczników [code].
    [zumek]
  • Poziom 13  
    Szczerze to z Bascomem nie miałem do czynienia.
    "Nie idzie do następnych linii" - czyli sie zapętlił czy w ogóle "wyleciał w kosmos"?
    Basica używałem na Commodore 64, i jak sie można domyśleć to było bardzo dawno...
    Wiem, że BASCOM ma to do siebie, że jest bardzo prosty, ale może lepiej pisać w C. Będziesz miał kompilator i symulator w jednym środowisku - AVR Studio.

    Ja dziś zmontowałem układ wykonawczy, niestety potwierdziło się, że muszę kupić mocniejszy transformator - mam nadzieję, że dostanę go w Pile i nie będę musiał czekać na przesyłkę z TME. A sam układzik działa (poza sytuacją gdy wszystkie przekaźniki są włączone - niewystarczający prąd do wysterowania wszystkich).

    Czasowy włącznik (Timer) 6 kanałowy na mikrokontrolerze
  • Poziom 15  
    no w sumie mi bez roznicy tylko ze bascom ma obsluge LCD np z default'u , jak i epromu
    chyba ze AVR Studio tez :-)

    Co do samego softu, plan dzialania taki:

    1. Zegarek 24h z mozliwoscia nastawiania
    2. Obsluga 3 przekaznikow ( zalaczanie o danej godzinie )
    3. Okreslenie dlugosci zalaczenia w sekundach ( 2 timery?)
    4. na koniec duperelek poiar temperatury online z odczytem co 3 sek.
    5. Zapisywanie czasu do eepromu

    Czy jest mozliwosc uratowania nastawu czasy przed strata zasilania ? Jakie musialbym zrobic podtrzymanie ATMega8 aby trzymal czas? Czy zrobic to na osobnym ukladzie?

    Dodano po 3 [minuty]:

    Dave_Masters , ja widze ze mi jest potrzebne to co ty juz masz :-D 8 przekaznikow uruchamiane o danej godzinie na okreslona dlugosc czasu...
  • Poziom 13  
    Nad podtrzymywaniem bateryjnym sam się zastanawiam, jak powiększysz zdjęcie to zobaczysz, że to złącze ma dziesięć pinów. 1 Vcc, 2 Gnd i 8 kanałów. Jak to dziś uruchomiłem to zauważyłem, że kondensator 2200 uF trzyma napięcie na prawidłowym poziomie przez kilka sekund - czas wystarczający do zapisania danych w eepromie i/lub przejścia na zasilanie bateryjne.

    Primo - w moim przypadku dodatkowy pin odłączony od zasilacza sygnalizujący stanem niskim odłączenie od sieci - procesor podejmuje odpowiednie działania po wystąpieniu takiego stanu. Ma na to kilka sekund, więc powinien zdążyć

    Zaraz narysuję jakiś rysunek poglądowy żeby wyjaśnić o co mi chodzi - do realizacji potrzebowałbym pomocy elektronika - sam jestem informatykiem ;)

    Oto i rysunek ;)
    Czasowy włącznik (Timer) 6 kanałowy na mikrokontrolerze


    Teraz potrzebowałbym pomocy co wstawić w miejsce znaku zapytania, można oczywiście użyć 7805 w obudowie TO92 do ograniczenia napięcia ale to chyba byłby przerost formy nad treścią. Potrzebuje te nieregulowane 9V sprowadzić do poziomów TTL (może jakaś dioda Zenera?) tak, żeby mi wejść uC nie zjarało.



    Co do określenia czasu załączenia - mam to rozwiązane trochę inaczej. Mianowicie wyłączenie i załączenie to są 2 odrębne zdarzenia, pozwala to na nieograniczony czas załączenia (w ramach cyklu tygodniowego). Z dokładnością sekundową na określenie długości zadziałania potrzebowałbym 2-3 bajtów, a 3 bajty to ma u mnie całe zdarzenie - czas, warunki, które przekaźniki...

    Teraz kwestia zegarka. Jeśli myślisz o podtrzymywaniu bateryjnym to może ATmega16 i zegar na drugim kwarcu (zegarkowym 32768Hz) - dlatego tak, gdyż ten procek może przejść w stan czuwania gdzie tylko ten kwarc będzie uruchomiony (no nie tylko :P ) - stan z minimalnym poborem prądu.
  • VIP Zasłużony dla elektroda
    smithpl - Po co zapisywanie czasu do EEPROMu, skoro po ponownym włączeniu zasilania czas trzeba będzie ustawiać od nowa?

    Do tego jest potrzebne albo podtrzymywanie bateryjne całego układu, albo osobny układ RTC do pomiaru czasu z własnym podtrzymaniem (np. PCF8583). Dodatkowo taki zegar będzie dokładniejszy niż ten zrobiony na uC i zwykłym kwarcu.

    Dave_Masters - najprościej pomiar napięcia przeprowadzić za stabilizatorem. Są do tego specjalizowane układy, np. DS1233 - generują sygnał resetu gdy napięcie spada poniżej określonego progu. Ew. możesz taki układ zbudować sam - wystarczy komparator (np. LM393), dioda zenera lub układ napięcia odniesienia (np. LM285) i kilka rezystorów (dzielnik napięcia, rezystor podciągający wyjście, ew. rezystor do histerezy).

    Pozdrawiam,
    Dr.Vee
  • Poziom 15  
    niby tak, ale ja znow potrzebuje uzyc timera okreslajacego dlugosc zalaczenia czasy nie przekraczajace 60-120 sek
    w cyklu co 1 sek.

    3 z tych przekaznikow beda zalaczac pomke nie ma czas ale na ilosc przeplywu, stad aposlugiwanie sie timerem bedzie latwiejsze przy wprowadzaniu dlugosci przeplywu :-)

    Dodano po 1 [minuty]:

    a moglby to ktos podeprzec przykladem?
    jakim wstepem, punktem zaczepienia ? :-)

    Ja tez w sumie sklanialbym sie do zewnetrznego RTC po I2c
    ale najpierw w ogole musi to ruszyc :-)
  • Poziom 13  
    Jeśli będziesz chciał jednak zrobić zegar na uC to spróbuj tak jak pisałem drugi kwarc 32768Hz taktujący Timer2 ATmegi16 - masz RTC w jednym układzie.
  • Poziom 39  
    Dave_Masters napisał:
    ...Oto i rysunek ;) ...

    A w jaki sposób, chcesz wykryć zanik zasilania na masie(GND) układu :?:

    Piotrek
  • VIP Zasłużony dla elektroda
    Dave_Masters napisał:
    Jeśli będziesz chciał jednak zrobić zegar na uC to spróbuj tak jak pisałem drugi kwarc 32768Hz taktujący Timer2 ATmegi16 - masz RTC w jednym układzie.


    Tak, ale wtedy i tak musisz rozwiązać problem podtrzymania zasilania RTC. Teoretycznie można uśpić procesor i zminimalizować pobór prądu, ale np. zwykły stabilizator sam pobiera ok. 5mA prądu nawet bez obciążenia. Trzeba cały układ zaprojektować pod tym kątem - nie prościej użyć sprawdzonego rozwiązania?

    smithpl - zewnętrzne układy RTC również mają możliwość ustawienia alarmu, albo na konkretną datę i godzinę, albo cyklicznego co określoną liczbę sekund, minut czy godzin.

    Pozdrawiam,
    Dr.Vee
  • Poziom 13  
    Mea culpa ;)
    Ale to tylko rysunek poglądowy, oczywiście miało iść do +
    Tylko, że kondek trzyma napięcie przez kilka sekund i jak dam za stabilizatorem to sie dowiem jak już przestanie je trzymać, a chciałbym wychwycić moment jak zaniknie.


    Dr. Vee - właśnie o tym piszę. Chodzi o to, że jak wykryje zanik napięcia to przechodzę w stan czuwania i jadę na bateriach - wyłączam wszystko oprócz RTC. Po to jest ten sygnał z zasilacza - jak zero to uC idzie lulu.
  • Poziom 15  
    Dr.Vee - ale przeczytaj jaka mam miec funkcjonalnosc.

    6-8 przekaznikow zalaczanych o podanej godzinie na okreslona ilosc sekund...
  • VIP Zasłużony dla elektroda
    Przy stałym poborze prądu napięcie na kondensatorze spada liniowo... A mierząc napięcie na kondensatorze jak niby chcesz zauważyć "kiedy zaniknie"? Musiałbyś obserwować napięcie w sieci, a raczej jego zanik.

    smithpl -> czytałem. Potrzebujesz też podtrzymania bateryjnego. Więc czemu nie użyć RTC jako zegara z podtrzymaniem + do odmierzania krótkich odcinków czasu? Ustawiasz alarm w RTC na odpowiedni czas, "usypiasz" procesor i czekasz, aż RTC go "obudzi"... Oczywiście możesz te 60-120 sekund odmierzać procesorem.

    Nie sugerowałem użycia samego RTC, tylko RTC obok procesora.

    Pozdrawiam,
    Dr.Vee
  • Poziom 13  
    No taki mam zamiar - jestem informatykiem, a nie elektrykiem i tutaj potrzebuje Waszej pomocy ;)
    Wiem, że jakoś to rozwiązali w zasilaczach komputerowych.

    ----

    Postanowiłem zbadać sprawę organoleptycznie - miernikiem.
    Przy normalnej pracy - obciążenie ultra jasna dioda led - napięcie na mostku (+) wynosi około 16V, napięcie wyjściowe ok. 5V.
    Po zaniku napięcia sieciowego napięcie na wyjściu utrzymuje się niezmienione przez 3-4 sekundy, zaś napięcie mierzone na nóżce mostka bardzo szybko spada.
    Teraz jeśliby skonstruować jakiś mechanizm który jeżeli tylko napięcie spadnie poniżej np. 14-15 V to dawał na wyjściu 0 - taki pseudo komparator analogowy.
    Problem jest taki, że nie chciałbym przerabiać pcb - najlepiej rozwiązanie które mieści sie rurce termokurczliwej polutowane na pająka - co implikuje użycie minimalnej ilości elementów.

    -> Dr. Vee
    co do układu resetu - w przypadku AVR wystarczy uaktywnić Brown-out detektor, ale koledze chodziło nie o reset tylko o przejście na zasilanie bateryjne. Czyli Sleep procka w odpowiednim trybie, byle tylko RTC działał nadal.

    A może zamiast bawić się i kombinować wystarczy zrobić coś w stylu zasilacza UPS typu online i mieć głęboko (wiecie gdzie ;) ) czy napięcie w sieci jest czy go nie ma.
    W moim przypadku to chyba będzie najlepsze rozwiązanie sam procek nie pobiera za dużo prądu (a i to można zmniejszyć), gorzej z podświetleniem LCD, ale to można zasilać z głównego źródła - nie ma prądu w sieci - nie ma podświetlenia. Proste.
    Tylko jak zrobić UPS online ;)
    Tutaj już nie mam takiego ograniczenia na liczbę elementów bo tej płytki jeszcze nie mam - robię na testowej. Kwestią jest cena.

    Idea rozwiązania jest taka:
    Czasowy włącznik (Timer) 6 kanałowy na mikrokontrolerze

    Jak widać tak czy inaczej możemy się dowiedzieć o zaniku napięcia zasilania, ale bez żadnych "kombinacji", i mimo wszystko przejść w stan uśpienia w celu zaoszczędzenia baterii.

    No i pytanie jak zrobić UPS online. Myślę, że można by użyć do tego 4 mini ogniw 1.2 V, przecież to nie szpital, pół godziny to aż za dużo ;)
    Tylko jak zrobić elektronikę ładującą bateryjki czy "po prostu podłączyć to i
    układ będzie pobierał zasilanie ze źródła o większym napięciu"...
    Pozdrawiam
    Dave
  • VIP Zasłużony dla elektroda
    Dave_Masters skoro przy zaniku napięcia w sieci i tak nie można sterować zewnętrznymi urządzeniami, to po co bateryjne podtrzymywanie całości?

    Do wykrycia spadku napięcia zasilania można również wykorzystać ADC w procesorze (ew. komparator analogowy w at90s8535 którego używasz). To by było minimum elementów - wystarczy dzielnik rezystorowy :)

    Pozdrawiam,
    Dr.Vee
  • Poziom 13  
    Do utrzymania RTC i zapisu konfiguracji do EEPROMU. Z pomiarem to już sobie bez problemu poradzę. Tylko z elektronika analogową "jestem na bakier" :)
    Dzięki za pomoc, zanim pójdę spać to jeszcze poszukam schematów jak zrobić taki UPS.

    P.S. Nie używam 8535 tylko 8515 i nie At90xxxx tylko ATmega8515, a żeby było śmieszniej to przerzucam się na ATmega32 ;)

    -------------

    W temacie

    https://www.elektroda.pl/rtvforum/viewtopic.php?t=1062732&highlight=podtrzymanie+bateryjne&sid=0bdd59b029af4584342da84a6d0ea2e2

    znalazłem coś takiego:
    Czasowy włącznik (Timer) 6 kanałowy na mikrokontrolerze

    Oczywiście u mnie byłoby to 5V(zasilacz) i 4x1.2 = 4.8V(aku).
    Czy taka konfiguracja jest ok? ATmega powinna działać na 4.5V, więc to raczej luz, gorzej czy akumulatorki to wytrzymają.
    P.s. Nie patrzcie polaryzacje tych aku...
    Czy powinienem układ zasilać wyższym napięciem żeby doładować akumulatory i już przed samym uC dać stabilizator na 5V (7805 w TO92 powinien być ok) czy tak też może być.
    Pozdrawiam
    Dave

    -----
    Zastanawiam się czy dać do działu DIY jak skończę...
  • Poziom 15  
    No to temat troszke ruszam,

    korzystam oczywiscie z kawalkow gotowych kodów co by nie klepac od nowa.

    W zwiazku z tym iz czekam dopiero na plytki w ktorych bedzie i RTC i podtrzymanie zasilania bawie sie na tym co mam , czyli atmega8 i zegar obsluguje na nim.

    Code:

    '8 MHz/256/31250 = 1 s

    $regfile = "m8def.dat"
    $crystal = 8000000
    Config Pinb.3 = Input
    Config Pinb.4 = Input
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Portd.5 , Db5 = Portd.6 , Db6 = Portd.7 , Db7 = Portd.4 , E = Portd.3 , Rs = Portd.2

    Config Watchdog = 256
    Stop Watchdog

    Config Timer1 = Timer , Prescale = 256

    Declare Sub Wysw_czas                                       'procedura wyświetlająca czas na LCD w formacie gg:mm:ss
    Declare Sub Stan_guzik1                                     'procedura sprawdzania stanu guzikow'
    Declare Sub Stan_guzik2                                     'procedura sprawdzania stanu guzikow'
    Declare Sub Stan_guzik3                                     'procedura sprawdzania stanu guzikow'
    Declare Sub Menu
    On Timer1 Odmierz_1s                                        'przerwanie od przepełnienia
                                                                 'Timer1 o etykiecie Odmierz_1s
    Dim Sekundy As Byte                                         'zmienna zliczająca sekundy
    Dim Minuty As Byte                                          'zmienna zliczająca minuty
    Dim Godziny As Byte                                         'zmienna zliczająca godziny
    Dim Nowa_w As Bit                                           'flaga zezwolenia aktualizacji czasu na LCD
    Dim Menu As Bit                                             ' wejscie do menu
    Dim Wart_bcd As Byte                                        'zmienna pomocnicza, w której jest zapisywana wartość BCD czasu
    Dim St_watch As Bit

    S1 Alias Pinb.3                                             'alias S1
    S2 Alias Pinb.4                                             'alias S2
    S3 Alias Pinb.5                                             'alias S3

    Enable Interrupts                                           ' odblokowanie przerwan
    Enable Timer1                                               'odblokowanie przerwania od przepełnienia Timer1
    Counter1 = 34286                                            'wartość początkowa wpisywana do Timer1 (65536 - 31250 = 34286)

    Set Nowa_w                                                  'zezwolenie na wyświetlenie aktualnego czasu
    Set Portb.3                                                 'dołączenie do linii PB1 rezystora podciągającego
    Set Portb.4                                                 ' j.w.
    Set Portb.5                                                 ' j.w.

    Cls
    Lcd "STEROWNIK"
    Lowerline
    Lcd "test"
    Cursor Off
    Wait 2.5

    Do
    If St_watch = 0 Then                                        'watchdog
       Reset Watchdog
    End If
     Cursor Off
     If Menu = 1 Then
       Call Menu
     Else
       Call Wysw_czas                                           'wwyświetlenie czasu
       Call Stan_guzik1                                         ' guzik S1
       Call Stan_guzik2                                         ' guzik S2
       Call Stan_guzik3                                         ' guzik S3
       Waitms 25
     End If
    Loop
    End                                                         'koniec programu


    Sub Wysw_czas                                               'procedura wyświetlająca czas
     If Nowa_w = 1 Then
      Cls                                                       'czyszczenie LCD
      Wart_bcd = Makebcd(godziny)                               'Godzina BCD
      Lcd Bcd(wart_bcd) ; ":"
      Wart_bcd = Makebcd(minuty)                                ' Minuta BCD
      Lcd Bcd(wart_bcd) ; ":"                                   'wyświetlenie
      Wart_bcd = Makebcd(sekundy)                               ' Sekunda BCD
      Lcd Bcd(wart_bcd) ;                                       'wyświetlenie
      Reset Nowa_w                                              'zerowanie flagi
     End If
    End Sub

    Sub Stan_guzik1
       If S1 = 0 Then
          Waitms 25                                             'eliminacja drgań styków
          If S1 = 0 Then
             Incr Minuty
             Sekundy = 0
             If Minuty = 60 Then
                Minuty = 0
             End If
             Set Nowa_w
             Call Wysw_czas
             Waitms 200
          End If
       End If
    End Sub
    Sub Stan_guzik2
       If S2 = 0 Then
          Waitms 25
          If S2 = 0 Then
             Incr Godziny
             Sekundy = 0
             If Godziny = 24 Then
                Godziny = 0
             End If
             Set Nowa_w
             Call Wysw_czas
             Waitms 200
          End If
       End If
    End Sub
    Sub Stan_guzik3
       If S3 = 0 Then
          Waitms 25
          If S3 = 0 Then
             Menu = 1
             Set Nowa_w
          End If
       End If
    End Sub

    Odmierz_1s:
     Counter1 = Counter1 + 34286
     Incr Sekundy
     Set Nowa_w
     If Sekundy = 60 Then
      Sekundy = 0
      Incr Minuty
      If Minuty = 60 Then
       Minuty = 0
       Incr Godziny
       If Godziny = 24 Then
        Godziny = 0
       End If
      End If
     End If
    Return

    Sub Menu
       If Nowa_w = 1 Then
          Cls
          Lcd "MENU:"
          Reset Nowa_w
       End If
       If S1 = 0 Then
          Waitms 25
          If S1 = 0 Then
             Menu = 0
          End If
       End If
    End Sub


    I teraz pytania, czysprawdzanie guzikow mozna ( i jak ) sprawdzac jedna funkja przekazujac jej np. nazwe guzika? Kombinowalem ale nie udawalo sie :cry:

    a teraz zalaczanie przekaznikow.

    w pteli glownej bede wchodzil do funkcji porownujacej aktualny czas do czasu zapisanego jako "zalacz przekaznik1"
    jezeli aktualny czas = czas ustalony do zalaczenia bede uruchamial drugi timer, zalacze przekaznik, odlicze zadana dlugosc zalaczenia np. 10sek i wylacze przekaznik.

    Pytania:
    1. Jaki macie pomysl aby to zrealizowac jezeli mamy np. 3 lub wiecej przekaznikow?
    2. jak to zaplanowac skoro kazdy przekaznik bedzie mial w przyszlosci mozliwosc odpalenia sie 2 razy dziennie .... ?

    Czy odpalic timer2 aby liczyl w kolko i zapamietywac timer2 liczbe jako start i do tej wartosci dodawac np. 10 sek?

    No i co zrobic aby kod byl dynamiczny, czyli uzalezniony od zaprogramowanych startów np.
    przekaznik1 - 2 razy dziennie, 10sek, 5sek
    przekaznik2 - 2 razy dziennie, 6sek, 2. 10sek
    przekaznik3 - 2 razy dziennie, 7sek, 5sek

    Nastawy oczywiscie bede zapisywal do eepromu...
  • Poziom 13  
    Ad 1 - poszukaj na temat klawiatury matrycowej - powinno Ci wystarczyć.
    Ad 2 - Jeżeli zrobisz tak jak ja, że włączenie i wyłączenie to 2 osobne zdarzenia to pozbędziesz się problemu przy większej ilości przekaźników.
    pętla szukania zdarzeń:
    Code:


    //FALSE = 0, TRUE = 1
    int rels = PORTX; //Nie PINX!!, odczytujesz poprzednio zapisana wartosc
    int akcja = 0; //0 - wylacz, 1 - wlacz przekaznik
    int przekaznik = 0;
    while (warunek)
    {
     if (zgadza sie czas zdarzenia)
      {
         akcja = (wyciagasz akcje ze zdarzenia)
         przekaznik = (wyciagasz nr przekaznika ze zdarzenia)
         if (akcja == TRUE)
          {
             rels |= _BV(przekaznik); // rels = rels + 2^przekaznik - nie wiem jak to zapisac w BASCOMie ;) - chodzi o wlaczenie konkretnego przekaznika

          }
          else
          {
             rels &= ~_BV(przekaznik); //wylaczam przekaznik pozostawiajac inne niezmienione - rels = rels and negacja (2^przekaznik)
          }
      }
    }

    PORTX = rels;



    W ten sposób wykorzystujesz tylko jeden timer i odpalasz takie szukanie co np. sekundę, tylko musisz uważać bo jeśli będziesz czytał bezpośrednio z eepromu to 1 sekunda to może być za mało na odczytanie dużej ilości danych. Kod powyżej jest tylko poglądowy, pisany na szybko, niestety nie znam Bascoma, żeby Ci to napisać w Basicu.
  • Poziom 15  
    Dave, dzieki za info.
    w drugim pytaniu jednak chodzilo mi nie o same zalaczanie co nie jest trudne... raczej o zaplanowanie poprawne przechowywania danych.

    Tak jak pisales czytanie eepromu w sek moze byc trudne, w zwiazku z tym na poczatku bede odczytywal dane z eepromu do zmiennych....

    I teraz moge miec taka opcje:
    przekaznik1 - 2 razy dziennie, 10sek, 5sek
    przekaznik2 - 2 razy dziennie, 6sek, 2. 10sek
    przekaznik3 - 2 razy dziennie, 7sek, 5sek

    co teoretycznie mozna zrobic na tablicy 2 wymiarowej

    Pomyslalem aby zrobic tak ze stworze tablice w ktorej przy starcie pobiore dane.

    Skoro mam np. 6 przekaznikow to wygenerowac 6 tablic

    W niej przechowywac linie:
    Tablica przekaznik1
    godzina zalaczenia | czas zalaczenia
    godzina zalaczenia | czas zalaczenia

    Tablica przekaznik2
    godzina zalaczenia | czas zalaczenia
    godzina zalaczenia | czas zalaczenia
    godzina zalaczenia | czas zalaczenia

    Tablica.....

    I wtedy w petli Do sprawdzac bede czy czas aktualny to ktorys z czasow w tablicach przekaznikow.

    Jesli "Tak" to zalacz dany przekaznik na ilosc sekund podanych w drugiej kolumnie wiersza tablicy.

    Tylko :
    1. Czy tak sie dla microkontrolerow :-)
    2. Wg. czego odmierzac czas.

    Pamietaj ze ja nie podaje czasu wylaczenia a raczej dlugosc zalaczenia, czasy beda dosc krotkie w interwale sekundowym.....

    No chyba ze zle rozumuje...
  • Poziom 13  
    Wbrew pozorom moja odpowiedź była dokładnie na Twoje pytanie :)
    Chodzi mi o to, że powinieneś zmienić swoje podejście do problemu, jeżeli jednak chcesz przy nim pozostać to powinieneś napisać sobie funkcje która będzie sprawdzać czy minął już czas działania przekaźnika.
    Oraz liczyć czas - mieć funkcję zegarka
    Np.
    Code:

    //zwroc 0 jesli juz skonczyl sie czas
    //przekazujesz czas zalczenia przekaznika i ile sekund ma dzialac.
    int TimeUp(int H,int M,int S, int time)
    {
       int result = 1;
       int GH = globalna_zmiennna_godziny;
       int GM = globalna_zmienna_minuty;
       int GS = globalna_zmienna_sekundy;
       S = S + time;
       if (S>59)
       {
           M = M + (S/60); //dodajemy liczbe minut - dzielenie calkowitoliczbowe
           S =  S%60; // znormalizuj liczbe sekund na przedzial 0..59 % -  reszta z dzielenia.
           if (M>59)
            {
                H = H + (M/60); //dodajemy liczbe godzin
                M = M%60; //j.w.
                if (H>23)
                {
                   H = H%24;//normalizacja
                }
            }
       }
       if ((GH == H) & (GM == M) & (GS == S))
       {
           result =  0; //nadszedl czas - to czy 0 to nadszedl czas czy nie to juz Twoja sprawa.
       }
       return result;   
    }


    Powyższy kod ma pewne wady, mianowicie nie obsługuje poprawnie długich opóźnień (pow. 24h), ale pisałeś, że bedziesz mial krótkie.

    I teraz możesz zrobić cos takiego:
    Code:


    ...
    //sprawdzanie co sekunde.
     if (TimeUp(zdarzenia[i].godzina,zdarzenia[i].minuta,zdarzenia[i].sekudna,zdarzenia[i].czas) == 0)
    {
      WYLACZ PRZEKAZNIK zdarzenia[i].przekaznik;

    }


    ...


    P.S. Jak z Twoją znajomością C?