Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Atmega 8 bascom - Zliczanie zmian stanu wyjścia

---trafopowielacz--- 03 Jul 2014 10:59 1668 7
  • #1
    ---trafopowielacz---
    Level 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:
    Code: basic4gl
    Log in, to see the code

    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:
    Code: basic4gl
    Log in, to see the code
  • Helpful post
    #2
    lukashb
    Level 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ć.
  • Helpful post
    #4
    piotrva
    VIP Meritorious for electroda.pl
    Pomyśl o tym, aby zapamiętywać stan poprzedni i inkrementować licznik jedynie w przypadku zmiany stanu.
  • Helpful post
    #5
    emarcus
    Level 38  
    ---trafopowielacz--- wrote:
    Witam. ................

    W czym problem? Przekaźnikiem steruję poprzez tranzystor BC547
    Przekaźniki załączają się poprzez warunek:
    Code: basic4gl
    Log in, to see the code


    Potraktuj stan przekaźnika jako jednobitową pamięc albo flagę i od tego uzależnisz incrementację licznika.
    Na przykład:
    Code: basic4gl
    Log in, to see the code

    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
  • #6
    ---trafopowielacz---
    Level 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 ;)
    Code: basic4gl
    Log in, to see the code


    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.
  • #7
    piotrva
    VIP Meritorious for electroda.pl
    Może być to spowodowane zakłóceniami na linii 1-wire podczas gdy w programie nie sprawdzasz poprawności sumy kontrolnej crc8 odczytanych danych.
  • Helpful post
    #8
    emarcus
    Level 38  
    ---trafopowielacz--- wrote:


    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."
    Quote:

    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:
    Code: basic4gl
    Log in, to see the code


    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