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

[AT90S2313][CodeVisionAVR] niby banalne a kłopot ...

insectteam 09 Sty 2012 18:47 732 4
REKLAMA
  • #1 10372991
    insectteam
    Poziom 11  
    Witam !

    Jako, że nie jestem jeszcze "orłem" w pisaniu softu w C na avr'y mam do Was pytanie i prośbę za razem...

    Napisałem sofcik który załącza silnik mieszadła do pieca w momencie gdy temperatura spada poniżej zadanego progu, teraz potrzebuję by wyłączyć ten silnik gdy temp. wzrośnie lub gdy minie określony czas. Ponieważ całość jest banalnie prostym programem bez wodotrysków chciałem do tego użyć pętli while i w jej warunkach sprawdzać czy miną określony czas bądź czujnik górnej temp. zadzałał

    Napisałem to tak :


    ...

    While ( !(PIND.1==1)||czas==360)
    { czas++;
    delay_ms(250); }

    ... dalsza część programu wyłączająca silnik ...

    Gdzie PIND.1 jest to wejście czujnika temp który normalnie daje 0, gdy się włączy daje sygnał 1 przez 3sec. , natomiast czas to zmienna która ma się zwiększać o jednostkę co 250ms co daje 90s czasu . W związku z tym, że czujnik daje sygnał dość długo nie potrzebuję tu przerawań - wystarczy że raz na 250ms pętla sprawdzi warunek czy nie został włączony ...

    Niestey nie działa mi to wcale - przypuszczam że wina leży po stronie mojej "niewiedzy" co do składni warunków w tej pętli ...

    Pomóżcie proszę ...
  • REKLAMA
  • Pomocny post
    #2 10373217
    rad231276
    Poziom 12  
    Ten fragment wyrwany z kontekstu o niczym nie świadczy mimo ze brakuje mi tam kilku nawiasów

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


    Problem może być np. w konfiguracji wejścia bądź wyjścia sterującego ewentualnie samym układzie elektronicznym np. brak pull-upów... Bez bliższych informacji na ten temat nie można analizować poważnie tego problemu... Możemy sobie tu wypisywać setki rozwiązań a i tak żadne może nie działać.... Więcej szczegółów proszę....
  • REKLAMA
  • #3 10373397
    Fredy
    Poziom 27  
    Zamiast tak:

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


    zrób tak:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #4 10373665
    insectteam
    Poziom 11  
    Kolego rad231276 ... co do konfiguracji wejść i pull-up'ów to jest dobrze - warunek dla samego czujnika działa jak należy - problemy zaczęły się gdy dorzuciłem warunek zliczania czasu. wpisałem tylko ten mały fragment, gdyż poza tym warunkiem reszta działa bez żadnego problemu ... Zaraz wpiszę Twój kod i zobaczę co i jak .

    Mam jeszcze wątpliwość co do kodu przesłanego przez Fredy'ego - wpisałeś tam operator "&&" - jeśli się nie mylę warunek if w tym wypadku będzie spełniony gdy obie części czyli PIND i czas będą spełnione jednocześnie, a ja potrzebuje spełnienie tylko jednego z nich ...

    Zaraz odpiszę jak poszło :) i póki co dziękuję za pomoc ...

    *****************************************************************
    SPRAWDZONE I DZIAŁA :)

    ... Koledze rad231276 dziękuję za pomoc - jak zwykle diabeł tkwi w szczegółach a w tym wypadku okazały się nimi nawiasy o których zapomniałem w niezwykle istotnym miejscu ...

    Raz jeszcze wielkie dzięki za pomoc i temat do zamknięcia ...
  • #5 10374025
    Fredy
    Poziom 27  
    insectteam napisał:

    Mam jeszcze wątpliwość co do kodu przesłanego przez Fredy'ego - wpisałeś tam operator "&&" - jeśli się nie mylę warunek if w tym wypadku będzie spełniony gdy obie części czyli PIND i czas będą spełnione jednocześnie, a ja potrzebuje spełnienie tylko jednego z nich ...


    Nie masz racji - włąsnie że jest odwrotnie. W tej konstrukcji spełnienie tylko jednego warunku zakończy tą pętlę.

    Pętla "While" to zupełnie coś innego niż "if".
    Tłumacząc ten kod na język potoczny wygląda to tak:

    Dopóki czas jest mniejszy niz 250 i PINd.0 jest zerem kręć się w pętli i testuj dalej.

    Myślę że właśnie ot oto Tobie chodziło.
REKLAMA