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

Program 89s52 / asembler - mruganie diodami

27 Maj 2014 13:17 1008 4
  • Poziom 8  
    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.
  • Poziom 31  
    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.
  • Poziom 8  
    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ć
  • Poziom 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: asm
    Zaloguj się, aby zobaczyć kod
  • Poziom 8  
    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ź.