Elektroda.pl
Elektroda.pl
X

Wyszukiwarki naszych partnerów

Wyszukaj w ofercie 200 tys. produktów TME
Kategoria: Kamery IP / Alarmy / Automatyka Bram
Montersi
Proszę, dodaj wyjątek elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Dwie funkcje niezależnie jednocześnie w programie

@GUTEK@ 04 Mar 2012 20:10 5830 8
  • #1 04 Mar 2012 20:10
    @GUTEK@
    Poziom 30  

    Witam.

    Ostatnio zainteresowałem się programowaniem PICów 16f84a, ponieważ mam ich kilka sztuk, a potrzebowałem zrobić parę prostych urządzeń.
    Język C trochę znam i próbuje swoich sił w MPLAB + HI-TEC.

    Zastanawia mnie czy da się zrobić coś takiego.
    Dwie funkcje działające niezależnie w jednym programie.
    Dajmy na to potrzebuje zrobić sterowanie dwóch pomp, działających niezależnie.
    Czyli przykładowo przychodzi mi sygnał na RA0 układ podaje sygnał na RB0 przez X czasu oraz mierzy czas X1, jeśli po tym czasie na RA0 nadal jest sygnał wyłącza RB0 a włącza alarm na RB2, który dopiero mogę wyłączyć przez RA2.
    Druga pompa sygnał na RA1, włącza RB1 na czas Y, oraz mierzy czas Y1 po którym włącza alarm na RB2, który włączam RA2.

    Szukałem trochę, ale nie znalazłem czy jest jakiś sposób żeby to optymalnie napisać na funkcjach lub czymkolwiek, jednak nic takiego nie znalazłem.

    W prawdzie udało mi się to napisać takim sposobem że użyłem pętli nieskończonej w której po przez przełączanie wartości w kilku zmiennych za pomocą instrukcji if wykonuje mi to co potrzebuje. Jednak tym sposobem prosty niby program zajmuje mi prawie 50% pamięci układu.

  • #2 04 Mar 2012 20:18
    gaskoin
    Poziom 38  

    Skoro programy robią to samo, tylko dla innych wejść to możesz napisać tylko jedną funkcję dla której parametrem będzie np numer pompy. Wtedy program zajmie połowę z tego co masz teraz. Można się zainteresować FreeRTOSem żeby otrzymać multitasking, ale na potrzebę tylko dwóch pomp jest to zbędny wysiłek :)

  • #3 04 Mar 2012 20:23
    @GUTEK@
    Poziom 30  

    No dobrze, tylko jeśli dobrze to rozumiem, to jeśli włącze tą funkcję z parametrami dla pompy pierwszej to do czasu zakończenia funkcji - czas pracy pompy to przykładowo 5 minut więc tyle ta funkcja (licznik/opóźnienia w niej) będzie musiała działać, druga pompa nie zadziała mimo podania sygnału.

  • #4 04 Mar 2012 20:27
    gaskoin
    Poziom 38  

    A mógłbyś wkleić kod ? Byłoby mi trochę łatwiej zajarzyć o co chodzi niż snuć domysły

  • #5 04 Mar 2012 20:37
    tmf
    Moderator Mikrokontrolery Projektowanie

    @GUTEK@ napisał:
    No dobrze, tylko jeśli dobrze to rozumiem, to jeśli włącze tą funkcję z parametrami dla pompy pierwszej to do czasu zakończenia funkcji - czas pracy pompy to przykładowo 5 minut więc tyle ta funkcja (licznik/opóźnienia w niej) będzie musiała działać, druga pompa nie zadziała mimo podania sygnału.


    Czyli źle napisałeś program. Musisz problem podzielić na kilka, prostych etapów. W tym przypadku pierwszy problem to kiedy włączyć/wyłączyć pompę. W chwili podjęcia decyzji nie musisz przecież czekać parę minut. Po prostu ją włączasz/wyłączasz i kończysz funkcję. Wtedy jest ona wywoływana dla kolejnej pompy itd. Pomiędzy wywołaniami pompa stanu nie zmienia. Ponieważ wywołania są naprzemienne, a każde trwa mikrosekundy, efekt końcowy jest taki, jakbyś miał dwie niezależnie działające funkcje.

  • #6 04 Mar 2012 20:52
    94075
    Usunięty  
  • #7 04 Mar 2012 20:54
    @GUTEK@
    Poziom 30  

    Tak jak pisałem wyżej, C znam słabo i próbuje swoich sił.

    Pierwsza wersja tego co napisałem i zadziałało ok wygląda tak:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Biblioteki delay ściągnąłem ze strony Microchipa. Z tego jednak co przeglądałem je to tam nie ma opóźnień dla rezonatora 6MHz (taki mam na próby), przez co tak nietypowo DelayBigMs(38) odpowiada mi 100ms.
    Dodatkowo też musiałem przypisać stan RA0 i RA1 do zmiennych bo inaczej głupiało mi przy if-ach, jeśli miało sprawdzać kilka zmiennych.
    Na laptopie mam jeszcze wersję rozszerzoną z dodatkowym włączaniem ręcznym i dodatkowym alarmem - wspólnym (te tu są osobno i mają tylko informować której pompy dotyczy) dla jakiejś syreny.

  • #8 04 Mar 2012 21:32
    gaskoin
    Poziom 38  

    albertb napisał:
    gaskoin napisał:
    Można się zainteresować FreeRTOSem


    No, no na PIC16F84A ;-)

    Albert


    Nie doczytałem :)

    @GUTEK@ Zauważ, że poniższe kody, są takie same:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Spróbuj napisać funkcję, która wykonuje powyższy kod w zależności od parametru jakiegoś. Nie widzę tam opóźnień więc nie powinno mieć to znaczenia. Jak się nie uda to Ci napiszę mniej więcej jak to ma wyglądać.

    Poza tym widzę błędy typu:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    takie wyrażenie jest zawsze prawdziwe, operatorem porównania jest ==

  • #9 05 Mar 2012 16:40
    @GUTEK@
    Poziom 30  

    Ok, dzięki za podpowiedź, popróbuje i zobaczę co mi z tego wyjdzie.

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