Elektroda.pl
Elektroda.pl
X
Elektroda.pl
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.
itemscope itemtype="https://schema.org/QAPage"

[Atmega8][Bascom]Problem sterowania diod led 3 przyciskami

provez 17 Lut 2010 22:49 2937 7
  • [Atmega8][Bascom]Problem sterowania diod led 3 przyciskami

    #1
    Poziom 2  

    witam

    Program steruje dwoma diodami(Led1 Portd.2, Led2 Portd.3). Klik.S1-->>Wł. led -->>klik.S1-->>Wył.led, tak samo z S2. Przycisk S3 jest 'nadrzędny'. Kliknięcie S3 wyłącza obydwa Ledy jeśli którakolwiek zapalona, ponowne kliknięcie S3 włącza obydwa Ledy. 'Na żywo' S3 zapala lub gasi ledy po kilku kliknięciach! Czy ktoś może mnie ukierunkować co nie tak?


    Code:


    $regfile = "m8def.dat"
    $crystal = 1000000
    Config Portd = &B00001100                                 
            Portd = &B00011111                                 

    Dim A As Byte                                               

    S1 Alias Pind.0
    S2 Alias Pind.1
    S3 Alias Pind.4
    A = 0

    Do

       If S3 = 0 And A = 0 Then                               

           If Pind.2 = 0 Or Pind.3 = 0 Then                     

              Portd.2 = 1                                     
              Portd.3 = 1                                     

           Elseif Pind.2 = 1 And Pind.3 = 1 Then               

              Portd.2 = 0                                       
              Portd.3 = 0                                       

           End If
           A = 1                                               

          End If

       If S3 = 0 And A = 1 Then                               
          Waitms 10
          Toggle Portd.2
          Toggle Portd.3

       End If

       Debounce S1 , 0 , Pr1 , Sub                             
       Debounce S2 , 0 , Pr2 , Sub                             

    Loop
    End

    Pr1:
     Toggle Portd.2
     A = 0
    Return

    Pr2:
     Toggle Portd.3
     A = 0
    Return

    0 7
  • #2
    Poziom 18  

    Może dodasz jakieś małe opóźnienie (20-80 ms) w celu eliminacji drgań styków przy sprawdzaniu stanu S3 ?

    0
  • #3
    Poziom 28  

    i odrazu po wait'cie daj ponowne sprawdzanie przycisku czy jest wcisniety

    0
  • #4
    Poziom 2  

    Poprawiłem kod ale wiesza się na S3. Próbuję z różnymi opóźnieniami ale nie pomaga.
    Jak wstawić kod na białym tle?Sorry za taki banał ale nie wiem ?

    0
  • #5
    Poziom 18  

    Znaczniki [Kode] [/Kode] (zamień duże K na małe c). W podglądzie wysyłanej wiadomości spraw czy wiesz już jak.

    0
  • #6
    Poziom 2  

    Program działa po wstawieniu 180ms opóźnienia. Poniżej 150ms przy naciskaniu S3 diody nie reagują prawidłowo. Dzięki za wskazówki i zainteresowanie problemem. Pozdrawiam

    Code:

    $regfile = "m8def.dat"
    $crystal = 1000000
    Config Portd = &B00001100                                 
            Portd = &B00011111                             

    Dim A As Byte                                               

    S1 Alias Pind.0
    S2 Alias Pind.1
    S3 Alias Pind.4
    A = 0

    Do

       If S3 = 0 And A = 0 Then                                 
           Waitms 180
           If Pind.2 = 0 Or Pind.3 = 0 Then                   

              Portd.2 = 1                                       
              Portd.3 = 1                                       

           Elseif Pind.2 = 1 And Pind.3 = 1 Then               

              Portd.2 = 0                                       
              Portd.3 = 0                                       

           End If
           A = 1                                               

       End If

       If S3 = 0 And A = 1 Then                                 
         
          Waitms 180
          Toggle Portd.2
          Toggle Portd.3

       End If

       Debounce S1 , 0 , Pr1 , Sub                             
       Debounce S2 , 0 , Pr2 , Sub                             

    Loop
    End

    Pr1:
     Toggle Portd.2
     A = 0
    Return

    Pr2:
     Toggle Portd.3
     A = 0
    Return

    0
  • #7
    Poziom 18  

    wader_669 dobrze Ci radził. Powinieneś po opóźnieniu ponownie sprawdzać stan przycisku. Chodzi o eliminację drgań styku. Ponowne sprawdzenie po chwili czasu upewnia Cię, że przycisk jest wciśnięty zatem

    Code:
    If S3 = 0 And A = 0 Then                                 
    
           Waitms 50
           If S3=0 Then ...

    0
  • #8
    Poziom 35  

    Kabuto15 napisał:
    wader_669 dobrze Ci radził. Powinieneś po opóźnieniu ponownie sprawdzać stan przycisku. Chodzi o eliminację drgań styku. Ponowne sprawdzenie po chwili czasu upewnia Cię, że przycisk jest wciśnięty zatem
    Code:
    If S3 = 0 And A = 0 Then                                 
    
           Waitms 50
           If S3=0 Then ...


    W tym wypadku jest obojetnie czy sprawdza wcisniecie lub nie./
    Ma po prostu kiepski przycisk potrzebujacy delay wiecej niz 150ms, gdy tymczasem przecietny przycisk winien miec nie wiecej niz 10ms (zwykle 4 do 7ms).
    Dlaczego np nie zastosuje subrutyny dla S3 podobnej do S1 i S2 ze standardowym "debounce"? W tym wypadku Do...Loop moze byc puste, albo cokolwiek.
    Wyszloby i tak "taniej" w czasie niz delay 180ms.
    Jezeli przyciski S1 i S2 pracuja przy standardowym delay 25ms, to dlaczego dla sprawdzenia jakosci S3 nie podmienic go z ktoryms 'dobrym'?

    e marcus

    0