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

poczatki z AVR - sterowanie DC

granacik 01 Maj 2011 16:34 1536 7
REKLAMA
  • #1 9458062
    granacik
    Poziom 22  
    Witam i proszę o wyrozumiałość gdyż dopiero zaczynam zabawę z prockami. Chciałbym podłączyć do procesora 2 silniczki DC jednak zanim to zrobię (L293d) podłączyłem 4 diody z opornikami 360 omów. W programie funkcja sprawdza czy klawisz został wciśnięty tak więc mam cztery "if" problem polega na tym że z dwoma pierwszymi wszystko działa jak należy. Jak wyłączę 2 pierwsze ify i chcę sprawdzić 3 i 4-ty to wszystko super chodzi jednak razem (4 ify) to już nie działa.
    Wklejam kod:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #2 9458303
    mirekk36
    Poziom 42  
    No ale żebyś chociaż napisał co ci nie działa albo jaki cel chciałeś osiągnąć tym programem ;)

    Tak tylko podejrzewam, że zakałapućkałeś się z tymi diodami po prostu. Wszystko działa i to poprawnie - zgodnie z napisanym programem.

    przecież w każdym warunku masz "else"

    spójrz więc sobie na to co się dzieje z diodą LED1 - w pierwszy warunku gdy wciśniesz klawisz to ona się niby zapala, ale już w czwartym IF'ie gdy klawisz nie jest wciśnięty to w tym samym obiegu pętli dioda LED1 jest od razu gaszona po ELSE. Zapala się więc ona tylko na hmm kilkadziesiąt mikrosekund. Musiałbyś wejść w MATRIX żeby zobaczyć że jednak się zapaliła , że świeciła i została zgaszona ;)

    Podejrzewam, że sam musisz dobrze przemyśleć swoje założenia do tego programu w ogóle a nie tylko sam kod - bo co to znaczy, że on "MA DZIAŁAĆ" albo że "NIE DZIAŁA" dla ciebie?
  • REKLAMA
  • #3 9458318
    Andrzej__S
    Poziom 28  
    Powiedzmy, że masz wciśnięty klawisz 1. W pierwszym warunku sprawdzasz czy jest wciśnięty i zapalasz diody 1 i 3. Po chwili jednak program dochodzi do sprawdzenia, czy jest wciśnięty klawisz 3, a ponieważ nie jest wciśnięty, to wykonują się instrukcje z else, które Ci gaszą diodę 3. Podobnie dzieje się z diodą 1 podczas sprawdzania klawisza 4.

    Jeśli dobrze rozumiem, co chcesz osiągnąć, to lepiej byłoby napisać funkcję, która odczytuje cały port z klawiszami, maskuje nieużywane bity i zwraca kombinację wciśniętych klawiszy:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    i później użyć switch case zamiast kilku if:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    W ten sposób nie tylko unikniesz sytuacji, jak powyżej (w przypadku użycia if), ale też będziesz mógł obsłużyć również kombinacje kilku klawiszy.

    EDIT:
    Zmodyfikowałem nieco funkcję read_kbrd(), bo poprzednio nie uwzględniłem negacji, czyli tego, że to stan niski oznacza wciśnięcie klawisza, a nie stan wysoki.
  • REKLAMA
  • #4 9459892
    granacik
    Poziom 22  
    Dziękuję za szybka odpowiedź. Wieczorkiem będę męczył temat, Andrzej__S dzięki za funkcję rozwiąże przy okazji problem jednoczesnego wciśnięcia klawiszy. Przymierzam się do podłączenia 2 silniczków DC a w późniejszym etapie dojdzie sterowania przez RS232 narazie brak czasu więc robię etapami. A w moim kodzie miałem else aby wygasić diody po zwolnieniu przycisku.
  • REKLAMA
  • #5 9459960
    mirekk36
    Poziom 42  
    granacik napisał:
    A w moim kodzie miałem else aby wygasić diody po zwolnieniu przycisku.


    No tak, tylko, że zobacz, że każdy fragment po else w twoim kodzie ZAWSZE się wykona gdy klawisze nie będą wciśnięte. I stąd te problemy były.
  • #6 9459977
    granacik
    Poziom 22  
    Ale w chwili gdy klawisz nie jest wciśnięty wszystkie diody mają być wyłaczone. Przynajmniej takie zamierzenie było.
  • Pomocny post
    #7 9459989
    Andrzej__S
    Poziom 28  
    No to po default: wygaś wszystkie diody / wyzeruj wyjścia. Instrukcje z sekcji default: są wykonywane wtedy, gdy żadna kombinacja z case SWITCHx_PIN: nie pasuje, czyli również wtedy, gdy żaden klawisz nie jest wciśnięty.
  • #8 9510013
    granacik
    Poziom 22  
    Temat zamykam dziękuję koledze Andrzej_S za pomoc.
REKLAMA