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

Dodanie obsługi pilota w programie Bascom dla 89c4051 - jak to zrobić?

kiler129 01 Gru 2006 10:41 1338 1
REKLAMA
  • #1 3282079
    kiler129
    Poziom 27  
    Posty: 1304
    Pomógł: 12
    Ocena: 80
    Mam sobie niżej pokazany programik w bascomie ale niestety nie wiem jak dopisać obsługę pilota :|
    Programik jest na 89c4051 ;)

    
    $large
    Config Lcd = 16 * 2
    Config Timer1 = Timer , Gate = Internal , Mode = 1
    Config Sda = P3.1
    Config Scl = P3.0
    Dim Licz As Byte
    Dim I As Byte
    Dim Nast(5) As Byte
    Dim St As String * 7
    Dim W_reg As Integer
    Dim Wielk1 As Byte
    Dim Wielk2 As Byte
    Dim X As Byte
    Dim Value As Byte
    Dim Adres As Byte
    Dim S As Byte
    Dim We As Bit
    Dim A As Byte
    Dim C As Byte
    Dim Flaga1 As Bit
    Dim Kod As Byte
    Dim Vp As Byte
    Dim Vl As Byte
    Dim Xxx As Byte
    Deflcdchar 0 , 1 , 2 , 2 , 4 , 4 , 2 , 2 , 1
    Deflcdchar 1 , 5 , 10 , 18 , 20 , 20 , 18 , 10 , 5
    Deflcdchar 2 , 16 , 8 , 8 , 4 , 4 , 8 , 8 , 16
    Deflcdchar 3 , 20 , 10 , 9 , 5 , 5 , 9 , 10 , 20
    S1 Alias P3.7
    S2 Alias P3.5
    S3 Alias P3.4
    Declare Sub Zmien()
    Declare Sub Regul
    Declare Sub Wys(st As String * 8)
    Declare Sub Przedz
    Declare Sub Wyslij(kod As Byte , Adres As Byte , Value As Byte)
    Declare Sub Warunk(a As Byte , C As Byte)
    Declare Sub Read_i(adres As Byte , Value As Byte)
    Declare Sub Up
    Declare Sub Down
    Declare Sub Wejscie
    On Timer1 Timer1_int
    On Int1 Mute
    Enable Int1
    Enable Timer1
    Enable Interrupts
    
    'Poczatek programu
    Cursor Off Noblink
    Counter1 = 4150
    Licz = 0
    Cls
    Lcd "** Ver. 1.00 **"
    Wait 2
    Cls
    Set S1
    Set S2
    Set S3
    Set P3.2
    Set P3.3
    Call Read_i 15 , Value                                        ' odczyt danych z eeprom
    If Value = 60 Then
      Call Read_i 2 , Value
      Nast(1) = Value
      Call Read_i 3 , Value
      Nast(2) = Value
      Call Read_i 5 , Value
      Nast(3) = Value
      Call Read_i 6 , Value
      Nast(5) = Value
      Call Read_i 8 , Value
      S = Value
     Else                                                         'jezeli brak pamieci to ponizsze parametry zmiennych
      Nast(1) = 6                                                 'bass
      Nast(2) = 6                                                 'treble
      Nast(3) = 10                                                'baland
      Nast(4) = 1                                                 'efekty
      Nast(5) = 40                                                'volume
      S = &B11001110
    End If
    
    Nast(4) = S And &B00011000                                    ' odpowiednie ustawienie rodzaju efektu
    Rotate Nast(4) , Right , 3
    
    Vl = 0                                                        ' odpowiednie ustawienia balansu
    Vp = 0
    If Nast(3) >= 10 Then
       Vp = Nast(3) - 10
      Else
       Vl = 10 - Nast(3)
    End If
    
    I = 5
    
    Call Zmien                                                    ' wywolanie procedury wpisujacej dane do eeprom i procesora dzwieku
    Counter1 = 4150
    
    Do                                                            'petla glowna programu
       While S.5 = 1                                              ' jezeli s.5=1 to wyswietl mute
         Lcd "MUTE"
       Wend
       Waitms 220
       If S1 = 0 Then                                             ' przycisk mode
         Incr I
        If I = 6 Then
         I = 1
        End If
        Call Zmien
        Bitwait S1 , Set
       End If
       If S3 = 0 Then                                             'przycisk down
        Decr Nast(i)
        Call Zmien
       End If
       If S2 = 0 Then                                             ' przycisk up
        Incr Nast(i)
        Call Zmien
       End If
       If P3.2 = 0 Then                                           ' przycisk wejscie
        Call Wejscie
        Bitwait P3.2 , Set
       End If
    Loop
    End
    
    Sub Zmien
       If I <> 5 Then
        Licz = 0
        Start Timer1                                              ' uruchamia timer
       End If
       Cls
       We = S.0
       Wielk2 = 1
       If I = 1 Then                                              ' bass
        Wielk1 = 12
        Call Przedz
        Call Wys( "Bass:")
        Call Przelicz
        Call Regul
       Elseif I = 2 Then                                          ' treble
        Wielk1 = 11
        Call Przedz
        Call Wys( "Treble:")
        Call Przelicz
        Call Regul
       Elseif I = 3 Then                                          ' balans
        Vl = 0
        Vp = 0
        Wielk1 = 20
        Wielk2 = 0
        Call Przedz
        Call Wys( "Balans:")
        If Nast(3) >= 10 Then
          Vp = Nast(3) - 10
         Else
          Vl = 10 - Nast(3)
        End If
        Lowerline
        Lcd "      " : Lcd Vl : Lcd "-" : Lcd Vp
       Elseif I = 4 Then                                          ' effect
        Wielk1 = 4
        Wielk2 = 255
        Call Przedz
        Call Wys( "Effect:")
        Waitms 50
        Lowerline
        If Nast(4) = 0 Then
           Lcd "Mono"
           Reset S.3
           Reset S.4
        Elseif Nast(4) = 1 Then
           Lcd "Liniowe St"
           Reset S.4
           Set S.3
        Elseif Nast(4) = 2 Then
           Lcd "Pseud St"
           Set S.4
           Reset S.3
        Elseif Nast(4) = 3 Then
           Lcd "Przest St"
           Set S.3
           Set S.4
        End If
       Elseif I = 5 Then                                          ' volume
        Wielk1 = 64
        Stop Timer1                                               ' zatrzymanie timera
        Counter1 = 4150
        Call Warunk(21 , 28)
        Call Warunk(27 , 20)
        Call Warunk(19 , 20)
        Call Przedz
        Call Wys( "Volume:")
        Call Przelicz
        W_reg = Nast(5) - 60                                      ' przelicza wartosci binarne na odpowiadajace im wartosci dB
        W_reg = W_reg * 2
        Locate 2 , 1 : Lcd "Input: " : Lcd We : Lcd "    "
        If Nast(4) = 0 Then
         Lcd Chr(0) : Lcd Chr(2)
        Elseif Nast(4) = 1 Then
         Lcd Chr(1) : Lcd Chr(3)
        Elseif Nast(4) = 2 Then
         Lcd "-" : Lcd Chr(1) : Lcd Chr(3) : Lcd "-"
        Elseif Nast(4) = 3 Then
         Lcd "+" : Lcd Chr(1) : Lcd Chr(3) : Lcd "+"
        End If
        Call Regul
       End If
       W_reg = Nast(5) - 27                                       ' obliczanie odpowiednio balansu
       If Vl = 9 Then
        A = 0
       Else
        A = 10 - Vl
       End If
       W_reg = W_reg * A
       Xxx = W_reg / 10
       A = Xxx + 27
       W_reg = Nast(5) - 27
       If Vp = 9 Then
        C = 0
       Else
        C = 10 - Vp
       End If
       W_reg = W_reg * C
       Xxx = W_reg / 10
       C = Xxx + 27
       For Kod = 130 To 160 Step 30                               ' zapis danych do pamieci i procesora dzwieku
        Call Wyslij Kod , 2 , Nast(1)
        Call Wyslij Kod , 3 , Nast(2)
        Call Wyslij Kod , 0 , C
        Call Wyslij Kod , 1 , A
        Call Wyslij Kod , 8 , S
       Next Kod
       Call Wyslij 160 , 5 , Nast(3)
       Call Wyslij 160 , 6 , Nast(5)
       Call Wyslij 160 , 15 , 60
    End Sub
    
    Sub Wys (st As String * 8)                                    ' wyswietla na wyswietlaczu zmienna st
      Cls
      Lcd St
    End Sub
    
    Sub Regul                                                     ' dba o odpowiednie wyswietlanie ujemnych i dodatnich liczb
       If W_reg < -9 Then
          X = 12
       Elseif W_reg < 0 Then
          X = 13
       Elseif W_reg > 9 Then
          X = 13
       Elseif W_reg >= 0 Then
          X = 14
       End If
       Locate 1 , X : Lcd W_reg : Lcd "dB"
    End Sub
    
    Sub Przelicz                                                  ' przelicza wartosci binarne  bass i treble na odpow. im wart. w dB
      W_reg = Makedec(w_reg)
      If I = 1 Or I = 2 Then
       W_reg = Nast(i) * 3
       W_reg = W_reg - 18
      End If
    End Sub
    
    Sub Przedz                                                    ' okresla zakresy wyswietlanych liczb
      If Nast(i) = Wielk1 Then
        Nast(i) = Nast(i) - 1
      End If
      If Nast(i) = Wielk2 Then
        Nast(i) = Wielk2 + 1
      End If
    End Sub
    
    Sub Warunk(a As Byte , C As Byte )                            ' warunek dba o wyswietlanie odpowiednich wartosci glosnosci
      If Nast(i) = A Then
        Nast(i) = C
      End If
    End Sub
    
    Sub Wejscie                                                   ' przelacza wejscia 0 na 1 i odwrotnie
      If S.0 = 1 Then
        Reset S.0
      Else
        Set S.0
      End If
      Call Zmien
    End Sub
    
    Mute:                                                         ' przerwanie funkcji mute
     If S.5 = 0 Then
       Set S.5
     Else
       Reset S.5
     End If
     Call Zmien
     Bitwait P3.3 , Set
     Waitms 250
    Return
    
    Sub Wyslij (kod As Byte , Adres As Byte , Value As Byte)      ' wysyla dane przez i2c
       I2cstart
       I2cwbyte Kod
       I2cwbyte Adres
       I2cwbyte Value
       I2cstop
       Waitms 10
    End Sub
    
    Sub Read_i(adres As Byte , Value As Byte)                     ' odbiera dane i2c
       I2cstart
       I2cwbyte 160
       I2cwbyte Adres
       I2cstart
       I2cwbyte 161
       I2crbyte Value , 9
       I2cstop
    End Sub
    
    Timer1_int:                                                   ' dba o odpowiednie odliczenie czasu po ostatnim nacisnieciu przycisku
       Counter1 = 4150
       If Licz = 75 Then
         I = 5
       Call Zmien
       End If
       Incr Licz
       Start Timer1
    Return
    


    Kto by był dobry i dopisał pilota ?
  • REKLAMA
  • #2 3284044
    M. S.
    Poziom 34  
    Posty: 2107
    Pomógł: 259
    Ocena: 680
    1. Napisz podprogram do obsługi pilota - instrukcja Getrc5 (w przykładach do Bascoma powinien być wzór użycia Getrc5)
    2. Wywołaj podprogram obsługi pilota w pętli głównej jeśli końcówka uC podłączona do odbiornika podczerwieni będzie w stanie niskim - If Koncowkarc5 = 0 Then Gosub ...
    3. Zapamiętaj odczytaną komendę w zmiennej (XXX).
    4. Do instrukcji if then, która sprawdza stan przycisku dołóż warunek OR ...
    np. było If S1 = 0 Then ..., jest If S1 = 0 or XXX = ... Then ...
    5. Po wykorzystaniu zmiennej XXX ustaw ją np. na 255, inaczej znów nastąpi reakcja na nią i tak w kółko.

    Zmień warunki przy wszystkich instrukcjach badających stan klawiszy sterujących - instrukcje po if wykonają się w wyniku wciśnięcia klawisza lub (OR) w wyniku odebrania odpowiedniego kodu z pilota więc uzyskasz niezależne sterowanie z obu źródeł.

    Swoją drogą program jest zbyt mocno nafaszerowany funkcjami (to i stos chyba puchnie). Najbardziej rozbawiła mnie funkcja wyświetlania na LCD, ale być może tak trzeba. Zajmuję się uC i Bascomem od pewnego czasu i bazuję tylko na podprogramach (GOSUB) - jak do tej pory nie użyłem jeszcze funkcji, mimo że zapełniam pamięć w ATMEGA8 po brzegi.

    P.S. Kurcze, zmienna XXX jest już użyta w programe - wymyśl inną nazwę.
REKLAMA