logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Jak zaimplementować my_delay, by nie blokowało czujników pływakowych?

KampoPampo 13 Gru 2018 20:51 447 5
  • #1 17625257
    KampoPampo
    Poziom 6  
    Witam. Posiadam taki problem z moim kodem. Funkcja my_delay odpowiadająca za wpisanie do delaya wartości ze zmiennej po uruchomieniu nie pozwala działać innym warunkom( program nie reaguje dopóki odliczanie w my_delay się nie zakończy). Teraz nie wiem czy jest to wina kodu klawiatury, która nie pozwala działać niczemu, chyba że naciśniemy przycisk lub tego, że lepiej będzie zastosować timer. Chciałbym otrzymac taki efekt że jak czujniki pływakowe (podłączone do pinów od PB0 do PB4) po ich zwolnieniu przerywały prace pompek (PA3 i PC2) i działanie my_delay, ale bez skutku.

    Oto kod w pętli głównej:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Kod klawiatury
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Funkcja my_delay()
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    funkcja check_result

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Bardzo bym prosił o jakiekolwiek wskazówki. Z góry dziękuję i pozdrawiam.
  • Pomocny post
    #2 17625325
    Konto nie istnieje
    Poziom 1  
  • Pomocny post
    #3 17625655
    BlueDraco
    Specjalista - Mikrokontrolery
    Jakakolwiek wskazówka:
    Zamiast błędnie skonstruowanej choinki if z koszmarnie długimi i źle zapisanymi warunkami użyj:
    switch (PINB & 0x1f)
    {
    case 0x1f:
    ...
    break;
    case 0x1e:
    ...
    break;
    itd.
    }
    a jeszcze lepiej zastąp to pętlą for, która zajmie 2 linijki:
    uint8_t npinb = ~PINB & 0x1f;
    for (poziom = 0; npinb; poziom++)
    npinb >>= 1;
  • #4 17626052
    LChucki
    Poziom 31  
    Delay po 500ms to jak cegła pod pedałem gazu w samochodzie albo na pedale hamulca a widzę delay 500, 400, 100 i o zgrozo 2000ms!
    Poczytaj o wielowątkowości.
  • #5 17652618
    KampoPampo
    Poziom 6  
    Poszedłem za wskazówkami i wykorzystałem zliczanie czasu poprzez Timer0 w mikrokontrolerze atmega32. Ogólnym założeniem projektu jest podlewanie zależne od czasu ustawionego z klawiatury 4x4. Lecz tutaj pojawia się moje pytanie: W jaki sposób mogę sterować timerem tak, żebym mógł wydłużać czas działania timera w zależności jaką liczbę zapiszę do zmiennej (chodzi głównie o podlewanie z zakresie czasu od 1 min do 60 min). Czy wtedy działanie timera przerwie stan w którym zbiornik jest pusty?

    kod timera
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Pozdrawiam i jeszcze Wesołych.
  • #6 17653328
    BlueDraco
    Specjalista - Mikrokontrolery
    "Po prostu" trzeba to zaprojektować zupełnie inaczej, niż próbujesz to zrobić. Zapisz cały algorytm działania urządzenia w postaci automatu realizowanego w przerwaniu timera zgłaszanym ze stałą częstotiwością np. 50 Hz. Pomyśl, jakie są możliwe stany urządzenia (np. sucho, podlewam, mokro, brak wody) i jakie są warunki zmian stanów (odczyt czujnika wilgotności, czas spędzony w danym stanie, opróżnienie zbiornika).
REKLAMA