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

Bascom i debounce działa ale jakoś dziwnie

Ajatol 16 Maj 2009 04:30 2482 6
REKLAMA
  • #1 6535660
    Ajatol
    Poziom 15  
    A więc króciutki program testujący debounce. Działa ale dziwnie jakoś.
    Na portach PD0 , PD1 są klawisze z aktywnym stanem 0
    Na portach PA0 , PA1 mam podłączone ledy.
    Założenie
    Po nacisnięciu klawisza PD0 zapal diode na PA0
    Po nacisnięciu klawisza PD1 zapal diode na PA1

    program działa tak że
    Po nacisnięciu klawisza PD0 zapal diode na PA0 oraz PA1
    Po ponownym naciśnięciu PD0 zgaś led
    Po nacisnięciu klawisza PD1 zapal diode na PA1 (tu jest ok)
    Po ponownym naciśnięciu PD1 zgaś led

    Kompletnie nie mogę załapać dlaczego po nacisnięciu PD0 ustawia mi obydwie końcówki PA0 (ok) ale dlaczego również PA1 skoro ustawianie flagi jest w zupełnie innej procedurze.

    Doszłem że używając config debounce można to częściowo rozwiazać ale musimy się zmieścić w odpowiednim czasie wciśnięcia przycisku. Za długo wciśnięty to efekt ustawienia obydwu końcówek na portach.
    
    
    $regfile = "m128def.DAT"
    $crystal = 8000000
    'Config Debounce = 200
    Config Porta = Output
    Config Portd = Input
    Set Portd                                                   'podciagnij wejscia do VCC
    Declare Sub Pd0_on                                          'Obsluga klawisza PD0
    Declare Sub Pd1_on                                          'Obsluga klawisza PD1
    Dim Klawisz0 As Bit                                         'flaga wcisnietego klawisza PD0
    Dim Klawisz1 As Bit                                         'flaga wcisnietego klawisza PD1
    '-----Program glowny-------------
    Do
    Debounce Pind.0 , 0 , Pd0_on , Sub                          'Jezeli PD0 byl wcisniety ustaw flagie
    Debounce Pind.1 , 0 , Pd1_on , Sub                          'Jezeli PD1 byl wcisniety ustaw flagie
    If Klawisz0 = 1 Then
      Set Porta.0                                               'wcisnieto klawisz PD0
    Else
       Reset Porta.0
    End If
    If Klawisz1 = 1 Then
       Set Porta.1                                              'wcisnieto klawisz PD1
    Else
       Reset Porta.1
    End If
    Loop
    End                                                         'end program
    '-------End program--------------
    
    
    
    Sub Pd0_on
    Toggle Klawisz0                                             'ustaw flagie klawisz wcisniety dla PD0
    End Sub
    
    Sub Pd1_on
    Toggle Klawisz1                                             'ustaw flage klawisz wcisniety dla PD1
    End Sub
    
    
  • REKLAMA
  • #2 6536024
    wader_669
    Poziom 28  
    ja nie uzywam debounce, ale wlasnie sprawdzalem w helpie i zrozumialem to tak, ze jak uzyjesz debounce sub to jest skok do podprogramu, czyli gosub i etykieta do ktorej ma szkonczyc. Ty zdeklarowales podprogramy moim zdaniem moze przez to nie dzialac.

    Jeszcze inna sprawa dlaczego taki skomplikowany program z flagami cos.

    
    do
    debounce  pind.0, 0, led1
    debounce pind.1, 0 , led2
    loop
    end
    led1:
    toggle porta.1
    return
    
    led2:
    toggle porta.2
    return
    


    a ja bym to tak zrobil
    
    const czas= 45
    
    if pind.0 = 0 then
    waitms czas
    if pind.0 = 0 then
    
    toggle porta.1
    
    end if
    end if
    
    


    Dodano po 2 [minuty]:

    jak sa bledy to sorry pisalem z glowy.

    Ten 2 kod bym tak napisal bo nie lubie funkcji debounce
  • REKLAMA
  • #3 6536145
    Ajatol
    Poziom 15  
    Próbowałem z etykietami i z procedurami ale nic to nie zmienia. Flagi potrzebne dla innej części programu. Twój sposób jest ok tylko mały problem blokuje program na czas opóżnienia waitms. W prostym programie moze nie mieć znaczenia ale dla mnie nie do przyjecia.
  • #4 6536572
    ZbeeGin
    Poziom 39  
    Przecież polecenie DEBOUNCE też wykorzystuje wewnętrznie WAITMS! A jego opóźnienie konfigurujesz przez CONFIG DEBOUNCE. Zatem u kol. wader_669 jest ono jawne, a w DEBOUNCE jest ono ukryte.

    Jest też ważny szczegół w DEBOUNCE:
    ZbeeGin w helpie napisał:
    Przed kolejną instrukcją DEBOUNCE stan linii portu musi być nieaktywny, by zapobiec powtórnemu skokowi.
  • REKLAMA
  • #5 6537330
    Ajatol
    Poziom 15  
    Masz racje
    Cytat:

    DEBOUNCE will not wait for the input value to met the specified condition. You need to use BITWAIT if you want to wait until a bit will have a certain value.

    So DEBOUNCE will not halt your program while a BITWAIT can halt your program if the bit will never have the specified value. You can combine BITWAIT and DEBOUNCE statements by preceding a DEBOUNCE with a BITWAIT statement.
    .
    Niestety przeczytałem helpa na szybko i póżno w nocy no i zrozumiałem że debounce nie zatrzymuje programu ale jednak zatrzymuje. Zrobiłem test i teraz wiem że po nacisnieciu klawisza zdefiniowanego jako aktywny w debounce program staje na czas jaki debounce jest skonfigurowany.
    Temat uwazam za rozwiązany
  • REKLAMA
  • #6 6537387
    wader_669
    Poziom 28  
    zle zrozumiales, przeczytaj co to jest bitwait.
  • #7 6539497
    Ajatol
    Poziom 15  
    Być może sie komus przyda w przyszłości.
    Błąd działanie był spowodowany tą linią
    set PORTA
    co miało włączyć rezystory podciągające na całym porcie A skonfigurowanym jako wejściowy. niestety taka komenda (set dla całego portu jest błędna. Komenda set można ustawic co najwyzej jeden bit
    a cały port (włączyć rezystory podciagające) to mozna tak
    porta=&HFF
REKLAMA