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.

Atmega 8 - Bascom - Zapalenie i zgaszenie diody

oko3g 20 Mar 2014 20:46 1737 9
  • #1 20 Mar 2014 20:46
    oko3g
    Poziom 17  

    Witam. Chcę zaprogramować procesor Atmega 8, tak aby po przyciśnięciu przycisku1 zapaliła się dioda i świeciła do momentu zwarcia przycisku2. (przyciski zwierane do masy)

    Napisałem taki program, lecz w efekcie dioda cały czas świeci. Nie wiem co jest źle, może ktoś zauważy jakiś błąd:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Pozdrawiam i proszę o odpowiedź.

    0 9
  • #2 20 Mar 2014 22:10
    BlueDraco
    Specjalista - Mikrokontrolery

    Stawiam na brak podciągania wejść przycisków.

    0
  • #3 20 Mar 2014 22:28
    oko3g
    Poziom 17  

    Pociąganie realizowane jest poleceniem "Set" - ósma i dziewiąta linijka. Może ktoś mógłby wypróbować ten program na swoim procesorze? Ciekawe czy Wy też tak byście mieli.

    0
  • #4 20 Mar 2014 23:33
    Press
    Poziom 22  

    Po pierwsze kolega BlueDraco słusznie przypomina Ci o podciągach do plusa.
    Port B masz ustawiony jako INPUT.
    Po drugie Przycisk1 i Przycisk2 to aliasy Pinb.0 i Pinb.1
    A więc Pisząc Set Przycisk1 sterujesz rejestrem Pinb.0
    Poczytaj czym różnią sie i do czego służą rejestry Pinb.0 i Portb.0

    0
  • Pomocny post
    #5 21 Mar 2014 05:36
    emarcus
    Poziom 34  

    oko3g napisał:
    Pociąganie realizowane jest poleceniem "Set" - ósma i dziewiąta linijka.


    To nie jest podciąganie(!)
    Jest to próba wpisania wartości do rejestru, który z natury jest przeznaczony tylko do odczytu. Nie ma możliwości zmiany stanu rejestru "PIN.x" z poziomu programu.
    Stan PIN.x możesz zmienić tylko fizycznie z zewnątrz poprzez podanie tam napięcia o odpowiednim poziomie logicznym, reprezentującym stan niski lub wysoki w odniesieniu do napięcia zasilania.
    Podciąganie wejść realizuje się poprzez załączenie napięcia zasilania przez wewn rezystory do analogicznych portów (nie pinów).
    Zatem, jezeli twoja konfiguracja określa PINB.0 jako input, to podciąganie tego wejścia będzie jednak:
    Set PORTB.0
    albo równoznacznie
    PORTB.0 = 1

    Przyjmij zasadę że PIN.x to jest dowolny bit rejestru a nie ta 'blaszka' wystająca z obudowy processora.

    Poczytaj na ten temat w Datasheet str 52; - paragraf zatytułowany:
    "Configuring the Pin".

    e marcus

    0
  • #6 21 Mar 2014 07:06
    oko3g
    Poziom 17  

    Dzięki wielkie za te sprostowania, dopiero się uczę. Gdzieś wyczytałem takie fajne zdanie, że gdy coś wysyłamy to używamy PORTX.y, a gdy odczytujemy stan to PINX.y, - zapomniałem że gdy używam polecenia Set to (tak jakby) chcę wysłać jedynkę. Dziś po szkole spróbóję, ale jeszcze raz dzięki za wyjaśnienie.

    0
  • Pomocny post
    #7 21 Mar 2014 15:04
    M. S.
    Poziom 34  

    Diodę gaś tak jak ją zapalasz.

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Pętla
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    zatrzyma ci działanie pętli Do: Loop i nic do tej pętli nie doprogramujesz w przyszłości. Nie zatrzymuj nigdy pętli głównej, inaczej będziesz szukał długo dlaczego program nie działa. Ten Waitms 10 jest niepotrzebny. Umieściłeś go tam chyba dlatego, żeby uC miał urozmaicenie, a nie tylko pętla i pętla.

    Powyższy program i tak nie będzie działał dobrze z uwagi na drgania styków.
    Ify w pętli Do: Loop zamień zatem na Debounce.

    0
  • #8 21 Mar 2014 19:46
    emarcus
    Poziom 34  

    M. S. napisał:


    Powyższy program i tak nie będzie działał dobrze z uwagi na drgania styków.
    Ify w pętli Do: Loop zamień zatem na Debounce.


    Na pewno będzie...
    W tym akurat przykładzie procedura 'debounce' jest zbędna, bo wynikiem/odpowiedzią warunku "If" jest ściśle określony stan portu wyjściowego bez żadnych dodatkowych uwarunkowań (np. 'else'...)
    Nie jest ważne ile razy powtórzysz commendę, której wynik ma charakter statyczny; wynik końcowy pozostanie ten sam.

    Inaczej byłoby przy 'Toggle Port wyjściowy', albo incrementacji jakiejś zmiennej, wtedy wynik poprawnego działania przycisku wymagałby debounce.

    e marcus

    0
  • #9 21 Mar 2014 22:36
    oko3g
    Poziom 17  

    Waitms umieśicłem w pętli dlatego żeby była jakakolwiek komenda, myślałem że między while [warunek] a wend musi znajdować się jakieś polecenie, jednak okzauje się że go tam nie musi być. Sprawdziłem program po zamienie polecenia Set przycisk1 na Set PORTB.0 itd - działa idealnie, po kilkudziesięciu próbach nie było ani jednej nieudanej ani nie było żadnego problemu z jakąś niestabilnością czy samoczynną zmianą stanu diody, widocznie kolega EMARCUS ma racje.

    0