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

Atmega 8 bascom - Zliczanie zmian stanu wyjścia

---trafopowielacz--- 03 Lip 2014 10:59 1431 7
  • #1 03 Lip 2014 10:59
    ---trafopowielacz---
    Poziom 23  

    Witam. Nie wiem czy to jest możliwe, ale potrzebuje dodatkowej funkcji w termostacie, by zliczała ile razy dany port miał zmianę (Chodzi tu konkretnie o liczbę kliknięć przekaźnika)
    Zrealizowałem to poprzez:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    Zmienną zadeklarowałem jako integer
    Problem jest taki, że zlicza w następujący sposób:
    2,7,9,16,33,36,39
    (Na zmianę, on - off)

    W czym problem? Przekaźnikiem steruję poprzez tranzystor BC547
    Przekaźniki załączają się poprzez warunek:
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    0 7
  • Relpol
  • Pomocny post
    #2 03 Lip 2014 11:10
    lukashb
    Poziom 39  

    Pomysłu na teraz nie mam jak to rozwiązać, ale problem zapewne leży w tym, że kiedy przekaźnik = 1 to zmienna jest zwiększana z każdym przejściem pętli..stąd 2 potem 7 itp. Po prostu przez czas trwania stanu 1 na zmiennej przekaźnik, liczba się powiększa. Ciebie interesuje jednokrotne powiększenie. Czyli Przekaźnik = 1 i tylko raz incr zmienna. Trzeba by pomyśleć jak to zabezpieczyć.

    0
  • Relpol
  • #3 03 Lip 2014 11:12
    ---trafopowielacz---
    Poziom 23  

    Właśnie, a pętla jest ciągle powtarzana, gdyż odczytuje temperaturę z ds'a.
    Spróbuję coś pokombinować, bo już wiem w czym problem.

    0
  • Pomocny post
    #5 03 Lip 2014 12:43
    emarcus
    Poziom 35  

    ---trafopowielacz--- napisał:
    Witam. ................

    W czym problem? Przekaźnikiem steruję poprzez tranzystor BC547
    Przekaźniki załączają się poprzez warunek:
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Potraktuj stan przekaźnika jako jednobitową pamięc albo flagę i od tego uzależnisz incrementację licznika.
    Na przykład:
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    Pytanie w zasadzie było o ilośc zmian czyli wyłączenia też (!?). Możesz w podobny sposób doliczac wyłączenia przekaźnika, abo zwyczajnie podwoic uzyskany wynik.

    e marcus

    0
  • #6 04 Lip 2014 13:06
    ---trafopowielacz---
    Poziom 23  

    Zaraz wrzucę to do programu, ale czy to normalne że ds18b20 zaniża mi temeraturę o 2-2,5 stopnia? Kupiłem nowy za 10zł i to samo.

    Wrzucę cały program do wglądu. Wiem, że może być coś nie tak napisane, ale działa tak jak chciałem ;)

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Po uruchomieniu, wyświetla się temperatura, czas pracy przekaźnika (żarówki), i zużyta energia w kWh.
    W ustawieniach można ustawić:
    *temperaturę termostatu
    *histerezę
    *ustawić temperaturę jeśli jest nie dokładna jak w moim wypadku poprzez dodanie lub odjęcie zadanych wartości
    *moc żarówki

    Program zajmuje 50%. Może i jest źle napisany ale działa :D
    Pozdrawiam

    Dodano po 3 [minuty]:

    Edit:
    Jest jeszcze jeden problem. Co jakiś czas temperatura podskakuje o 10 stopni a czasami nawet do 200 podskoczyło co spowodowało zbędne załączenie przekaźnika. Z czym jest problem? Zasilam całość zasilaczem 12V. Pod procesor lm7805 wraz ze wszystkimi potrzebnymi kondensatorami na wejściu i wyjściu ceramiczne i elektrolityczne.

    0
  • Pomocny post
    #8 05 Lip 2014 07:39
    emarcus
    Poziom 35  

    ---trafopowielacz--- napisał:


    Program zajmuje 50%. Może i jest źle napisany ale działa..



    Ja bym to stwirdzenie troche skorygował;
    Program działa tak jak jest napisany!... bo
    - "Jest jeszcze jeden problem."
    Cytat:

    Co jakiś czas temperatura podskakuje o 10 stopni a czasami nawet do 200 podskoczyło co spowodowało zbędne załączenie przekaźnika. Z czym jest problem?


    Popatrz na pracę timera0, odmierzajacego 1sec. Wywołuje on przerwanie co ok 8 msec. Niby jest to dużo czasu podczas którego processor powraca do głównego programu (Do... Loop), w którym masz odczyt temperatury bez żadnej synchronizacji z przerwaniem, i jezeli podczas tego odczytu wystąpi przerwanie to oczywiście odczyt będzie błędny a także przeliczony wynik.
    Jak się tego pozbyc(?)..

    Potrzebujesz w zasadzie kompletnie przerobic cały program... (bez urazy!!!)
    Najpierw uporządkuj pomiar czasu; (nigdzie nie wykorzystujesz timera1, więc go zastosuj)
    Usuń tą karkołomną procedurę z Timerem0 i zastąp go timerem1, pracującym w trybie CTC i dającym interwały 1 sec. Na przykład tak:
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Moment odczytu temperatury z DS winien byc kontrolowany i zsynchronizowany z wystąpieniem przerwania. Wystarczy że będzie co 1 sec. Bezpośrednio po obsłudze przerwania timera1 (powiedzmy sygnalizowane flagą) dokonujesz obsługi sensora temperatury w ten sposób że na czas tylko odczytu temperatury (scratchpad), 'zawieszasz' interrupty i natychmiast po odczycie je uaktualniasz, na końcu sesji dajesz instrukcję conversji temperatury, przez co nie musisz tu dawac te minimum 750 ms na konversję T. W następnej sesji już będzie gotowa do odczytu.

    Usuń wszystkie Goto zastępując je gosub jako skok do etykiety (label) i Return.
    Także w obszarze subrytyny bardziej sensowne jest stosowanie pętli nieskoczonej Do/Loop zamiast goto "początek" itd...

    e marcus

    0
  Szukaj w 5mln produktów