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

Avr/Atmega/16 - Alarm i ustawienie w menu lub cos podobnego

kulamario 29 Sty 2014 15:51 2259 15
  • #1 29 Sty 2014 15:51
    kulamario
    Poziom 22  

    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
    Prosił bym bardziej doświadczonych kolegów o pomoc lub jakieś sugestie jak to ugryźć

    0 15
  • #2 29 Sty 2014 16:25
    ASMnauka
    Poziom 12  

    Witaj

    Nie musisz zaprzęgać Timera, jeśli Masz zegar PCF8583.
    Ja zrobiłbym to następująco:
    1. Zapis CZASU PRACY, oraz CZASU PRZERWY do pamięci EEPROM ATmegi
    2. Napisanie krótkiego podprogramu realizującego porównanie CZASU PRACY, oraz CZASU PRZERWY
    3. Gdy podprogram wykryje takie same wartości CZASÓW (zegara i nastawionych) wysyła np. impuls na wyznaczony pin.

    Pozdrawiam

    0
  • #3 29 Sty 2014 17:07
    kulamario
    Poziom 22  

    Mozesz jakis przykład dac podprogramu co by porównywał wartosci.
    Bo tam chyba trzeba przekonwertowac kod BCD na dziesiętny i za bardzo tego nie wiem jak

    0
  • #4 29 Sty 2014 17:57
    ASMnauka
    Poziom 12  

    Owszem, mogę, lecz w jakim języku ?
    Sądzę, że Piszesz w tym nieszczęśliwym Bascomie.
    Jeśli tak, to przepraszam, ale nie pamiętam już wszystkiego.
    Na pewno jest:
    - Zapisz do EEPROM
    - Odczytaj z EEPROM
    Więc jest to to początek naszego problemu.
    Poczekaj ...

    0
  • #5 29 Sty 2014 22:43
    kulamario
    Poziom 22  

    Tak bascom

    Dodano po 3 [godziny] 37 [minuty]:

    Witam
    to może ja zacznę od takiego początku

    Code:
    $regfile = "m16def.dat"
    
    $crystal = 16000000
    $hwstack = 32
    $swstack = 32
    $framesize = 32



    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.5
    Water = 1
    Config Pind.4 = Output                                      'Konfigruacja HPS
    Hps Alias Portd.6
    Hps = 1





    Dim Ustaw_water As Integer
    Dim Ustaw_hps As Integer




    Readeeprom Ustaw_water , 2
    Readeeprom Ustaw_hps , 3





    Cursor Off
    Cls


    Moderowany przez dondu:

    SYNTAX - Wklejając kod programu używaj proszę znacznika SYNTAX, a nie CODE. Składnia jest wtedy kolorowana i łatwo kod analizować, a dodatkowo posty są krótkie.

    0
  • #7 31 Sty 2014 09:36
    kulamario
    Poziom 22  

    To nie będzie takie proste napisanie takiej procedury jeśli nawet już uda mi się porównać zmienne z eprom z PCF to jak mam sobie przeliczyć bieżącą godzinę na minuty które upłynęły z nastawienia czasu z menu?

    0
  • #8 01 Lut 2014 18:19
    ASMnauka
    Poziom 12  

    Cytat:
    To nie będzie takie proste napisanie takiej procedury

    To jest proste, jeśli Zrozumiesz zasadę działania porównania.
    Nie wiem, czy istnieje jakikolwiek PCF, z którego można odczytać jednocześnie godzinę, minuty i sekundy.
    Moim zdaniem nie.
    Przede wszystkim nie Pisz programów na łapu-capu.
    Postaraj sie pisać modułowo.
    Innymi słowy Napisz procedurę odczytu czasu z PCF i zapisu do EEPROM, po czym sprawdz czy działa i następnie dodaj kolejne procedury.
    Więc:

    - Zadeklaruj zmienną globalną godzin i minut, lub skorzystaj z własnej procedury którą już posiadasz.
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    - Zadeklaruj Procedurę odczytu odczytu czasu z PCF dla potrzeb Włącz - Wyłącz
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    - W Procedurze Odczyt_czasu pod zmienne Godzina i Minuta "podeślij" odczyt godziny i minuty z PCF.
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    - Napisz instrukcję warunkową, która porównuje czas z PCF z czasem ustawionym przez użytkownika:
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Zaznaczam, piszę z pamięci, lecz Sprawdz, proszę.

    Cytat:
    ...jak mam sobie przeliczyć bieżącą godzinę na minuty które upłynęły z nastawienia czasu z menu?

    To już inna sprawa.
    Możesz do tego celu użyć
    - Timera ATmegi16
    - Odczytu minut z PCF
    I tu podobnie jak w poprzedniej procedurze Musisz porównać czas, jaki upłynął z czasem ustawionym przez użytkownika.
    Przykład:
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Nie Martw się:
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    Celowo to napisałem, Byś Miał nad czym myśleć.
    Pisząc szczerze, Postaraj się zapomnieć o Bascom-e, pisząc a ASM.
    Tak, te dwie króciutkie linijki są właśnie wstawkami ASM.
    Lecz jak Widzisz przed nimi jest wykrzyknik.
    On powinien tam być, ponieważ dziwny Bascom nie "przyjmuje do świadomości faktu, że programista może być mądrzejszy od niego".

    A swoją drogą dziwię się, że nie ma osoby, która jest na tyle odważna, by udzielić rady Bascomowiczom względem wstawek ASM.
    Owszem, jeśli pozwoli mi na to czas, uczynię to.

    Pozdrawiam

    0
  • #9 01 Lut 2014 20:53
    PiotrPitucha
    Poziom 33  

    Witam
    A czemu znowu Bascom dziwny?
    Wystarczy zaglądnąć do manuala aby zobaczyć jak się robi wstawki w assemblerze.

    $asm
    ......
    ......
    $end asm

    Pozdrawiam

    0
  • #10 02 Lut 2014 18:08
    kulamario
    Poziom 22  

    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

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    0
  • #11 02 Lut 2014 19:05
    ASMnauka
    Poziom 12  

    Cytat:
    Dopisałem obsługę timer1 do programu z przerwaniem co 1s

    Przepraszam bardzo, zapomniałem o bardzo istotnej rzeczy.
    Mianowicie o przerwaniu z PCF co sekundę.
    Można właśnie tak to rozwiązać
    Nóżka 7 PCF8583 wysyła sygnał dokładnie co sekundę.
    Więc podłączając ją do ATmegi pod przerwanie zewnętrzne Otrzymasz impuls co sekundę bez potrzeby stosowania Timera.
    Natomiast Timer użyj zamiast nieszczęśliwego Waitms
    Cytat:
    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

    No dobrze.
    Załóżmy, że Ustawiasz w menu działanie np. pompy na trzy minuty.
    Pompa ma dostarczyć wodę do jakiegoś pojemnika (np. basenu).
    Jeśli upłynie trzy minuty pompa musi się wyłączyć.
    Lecz Twój tok myślenia doprowadzi jedynie do uruchomienia i wyłączenia pompy z poziomu menu.
    Czyli, jeśli Ustawisz w menu Start i naciśniesz jakiś przycisk, woda znajdzie się w basenie.
    Jest to zdarzenie jednorazowe, a nie cykliczne.
    Cytat:
    włącz na 3minuty wyłącz na 5godzin

    Jeśli Włączysz pompę na trzy minuty, to po co ją wyłączać na pięć godzin ?
    Program musi zadbać, by po trzech minutach sama się wyłączyła.
    Cytat:
    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

    Skąd program ma wiedzieć, kiedy zaszło zdarzenie w menu przy włączaniu pompy z punktu widzenia czasu w pracy cyklicznej ?

    0
  • #12 02 Lut 2014 21:35
    kulamario
    Poziom 22  

    Zajmiemy sie ustawieniem zmiennej w menu i Timer1 co by zaliczał minuty i porównywał z wartością z menu?co do przerwan zewnętrznych z PCF to jest to nie mozliwe bo Int0 i Int1 jest wykorzystywane przez enkoder głównym projekcje sterownika

    0
  • #13 04 Lut 2014 17:13
    ASMnauka
    Poziom 12  

    Zajmiemy się na początek faktem, że ATmega16 posiada trzy przerwania zewnętrzne.
    Na pinach:
    D2 - INTO 0
    D3 - INTO 1
    B2 - INTO 2
    Więc Podłącz PCF pod pin B2.
    Natomiast Timer1 pozostaw do ciekawszych rozwiązań.
    Dokładniej do ominięcia Waitms.
    Podłącz PCF i się Odezwij, będziemy kontynuować.

    0
  • #14 06 Lut 2014 17:46
    kulamario
    Poziom 22  

    Przepraszam za przerwę.
    Pcf to ja mam podłączony cały czas na płytce testowej
    czyli dać z PCF pin 7 na Int2 w Atmega 16
    dać to bezpośrednio czy podciągnąć rezystorem do +5V?

    0
  • #15 08 Lut 2014 18:00
    ASMnauka
    Poziom 12  

    I ja witam po przerwie.
    Możesz podłączyć wyjście przerwania z PCF bezpośrednio do wejścia M16 Pin B2.
    Jeśli to Zrobisz to następnie:

    1. Konfuguracja i uaktywnienie przerwań, oraz przerwania zewnętrznego 2.

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    2. Deklaracja zmiennej Sekunda i zmiennej Minuta
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    W zmiennej Byte możemy umieścić jedynie maksymalną liczbę 255.
    Nie jest nam potrzebna większa, minuta ma 60 sekund, a godzina 60 minut.
    3. Podłącz pod którykolwiek wolny pin M16 diodę, lub buzer, np. B3
    Następnie skonfiguruj go jako wyjście, oraz ustaw na nim stan niski (0 logiczne).
    Nie wiem, czy Masz w swoim programie inwersję stanu logicznego, czyli czy Zamieniasz 1 na 0 i odwrotnie.
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    4. Pętla główna programu sprawdzająca działanie przerwanie z PCF.
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    Impuls na pinie B.3 co minutę.
    5. Przerwanie INT2 w M16
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Dopisz Swoje ustawienia ustawienia, skompiluj programik, po czym Wgraj go do M16 i Odpisz. czy działa. Zaznaczam, piszę z pamięci.
    Zapomniałem, że PCF 8583 posiada timer, budzik i własną pamięć RAM.
    Można w pamięci zapisać do 255 słów 8 bitowych.
    Więc czas wywołania włączenia np. pompy można zrealizować całkowicie sprzętowo.
    Pozdrawiam

    0
  • #16 20 Mar 2014 22:30
    kulamario
    Poziom 22  

    Witam
    Udało mi się zrobić ustawienie dodam ze sterowanie zmieniłem na enkoder
    Jak by ktoś mógł zerknąć na jedna sprawę wyjście z drugiego podprogramu.

    0