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

Sterowanie szybkością i kierunkiem mrugania 8 diod na 89S52 w asemblerze, obsługa przycisków

TechnoT 27 Maj 2014 13:17 1317 4
REKLAMA
  • #1 13638278
    TechnoT
    Poziom 9  
    Posty: 20
    Ocena: 9
    Witam, chciałbym zapytać w jaki najprostszy sposób można zaprogramować szybkość migania diod.

    Dajmy taki przykład, mam 8 diod na portach np. pd p1.0 do p1.7, zapalam je rozkazem clr p1.0 itd. Czas świecenia będę regulował lcall opoznienie1 itd, teraz tak ma wyglądać program:

    Przyciskiem p2.0 jeśli będzie na nim 1 mam przełączać tryby prędkości w górę (szybciej), a przyciskiem p2.1 ma spowalniać, czyli w dół. Trybów prędkości niech będzie np 7 od opoznienie1 do opoznienie7. Diody mają się zaświecać jedna po drugiej. przyciskiem p2.2 chciałbym by zatrzymać całkowicie program, jeśli np będzie się świecić dioda p1.3, a wcisne p2.2 to powinna zostać w tym etapie i cały czas się świecić nie przeskakując dalej. p2.3 powinno regulować kierunek świecenia diod, czy przełączają się od p1.0 do p1.7 czy od p1.7 do p1.0.

    Myślałem już sporo nad tym programem lecz jestem początkujący.
    Chciałbym byście mi udzielili wskazówek w jaki sposób mogę coś takiego napisać, bądź choć zaproponowali jakiś pomysł jeśli nie chce się wam takiego programu pisać. Pomocne też będą przykładowe programy które działają podobnie jak na tej zasadzie. Język: asembler program jakiego używam: mcu8051 ide Mikrokontroler oparty na at89s52. Dziękuję i proszę o pomoc.
  • REKLAMA
  • #2 13638395
    mipix
    Poziom 38  
    Posty: 4067
    Pomógł: 495
    Ocena: 1475
    Wprowadź do programu dodatkowe zmienne (flagi) zmieniając ich wartość/stan i monitoruj je. Jeśli użyjesz zmiennych bajtowych, to użyj np rozkazu "cjne" i porównaj to do zera lub jedynki. Wartości zmiennych ustawiasz przy sprawdzaniu wciśniętych klawiszy, natomiast ich stan sprawdzasz w pętli.
  • REKLAMA
  • #3 13638433
    TechnoT
    Poziom 9  
    Posty: 20
    Ocena: 9
    mipix napisał:
    Wprowadź do programu dodatkowe zmienne (flagi) zmieniając ich wartość/stan i monitoruj je. Jeśli użyjesz zmiennych bajtowych, to użyj np rozkazu "cjne" i porównaj to do zera lub jedynki. Wartości zmiennych ustawiasz przy sprawdzaniu wciśniętych klawiszy, natomiast ich stan sprawdzasz w pętli.


    Głupio mi mówić ale do końca z tymi flagami nie wiem o co chodzi.
    Mógłbyś mi to jakoś wytłumaczyć? napisałem na twoje gg które masz w profilu, jeśli miałbyś czas byłbym ci wdzięczny. Bądź jeśli mógłbyś napisać program na tej zasadzie dla 3 diod i 2 np opóźnień żeby regulować, ja to potem bym sobie już rozbudował, tylko poprostu zasadę działania muszę załapać
  • REKLAMA
  • #4 13639464
    Badmaneq
    Poziom 23  
    Posty: 567
    Pomógł: 76
    Ocena: 23
    uC 8051 od adresu 20h do 2Fh posiada pamięć adresowaną bitowo, którą można użyć jako flagi w celu zmniejszenia ilości używanej pamięci. Jednak na Twoim etapie ja bym użył zmiennych bajtowych, które prezentują flagi. Ogólnie flaga to zmienna która informuję o czymś. Dla przykładu nazwijmy zmienną flaga_swieci i przyjmijmy, że jeżeli ma wartość 1 to oznacza, że dioda świeci natomiast wartość 0 dioda zgaszona.
    Możesz skorzystać z takiego schematu:
    Kod: text
    Zaloguj się, aby zobaczyć kod
  • #5 13639904
    TechnoT
    Poziom 9  
    Posty: 20
    Ocena: 9
    okej już trochę rozumiem, mam jeszcze jeden kłopot.

    Mam jeden przycisk którym chciałbym zarówno załączać jak i zatrzymywać pracę układu. Jest lecz jeden problem. Jeśli stworzę coś w tym stylu:
    ... czesc programu...
    jnb p1.0,stop
    dalsza czesc programu jesli p1.0 wynosi 0, jesli jest 1 przechodzimy do pętli która stopuje pracę układu

    stop:
    jnb p1.0,start
    lcall czekaj100ms
    sjmp stop

    Wszystko w tym jest okej, można zarówno zastopować jak i zastartować układ, jednak czasem trzeba wcisnąć przycisk kilka razy. Poprostu nie zawsze go łapie, jeśli bym zrobił to na tej samej zasadzie, lecz na przycisk wznawiające pracę dał drugi np na p1.1 to by działało normalnie. Czym jest to spowodowane, że nie zawsze działa gdy jest na 1 przycisku to samo? Jak to naprawić by wznawiało i stopowało zawsze po 1 wciśnięciu, a nie np. po kilku aż załapie ? Dzięki i proszę o odpowiedź.
REKLAMA