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.

atmega8 - trzy czujniki trzy przekaźniki

enroline 23 Cze 2014 17:51 2040 18
  • #1 23 Cze 2014 17:51
    enroline
    Poziom 8  

    mój projekt wymaga tego by na reakcję na czujnik, zadziałał przekaźnik na kilka sekund a potem musi się wyłączyć.
    Mam łącznie trzy czujniki i zadziałanie każdego z czujników, uruchamia odpowiedni przypisany do niego przekaźnik.

    problem mam z tym, że czujniki mogą zadziałać po sobie w odstępach pół sekundowych jak i 20 sekundowych.

    Chciałem zrobić to komendami wait, lecz ta komenda opóźnia wszystko co jest po niej wpisane, nawet reakcję kolejnych przekaźników na czujniki...

    proszę o wskazówkę jak należy zaprojektować program by działały niezależne podprogramy, gdzie każdy obsługuje swoje porty i odmierza swój czas ?

    0 18
  • #2 23 Cze 2014 17:54
    BlueDraco
    Specjalista - Mikrokontrolery

    Zrób wszystko w przerwaniu timera zgłaszanym ze stałą częstotliwością, np. 100 Hz. Trzy zmienne posłużą do do odmierzania czasu dla każdego przekaźnika oddzielnie.

    0
  • #3 23 Cze 2014 17:56
    archanoid
    Poziom 25  

    Witam .Jakie czujniki ?.

    0
  • #4 23 Cze 2014 18:21
    enroline
    Poziom 8  

    Co do czujników to są różne czujniki analogowe ale wszystkie podłączone poprzez transoptory. Jeden czujnik typowo drzwiowy, drugi podczerwieni, trzeci czujka ruchu.
    Co do timerów. To rozumiem, że mają to być trzy podprogramy z timerami?

    komenta if.... then ... i odniesienie poniżej do kolejnego zbiegu zdarzeń?
    Nie jestem zbyt lotny w bascomie i prosze o bliższe informacje co do tych 100Hz.

    0
  • #5 23 Cze 2014 19:21
    BlueDraco
    Specjalista - Mikrokontrolery

    Nie wspominałeś o Bascomie. W C wyglądałoby to tak:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #6 24 Cze 2014 11:51
    enroline
    Poziom 8  

    Niestety ledwo w bascomie się orientuje a w C to niestety...

    A jak to w bascom'ie miałoby to wyglądać.
    Rozumiem, że ma to być oparte o Timer0?

    0
  • #7 24 Cze 2014 12:28
    atom1477
    Poziom 43  

    W BAASCOMie mogło by to wyglądać tak samo (tylko składnia języka inna).
    Nie "ma być" to oparte na Timer0. Może być, ale nie musi.
    Niestety nikt tutaj gotowca Ci raczej nie zrobi. Musisz zacząć czytaj jakieś kursy programowania i wtedy coś pomożemy na pewno.

    0
  • #8 24 Cze 2014 16:53
    enroline
    Poziom 8  

    Bascom'a staram się uczyć, jednak nie potrafie ogarnąć kwestii timerów. Czytam książkę jakies teksty w necie ale dotyczą one innych przypadków i nie potrafie tego wykorzystać. Kwestia timerów wszędzie jest dla mnie jakoś nielogicznie wytłumaczona i więcej mam pytan niż odpowiedzi..


    Bardziej mi zależało na przykładzie takim jaki dostałem w C tyle, że w bascomie.
    NIe oczekuje gotowca tylko przykładu gdzie jest wytłumaczony taki chyba prosty przypadek jak u mnie.

    0
  • #9 24 Cze 2014 17:19
    archanoid
    Poziom 25  

    Witam. ATMega 8 to raczej przerost formy nad treścią . Do tego wystarczy i to na wyrost starczy ATTiny2313 albo jeszcze mniejszy . Potrzebujesz 3 wejścia i 3 wyjścia czyli nawet jakiś w obudowie dip 8 wystarczy .

    0
  • #10 24 Cze 2014 18:08
    BlueDraco
    Specjalista - Mikrokontrolery

    1. Skonfiguruj porty wyjściowe do przekaźników.
    2. Zaprogramuj dowolny timer na zgłaszanie przerwań ze stałą częstotliwością rzędu kilkadziesiąt..100 Hz.

    Na tym kończy się program główny, a jak to się robi - znajdziesz w setkach miejsc w sieci.

    3. W procedurze obsługi przerwania zrób 3 razy to, co pokazałem wyżej. Chyba nietrudno to zrozumieć i przepisać na dowolny język programowania.

    0
  • #11 24 Cze 2014 19:31
    archanoid
    Poziom 25  

    Witam . Jeśli nie jesteś w stanie zrobić tego na procku to zrób to na 3 NE555 . Rozwiązanie także jest proste .

    0
  • #12 27 Cze 2014 00:20
    emarcus
    Poziom 34  

    enroline napisał:


    Bardziej mi zależało na przykładzie takim jaki dostałem w C tyle, że w bascomie.
    NIe oczekuje gotowca tylko przykładu gdzie jest wytłumaczony taki chyba prosty przypadek jak u mnie.


    No to studjuj....
    Masz tu jeden z wielu 'nie-gotowy' przykad na dwa sensory...

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    e marcus

    0
  • #13 07 Lip 2014 13:47
    mavi
    Poziom 19  

    Wracam do tematu bo oporni mi idzie.
    Stworzyłem coś co nie działa... NIe wiem czego brakuje i czy dobry jest zamysł..
    proszę o konstruktywne uwagi co do treści programu.

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    0
  • #14 07 Lip 2014 15:07
    atom1477
    Poziom 43  

    O konstruktywne ciężko bo to jest bez sensu :D
    Mieszasz różne instrukcje blokowe. Boki muszą być jeden w drugim. Nie mogą się przeplatać.
    Np.

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    A Ty masz tak:
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    Tak nie może być.
    Albo:
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    albo
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Kolejna rzecz to:
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    Co to jest?
    Takie coś nie ma racji bytu.
    Żeby to miało jakikolwiek sens to musiało by być:
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    albo
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    Oczywiście przy założeniu że Przerwanie to by był podprogram a nie faktyczne przerwanie.
    Przy faktycznym przerwaniu jakiekolwiek wywoływanie go nie ma sensu. Ono ma się samo wywoływać (w znaczeniu że nie wywołujemy go programowo).

    0
  • #15 08 Lip 2014 00:01
    enroline
    Poziom 8  

    Przerwanie to miało być odliczenie czasu.

    By uprościć program na potrzeby forum chciałem by każdy ze spełnionych warunków
    uruchomił dany przekaźnik o ten sam ustalony w 'Przerwaniu' czas.


    Chodzi mi tylko o to by na zadziałanie czujników, włączyły się odpowiednie przekaźniki na określony czas.
    Faktycznie zrobiłem mase błędów ale niestety metodą prób i błędów widze muszę dojść do tego jak zrobić program z pozoru o banalnej funkcji...

    poniżej zmodyfikowałem program ale przekaźniki nawet nie drgną na zadziałanie czujników.

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    0
  • #16 08 Lip 2014 00:13
    atom1477
    Poziom 43  

    Ale Goto ani GOSUB nie możesz tam dać.
    To jeszcze raz dlaczego.
    Samo Gosub można dać, ale nie tutaj akurat. Bo je się daje do normalnego podprogramu a nie do przerwania.
    Do przerwania się nie skacze (Goto) ani nie wywołuje go (Gosub). Przerwanie ma się wywoływać samo.
    W BASCOMie o tym czy coś jest podprogramem czy przerwaniem decyduje deklaracja tego na początku programu.
    Ty napisałeś:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    i tym sposobem sprawiłeś że to będzie przerwanie.
    Dlatego nie możesz używać ani Goto ani Gosub.
    Co innego gdybyś miał np. podprogram:
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    Wtedy to jest podprogram i mógł byś napisać np:
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    Natomiast Goto to jeszcze inna sprawa. Samo Goto to też można by użyć ale tylko w miejscach które nie kończą się za pomocą Return (czyli na pewno nie w przykładzie powyżej).
    Generalnie Goto jest niewygodne w użyciu albo zaciemnia kod (choć są wyjątki). Więc o Goto raczej zapomnij.
    Natomiast o Gosub i przerwaniach to musisz poczytać. I to ostro.
    Bo widzę że brak Ci najelementarniejszej wiedzy.
    Na przykład to Twoje cudo z IFem i skakaniem do przerwania to wygląda na pomyłkę (literówkę) albo przeróbkę programu zupełnie bez zrozumienia jak on działa.
    Aby tylko coś skleić i pokazać na forum (bo może ktoś poprawi).
    To pewnie miało być:
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    Czyli tam ma być Else a nie żadne Goto.
    W związku z tym mimo że przerwania są podstawą programowania (aby dało sie napisać program nie używać np. funkcji Delay) to jednak musisz zacząć o jeszcze większych podstaw. Czyli od instrukcji warunkowych If.
    Bez tego nie będziemy Ci w stanie pomóc. Bo żadnego nawet najprostszego programu nie zrozumiesz. I tylko gotowiec by Cię ratował a raczej nie o to Ci chyba chodzi.

    0
  • #17 08 Lip 2014 00:25
    enroline
    Poziom 8  

    Dziekuje za wytlumaczenie. Rozjaśnia mi się już bo widzę przykłady.
    Ktoś wcześniej napisał mi, że powinienem oprzeć program na przerwaniach i tu moje pytanie o deklaracje odnośnie przerwania:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    W przypadku gdy zadeklarowałem powyższą komendą, że będzie to przerwanie, to jak potem kontunuować program z komendą warunkową " If " ?
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    0
  • #18 08 Lip 2014 06:53
    emarcus
    Poziom 34  

    enroline napisał:
    Dziekuje za wytlumaczenie. Rozjaśnia mi się już bo widzę przykłady.


    Nie wygląda abyś rozumiał w pełni koncept przerwań.
    Poprzedni mój post zawierał cały, gotowy, pracujący program dla dwóch czujników (z pełnymi objaśnieniami), oparty o timer1, skonfigurowany do pracy w trybie CTC.
    Jeżeli tamtego nie zrozumiałeś, to naturalnie i tu masz poważne problemy.
    Oczywiście timer0 w Mega8 jast nabardziej prymitywny timer jaki spotkasz w AVR; więc nie możesz tego kopiowac
    Ma on tylko jeden tryb - 'Normal'. Potrafi liczyc tylko w górę i tylko do pełnego przepełnienia (można mu tylko przesunąc poczatek liczenia od dowolnej wartości).

    Wracając do tematu: co to jest przerwanie???
    - jest to zdarzenie nie planowane (dlatego nie może byc przewidziany skok do niego z programu głównego [Do...Loop]; lecz jednak spodziewane ze może wystąpic - dlatego potrzebna jest określona procedura jego wykonania zawarta w podprogramie zwanym subrutyną lub etykietą (label), które niefortunnie ludzie nazywają je tak samo jak i jego funkcja. Co prawda nazwa ta jest dowolna i Bascom nie interpretuje jezyka polskiego, więc to nie jest błędem.
    Kazde przerwanie (może ich byc kilka z różnych powodów) ma swoje źródło w jakimś zdarzeniu. W tym wypadku takim zdarzeniem jest przepełnienie Licznika/Timera0 (256 tyknięc) co w przeliczeniu na czas rzeczywisty jest około 8 ms. Tylko przerwanie Timer0 (OVF0) wywołuje tą procedurę(!!!)
    Owszem w procedurze tego przerwania (nawet poprawnie) incrementujesz zmienną 'Licz' do osiągnięcia 1 sec, ale poza tym nigdzie tego nie wykorzystujesz.
    Jeżeli na potrzeby programu będą wymagane inne interwały czasu to musisz wprowadzic dodatkowe zmienne do których będziesz zliczał czas i w odpowiednich momentach te wartości wykorzystywał lub je zerował.
    spróbuj uzupełnic ten przykład:
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    e marcus

    0
  • #19 09 Lip 2014 01:15
    mavi
    Poziom 19  

    Wytłumaczone jak krowie na granicy ;)
    Mam kurcze książke do nauki Bascoma ale tam jest to napisane nieprzyswajalnym językiem bez podania przykładu.

    Jeszcze nie zdażyłem przysiąść do zastosowania teorii w praktyce ale jestem optymistą i z góry Podziekowania dla atom'a1477 i emarcus'a

    0