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

[ATmega32][avr-gcc] Multipleksowanie wyświetlacza LED

maniek0005 28 Lut 2014 22:10 2652 21
REKLAMA
  • #1 13356452
    maniek0005
    Poziom 9  
    Witam serdecznie mam mały kłopot z zatrzymaniem pętli licznika, używam do tego 2 styków
    Sw1 i sw2, czyli start stop jednak, gdy przyciskam styk odpowiadający za zatrzymanie pętli
    Ona po chwili jest uruchamiana ponownie

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

    Poprawiono tytuł na zgodny z regulaminem p. 3.1.15. oraz zasadami korzystania z działu mikrokontrolery.
    LordBlick
  • REKLAMA
  • #2 13356488
    BlueDraco
    Specjalista - Mikrokontrolery
    Zieeeeew.... Drgania styków, temat powraca co 3 dni...
    http://mikrokontrolery.blogspot.com/2011/02/o-drganiach-stykow-bez-bajek-przykad.html

    A teraz popatrz, co naprawdę robi Twoja funkcja - w uproszczonym zapisie:

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


    Wartość argumentu nie zmienia się przecież sama podczas wykonania funkcji.

    No i wytłumacz jeszcze jaki związek ma treść postu z jego tematem.
  • #3 13356556
    maniek0005
    Poziom 9  
    trochę się pospieszyłem to fakt, jestem na tym forum pierwszy raz, gdy styki są odłączone odliczanie jest chwilowo nieregularne
  • #4 13357110
    el2010tmp
    Poziom 25  
    maniek0005 napisał:
    #define KEY1_PIN !(PINB & (1<<PB0))
    #define KEY2_PIN !(PINB & (1<<PB1))

    Ponieważ użyłeś negacji logicznej [!] zamiast bitowej [~] zmienne KEY1_PIN,KEY2_PIN będą przyjmowały wartości 0 [0b00000000] lub 1 [0b00000001], dalej piszesz:
    DDRB &= ~(KEY1_PIN | KEY2_PIN);
    jest to w tym przypadku bez sensu ponieważ przypisanie powinno dotyczyć dwóch najmłodszych bitów a nie wyrażeń testujących ich stany. Definicje będą działać poprawnie
    ale nie w tym przypadku. Zamień przynajmniej na:
    DDRB &= ~(0b00000011);
  • #5 13358324
    maniek0005
    Poziom 9  
    Witam tak dokładnie miałeś racje el2010tmp :) teraz już będę wiedział :)
    zastanawiam się jak dopisać do tego programu taką funkcje : gdy sw1 i sw2 są załączone razem to załącz tylko sw2, będę wdzięczny za podsunięcie różnych sugestii :)
  • REKLAMA
  • #6 13367116
    el2010tmp
    Poziom 25  
    Chodzi Ci o priorytet sygnału STOP nad START?
    Np. tak:

    Dla START:

    if(klawisz_wcisniety( KEY1_PIN )&&(!klawisz_wcisniety( KEY2_PIN)))
    {...}

    Dla STOP:

    if(klawisz_wcisniety( KEY2_PIN ))
    {...}
  • #7 13368288
    maniek0005
    Poziom 9  
    tak dokładnie jak są wciśnięte KEY1 I KEY2 nadaj priorytet np:KEY1
    z tym że dodałem ten kawałek kodu i pętla mi znowu dziwnie pracuje, gdy uruchamiam KEY1 to stopuje na chwile i znowu się uruchamia, a jak uruchamiam KEY1 i KEY2 licznik liczy ale bardzo powoli
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • Pomocny post
    #8 13368403
    el2010tmp
    Poziom 25  
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Nie ma potrzeby niczego zatrzymywać. Key2_PIN ma priorytet nad KEY1_PIN ponieważ jest później sprawdzany. Jeśli koniecznie musisz wstrzymywać program do momentu puszczenia KEY2 to zrób to tak:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #9 13368664
    maniek0005
    Poziom 9  
    hej masz racje to już działa tylko że jak przyciskam i trzymam to KEY1 powoduje znaczne zwolnienie pracy licznika można to jakoś ominąć aby on liczył stabilnie gdy KEY1 jest wciśnięty cały czas ?
    ogólnie to jest ok bo jak są razem wciśnięte to pętla staje
  • #10 13368741
    el2010tmp
    Poziom 25  
    maniek0005 napisał:
    jak przyciskam i trzymam to KEY1 powoduje znaczne zwolnienie pracy licznika można to jakoś ominąć aby on liczył stabilnie gdy KEY1 jest wciśnięty cały czas ?

    Dzieje się tak za sprawą _delay_ms(80);
    w funkcji
    uint8_t klawisz_wcisniety(uint8_t klawisz)
    Aby to zlikwidować skorzystaj i innej metody eliminacji drgań styków a najlepiej umieść obsługę przycisków w przerwaniu.
  • #11 13370382
    Tomq
    Poziom 38  
    Cytat:
    Aby to zlikwidować skorzystaj i innej metody eliminacji drgań styków a najlepiej umieść obsługę przycisków w przerwaniu...




    ...timera, tu jest przystępnie wytłumaczone jak obchodzić się z timerami http://diycenter.acid19.linuxpl.com/readarticle.php?article_id=3

    Timery działają asynchronicznie w stosunku do głównej pętli programu, więc timer licząc czas potrzebny na przeczekanie drgań styków nie przeszkadza w pracy Twojego licznika.


    W praktyce czas potrzebny na eliminacje drgań styków może być o połowę mniejszy (max 30-40ms). Istnieją również inne metody eliminacji drgań styków, jak np. kilkukrotne sprawdzanie stanu przycisku po jego wciśnięciu, zapisywanie tego stanu i dopiero, gdy określona liczba ostatnich odczytów była stabilna uznanie, że klawisz został wciśnięty.
  • REKLAMA
  • #12 13374292
    maniek0005
    Poziom 9  
    Witam jeszcze mam małe pytanko jeśli chciałbym dokonać resetu tej pętli z opóźnieniem 500ms, gdy licznik zostanie zatrzymany.
  • #14 13374891
    maniek0005
    Poziom 9  
    wyzerowanie licznika
  • REKLAMA
  • #15 13375033
    el2010tmp
    Poziom 25  
    Jeżeli w programie występuje konieczność odmierzania czasu ATmega musi mieć swój "zegarek" na którym będzie ten czas odmierzał. Tym zegarkiem jest Timer, natomiast funkcje typu delay() wstrzymują tylko wykonywanie programu.
  • #16 13390825
    maniek0005
    Poziom 9  
    Witam serdecznie dziękuje za pomoc el2010tmp :) poradziłem sobie z tematem :)
    mam takie pytanie odnośnie tego licznika po zatrzymaniu odliczania chciałbym odczytać jego wartość która jest na nim wyświetlana w celu dalszej obróbki w programie
  • #17 13390976
    el2010tmp
    Poziom 25  
    maniek0005 napisał:
    po zatrzymaniu odliczania chciałbym odczytać jego wartość która jest na nim wyświetlana w celu dalszej obróbki w programie

    Wartość licznika masz w zmiennej licznik. Wystarczy że po zatrzymaniu przepiszesz tą wartość do innej zmiennej.
  • #18 13414012
    maniek0005
    Poziom 9  
    witam ponownie dzięki jeszcze raz za pomoc :) mam teraz taki temat dopisałem do tego kodu licznika coś takiego i działa wysyłam sobie przez rs232 napis "Test UART " z tym że transmisja działa ale klawisze już nie:(
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    całość
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #19 13414169
    el2010tmp
    Poziom 25  
    Masz dwie pętle while(1). Program wykonuje tylko pierwszą.
  • #20 13414212
    maniek0005
    Poziom 9  
    a jak można to przypuszczalnie napisać inaczej ?
    jak zamykam pierwszą pętle nawiasem na końcu to tylko licznik działa :(
  • #21 13414224
    el2010tmp
    Poziom 25  
    maniek0005 napisał:
    }


    while(1)
    {


    - to usuń.
  • #22 13414566
    maniek0005
    Poziom 9  
    jest ok :) tylko licznik masakrycznie zwolnił
    po usunięciu funkcji _delay_ms(500);z uart przyspieszył lecz nie reaguje na zmiany czasowe w pętli licznika _delay_ms(10);
REKLAMA