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.

dsm-51 Jagoda - miganie diody

plotek5 09 Mar 2014 17:50 2172 10
  • #1 09 Mar 2014 17:50
    plotek5
    Poziom 11  

    Mam napisać program, który spowoduje na przemian miganie diody i sygnał buzera. Napisałem go tak:

    Kod: asm
    Zaloguj się, aby zobaczyć kod

    jednakże po wpisaniu tego w symulator "jagoda" zauważyłem, ze są momenty podczas symulacji, kiedy to oba elementy są jednocześnie wyłączone i włączone. Myślę, ze to nie jest wina symulatora, tylko kodu, wiec proszę o pomoc w jego modyfikacji.

    0 10
  • #2 09 Mar 2014 18:08
    BlueDraco
    Specjalista - Mikrokontrolery

    Jeśli przy linijkach kodu odpowiedzialnych za zmianę stanu diody i piszczka dopiszesz sobie komentarze objaśniające, co one robią, sam zobaczysz łatwo, jak ten program działa.

    0
  • #3 09 Mar 2014 18:16
    plotek5
    Poziom 11  

    taka modyfikacja również nic nie dała:

    Kod: asm
    Zaloguj się, aby zobaczyć kod

    0
  • #4 09 Mar 2014 19:23
    maniek1818
    Poziom 22  

    Z tego co pamiętam, to symulator jagoda działał tak sobie. Dlatego też zbudowałem rzeczywisty układ z procesorem opartym o architekturę '51. Program twój wygląda prawidłowo. Wiem, że asembler jest mało czytelny na pierwszy rzut oka, ale warto posiedzieć. Na zachętę powiem, że po nauczeniu się asemblera 8051 (a trwało to kilka tygodni) asembler AVR'ów zrozumiałem w jeden dzień.

    0
  • #5 09 Mar 2014 19:33
    Marek_Skalski
    Moderator Projektowanie

    maniek1818 napisał:
    Program twój wygląda prawidłowo.

    Bzdura!

    BlueDraco już wcześniej powiedział jak wyleczyć program, ale plotek5 albo nie zrozumiał, albo jest uparty.
    Jest spora różnica między SETB/CLR, a CPL.
    Jeżeli LED i Buzzer mają działać na zmianę, to chyba w tym samym momencie należy przełączyć oba wyjścia, prawda? Przełączenie jednego, opóźnienie, przełączenie drugiego i kolejne opóźnienie to nie jest właściwa metoda.

    0
  • #6 09 Mar 2014 20:02
    maniek1818
    Poziom 22  

    Marek_Skalski napisał:
    Bzdura!

    :?:
    Marek_Skalski napisał:
    Jeżeli LED i Buzzer mają działać na zmianę, to chyba w tym samym momencie należy przełączyć oba wyjścia, prawda?

    Faktycznie :)

    0
  • #7 09 Mar 2014 20:21
    plotek5
    Poziom 11  

    właśnie zauważyłem to: wszędzie, gdzie miałem osobno instrukcję MOV A,#10 to symulator działał nieprawidłowo. To moja pierwsza styczność z asemblerem, więc nie wiedziałem, że tak nie można. No nic, zaraz spróbuję poprawić

    Kod: asm
    Zaloguj się, aby zobaczyć kod


    działa, a co jeśli chcę, aby czart świecenia i nieświecenia diody był 4 razy dłuższy od buzzera? Przez komendę MOV A,#40, znowu będzie źle

    0
  • #8 09 Mar 2014 20:48
    maniek1818
    Poziom 22  

    plotek5 napisał:
    działa, a co jeśli chcę, aby czart świecenia i nieświecenia diody był 4 razy dłuższy od buzzera? Przez komendę MOV A,#40, znowu będzie źle

    Musisz dodać licznik na przykład na którymś z rejestrów roboczych. Ładujesz go na początku wartością 4 i przy każdym przejściu przez rozkaz wyłączania buzzera dekrementujesz ją. Następnie używając rozkazu CJNE sprawdzasz czy w rejestrze licznika jest już '0'. Jeżeli będzie '0', to:
    - zmieniasz stan diody,
    - ponownie ładujesz do licznika wartość '4'

    1
  • #9 09 Mar 2014 20:52
    plotek5
    Poziom 11  

    nie bardzo rozumiem. Da się jakoś prościej?
    z doświadczenia z poprzedniego zadania rozumiem, że tak będzie źle:

    Kod: asm
    Zaloguj się, aby zobaczyć kod

    0
  • #10 09 Mar 2014 21:10
    maniek1818
    Poziom 22  

    Może inaczej. Buzzer zmienia swój stan co 1 sekundę. Zaś co zmiany stanu linii sterującej buzzerem ma zmienić się stan diody led. Narysuj może wpierw na kartce algorytm.

    0
  • #11 09 Mar 2014 21:18
    plotek5
    Poziom 11  

    już wiem, teraz mam tylko dylemat któą wersję programu wybrać:
    -czy dioda ma 4s świecić i 4s nie świecić, buzer 1s działać i 1s nie działać, przez co nie będzie "na przemian", bo będziemy mieć chwile, kiedy nic się nie dzieje w programie
    -czy dioda świeci 4s, potem zapala sie buzer na 1s, potem zapala się dioda na 4 itd... Dzięki czemu wszystko działa na przemian, ale dioda w tym cyklu nie świeci się przez 1s, a skoro czas wygaszania ma być 4krotnie dłuższy od buzera to nie wiem, czy nie powinien wynieść 4s - czyli przypadek 1.

    W każdym razie oba programy już mi działają, kwestia, który wybrać

    0