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

[ATMega8][Asembler] Przełączanie diody LED za pomocą przycisku

Asmox 21 Cze 2014 17:03 2595 6
REKLAMA
  • #1 13727865
    Asmox
    Poziom 9  
    Posty: 47
    Cześć! Mam do zrobienia następujące ćwiczenie:
    Cytat:
    Obsłuż układ z rysunku tak, by naciśnięcie przycisku S1 powodowało zaświecenie diody D1. Dioda D1 powinna od tej pory świecić, aż do powtórnego naciśnięcia przycisku S1 - wówczas dioda D1 powinna zgasnąć, a dioda D2 jednocześnie się zapalić.

    Oto schemat:

    [ATMega8][Asembler] Przełączanie diody LED za pomocą przycisku



    Edytuj

    Ponieważ na lekcji było pokazane jak zapalać i gasić diody za pomocą operacji XOR na rejestrach, robiąc zadanie też wykorzystałem tę funkcję. Mój kod wygląda następująco:
    Kod: text
    Zaloguj się, aby zobaczyć kod


    Program działa, ale mam zastrzeżenia do sposobu, w jaki przełączają się diody. Otóż nie zawsze się one przełączają po wciśnięciu przycisku (np bardzo szybko przełączają się z powrotem). Wiem że przy naciskaniu zdarzają się zwarcia, dlatego dodałem instrukcję opóźniającą Czekaj125ms, ale nie bardzo ona pomaga. Co powinienem zrobić?

    Zadanie pochodzi z książki P.Borkowskiego "AVR&ARM7. Programowanie mikrokontrolerów dla każdego"
  • REKLAMA
  • Pomocny post
    #2 13727921
    McMonster
    Poziom 32  
    Posty: 1942
    Pomógł: 182
    Ocena: 57
    Jeśli to jest dokładny schemat, to działa jedynie przypadkiem, a te diody tak podłączone w końcu spalą port lub same siebie.

    A sam problem może wynikać z drgania styków lub z tego, że się układ resetuje z braku filtrowania i ogólnie kiepskiego zasilania wynikającego z niepodłączenia wszystkich pinów.
  • REKLAMA
  • #3 13727957
    Asmox
    Poziom 9  
    Posty: 47
    Jeśli chodzi o diody, to masz absolutną rację. To ćwiczenie jest z książki, gdzie autor zawsze podłącza diody bez zabezpieczenia. U mnie są one połączone z rezystorem 470R. Powinienem je dołączyć na schemacie.
    W książce (w pierwszym poście dodałem tytuł) autor przedstawił 2 sposoby obsługi przycisku - jeden przez bezpośrednie połączenie z masą, a drugi przez takie kombinacje z plusem zasilania - nie rozumiem ich. Wiem tylko że linia PD7 ma być ustawiona jako wejściowa i w stan niski, aby PORTD7 mógł wykryć ewentualny przypływ ładunku. Mógłbyś wyjaśnić, czemu układ działa jedynie przypadkiem?
  • REKLAMA
  • Pomocny post
    #4 13727985
    Grzegorz77
    Poziom 25  
    Posty: 589
    Pomógł: 73
    Ocena: 301
    Masz problem z drganiem styków przełącznika. Możesz go wyeliminować programowo, np. porównaj dwa razy dokonany odczyt PD7 i uznaj że jest prawidłowy jeśli 2x się potwierdził (przy naciskaniu i zwolnieniu) możesz jeszcze dodać małą pętlę w której kilka razy sprawdzisz stan tego wejścia, a za prawidłowy uznasz dopiero gdy kilkukrotny odczyt da taki sam wynik.
  • REKLAMA
  • #5 13730934
    Asmox
    Poziom 9  
    Posty: 47
    Nie wiem jak to zrobić, mam małe doświadczenie w Assembly. Na razie wyobrażam sobie to mniej więcej tak:
    Kod: text
    Zaloguj się, aby zobaczyć kod


    Czy to miałeś na myśli? Mógłbyś zamieścić przykład rozwiązania tego problemu?
  • Pomocny post
    #6 13731225
    Grzegorz77
    Poziom 25  
    Posty: 589
    Pomógł: 73
    Ocena: 301
    Tak na szybko :
    Kod: text
    Zaloguj się, aby zobaczyć kod


    Analogicznie zrób zwolnienie przycisku
    [EDIT]
    Włąśnie zauważyłem że w twoim układzie jak jest wciśnięty to jest stan H na PIND,7, a ja zrobiłem odwrotnie, ale myślę że jak zrozumiesz zasadę to łatwo sobie poradzisz ;)
  • #7 13758357
    Asmox
    Poziom 9  
    Posty: 47
    Już wiem, co dokładnie zrobiłem źle. Błąd był bardzo subtelny :-)
    Zauważyłem, że w podprogramie(?) przelacz_diody nie ma instrukcji czekania po zmianie świecenia. Dlatego podczas wciskania przycisku nie była realizowana żadna procedura opóźniająca, mimo że ją zdefiniowałem. Wyglądało to tak:
    Początek pętli głównej -> Przycisk wciśnięty -> Zamień świecenie diód -> Wróć do pętli głównej -> Czekaj 125 ms
    A ponieważ przed czekaniem był skok z powrotem do pętli głównej, instrukcja Czekaj125ms nie była realizowana. Spojrzenie na kod po kilku dniach przerwy dało zaskakujące rezultaty :D
    Poprawiona wersja skoku przelacz_diody wygląda teraz tak:
    Kod: text
    Zaloguj się, aby zobaczyć kod

    Dziękuję wszystkim za zainteresowanie tematem. Zamykam go.

Podsumowanie tematu

✨ W dyskusji poruszono problem przełączania diod LED za pomocą przycisku w układzie opartym na mikrokontrolerze ATMega8. Użytkownik zastosował operację XOR do zmiany stanu diod, jednak napotkał problemy związane z drganiami styków przycisku oraz brakiem odpowiednich opóźnień w kodzie. Uczestnicy zasugerowali wprowadzenie programowego debouncingu, polegającego na wielokrotnym odczycie stanu przycisku, oraz dodanie opóźnienia po zmianie stanu diod, co poprawiło działanie układu. Użytkownik poprawił kod, aby uwzględnić te zmiany, co rozwiązało problem.
Wygenerowane przez model językowy.
REKLAMA