'DTMF_odb9

Bascom

Jeśli posiadasz dwa radiotelefony, tak jak w tym przypadku na częstotliwość 433MHz i jeśli one posiadają wyjścia słuchawkowe oraz wejścia mikrofonowe, to mamy możliwość zbudowania sobie zdalnego sterowania różnymi urządzeniami.

Oczywiście radiotelefony mogą być na dowolną częstotliwość. Jeśli pochodzą z demobilu i możemy przy nich majstrować, to wejścia mikrofonowe i wyjścia słuchawkowe możemy dorobić.

Co możemy zdalnie załączać. Możemy np. przed pojechaniem na działkę załączyć ogrzewanie, możemy załączać kamerę i nagrywać obrazy w dowolnym czasie, itp. Pomysłów może być mnogość.

Radiotelefony Maycom, które widzimy na foto, mają jeszcze jedną ciekawą cechę, mogą potwierdzić przyjęcie polecenia. Mogą też prowadzić podsłuch pomieszczenia sprawdzając, czy istnieje ciągła łączność z bazą.

Załączanie i wyłączanie odbywa się na zasadzie sterowania tonami DTMF, takimi jak w telefonach. Potrzebny będzie nadajnik tonów DTMF (DTMF_nad9), który wysteruje gniazdo wejścia mikrofonu w radiotelefonie oraz odbiornik DTMF (DTMF_odb9), który dołączymy do gniazda słuchawkowego radiotelefonu.

Na schemacie widzimy modem, który dołączymy do wyjścia słuchawkowego radiotelefonu. Tony DTMF wchodzą do modemu w miejsce we DTMF. W zależności który przycisk PX został uruchomiony w nadajniku, włączy się odpowiedni kanał wyjściowy modemu. Kanałów jest osiem. Można do nich dołączać przekaźniki 12V, układy z triakiem załączające urządzenia sieciowe 230V i inne. Każdy kanał potrafi wysterować urządzenia pobierające prąd do 500mA.

Mikroprocesor Atmega8 sterowany jest programem, który widzimy pod schematem. Starałem się jak najdokładniej opisać jego działanie zarówno przy każdej procedurze, jak i pod programem. Jeśli starasz się samodzielnie pisać programy w Bascom, masz cierpliwość i poświęcisz czas, aby zrozumieć ten program, odniesiesz sukces, bo nie jest to program łatwy w napisaniu.

'DTMF_odb9.bas

'Odbiór DTMF.

'Program nadajnika: DTMF_nad9.bas.

'Z nadajnika odebrany sygnał przez MT8870, dalej kod BCD do Atmega8, potem do UDN2580 i wyjście kanału.

'Odpowiedni przycisk P w nadajniku, tutaj odpowiedni kanał wyjściowy.

'Jeden kanał uruchomi się po 5 tonach DTMF.

'Ponowne przyciśnięcie P w nadajniku powoduje wyłączenie tego samego kanału wyjściowego w odbiorniku.

'Lcd pokazuje włączony kanał numerX oraz w rugiej linii wyłączony kanał nrX.

'Ten program obsługuje tony DTMF od 1 do 9. Wysyłając sygnał jednego kanału, wysyłamy 5 tonów wybierając je z zakresu 1 do 9.

'Jeśli przypadkowo do odbiornika dotrze mniej niż 5 tonów, Timer1 wyzeruje zmienne i program będzie oczekiwał na 5 tonów.

'Procesor Atmega8.

'Pamięć zajęta w 47%.

'Schemat: DTMF_odb9.png

'Opracował Henryk Wydmuch.

'Fusebit ustawiony na 0011 (generator wewnętrzny RC 4MHz).

 

 $regfile = "m8def.dat"                                     'Dyrektywy dla kompilatora.

 $crystal = 4000000                                         'Oscylator o częstotliwości 4MHz.

 Config Lcd = 16 * 2

 Config Lcdpin = Pin , Db4 = Portd.2 , Db5 = Portb.6 , Db6 = Portd.4 , Db7 = Portb.7 , E = Portd.1 , Rs = Portd.0

 

 Config Timer1 = Timer , Prescale = 1                       'Tomer1 jako miernik czasu.

 Config Timer0 = Timer , Prescale = 64                      'Tomer0 jako miernik czasu, z podziałem wstępnym.

 Config Int1 = Rising                                       'Przerwanie zadziała od poziomu wysokiego.

 

  On Int1 Indo                                              'Włącz podprogram Indo przerwania INT1.

  On Timer1 Odblokowuj                                      'Podprogram Odblokowuj dla Timer1.

  On Timer0 Sekunda                                         'Podprogram Sekunda dla Timer0 (Led).

  Dim Przepelnienia_t0 As Byte                              'Deklarujemy 1 bajt dla zmiennej przepełnień.

 

  Enable Interrupts                                         'Zezwalaj na odblokowanie przerwań.

  Enable Timer0                                             'Odblokuj przerwanie Timer0.

  Enable Int1                                               'Odblokuj przerwanie INT1.

 

 Dim Przeptim1 As Byte

 Dim Il_dan_wtabl As Byte                                   'Deklaracje zmiennych.

 Dim Cyfra_wzmiennej As Byte                                '

 Dim Ind As Byte                                            '

 Dim I As Byte                                              '

 Dim Odp As Byte                                            '

 Dim Odp1 As Byte                                           '

  Dim Odp2 As Byte                                          '

   Dim Odp3 As Byte                                         '

    Dim Odp4 As Byte                                        '

     Dim Odp5 As Byte                                       '

 

 Deflcdchar 3 , 8 , 8 , 12 , 24 , 8 , 8 , 28 , 32           'Wpisano ł. (Ctrl+L)

 Deflcdchar 2 , 28 , 2 , 30 , 18 , 18 , 30 , 1 , 2          'Wpisano ą.

 

   Config Pind.3 = Input                                    'INT1

   Config Portb.5 = Output                                  'Led migająca.

   Set Portb.5

   Config Portb.1 = Output                                  'Tu poziom wysoki po prawidłowym wejściu BCD w DTMF (kanał wyjściowy).

   Set Portb.1

   Config Portb.2 = Output                                  'Tu poziom wysoki po prawidłowym wejściu BCD w DTMF (kanał wyjściowy).

   Set Portb.2

   Config Portc.0 = Output                                  'Tu poziom wysoki po prawidłowym wejściu BCD w DTMF (kanał wyjściowy).

   Set Portc.0

   Config Portc.1 = Output                                  'Tu poziom wysoki po prawidłowym wejściu BCD w DTMF (kanał wyjściowy).

   Set Portc.1

   Config Portc.2 = Output                                  'Tu poziom wysoki po prawidłowym wejściu BCD w DTMF (kanał wyjściowy).

   Set Portc.2

   Config Portc.3 = Output                                  'Tu poziom wysoki po prawidłowym wejściu BCD w DTMF (kanał wyjściowy).

   Set Portc.3

   Config Portc.4 = Output                                  'Tu poziom wysoki po prawidłowym wejściu BCD w DTMF (kanał wyjściowy).

   Set Portc.4

   Config Portc.5 = Output                                  'Tu poziom wysoki po prawidłowym wejściu BCD w DTMF (kanał wyjściowy).

   Set Portc.5

   Config Portb.3 = Output                                  'Dioda gotowości przyjęcia tonów D2.

 

   Config Pind.5 = Input                                    'Tu wchodzi kod D kodu BCD.

   Config Pind.6 = Input                                    'Tu wchodzi kod C kodu BCD.

   Config Pind.7 = Input                                    'Tu wchodzi kod B kodu BCD.

   Config Pinb.0 = Input                                    'Tu wchodzi kod A kodu BCD.

 

 A Alias Pinb.0                                             'Zmieniamy nazwy bitów Portów wejściowych.

 B Alias Pind.7                                             '

 C Alias Pind.6                                             '

 D Alias Pind.5                                             '

 

 Il_dan_wtabl = 9                                           'Określamy ile jest danych w Tabl.

  Cls                                                       'Czyść Lcd.

'-------------------------------------------------------------------------------

Do                                                          'Pętla główna.

 

'*******P1 w nadajniku, tu kanał 1*******

If Odp1 = 4 And Odp2 = 5 Then                               'Jeśli do odbiornika dotrze sygnał wysłany przyciskiem P1 (45832)...

If Odp3 = 8 And Odp4 = 3 Then                               '

If Odp5 = 2 Then                                            '

Toggle Portb.1                                              'Przełącz Portb.1 na poziom niski(ponownie ten sam sygnał, Port wysoki).

Gosub P1

 I = 0                                                      'Zeruj...

 Odp1 = 0                                                   '

 Odp2 = 0                                                   '

 Odp3 = 0                                                   '

 Odp4 = 0                                                   '

 Odp5 = 0                                                   '

 Odp = 0                                                    '

End If                                                      'Koniec warunków.

End If                                                      '

End If                                                      '

'*******P2 w nadajniku, tu kanał 2*******

If Odp1 = 4 And Odp2 = 5 Then                               '

If Odp3 = 3 And Odp4 = 2 Then                               '

If Odp5 = 7 Then                                            '

Toggle Portb.2                                              '

Gosub P2

 I = 0                                                      '

 Odp1 = 0                                                   '

 Odp2 = 0                                                   '

 Odp3 = 0                                                   '

 Odp4 = 0                                                   '

 Odp5 = 0                                                   '

 Odp = 0                                                    '

End If                                                      '

End If                                                      '

End If                                                      '

'*******P3 w nadajniku, tu kanał 3*******

If Odp1 = 4 And Odp2 = 5 Then                               '

If Odp3 = 6 And Odp4 = 3 Then                               '

If Odp5 = 2 Then                                            '

Toggle Portc.0                                              '

Gosub P3

 I = 0                                                      '

 Odp1 = 0                                                   '

 Odp2 = 0                                                   '

 Odp3 = 0                                                   '

 Odp4 = 0                                                   '

 Odp5 = 0                                                   '

 Odp = 0                                                    '

End If                                                      '

End If                                                      '

End If                                                      '

'*******P4 w nadajniku, tu kanał 4*******

If Odp1 = 4 And Odp2 = 6 Then                               '

If Odp3 = 1 And Odp4 = 3 Then                               '

If Odp5 = 5 Then                                            '

Toggle Portc.1                                              '

Gosub P4

 I = 0                                                      '

 Odp1 = 0                                                   '

 Odp2 = 0                                                   '

 Odp3 = 0                                                   '

 Odp4 = 0                                                   '

 Odp5 = 0                                                   '

 Odp = 0                                                    '

End If                                                      '

End If                                                      '

End If                                                      '

'*******P5 w nadajniku, tu kanał 5*******

If Odp1 = 4 And Odp2 = 6 Then                               '

If Odp3 = 1 And Odp4 = 9 Then                               '

If Odp5 = 3 Then                                            '

Toggle Portc.2                                              '

Gosub P5

 I = 0                                                      '

 Odp1 = 0                                                   '

 Odp2 = 0                                                   '

 Odp3 = 0                                                   '

 Odp4 = 0                                                   '

 Odp5 = 0                                                   '

 Odp = 0                                                    '

End If                                                      '

End If                                                      '

End If                                                      '

'*******P6 w nadajniku, tu kanał 6*******

If Odp1 = 4 And Odp2 = 6 Then                               '

If Odp3 = 3 And Odp4 = 1 Then                               '

If Odp5 = 4 Then                                            '

Toggle Portc.3                                              '

Gosub P6

 I = 0                                                      '

 Odp1 = 0                                                   '

 Odp2 = 0                                                   '

 Odp3 = 0                                                   '

 Odp4 = 0                                                   '

 Odp5 = 0                                                   '

 Odp = 0                                                    '

End If                                                      '

End If                                                      '

End If                                                      '

'*******P7 w nadajniku, tu kanał 7*******

If Odp1 = 4 And Odp2 = 7 Then                               '

If Odp3 = 2 And Odp4 = 1 Then                               '

If Odp5 = 4 Then                                            '

Toggle Portc.4                                              '

Gosub P7

 I = 0                                                      '

 Odp1 = 0                                                   '

 Odp2 = 0                                                   '

 Odp3 = 0                                                   '

 Odp4 = 0                                                   '

 Odp5 = 0                                                   '

 Odp = 0                                                    '

End If                                                      '

End If                                                      '

End If                                                      '

'*******P8 w nadajniku, tu kanał 8*******

If Odp1 = 4 And Odp2 = 7 Then                               '

If Odp3 = 1 And Odp4 = 2 Then                               '

If Odp5 = 4 Then                                            '

Toggle Portc.5                                              '

Gosub P8

 I = 0                                                      '

 Odp1 = 0                                                   '

 Odp2 = 0                                                   '

 Odp3 = 0                                                   '

 Odp4 = 0                                                   '

 Odp5 = 0                                                   '

 Odp = 0                                                    '

End If                                                      '

End If                                                      '

End If                                                      '

'****************************************

'-------------------------------------------------------------------------------

If A = 1 Then                                               'Jeśli do Portu wejściowego Portb.0 wszedł impuls dodatni.

  Odp = 1                                                   'Do zmiennej Odp załaduj 1.

  End If                                                    'Koniec warunku.

 

  If B = 1 Then                                             '

  Odp = 2                                                   '

  End If                                                    '

 

  If A = 1 And B = 1 Then                                   'Jeśli do Portu A i B weszły impulsy dodatnie.

  Odp = 3                                                   'Do Odp załaduj 3(bo A+B=3).

  End If                                                    '

 

  If C = 1 Then                                             '

  Odp = 4                                                   '

  End If                                                    '

 

  If A = 1 And C = 1 Then                                   '

  Odp = 5                                                   '

  End If                                                    '

 

  If B = 1 And C = 1 Then                                   '

  Odp = 6                                                   '

  End If                                                    '

 

  If A = 1 Then                                             '

  If B = 1 And C = 1 Then                                   '

  Odp = 7                                                   '

  End If                                                    '

  End If                                                    '

 

  If D = 1 Then                                             '

  Odp = 8                                                   '

  End If                                                    '

 

  If A = 1 And D = 1 Then                                   '

  Odp = 9                                                   '

  End If                                                    '

 

'-------------------------------------------------------------------------------

Select Case I                                               'Przeglądaj I (zmienia się w podprogramie Ind).

 

Case 1 : Ind = Lookdown(odp , Tabl , Il_dan_wtabl)          'Jeśli I ma 1, poszukaj w Tabl, na którym miejscu jest taka cyfra, jak w Odp.

Odp1 = Ind                                                  'Przy I=1 załaduj do Odp1 wartość Ind.

 

Case 2 : Ind = Lookdown(odp , Tabl , Il_dan_wtabl)          'Jeśli I ma 2...

Odp2 = Ind                                                  '

 

Case 3 : Ind = Lookdown(odp , Tabl , Il_dan_wtabl)          '

Odp3 = Ind                                                  '

 

Case 4 : Ind = Lookdown(odp , Tabl , Il_dan_wtabl)          '

Odp4 = Ind                                                  '

 

Case 5 : Ind = Lookdown(odp , Tabl , Il_dan_wtabl)          '

Odp5 = Ind                                                  '

 

End Select                                                  'Koniec przyglądania się I.

'-------------------------------------------------------------------------------

'******Tu sprawdzisz jakie cyfry przychodzą z nadajnika*******

'Home

'Lcd Odp1 ; Odp2 ; Odp3 ; Odp4 ; Odp5;

'*************************************************************

 

'****procedura odblokowująca procesor, gdy przyjdzie mniej niż 5 tonów****

If Pind.3 = 1 Then                                          'Jeśli na wejściu INT1 jest poziom wysoki (pojawił się ton DTMF).

Enable Timer1                                               'Odblokuj Timer1

Set Portb.3                                                 'Wyłącz Led D2.

Else                                                        'W przeciwnym razie, gdy If Pind.3 = 0

If Przeptim1 = 1 Then                                       'Jeśli było jedno przepełnienie Timer1.

 I = 0                                                      'Wyzeruj zmienne...

 Odp1 = 0                                                   '

 Odp2 = 0                                                   '

 Odp3 = 0                                                   '

 Odp4 = 0                                                   '

 Odp5 = 0                                                   '

 Odp = 0                                                    '

 Przeptim1 = 0                                              '

 Disable Timer1                                             'Już nie zezwalaj na przerwanie Timer1.

 Reset Portb.3                                              'Zaświeć Led D2.

 End If                                                     'Koniec warunków.

End If                                                      '

'**************************************************************************

Waitms 10                                                   'Zatrzymuj pętlę, aby zdążyły naładować się zmienne.

Loop                                                        'Powtarzaj pętlę.

 End                                                        'Koniec pętli.

 

 '------------------------------------------------------------------------------

Sekunda:                                                    'Podprogram przerwania (migania diody).

  Incr Przepelnienia_t0                                     'Zwiększaj zawartość zmiennej.

  If Przepelnienia_t0 = 255 Then                            '20 przepełnień, szybkość migania Led D1.

   Przepelnienia_t0 = 0                                     'Zeruj zmienną.

  Toggle Portb.5                                            'Zamień poziom Portb.5 na niski (Led D1).

 End If                                                     ' Koniec warunku.

Return                                                      'Wróć do programu.

'-------------------------------------------------------------------------------

Odblokowuj:                                                 'Podprogram Timer1.

 Incr Przeptim1                                             'Po każdym przepełnieniu Timer1 powiększ zmienną Przeptim1.

Return                                                      'Wracaj do programu.

'-------------------------------------------------------------------------------

Indo:                                                       'Podprogram przerwania INT1.

Incr I                                                      'Po każdym sygnale wysokim na INT1 powiększ I.

Return                                                      'Wracaj do programu.

'-------------------------------------------------------------------------------

P1:                                                         'Podprogram dla Lcd kanału P1.

If Pinb.1 = 0 Then                                          'Jeśli Portb.1 jest załączony.

Locate 1 , 1                                                'Pierwsza linia, pozycja 1.

Lcd "Za" ; Chr(3) ;                                         'Zał.

Locate 1 , 5                                                'Pierwsza linia Lcd, 5 pozycja.

Lcd "1"                                                     'Pokaż nr kanału 1.

Locate 2 , 5                                                'Druga linia Lcd, 5 pozycja.

Lcd " "                                                     'Wytnij numer kanału.

Else                                                        'Po wyłączeniu kanału (If Portb.1 = 1 Then).

Locate 2 , 1                                                'W drugiej linii, pozycja 1.

Lcd "Wy" ; Chr(3) ;                                         'Wył.

Locate 2 , 5                                                'Druga linia, pozycja 5.

Lcd "1"                                                     'Pokaż 1.

Locate 1 , 5                                                'Pierwsza linia, pozycja 5.

Lcd " "                                                     'Wytnij numer kanału.

End If                                                      'Koniec warunku If Portb.1 = 0.

Return                                                      'Wracaj.

 

'-------------------------------------------------------------------------------

P2:                                                         'Podprogram dla Lcd kanału P2.

If Portb.2 = 0 Then                                         'Jeśli Portb.2 jest załączony.

Locate 1 , 1                                                'Pierwsza linia, pozycja 1.

Lcd "Za" ; Chr(3) ;                                         'Zał.

Locate 1 , 6                                                'Pierwsza linia Lcd, 6 pozycja.

Lcd "2"                                                     'Pokaż nr kanału 2.

Locate 2 , 6                                                'Druga linia Lcd, 6 pozycja.

Lcd " "                                                     'Wytnij numer kanału.

Else                                                        'Po wyłączeniu kanału (If Portb.2 = 1 Then).

Locate 2 , 1                                                'W drugiej linii, pozycja 1.

Lcd "Wy" ; Chr(3) ;                                         'Wył.

Locate 2 , 6                                                'Druga linia, pozycja 6.

Lcd "2"                                                     'Pokaż 2.

Locate 1 , 6                                                'Pierwsza linia, pozycja 6.

Lcd " "                                                     'Wytnij numer kanału.

End If                                                      'Koniec warunku If Portb.2 = 0.

Return                                                      'Wracaj.

 

'-------------------------------------------------------------------------------

P3:                                                         'Podprogram dla Lcd kanału P3.

If Pinc.0 = 0 Then                                          'Jeśli Portc.0 jest załączony.

Locate 1 , 1                                                'Pierwsza linia, pozycja 1.

Lcd "Za" ; Chr(3) ;                                         'Zał.

Locate 1 , 7                                                'Pierwsza linia Lcd, 6 pozycja.

Lcd "3"                                                     'Pokaż nr kanału 3.

Locate 2 , 7                                                'Druga linia Lcd, 7 pozycja.

Lcd " "                                                     'Wytnij numer kanału.

Else                                                        'Po wyłączeniu kanału (If Portc.0 = 1 Then).

Locate 2 , 1                                                'W drugiej linii, pozycja 1.

Lcd "Wy" ; Chr(3) ;                                         'Wył.

Locate 2 , 7                                                'Druga linia, pozycja 7.

Lcd "3"                                                     'Pokaż 3.

Locate 1 , 7                                                'Pierwsza linia, pozycja 7.

Lcd " "                                                     'Wytnij numer kanału.

End If                                                      'Koniec warunku If Portc.0 = 0.

Return                                                      'Wracaj.

 

'-------------------------------------------------------------------------------

P4:                                                         'Podprogram dla Lcd kanału P4.

If Pinc.1 = 0 Then                                          'Jeśli Portc.1 jest załączony.

Locate 1 , 1                                                'Pierwsza linia, pozycja 1.

Lcd "Za" ; Chr(3) ;                                         'Zał.

Locate 1 , 8                                                'Pierwsza linia Lcd, 8 pozycja.

Lcd "4"                                                     'Pokaż nr kanału 4.

Locate 2 , 8                                                'Druga linia Lcd, 8 pozycja.

Lcd " "                                                     'Wytnij numer kanału.

Else                                                        'Po wyłączeniu kanału (If Portc.1 = 1 Then).

Locate 2 , 1                                                'W drugiej linii, pozycja 1.

Lcd "Wy" ; Chr(3) ;                                         'Wył.

Locate 2 , 8                                                'Druga linia, pozycja 8.

Lcd "4"                                                     'Pokaż 4.

Locate 1 , 8                                                'Pierwsza linia, pozycja 8.

Lcd " "                                                     'Wytnij numer kanału.

End If                                                      'Koniec warunku If Portc.1 = 0.

Return                                                      'Wracaj.

 

'-------------------------------------------------------------------------------

P5:                                                         'Podprogram dla Lcd kanału P5.

If Pinc.2 = 0 Then                                          'Jeśli Portc.2 jest załączony.

Locate 1 , 1                                                'Pierwsza linia, pozycja 1.

Lcd "Za" ; Chr(3) ;                                         'Zał.

Locate 1 , 9                                                'Pierwsza linia Lcd, 9 pozycja.

Lcd "5"                                                     'Pokaż nr kanału 5.

Locate 2 , 9                                                'Druga linia Lcd, 9 pozycja.

Lcd " "                                                     'Wytnij numer kanału.

Else                                                        'Po wyłączeniu kanału (If Portc.2 = 1 Then).

Locate 2 , 1                                                'W drugiej linii, pozycja 1.

Lcd "Wy" ; Chr(3) ;                                         'Wył.

Locate 2 , 9                                                'Druga linia, pozycja 9.

Lcd "5"                                                     'Pokaż 5.

Locate 1 , 9                                                'Pierwsza linia, pozycja 9.

Lcd " "                                                     'Wytnij numer kanału.

End If                                                      'Koniec warunku If Portc.2 = 0.

Return                                                      'Wracaj.

 

'-------------------------------------------------------------------------------

P6:                                                         'Podprogram dla Lcd kanału P6.

If Pinc.3 = 0 Then                                          'Jeśli Portc.3 jest załączony.

Locate 1 , 1                                                'Pierwsza linia, pozycja 1.

Lcd "Za" ; Chr(3) ;                                         'Zał.

Locate 1 , 10                                               'Pierwsza linia Lcd, 10 pozycja.

Lcd "6"                                                     'Pokaż nr kanału 6.

Locate 2 , 10                                               'Druga linia Lcd, 10 pozycja.

Lcd " "                                                     'Wytnij numer kanału.

Else                                                        'Po wyłączeniu kanału (If Portc3 = 1 Then).

Locate 2 , 1                                                'W drugiej linii, pozycja 1.

Lcd "Wy" ; Chr(3) ;                                         'Wył.

Locate 2 , 10                                               'Druga linia, pozycja 10.

Lcd "6"                                                     'Pokaż 6.

Locate 1 , 10                                               'Pierwsza linia, pozycja 10.

Lcd " "                                                     'Wytnij numer kanału.

End If                                                      'Koniec warunku If Portc.3 = 0.

Return                                                      'Wracaj.

 

'-------------------------------------------------------------------------------

P7:                                                         'Podprogram dla Lcd kanału P7.

If Pinc.4 = 0 Then                                          'Jeśli Portc.4 jest załączony.

Locate 1 , 1                                                'Pierwsza linia, pozycja 1.

Lcd "Za" ; Chr(3) ;                                         'Zał.

Locate 1 , 11                                               'Pierwsza linia Lcd, 11 pozycja.

Lcd "7"                                                     'Pokaż nr kanału 7.

Locate 2 , 11                                               'Druga linia Lcd, 11 pozycja.

Lcd " "                                                     'Wytnij numer kanału.

Else                                                        'Po wyłączeniu kanału (If Portc.4 = 1 Then).

Locate 2 , 1                                                'W drugiej linii, pozycja 1.

Lcd "Wy" ; Chr(3) ;                                         'Wył.

Locate 2 , 11                                               'Druga linia, pozycja 11.

Lcd "7"                                                     'Pokaż 7.

Locate 1 , 11                                               'Pierwsza linia, pozycja 11.

Lcd " "                                                     'Wytnij numer kanału.

End If                                                      'Koniec warunku If Portc.4 = 0.

Return                                                      'Wracaj.

 

'-------------------------------------------------------------------------------

P8:                                                         'Podprogram dla Lcd kanału P8.

If Pinc.5 = 0 Then                                          'Jeśli Portc.5 jest załączony.

Locate 1 , 1                                                'Pierwsza linia, pozycja 1.

Lcd "Za" ; Chr(3) ;                                         'Zał.

Locate 1 , 12                                               'Pierwsza linia Lcd, 12 pozycja.

Lcd "8"                                                     'Pokaż nr kanału 8.

Locate 2 , 12                                               'Druga linia Lcd, 12 pozycja.

Lcd " "                                                     'Wytnij numer kanału.

Else                                                        'Po wyłączeniu kanału (If Portc.5 = 1 Then).

Locate 2 , 1                                                'W drugiej linii, pozycja 1.

Lcd "Wy" ; Chr(3) ;                                         'Wył.

Locate 2 , 12                                               'Druga linia, pozycja 12.

Lcd "8"                                                     'Pokaż 8.

Locate 1 , 12                                               'Pierwsza linia, pozycja 12.

Lcd " "                                                     'Wytnij numer kanału.

End If                                                      'Koniec warunku If Portc.5 = 0.

Return                                                      'Wracaj.

'-------------------------------------------------------------------------------

Tabl:                                                       'Nazwa tablicy.

Data 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9                      'Na pierwszym miejscu jest 1, na piątym jest 5 itd.

'-------------------------------------------------------------------------------

'Objaśnienia:

 'Jak działa przerwanie INT1.

 'Wybieramy przerwanie INT1 lub INT0 (Portd.3 lub Portd.2).

 'Wybraliśmy INT1.

 'Konfigurujemy: Config Int1 = Rising. Będzie reagował od poziomu wysokiego.

 'Włączamy podprogram On Int1 Indo (wybraliśmy nazwę Indo).

 'Zezwalamy na działanie przerwania: Enable Int1.

 'Teraz, jeśli w Portd.3 pojawi się poziom wysoki, program skoczy do Indo i załaduje do I 1, potem 2 itd.

 'Zmienna I pokazuje nam, który kolejny ton DTMF się pojawił. Pojawia się ich zawsze po 5 dla każdego kanału wykonawczego.

 'Sprawdzanie zmiennej I odbywa się w Selct Case I.

 'Po każdym tonie DTMF, gdy np. I=2 (Case 2), Ind = Lookdown(odp , Tabl , Il_dan_wtabl), instrukcja Lookdown

 'sprawdzi w Tabl na którym miejscu jest ta sama cyfra co w Odp. Znajdzie, że 2 jest w miejscu 2. Tę cyfrę zapisze do Ind.

 'Teraz zawartość Ind przepisana zostanie do Odp2.

 'Mamy do dyspozycji: Odp1, Odp2, Odp3, Odp4, Odp5, czyli do każdego tonu DTMF jedną zmienną.

 'Na koniec, pętla sprawdza, w jakiej kolejności i jakie tony przyszły (np. If Odp2 = 8 And Odp4 = 3 Then),

 'jeśli są zgodne z przyciskiem Px w nadajniku, załączony zostanie odpowiedni kanał (Toggle Portb.2).

 

 'Jak działa tablica Tabl.

 'Zdecydowaliśmy, że tablica będzie zawierać 9 cyfr. Wybieramy jej dowolną nazwę, tu Tabl.

 'Te 9 cyfr, to pochodne kodu BCD. Kod BCD pojawia się na wyjściu MT8870 i skierowany jest do Us1, do Portów A, B, C, D.

 'Us2 zamienia przychodzące tony DTMF na impulsy kodu BCD. Przykład: odebrany ton A kodu BCD spowoduje

 'następujące poziomy na wyjściach BCD: A=1, B=0, C=0, D=0.

 'Gdy przyjdzie ton DTMF 3, na wyjściach BCD pojawią się poziomy: A=1, B=1, C=0, D=0. Jak Us1 wie, że to jest 3?.

 'Zsumuje A i B, bo w kodzie BCD: A=1, B=2, C=4, D=8. Więc A+B=3.

 'Pętla Do obserwuje Porty wejściowe A, B, C, D. Jeśli na wejściu A pojawi się 1 (poziom wysoki), na B=1, a na pozostałych

 'pozostaną poziomy niskie, pętla zapisze do zmiennej Odp adekwatną liczbę, tutaj cyfrę 3.

 'Sprawdzi tę cyfrę z tablicą Tabl i otrzyma wynik, że jest ona na pozycji 3, zapisze ją do zmiennej Ind i jeśli

 'I=3 przepisze Ind do zmiennej Odp3, jeśli I=2 przepisze Ind do zmiennej Odp2 itd.

 'Gdy mamy już w zmiennych Odp1-5 odpowiednie wartości, pętla Do może teraz czuwać nad tym, w jakiej kolejności i na którym

 'wejściu A, B, C, D pojawią się poziomy wysokie, załączając odpowiedni Port wyjściowy (Portb.1), czli kanał wyjściowy 1-8.

 

 'Jak zapobiec zablokowania programu, gdy nie zostaną rozpoznane tony DTMF, albo będzie ich mniej niż 5.

 'Bez procedury zapobiegającej, po przyjściu tylko jednego tonu, program oczekiwałby na następne,

 'blokując w ten sposób swoje działanie.

 'Został uruchomiony Timer1 jako miernik czasu.

 'Chwilę po ustaniu tonu na wejściu INT1, zmienne zostaną wyzerowane i program będzie gotów do przyjęcia prawidłowych tonów.

 'Zaświeci dioda Led D2 pokazując gotowość programu do przyjęcia tonów.

 'Jeśli dotrze prawidłowo 5 tonów, program będzie gotów natychmiast po ustaniu ostatniego do przyjęcia następnych

 'nawet, gdy jeszcze nie zaświeciła D2, bo po piątym, prawidłowym tonie, następuje również zerowanie zmiennych.

 'Koniec.