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

[Bascom] Prośba o wytłumaczenie kodu

grala1 10 Paź 2011 10:43 1960 5
  • #1 10011669
    grala1
    Specjalista grupy V.A.G.
    Witam.
    Jestem początkujący w programowaniu mikrokontrolerów i mam prośbę do osób z większym doświadczeniem o wyjaśnienie zasady działania poniższego kodu.
    
    ‘Program obslugi jednego przycisku S1 za pomoca instrukcji Debounce
    ‘Krotkie przycisniecie S1 umozliwia właczenie i wyłaczenie diody LED1
    ‘natomiast przycisniecie przycisku S1 na czas ok 2 sekund umozliwia wlaczenie lub wylaczenie diody LED2
    
    $regfile = „m8def.dat”		‘informuje kompilator o pliku dyrektyw mikrokontrolera
    $crystal = 8000000	‘informuje kompilator o czŕstotliwosci oscylatora
    					‘taktuj¦cego mikrokontroler
    
    Config Pinb.0 = Input 		‘linia PB0 jako wejsciowa
    Config Pinb.1 = Output 		‘linia PB1 jako wyjsciowa
    Config Pinb.2 = Output 		‘linia PB2 jako wyjsciowa
    Dim Opozn As Byte			‘pomocnicza zmienna zliczajaca opoznienia
    Led1 Alias Portb.1			‘przypisanie nazwie Portb.1 nazwy Led1
    Led2 Alias Portb.2			‘przypisanie nazwie Portb.2 nazwy Led2
    S1 Alias Pinb.0			‘przypisanie nazwie Pinb.0 nazwy S1
    Set Portb.0		‘dolaczenie do linii PB0 rezystora podciagajacego
    
    Do		‘poczatek nieskoczonej petli Do-Loop ‘niesko˝czona pŕtla Do...Loop
    Debounce S1 , 0 , Obs_s1 , Sub	‘jeťli nacisniety przycisk S1,to skok do podprogramu 					‘Obs_s1
    Loop
    End					‘koniec programu
    
    Obs_s1:				‘podprogram Obs_s1
    Opozn = 0				‘zerowanie zmiennej liczacej opoznienia
    
    Do					‘poczatek petli Do-loop
    Waitms 10				‘opoznienie 10 ms
    Incr Opozn		‘zwiekszenie o jeden wartosci zmiennej opoznienia
    Loop Until Opozn = 200 Or S1 = 1	‘jesli S1 puszczony lub zmienna opozn osiagnie wartosc 					‘200 to opusc petle
    
    If Opozn = 200 Then		‘jesli opozn=200 (200*10 ms)=2 sekundy to
    Toggle Led2	‘zmiana na przeciwny stanu wyjscia sterujacego dioda LED D2
    Else					‘w przeciwnym razie
    Toggle Led1				‘zmiana na przeciwny stanu
    					‘wyjscia sterujacego dioda LED D1
    End If
    Return 				‘powrot z podprogramu
    

    Ustawianie wejść, wyjść, aliasy i zmienna jest zrozumiałe.
    Pierwszą pętle rozumiem w ten sposób że jeżeli naciśnięty jest S1 to wykonuje podprogram Obs_s1 - czyli po naciśnięciu S1 zmienna Opozn przyjmuję wartość zero.
    Druga pętla to zwiększanie zmiennej Opozn co 10ms
    Później tego kawałka nie rozumiem:
    Loop Until Opozn = 200 Or S1 = 1

    Dalej warunek że jeżeli zmienna Opozn osiągnie wartość 200 to wyjście sterujące D2 ma zmienić stan na przeciwny, w przeciwnym wypadku ma zostać zmieniony stan wyjścia sterującego diodą D1.
  • #2 10011856
    Konto nie istnieje
    Poziom 1  
  • #3 10011870
    FastProject
    Poziom 28  
    A czego tu nie rozumieć...jeśli zmienna osiągnie 200 to wychodzi z pętli Do...Loop lub jeśli zostanie 'puszczony' przycisk S1 (zwolniony zanim zmienna Opozn osiągnie 200) to także wychodzimy z pętli.

    Czyli logicznie..jeśli będziemy przyciskać przycisk S1 odpowiedni czas (około 2s-Waitms 10 x 200), to zmienimy stan LED2 jeśli krócej jak 2s to zmienimy stan LED1.

    Dodano po 54 [sekundy]:

    EDIT..widzę, ze kolega mnie uprzedził...
    Pozdrawiam
  • #4 10011923
    grala1
    Specjalista grupy V.A.G.
    Rozumiem że reszta programu jest według mojego toku myślenia.
    Druga pętla jest częścią podprogramu Obs_s1 - czy tak?
    Czy takich podprogramów z pętlami można pisać większą ilość? Tzn. Czy można napisać podobny podprogram dla drugiego guzika s2 i sterować kolejnymi dwoma diodami?
  • #5 10012740
    FastProject
    Poziom 28  
    Tak.
    Tak.
    Tak.
    Tak.
  • #6 10016101
    SylwekK
    Poziom 32  
    Cytat:
    Czy można napisać podobny podprogram dla drugiego guzika s2 i sterować kolejnymi dwoma diodami?


    Rozbudowa tego programu tym algorytmem raczej da opłakane efekty. O ile chodzi o jeden przycisk i program może blokować (czyli nie pozwolić na wykonywanie się w tym czasie innych instrukcji) to ok. ale jeśli coś ma się jeszcze wykonywać, choćby jednoczesne badanie czasu wciśnięcia dwóch przycisków naraz to już będzie problem. Tego typu rzeczy robi się w zupełnie inny sposób o czym już na elektrodzie pisałem i dawałem gotowe przykłady. Pozdrawiam.
REKLAMA