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

atmega32 [Bascom] - 1 przycisk - dwie funkcje

maximus22_kr 15 Paź 2011 12:38 2587 3
REKLAMA
  • #1 10029549
    maximus22_kr
    Poziom 18  
    Witam
    Wiem, że temat przycisku jest mocno nadwyrężony, ale ...

    Program ma jednym przyciskiem przy dłuższym przytrzymaniu zwiększać i zmniejszać wartość wyjścia PWM ( na zmianę ) lub przy krótszym włączyć/wyłączyć, czyli pwm1a = 0 lub pwm1a = 255.

    Każda z tych funkcji osobno działa ok, ale razem działa tylko włącz/wyłącz przy krótszym przytrzymaniu W1, dłuższe powoduje powolne ( nawet bardzo ) zwiększanie PWM, a po puszczeniu gaśnie.

    
    $regfile = "m32def.dat"
    $crystal = 8000000
    $hwstack = 8                                                ' rozmiar stosu sprzętowego
    $swstack = 8                                                ' rozmiar stosu
    $framesize = 10
    
    
    '********************* Konfiguracja wejść i wyjść
    
    Config Portb.6 = Input
     Set Portd.6
    Config Portd.7 = Input
     Set Portd.7
    Config Portd.5 = Output
     Reset Portd.5
    Config Portd.4 = Output
     Reset Portd.4
    
    '********************* Konfiguracja Timer0
    Config Timer0 = Timer , Prescale = 256
    Enable Timer0
    On Timer0 Czas0
    Timer0 = 6                                                  'Timer0 8 BIT - 250 x 16us = 0,008 s , 256 - 6 = 250
    
    '********************* Konfiguracja Timer1
    Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 64
    
    Enable Interrupts
    Enable Timer1
    
    '********************* Deklaracje zmiennych
    
    Dim A As Bit
    Dim B As Bit
    Dim C As Byte
    Dim D As Byte
    Dim Licznik1 As Integer
    Dim Licznik2 As Integer
    Dim O1 As Bit
    Dim Flaga1 As Bit
    Dim Flaga2 As Bit
    
    
    '********************* Deklaracje podprogramów
    
    Declare Sub S1
    Declare Sub Up1
    Declare Sub Dn1
    Declare Sub Scm1
    
    '********************* Deklaracje wejść i wyjść
    W1 Alias Pind.6
    W2 Alias Pind.7
    St1 Alias Portd.5
    St2 Alias Portd.4
    
    
    A = 1
    B = 1
    C = 5
    Flaga1 = 0
    Flaga2 = 0
    
    Cls
    Cursor Off
    
    
    '********************* Program główny
    Do
    If W1 = 0 Then                                              ' jeśli przycisk W1 wciśnięty
        Waitms 700
     If W1 = 0 Then
      Set Flaga1
      Gosub Scm1                                              
      Else
      Gosub S1
    
      End If
     End If
    
    
    Loop
    End
    
    '********************* Podprogramy
    
    
    Up1:
        If Pwm1a < 255 Then                                    
        Pwm1a = Pwm1a + C
        Waitms 5
        End If
       Return
    
    
    Dn1:
    
    If Pwm1a > 0 Then                                          
        Pwm1a = Pwm1a - C
        Waitms 5
        End If
        Return
    
    
    Scm1:
    
     If A = 1 Then                                              ' jeśli zmienna A = 1
      Gosub Up1                                                 ' idź do podprogramu Up1
      Waitms 3
       If W1 = 1 Then                                           'jesli przycisk W1 rozłączony
        A = 0
    
    
     If A = 0 Then                                              ' jeśli zmienna A = 0
      Gosub Dn1                                                 ' idź do podprogramu Dn1
      Waitms 3
       If W1 = 1 Then                                           'jesli przycisk W1 rozłączony
        A = 1
     End If
    End If
    End If
    End If
    
    Return
    
    S1:
    If Pwm1a <> 0 Then
    Pwm1a = 0
    Else
    Pwm1a = 255                                                 ' Przełączanie wyjścia 1 - Portd.5
    End If
    
    Return
    
  • REKLAMA
  • #2 10031228
    arktik1
    Poziom 27  
    Myślę że to powinno być tak:
    Po wciśnięciu przycisku program nie robi nic, tylko odlicza 3 sekundy, po czym przechodzi w tryb przyciemniania/rozjaśniania.
    Jeśli przycisk zostanie puszczony wcześniej niż 3 sekundy to program zauważa puszczony przycisk i automatycznie ustawia stan 0 lub 255.
  • REKLAMA
  • #3 10033695
    Konto nie istnieje
    Poziom 1  
  • #4 10068113
    SylwekK
    Poziom 32  
    To się da o wiele prościej rozwiązać (timery w sumie też nie potrzebne). Wystarczy jedna zmienna np byte dla klawiszy i jedna zmienna bit jako znacznik dla pwm. Przejrzyj temat https://www.elektroda.pl/rtvforum/topic1828017-30.html i pomyśl chwilę jak wykorzystać znacznik w moim programie żebyś mógł zrealizować to co chcesz...
REKLAMA