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] Wyłącznik na 89C2051. Program czasami działa, a czasami nie.

august_a 21 Mar 2006 18:22 1956 16
REKLAMA
  • #1 2441286
    august_a
    Poziom 21  
    Posty: 572
    Pomógł: 32
    Ocena: 4
    Witam,
    Mam pewien problem, chciałem zrobić na 89C2051 następujący wyłącznik: naciskam przycisk 1 to przekaźnik załączy, naciskam drugi raz przekaźnik wyłączy...
    Napisałem taki program:
    Przycisk Alias P3.0
    P1.4 = 0                                                      'Wyzerowanie stanu przekaznika( P1.2 = wylaczony)
    Przycisk = 1
    
    'Program wlaczania
    
    Sub On_u
       Przycisk = 1
    
       Do
    
             If Przycisk = 0 Then
              Bitwait Przycisk , Reset
              Wait 1
              Reset P1.4
              Waitms 650
              Przycisk = 1
              Call Off_u
             End If
       Loop
    End Sub
    'Program wylaczania
    Sub Off_u
    
       Przycisk = 1
       Do
             If Przycisk = 0 Then
              Bitwait Przycisk , Reset
              Wait 1
              Set P1.4
              Waitms 650
              Przycisk = 1
              Call On_u
             End If
       Loop
    End Sub


    On działa ale troche dziwnie ponieważ czasami załączy a czasami nie, lub załączy i wyłączy Ma ktoś jakiś pomysł na to??
    Pozdrawiam
  • REKLAMA
  • #2 2441456
    jacobsek
    Poziom 22  
    Posty: 419
    Pomógł: 61
    Ocena: 24
    Jeśli napisałeś
    if przycisk=0 then
    bitwait przycisk,reset
    to trochę nie tak, polecenie bitwait to oczekiwanie na stan podany po przecinku czyli w tym przypadku reset (=0)
    sprawdzasz warunek jeśli przycisk=0 to czekaj aż przycisk będzie =0?

    Dodano po 7 [minuty]:

    stan naciśnięcia przycisku badamy na pinie a nie na porcie czyli np.pin.x=0 to cś tam...
  • REKLAMA
  • #3 2442044
    august_a
    Poziom 21  
    Posty: 572
    Pomógł: 32
    Ocena: 4
    Zmieniłem tak jak mi podałeś, i nadal nie jest dobrze - załączenie następuje dopiero po którymś razie...
  • REKLAMA
  • #4 2442641
    Fredy
    Poziom 27  
    Posty: 915
    Pomógł: 117
    Ocena: 28
    Spróbuj coś w ten deseń:


    DO
    IF PRZYCISK=0 AND PK=0 THEN
    WAITMS 50

    IF PRZYCISK=0 THEN
    PRZEKAZNIK=1
    BITWAIT PRZYCISK,SET
    END IF
    END IF

    IF PRZYCISK=0 AND PK=1 THEN
    WAITMS 50

    IF PRZYCISK=0 THEN
    PRZEKAZNIK=O
    BITWAIT PRZYCISK,SET
    END IF
    END IF


    LOOP

    END
  • #5 2444119
    cyberdar
    Poziom 31  
    Posty: 1465
    Pomógł: 161
    Ocena: 73
    if przycisk = 0 then
    przekaznik = not przekaznik : bitwait przycisk, set : waitms 200
    end if
  • #7 2444740
    august_a
    Poziom 21  
    Posty: 572
    Pomógł: 32
    Ocena: 4
    Debounce eliminuje drganie styków, a jak mam zmienić stan pinu pod który dam przekaźnik?
    Toggle w 8051 nie jest dostępne.
  • #8 2444823
    avatar
    Poziom 36  
    Posty: 4149
    Pomógł: 159
    Ocena: 413
    
    Dim A As Bit
    Dim D As Bit
    Dim C as Bit
    A = P0.7  ' pin przycisku  
    do 
    If P0.7 <> A Then
        If A = 1 Then
        D = 1
        A = P0.7
         Else
         A = P0.7
         C = 1
         End If
         End If
    If D = 1 Then
      P1.0 = 1     'pin przekaznika
        End If
    If C = 1 Then
       P1.0 = 0
        End If
    
    If D = 1 Then           
         D = 0
         End If
         If C = 1 Then
         C = 0
         End If
    loop
    end 
    
  • #9 2444883
    august_a
    Poziom 21  
    Posty: 572
    Pomógł: 32
    Ocena: 4
    avatar twój kod nie działa zbyt dobrze ponieważ jak włącze zasilanie, to przekażnik jest załączony, a jeśli nacisne przycisk to się wyłączy i już się nie włączy na stałe, tylko gdy trzymam przycisk.
  • REKLAMA
  • #10 2445217
    uC
    Poziom 14  
    Posty: 39
    Pomógł: 13
    Ocena: 1
    Debounce niweluje drgania stykow i zapobiega kilkukrotnemu wykonaniu procedury, jesli przytrzymasz przycisk.
    Sprobuj napisac tak, jak masz ponizej. Pisalem z glowy, bez kompilatora, wiec moga byc jakies bladki, ale logika jest prawidlowa.


    Przycisk alias P3.0
    Przekaznik alias P1.4

    Dim wlaczony_przekaznik as Bit
    Wlaczony_przekaznik =0
    Przekaznik=0

    Declare Sub obsluga_przycisku

    '***** PROGRAM GLOWNY
    Do

    Debounce Przycisk,0,Obsluga_przycisku 'przycisk zwierany do masy

    Loop

    '******** OBSLUGA PRZYCISKU
    Sub Obsluga_przycisku:

    If Wlaczony_przekaznik=0 Then
    Przekaznik=1
    Wlaczony_przekaznik=1
    Else
    Przekaznik=0
    Wlaczony_przekaznik=0
    Endif

    End sub
  • #11 2445549
    ZbeeGin
    Poziom 39  
    Posty: 4318
    Pomógł: 602
    Ocena: 452
    Poprawka (też pisałem z głowy :) ):

    
    Debounce Przycisk,0,Obsluga_przycisku,SUB  'przycisk zwierany do masy 
    
    Loop 
    
    '******** OBSLUGA PRZYCISKU 
    Obsluga_przycisku: 
      If Wlaczony_przekaznik=0 Then 
        Przekaznik=1 
        Wlaczony_przekaznik=1 
      Else 
        Przekaznik=0 
        Wlaczony_przekaznik=0 
      Endif 
    Return
    
  • #12 2445567
    jaroslawk
    Poziom 21  
    Posty: 634
    Pomógł: 30
    Ocena: 13
    Witam,
    Poniżej przedstawiam kod jaki wykorzystuje do załączania podświetlania wyświetlacza.
    Pozdrawiam
    
    Dim A1 As Integer
    Dim Stan As Integer
    Dim Czas As Integer
    Config Debounce = 100
    Poz Alias P3.7
    B1 Alias P3.0
    Czas = 32
    Do
    Locate 1 , 1
    Czas = Czas - 1
    If Czas = 0 Then Set B1
    Lcd "Podswietlanie -"
       Debounce Poz , 0 , On_off , Sub
       If Stan = 1 Then
    
     Lcd " ON" ; Spc(1)
     Set B1
    Else
    Lcd " OFF" ; Spc(1)
     Reset B1
    End If
    
    Loop
    
    On_off:
    Incr Stan
    If Stan > 2 Then
      Stan = 1
    End If
    
    Return 
    
  • #13 2447899
    jacobsek
    Poziom 22  
    Posty: 419
    Pomógł: 61
    Ocena: 24
    Witam.
    Zrób tak:
    przycisk alias pin.x(jakiś tam)
    przekaźnik alias port.x(jakiś tam)

    do
    if przycisk=0 then
    waitms 25
    if przycisk=0 then
    if przekaźnik=0 then przekaźnik=1
    if przekaźnik=1 then przekaźnik=0
    bitwait przycisk,set
    end if
    end if
    loop
    end
    ----------------------------------
    działa tak:
    sprawdzasz stan pinu.x jeśli jest zwarty do masy przyciskiem to
    czekanie 25mS na wyeliminowanie drgań styków
    jesli nadal jest zwarty to sprawdza jaki był stan przekaźnika i zmienia na przeciwny, następnie jest oczekiwanie na puszczenie przycisku(bitwait,set) czyli jeśli go puścimy i będzie już stan wysoki to kończy się procedurka i dalej leci pętla do loop
    .pozdrawiam

    Dodano po 53 [minuty]:

    sorki, pomyłka w tych if
    zastosuj w sprawdzaniu stanu przekaźnika polecenie elseif bo tak to stan się nie będzie zmieniał, a jesli dasz else if to po sprawdzeniu zgodności nie będzie już sprawdzał przeciwnego warunku
  • #14 2452338
    Andy74
    Poziom 25  
    Posty: 525
    Pomógł: 103
    Ocena: 24
    Witam
    :arrow: jacobsek a nie prościej tak?

    
    Do
       If Przycisk = 0 Then
          Waitms 25
          If Przycisk = 0 Then
             Przekaznik = Not Przekaznik
             Bitwait Przycisk , Set
          End If
       End If
    Loop
    End
    
  • #16 2452656
    Andy74
    Poziom 25  
    Posty: 525
    Pomógł: 103
    Ocena: 24
    Sorry ZbeeGin. Już milczę.

    Pomyślałem że skoro kolega august_a nie zamknął tematu to czeka jeszcze na inne sugestie... :|
  • #17 2452835
    jacobsek
    Poziom 22  
    Posty: 419
    Pomógł: 61
    Ocena: 24
    Pewnie że prosciej

Podsumowanie tematu

✨ Dyskusja dotyczy problemu z realizacją wyłącznika bistabilnego na mikrokontrolerze 89C2051 w BASCOM, gdzie naciśnięcie przycisku ma załączać i wyłączać przekaźnik naprzemiennie. Autor zgłasza, że program działa niestabilnie – przekaźnik czasami się załącza, czasami nie, lub załącza i wyłącza się natychmiast. W odpowiedziach zwrócono uwagę na błędne użycie instrukcji BITWAIT oraz konieczność sprawdzania stanu pinu, a nie całego portu. Sugerowano implementację opóźnienia eliminującego drgania styków (debounce) oraz prostą logikę zmiany stanu przekaźnika za pomocą negacji (toggle) zmiennej bitowej. Przykładowe rozwiązania zawierają pętle z warunkiem wykrywania naciśnięcia przycisku, opóźnieniem 25-50 ms dla eliminacji drgań, a następnie zmianą stanu przekaźnika i oczekiwaniem na zwolnienie przycisku (BITWAIT). Zaproponowano także wykorzystanie wbudowanej funkcji DEBOUNCE w BASCOM do stabilizacji sygnału przycisku oraz prostą obsługę stanu przekaźnika za pomocą zmiennej bitowej. Wskazano, że toggle (negacja) stanu przekaźnika jest możliwa i efektywna w 8051, mimo że nie ma dedykowanej instrukcji. Ostatecznie rekomendowane jest stosowanie debouncingu i prostego kodu zmieniającego stan przekaźnika po wykryciu stabilnego naciśnięcia przycisku.
Wygenerowane przez model językowy.
REKLAMA