Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

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

Asmox 21 Cze 2014 17:03 1449 6
  • #1 21 Cze 2014 17:03
    Asmox
    Poziom 9  

    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: asm
    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"

    0 6
  • Pomocny post
    #2 21 Cze 2014 17:25
    McMonster
    Poziom 32  

    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.

    0
  • #3 21 Cze 2014 17:40
    Asmox
    Poziom 9  

    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?

    0
  • Pomocny post
    #4 21 Cze 2014 17:49
    Grzegorz77
    Poziom 25  

    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.

    0
  • #5 22 Cze 2014 16:13
    Asmox
    Poziom 9  

    Nie wiem jak to zrobić, mam małe doświadczenie w Assembly. Na razie wyobrażam sobie to mniej więcej tak:

    Kod: asm
    Zaloguj się, aby zobaczyć kod


    Czy to miałeś na myśli? Mógłbyś zamieścić przykład rozwiązania tego problemu?

    0
  • Pomocny post
    #6 22 Cze 2014 17:37
    Grzegorz77
    Poziom 25  

    Tak na szybko :

    Kod: asm
    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 ;)

    0
  • #7 01 Lip 2014 14:28
    Asmox
    Poziom 9  

    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: asm
    Zaloguj się, aby zobaczyć kod

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

    0