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

ATmega 16 i prosty program

jacekk55 12 Maj 2011 21:07 2718 20
REKLAMA
  • #1 9499535
    jacekk55
    Poziom 12  
    Witam
    Zacznę od tego, że uczę się programować Atmega. Napisałem programik (prosty dla początkujacego). Idea jest taka, że:
    - 3 swiche i 3 LED'y.
    Działanie programu:
    -wciskam 1 SW - zapala się 1 LED, 2 SW to 2 LED, 3 SW to 3 LED. Wciśnięty 1 SW pali się 1 LED ale wciśnięcie dodatkowo 2 SW spowoduje wygaszenie LED. I Tak w pzrypadku 2 i 3 oraz 1 i 3.
    Mój program działa ale przytrzymanie przycisku powoduje zauważalne mignięcie diody (działanie pętli for), chciałbym to wyeliminować oraz aby wciśnięcie dodatkowego przycisku działało jak przerwanie. Może ktoś mi podpowie jakie zmiany wprowadzić.
  • REKLAMA
  • #2 9499561
    tadzik85
    Poziom 38  
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    powinno być:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #3 9499596
    jacekk55
    Poziom 12  
    Uściśle problem.
    Wciskam SW1 zapala się LED 1. - mój program to realizuje.
    Puszczam SW1 i wciskam SW2, zapala się LED 2 - i to też działa.
    Tak samo jest z przyciskiem SW3 i LED 3 - i to też realizuje mój program
    Problem:
    1. Chciałbym usunąć mignięcie diody przy każdym zakończeniu pętli for, (gdy SW1 jest stale przyciśnięty)
    2. Chciałbym wprowdzić przerwanie, kiedy jest wciśniety SW1 i dodatkowo dociskam SW2 (równocześnie) następuje przerwanie wykonania programu i wygaszenie diody. (W tym przypadku 1).
  • REKLAMA
  • #4 9499634
    tadzik85
    Poziom 38  
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    to jest złe.
    a przerwanie? troszkę później się ty zajmij. przy przyciskach występują drgania styków. A to sprawi ci klopot
  • #5 9499668
    jacekk55
    Poziom 12  
    Ten fragment kodu działa, nie jest to przerwanie ale realizuję zmianę stanu jednak nie ma takiego priorytetu. Jest to kolejna część pętli. Ten fragment nie ma wpływu na część pierwszą problemu. Dlaczego następuje migniecie diody. Moze zastosowanie pętli while(1) to usunie?
  • #6 9499684
    drzasiek
    Specjalista CNC
    Zamiast:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #7 9499712
    jacekk55
    Poziom 12  
    Sprawdzę to praktycznie jutro. Dzisiaj tylko mogę przeanalizować. To rozwiazanie dotyczy 2 problemu a jak usunać mignięcie?
  • REKLAMA
  • #8 9499737
    drzasiek
    Specjalista CNC
    Mignięcie nie leży w pętli w kwestii wyboru pętli ale fragmentu kodu odpowiedzialnego za wygaszenie diod w przypadku wciśnięcia 2 przycisków (trzeba dokładnie przeglądnąć czemu robi się wyjątek i mimo nie naciśnięcia 2 przycisków dioda gaśnie)
    Stosujesz w warunku ifa | oraz & lecz logiczna alternatywa to jest || zaś logiczne and to jest &&. W tym może być problem.
  • #9 9499756
    jacekk55
    Poziom 12  
    Analizując kolejność wykonanych poleceń wynika, że:
    - sprawdzenie warunku czy SW_1 jest wciśniety - jest wciśnięty
    - ... następne warunki
    - koniec petli i wyzerowanie pytania i odpowiedzi - moment zgaszenia diody
    - Sw 1 nadal wduszony więc spełnienie warunku - zapalenie LED
  • #10 9499776
    drzasiek
    Specjalista CNC
    Doda sama nie zgaśnie na końcu pętli. Dioda zgaśnie jeśli pojawi się PORTA=0x00;
    lub np:
    PORTA&=~0x01
    W twoim przypadku jest PORTA=0x00 w instrukcji ifa sprawdzającego wciśniecie 2 przycisków. Więc skoro dioda gaśnie tzn, że if zwraca 1 a więc masz niepoprawnie zapisany warunek w if.
  • #11 9499798
    jacekk55
    Poziom 12  
    Ostatni warunek if wygasza diodę (PORTA=0x00) gdy są wciśniete dwa przyciski. Migniecie pojawia się gdy wciskam tylko jeden SW. Tzn. warunki if pierwszy, drugi i trzeci.
  • REKLAMA
  • #12 9499820
    drzasiek
    Specjalista CNC
    TAK, ALE POD WARUNKIEM, ŻE JEST DOBRZE NAPISANY. A nie jest, skoro gasi diodę mimo, że nie są wciśnięte 2 przyciski. DIODA SAMA NIE MIGNIE. Trzeba ustawić bit żeby zaświeciła i skasować, żeby zgasła. POPATRZ w swój kod i pomyśl logicznie; masz gdzieś w kodzie "gaszenie diody" oprócz tego tutaj?
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #13 9499839
    jacekk55
    Poziom 12  
    To jedyne miejsce. Sprawdzę ten fragment kodu jutro praktycznie i odpiszę. Ale teoretyzując, czy rozpoczęcie pętli nie zaczyna się od stanu, kiedy dioda nie świeci a dopiero rozpoczyna się sprawdzenie warunku? Te mignięcie trwa milisekundy.
  • #14 9499857
    drzasiek
    Specjalista CNC
    Jeśli ustawisz w programie raz
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    to żadne zakończenie pętli, żadna nowa funkcja tego nie odwołuje. Jedynie wykasowanie odpowiedniego bitu albo ustawienie całego portu na wartość mającą 0 w bicie odpowiadającym diodzie powoduje, że na tym wyprowadzeniu pojawi się stan niski. Sprawdź, przekonasz się.
    A mignięcie trwa milisekundy, bo wykonuje się instrukcja pętli sprawdzającej wciśnięcie 2 przycisków czyli:
    PORA=0x00;
    A następnie program skakuje na początek pętli for a tam jest co? sprawdzanie wciśnięcia przycisków i dlatego jeśli trzymasz przycisk to dioda zaraz się zapala.
  • #15 9499891
    jacekk55
    Poziom 12  
    Jutro to sprawdzę. Usunę ostatni warunek, kiedy to dioda ma się wygasić. Jutro odpowiem czy migniecia nie ma. pozostanie kwestia pzrerwania. To znaczy, żeby wciśniecie drugiego (równocześnie) przycisku powodowała pzrerwanie kodu i wykonanie np. migania diody a po zwolnieniu przycisku procesor powrócił do wykonywania kodu. W przypadku 3 SW, czas jest niezauważalny, ale zakładam, ze warunków if jest np. 100. Każdy jest sprawdzany kolejno a to zajmuje trochę czasu. Dzięki za zainteresowanie. Jutro napiszę o wnioskach.
  • #16 9499928
    drzasiek
    Specjalista CNC
    Z tym twoim przerwaniem, które poniekąd przerwaniem nie jest (poczytaj co to są przerwania :) ) będzie więcej kłopotu, niż ci się wydaje. Po pierwsze, jeśli będziesz trzymał wciśnięty 1 przycisk i wciśniesz drugi to program przechodząc przez ifa sprawdzającego wciśniecie 2 przycisków wykona jej instrukcję (bo i warunek będzie się zgadzał).
    Tak więc konstrukcja tego ifa musi się zmienić(musi być zadany czas między wciśnięciem jednego i drugiego przycisku i po jakim czasie program ma to traktować jako wciśnięcie naraz a po jakim jako wciśniecie jednego a potem drugiego. W realizacji jest to proste ale z tego co widzę wytłumaczenie ci jak to działa będzie trudniejsze :)
    Ale najpierw uporaj się z miganiem diody.
  • #17 9499956
    jacekk55
    Poziom 12  
    Program jest prosty. Jednak nie jest to cel sam w sobie, że roztrząsam ten problem. Jeżeli np. chciałby sterować napędem złożonych z dwóch silników: Lewy - Prawy, to każde takie "migniecie" na przestrzeni 1 metra spowoduje zauważalny skręt. Po drugie: jeżeli zamiast SW zastosuję np. fotoelementy, to oświetlenie z kilku stron spowoduje poważne zakłócenie. Pewnie są gotowe rozwiązania ale chce dojść do tego przez logikę.
  • #18 9500097
    janbernat
    Poziom 38  
    Im dalej w las tym więcej drzew.
    Jak zastosujesz fotoelementy to nie będzie już sytuacji zerojedynkowej.
    To są czujniki analogowe- czyli raczej ADC.
    I porównanie- który sygnał silniejszy.
    No i to "mignięcie" oznacza że oba silniki są włączone- albo wyłaczone.
    Koncepcja co to ma robić jest równie ważna jak pomysł jak to napisać.
  • #19 9500279
    Konto nie istnieje
    Konto nie istnieje  
  • #20 9500680
    drzasiek
    Specjalista CNC
    Tak tak, w tym akurat przypadku po jednym "&" ale po dwa "|" czyli "||" .
    Dzięki za zwrócenie uwagi
  • #21 9506045
    jacekk55
    Poziom 12  
    Wracam do tematu. Rzeczywiście migniecia LEDa nie wynikały z pętli. Drzasiek miał rację. Opóźnienie delay. Warunek operatora logicznego "lub" załatwia sprawę ale powstał kolejny problem w przypadku zapalenia:
    - 1 SW to 1 LED
    - 2 SW to 2 LED
    -1i2 SW to 1 LED
    Zapala mi się 1 potem gaśnie i zapala 2 a potem (SW3) zapala sie 1 i 2. Co jest logiczne, bo spełniaja się warunki 1 i 2. Przemysle ten kod.
    Próbowałem zastosować czujnik 38kHz. Spadek napięcia wynosi ok1,5-2V i dobrze wysterowuje wejscie portu.
REKLAMA