Elektroda.pl
Elektroda.pl
X

Wyszukiwarki naszych partnerów

Wyszukaj w ofercie 200 tys. produktów TME
Europejski lider sprzedaży techniki i elektroniki.
Proszę, dodaj wyjątek elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Atmega8 - [C]Czasowe sterowanie przekaźnikiem

cdominik 14 Lip 2013 22:20 4071 11
  • #1 14 Lip 2013 22:20
    cdominik
    Poziom 2  

    Witam!
    Jestem początkującym programistą i postanowiłem się zmierzyć z tematem sterowania czasowego do domowej suszarki do rąk.
    Jej działanie w skrócie chciałbym rozwiązać w następujący sposób: mikrokontroler Atmega 8 połączony z microswitchem oraz przekaźnikiem na 5v.Po nacisćnięciu i zwolnieniu microswitcha następuje załączenie przekaźnika na ok 20 sekund oraz uruchomienie silnika z grzałką poprzez przekaźnik.
    Tyle w teorii.W praktyce natomiast udało mi się zbudować cały układ oraz napisać kod w C,który załącza przekaźnik na czas wciśnięcia microswitcha
    Dlatego postanowiłem napisać tutaj i poprosić o jakieś sugestie i wskazówki jak ten problem programowo rozwiązać...
    Przeszukałem już spory kawałek internetu,jednakże nie trafiłem na nic konkretnego ani przydatnego...
    Czy mam użyć do tego przerwań,czy jest jakiś łatwiejszy sposób?
    Bardzo chętnię zobaczyłbym przykładowy kod...
    Pozdrawiam!

  • #2 15 Lip 2013 09:51
    Tom1988p
    Poziom 16  

    Podaj swój kod, a najłatwiej wpisać tyle "delajów" aby procek się kręcił przez 20s. po czym wyłączył przekaźnik (nie pamiętam ale jeden delay_ms(xx) to chyba maksymalnie 15s wyciągnie?).

    algorytm taki:
    - jeżeli przycisk wciśnięty to wykonaj:
    - uruchomienie przekaźnika
    - czekaj 20s
    - wyłącz przekaźnik

    i chyba tyle powinno wystarczyć w pętli.

  • Pomocny post
    #3 15 Lip 2013 10:32
    BlueDraco
    Specjalista - Mikrokontrolery

    Ale Kolega lubi sobie życie komplikować...

    W programie głównym programujemy dowolny timer na zgłaszanie przerwań z częstotliwością coś pomiędzy 30 i 300 Hz, a następnie usypiamy procesor w pustej pętli.

    Definiujemy stałą określającą czas włączenia w okresach timera:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    przerwanie timera:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Zamiast wlacz() i wylacz() piszemy odpowiednią instrukcję operującą na porcie.
    No i oczywiście da się to zrobić na dowolnym ATtiny, choćby na najtańszym ATtiny13 w 8-nóżkowej obudowie.

  • Pomocny post
    #4 15 Lip 2013 10:57
    Tom1988p
    Poziom 16  

    Oj kolego jest wyraźnie napisane:

    Cytat:
    Jestem początkującym programistą...
    wiec gotowca nie ma co dawać bo człowiek się nie uczy tylko bezmyślnie go używa. Podejrzewam że nie potrafiłby jeszcze zainicjować odpowiednio timer, skoro nie znalazł odpowiedzi na prosty problem.
    Tak poza tym z timerem tez procek się kreci bez celu oczekując na wciśniecie przycisku. Wiec po co utrudniać na start jak byle jaki delay wystarcza? Jestem przekonany i że ty sam kiedyś nie potrafiłeś użyć odpowiednio timera i jechałeś na delayach.

    Dodano po 12 [minuty]:

    Dadam moja idee:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    I ile mniej linijek?
    Proste funkcje potrzebują prostych rozwiazań.

  • #5 15 Lip 2013 11:15
    BlueDraco
    Specjalista - Mikrokontrolery

    Nie, procesor usypia się w pętli głównej, jak to wyżej napisałem.

    Wyobraź sobie, że nie "jechałem na delayach", bo gdzieś tam dawno temu usłyszałem, że taka technika programowania jest do bani i odbija się czkawką przy jakiejkolwiek próbie rozszerzenia funkcjonalności projektu.

    Zauważ, że kod, który pokazałem, wyłączy urządzenie w określonym czasie od zwolnienia przycisku, czyli jeśli chcesz, żeby pracowało ciągle - trzymasz wciśnięty przycisk albo wciskasz go co jakiś czas. Zrób to prościej na delay. Założę się, że kod z delay będzie w takim przypadku dłuższy od trywialnego rozwiązania z przerwaniem timera.

    Spróbuj dorzucić drugi przycisk do niezależnego sterowania drugim urządzeniem w wersji z delay - sukcesów życzę. W wersji z timerem dopisujesz w przerwaniu drugi identyczny kawałek kodu, a potem trzeci, czwarty itd - dopóki ci nóg procesora starczy do kolejnych guzików i grzałek.

    Zwłaszcza początkujących warto od razu uświadamiać, że kod z "delay" nie nadaje się do niczego poważnego, a tylko i wyłącznie do zabaw.

  • #6 15 Lip 2013 11:31
    Tom1988p
    Poziom 16  

    Wiem że "delaje" nie są dobre, sam w swoich urządzeniach to sporadycznie _delay_us używam, a tak to timer. Ale mimo wszystko początkujący nie zrozumie chociaż tej jednej linijki:

    Kod: c
    Zaloguj się, aby zobaczyć kod
    A to że nigdy nie używałeś to tez nie prawdę mówisz bo zanim znalazłeś tą wzmiankę o "delajach" to już musiałeś go raz użyć (powiedzmy do nauki).
    Ja pamiętam że pierwszy raz zobaczyłem zło "delaja" w odczycie ds18b20 kiedy to prawie sekundę nie można było nic innego robić na Procku...

    A tak to nie widzę momentu kiedy usypiasz proca (sleep...).

    Coraz częściej widzę że ludzie którzy mają wiedzę dobrze opanowaną to dla początkującego podają rozwiązania o szerokim zasobie informacji. A wiem że to trochę zniechęca "bo myślałem że jakoś prościej się da".

  • #7 15 Lip 2013 11:56
    excray
    Poziom 38  

    Może niech się autor wypowie bo widać że wytaczacie ciężkie działa na projekt zabicia muchy. Jak to ktoś kiedyś powiedział - nawet najpiękniej napisany nie działający program jest gorszy od byle jak napisanego ale działającego.

  • #8 15 Lip 2013 20:02
    cdominik
    Poziom 2  

    Drodzy forumowicze!
    Zostałem zasypany odpowiedziami z czego bardzo się cieszę,jednakże mój poziom zaawansowania jest na prawdę niezbyt wysoki bo uczę się tego języka od ok.5 miesięcy.
    Chciałem po prostu wiedzieć jak najłatwiej można uzyskać pożądany przeze mnie efekt i z tego co widzę to mamy tutaj dwa obozy za i przeciw używaniu "delayów"...Próbowałem stosować opóźnienie właśnie za pomocą _delay_ms() ale jakoś nie przynosiło mi to efektu...Cały problem leży w tym jak to napisać tak aby po naciśnięciu i puszczeniu microswitcha program wykonywał sie przez 20 s...

    Podaję mój banalny kod,który obecnie jest w procku...



    Kod: c
    Zaloguj się, aby zobaczyć kod


    Dziękuję wszystkim za pomoc i pozdrawiam

  • Pomocny post
    #9 15 Lip 2013 20:24
    Mat_91
    Poziom 25  

    Hi,

    Po pierwsze ustawiasz kierunek portu dla PC1, a gdzie ustawienie dla PC4? Nawet jeżeli po resecie jest ustawiony jako wejście to dobrym zwyczajem jest go ustawić tak jak należy.
    Po drugie w najprostszym wypadku to co chcesz zrobić:

    Kod: c
    Zaloguj się, aby zobaczyć kod

  • #10 15 Lip 2013 20:32
    BlueDraco
    Specjalista - Mikrokontrolery

    Dobrym zwyczajem jest poleganie na dokumentacji (o ile nie wiemy, że zawiera oczywiste błędy) oraz niewykonywanie zbędnych operacji. Prawidłowe zainicjowanie portu to w tym przypadku:

    PORTC = KEY; /* podciaganie dla przycisku */
    DDRC = RELAY; /* PC1 - wyjście, pozostałe - wejścia */

    Czyli prawie to samo, co Autor pokazał, tylko z poprawionym komentarzem i usuniętymi zbędnymi (ale w tym przypadku nieszkodliwymi) operacjami logicznymi.

    Tom1988p:
    Uważam, że nie należy uczyć początkujących technik, o których wiadomo, że są błędne i prowadzą do nikąd. Zdaję sobie sprawę, że są tacy, co uważają, że najpierw trzeba nauczyć człowieka błędnych rozwiązań, a następnie ewentualnie pokazać poprawne, i Ci chętnie miotają epitetami pod adresem osobników prezentujących poglądy zbliżone do moich - jakoś mało mnie to rusza.
    Oczywiście w tym przykładzie można użyć delay (to, co pokazałeś, zadziała) i oczywiście jest to ślepa uliczka, bo nic bardziej złożonego z tym delay nie da się zrobić dobrze ani łatwo - vide mój przykład ze sterowaniem kilkoma urządzeniami przy użyciu kilku przycisków.
    No i możesz się dziwić, ale naprawdę NIGDY nie używałem delay do odczekiwania czasu w jakiejkolwiek pętli głównej, kiedy jeszcze pisałem programy z pętlami głównymi. Po prostu miałem to szczęście, że najpierw nauczono mnie dobrze teorii, co ja też staram się robić.

    Dlatego powtórzę: przerwanie timera to podstawa dla każdego, nawet najprostszego programu dla mikrokontrolera (wyłącznik czasowy, miganie diodą, reakcja na przycisk/czujnik, wyświetlanie itd.).

  • #12 16 Lip 2013 22:53
    cdominik
    Poziom 2  

    Dziękuję wszystkim za rady,problem już rozwiązany.Dzięki Wam nabyłem troszkę wiedzy i utwierdziłem się w tym,że jeszcze sporo nauki języka C przede mną.Pozdrawiam!

 Szukaj w ofercie
Zamknij 
Wyszukaj w ofercie 200 tys. produktów TME