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.

[BASCOM] Licznik 0-9, regulowanie prędkości odliczania

misiek85_1 14 Lis 2009 23:03 1200 6
  • #1 14 Lis 2009 23:03
    misiek85_1
    Poziom 11  

    Witam,

    tworzę sobie mały licznik w Bascomie, wszystko ładnie mi już odlicza, proszę tylko o małą poradę - w jaki sposób za pomocą dwóch przycisków (+ i -) regulować szybkością odliczania liczby?

    Teraz posługiwałem się

    Code:

    Do
    For Licznik = 0 To 9
    Print Licznik
    Waitms 500
    Next
    Loop


    teraz jak wykonać regulowanie czasu przerwy - czyli prędkości odliczania? Załóżmy, że w przedziale 1-10?

    Myślałem żeby do tego jakoś Timer zaprząc, ale za bardzo nie wiem jak..

    Z góry dziękuje za pomoc :)

    0 6
  • #2 14 Lis 2009 23:12
    ziomus90210
    Poziom 35  

    Wprowadź zmienną A zapisaną gdzieś :)
    i niech będzie :
    WAITMS A
    a zmienna zmieniaj :)
    kombinuj:)

    0
  • #3 14 Lis 2009 23:21
    misiek85_1
    Poziom 11  

    Już z tym też kombinowałem, ale nie wydaje mi się by było to "fachowe" rozwiązanie..

    0
  • #4 15 Lis 2009 07:07
    emarcus
    Poziom 35  

    misiek85_1 napisał:
    Już z tym też kombinowałem, ale nie wydaje mi się by było to "fachowe" rozwiązanie..

    Kazde rozwiazanie z uzyciem 'Wait,' 'waitms' jest NIE-fachowe i bez sensu.
    Uzywasz calej mocy processora dla glupiej dyrektywy czekania. Malo tego, w tym czasie processor jest zajety wlasnie odliczniem tego czasu i nic wiecej nie moze robic, gdy tymczasem wbudowane w processor rozne funkcje takie jak timery/liczniki, komparatory, ADC, nie sa uzywane - zwyczajnie 'poszly spac'.

    Najprosciej, zaprzegnij do tego dowolny timer(x) i ovf(x) ; zmieniajac preload timera wydluzysz lub skrocisz czas pomiedzy przerwaniami z tytulu przepelnien timera(x).
    Innym rozwiazaniem moze byc uzycie timera w trybie CTC (nie kazdy timer ma ten tryb); zmieniajac gorna wartosc do jakiej liczy timer, otrzymasz sygnal (w regulowanych przedzialach czasowych) do increamentacji twojego licznika 0-9; efekt bedzie podobny jak w poprzednim przykladzie, tyle ze dokladniejszy.
    I wiele innych rozwiazan.
    Popracuj troche z timerami a koncepty na tego typu (i bardziej zaawansowane)projekty zaczna sie sypac same.
    Przy okazji zapoznaj sie z interruptami (przerwaniami) - to jest konieczne.
    Zechcesz uzywac przyciski do kontrolowania stanow portow, zapoznaj sie ze zjawiskiem drgania stykow i co z tym robic (debounce). Regulacje czasu pomiedzy 'odliczaniem' mozesz dokonywac nie tylko przyciskami (skokowo) ale takze plynnie - potencjometrem w bardzo szerokim zakresie. Lektura na temat uzycia ADC jest tu konieczna.
    Gdy opanuesz te zagadnienia to zostaniesz specjalista w projektowaniu roznego rodzaju generatorow z regulacja zarowno czestotliwosci jak i czasu wypelnienia (PWM) na kazda potrzebe.

    Moglbym ci wyslac kilka gotowych przykladow, ale chyba nie o to ci chodzi, nieprawdaz?

    e marcus

    0
  • #5 15 Lis 2009 15:23
    Electrik_eye
    Poziom 13  

    Zgadzam się z kolegą.
    Używanie polecenia wait to tak jakbyś strzelał z działa przeciwpancernego do muchy...

    Przykładowe skonfigurowanie licznika 16-bitowego w BASCOM tak żeby zliczał do 1s przy częstotliwości taktowania 16MHz:
    ( wszystkie ustawienia konfiguracyjne oraz deklaracja zmiennych )

    Config Timer1 = Timer , Prescale = 256 ' konfiguracja licznika jako licznik i 'ustawienie prescalera na 256 ( w przypadku taktowania 4 MHz byłoby to '64 itp.)

    Enable Interrupts
    Enable Timer1 ' odblokuj timer
    On Timer1 Co1s ' po przepełnieniu licznika przejdź do etykiety co1s

    do:loop:end


    Co1s:

    Timer1 = 3036
    ( i dalsza część programu )

    Dodano po 2 [minuty]:

    No a z zwiększaniem szybkości to np. if Pinb.0 = 0 (przykładowe polecenie jeśli przysisk naciśnięty ( oczywiście wymyśliłem, że portb.0 to wyjście i właśnie tam jest przycisk podłączony i , że zwiera on końcówkę do masy)
    then
    Timer = 5256

    itd.

    0
  • #6 15 Lis 2009 17:57
    emarcus
    Poziom 35  

    Electrik_eye napisał:

    ...........
    No a z zwiększaniem szybkości to np. if Pinb.0 = 0 (przykładowe polecenie jeśli przysisk naciśnięty ( oczywiście wymyśliłem, że portb.0 to wyjście i właśnie tam jest przycisk podłączony i , że zwiera on końcówkę do masy)
    then
    Timer = 5256

    itd.


    Z rubsza tak, tylko ze :
    PORTB.0 powinien byc wejsciem podciagnietym do VCC przez zewn. R= 5 do 10k, lub wewnetrznie przez soft.
    Ponadto, przy tych liczbach bedzie trudno zauwazyc roznice; zamiast miec impuls co 1sec bedzie co 0.96 sec.; no i ten warunek powinien byc na poczatku etykiety w postaci:
    if...... then ..... else
    ..........
    end if
    Return

    e marcus

    0
  • #7 16 Lis 2009 11:56
    Electrik_eye
    Poziom 13  

    Co racja to racja :) Heh...

    Dzięki za sprostowanie :)

    Pozdrawiam

    Electrik_eye

    0