Odpowiedz 
 
Ocena wątku:
  • 4 Głosów - 5 Średnio
  • 1
  • 2
  • 3
  • 4
  • 5
Sterownik DTMF (PUK 2011)
SQ9MDD Offline
Rysiek
****

Liczba postów: 378
Dołączył: 01-02-2009
Post: #1
Copyleft Sterownik DTMF (PUK 2011)
Na tegoroczny konkurs PUK, czyli przydatne urządzenie krótkofalarskie przygotowałem prosty sterownik DTMF. Sterownik ten może być wykorzystany do sterowania wszelkimi urządzeniami do których jest utrudniony dostęp. W zamierzeniu powstał jako urządzenie do kontrolowania przemiennika, oraz komputerów obsługujących Echolink i Igate w sieci APRS. Urządzenie jest prostym rozwiązaniem opartym o sprzętowe dekodowanie DTMF-u oraz najpopularniejszy procesor ATTiny 2313. Projekt jest udostępniany na licencji GPL.
Sterownik może kontrolować maksymalnie do 6-ciu urządzeń i składa się z płytki podstawowej (3 linie) oraz płytki rozszerzeń (kolejne 3 linie). Funkcje sterowania są zabezpieczone cztero cyfrowym pinem.
Sterownik ten dzięki udostępnieniu źródeł może posłużyć jako baza do konstruowania innych urządzeń, lub do zaimplementowania w swoim rozwiązaniu części funkcjonalności.

W projekcie przewidziałem możliwość rozszerzenia funkcjonalności poprzez rozbudowę o port RS-232 i możliwość wyrzucania tam, zdekodowanych kodów DTMF, na przykład do sterowania Echolinkiem. Jeśli jest ktos chętny to zapraszam do rozbudowy i opisania tego na forum.

Wszystkie pliki źródłowe można pobrać ze strony: sq9mdd.qrz.pl

Film prezentujący działanie sterownika.

Poniżej źródło programu a w załącznikach rysunki płytek w SprintLayout

Kod:
'-------------------------------------------------------------------------------
'      DTMF  Controler DC1  v.1.2 Stable
'
'
'      SQ9MDD <rlabus@luxmat.com> 2011
'
'      This program is free software; you can redistribute it and/or modify
'      it under the terms of the GNU General Public License as published by
'      the Free Software Foundation; either version 2 of the License, or
'      (at your option) any later version.
'
'      This program is distributed in the hope that it will be useful,
'      but WITHOUT ANY WARRANTY; without even the implied warranty of
'      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
'      GNU General Public License for more details.
'
'      You should have received a copy of the GNU General Public License
'      along with this program; if not, write to the Free Software
'      Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
'      MA 02110-1301, USA.
'-------------------------------------------------------------------------------
' ustawienia kompilatora i konfiguracja
$regfile = "Attiny2313.dat"
$crystal = 4000000
$hwstack = 32
$swstack = 0
$framesize = 50
'-------------------------------------------------------------------------------
'konfiguracja portów, patrz schemat
Config Portb.0 = Output  'L6  Conn 3
Config Portb.1 = Output  'L5
Config Portb.2 = Output  'L4
Config Portb.3 = Output  'func led
Config Portb.4 = Input   'Q4
Config Portb.5 = Input   'Q3
Config Portb.6 = Input   'Q2
Config Portb.7 = Input   'Q1

Config Portd.0 = Output  'RS 232
Config Portd.1 = Output  'RS 232
Config Portd.2 = Input   'StD
Config Portd.3 = Input   'ResetKey
Config Portd.4 = Output  'L1
Config Portd.5 = Output  'L2
Config Portd.6 = Output  'L3

Config Porta.0 = Output  'UNUSED
Config Porta.1 = Output  'UNUSED

Portb = &B00000000
Portd = &B0001000        'ResetKey domyślnie w stanie wysokim

L1 Alias Portd.4
L2 Alias Portd.5
L3 Alias Portd.6
L4 Alias Portb.2
L5 Alias Portb.1
L6 Alias Portb.0

Q1 Alias Pinb.7
Q2 Alias Pinb.6
Q3 Alias Pinb.5
Q4 Alias Pinb.4

Funcled Alias Portb.3
Resetkey Alias Pind.3

Dim Cyfra As Integer
Dim Kod As String * 8
Dim Znak As String * 1
Dim Pin As String * 4
Dim Mypin As String * 4
Dim Savedpin As Eram String * 4
Dim Temppin As String * 4
Dim Linia As String * 1
Dim Akcja As String * 1
Dim Zmianapinu As Bit

Enable Interrupts        'odpalam przerwania
Config Int0 = Rising     'reagujemy na zbocze narastajace
Enable Int0
On Int0 Dtmfin           'jesli przyjdzie sygnal ze zdekodowano dtmf odpalamy procedure dtmfin
'-------------------------------------------------------------------------------
'inicjalizacja programu zczytuje zapisany pin
Zmianapinu = 0
Cyfra = 0
Mypin = Savedpin         'wczytuje pin z eepromu
Wait 5
'wlasciwa petla
  Do
   If Resetkey = 0 Then  'procedurk resetu i ustawienia domyslnego pinu
      Funcled = 1
      Wait 5             'po pieciu sekundach od zwarcia zworki reset sprawdzam czy nadal jest zwarta jesli tak to wykonuje akcje.
      If Resetkey = 0 Then
         Mypin = "2222"  'ustawiamy domyslny pin w urzadzeniu
         Savedpin = "2222"
         Funcled = 0
         Wait 5
      End If
   End If
  Loop

End                      'koniec programu glównego
'-------------------------------------------------------------------------------
Dtmfin:
      Cyfra = 0          ' reset cyfry zaczynamy od zera
      Waitms 5           ' czekamy czy nadal jest kod

      If Q1 = 1 Then     ' zamiana binarki z 8870 na dziesietne
         Cyfra = Cyfra + 1
      End If
      If Q2 = 1 Then
         Cyfra = Cyfra + 2
      End If
      If Q3 = 1 Then
         Cyfra = Cyfra + 4
      End If
      If Q4 = 1 Then
         Cyfra = Cyfra + 8
      End If

      Znak = Lookupstr(cyfra , Kody)       ' zamiana cyferek na string z liczbami
      If Znak = "#" Then ' znaki specjalne resetuja bufor
         Kod = ""
         Znak = ""
         Zmianapinu = 1
      End If
      If Znak = "*" Then ' znaki specjalne resetuja bufor
         Kod = ""
         Znak = ""
         Zmianapinu = 0
      End If
      Kod = Kod + Znak   ' tutaj sklejam stringa z poszczegolnych znakow

   If Zmianapinu = 0 Then
      If Len(kod) = 6 Then       ' jesli string ma 6 znakow przystepujemy do analizy
         Pin = Left(kod , 4)       ' wycinamy PIN
         Linia = Mid(kod , 5 , 1)       ' wycinamy ktora linia bedziemy sterowac
         Akcja = Right(kod , 1)       ' wycinamy jaka akcja
         Kod = ""
         If Pin = Mypin Then       ' jesli pin jest ok przystepujemy do dzialania
            If Linia = "1" Then
              If Akcja = "1" Then       'wlacz
                  L1 = 1
              Elseif Akcja = "0" Then       'wylacz
                  L1 = 0
              Elseif Akcja = "2" Then       'reset
                  L1 = 1
                  Wait 30
                  L1 = 0
              End If
            Elseif Linia = "2" Then
              If Akcja = "1" Then
                  L2 = 1
              Elseif Akcja = "0" Then
                  L2 = 0
              Elseif Akcja = "2" Then
                  L2 = 1
                  Wait 30
                  L2 = 0
              End If
            Elseif Linia = "3" Then
              If Akcja = "1" Then
                  L3 = 1
              Elseif Akcja = "0" Then
                  L3 = 0
              Elseif Akcja = "2" Then
                  L3 = 1
                  Wait 30
                  L3 = 0
              End If
            Elseif Linia = "4" Then
              If Akcja = "1" Then
                  L4 = 1
              Elseif Akcja = "0" Then
                  L4 = 0
              Elseif Akcja = "2" Then
                  L4 = 1
                  Wait 30
                  L4 = 0
              End If
            Elseif Linia = "5" Then
              If Akcja = "1" Then
                  L5 = 1
              Elseif Akcja = "0" Then
                  L5 = 0
              Elseif Akcja = "2" Then
                  L5 = 1
                  Wait 30
                  L5 = 0
              End If
            Elseif Linia = "6" Then
              If Akcja = "1" Then
                  L6 = 1
              Elseif Akcja = "0" Then
                  L6 = 0
              Elseif Akcja = "2" Then
                  L6 = 1
                  Wait 30
                  L6 = 0
              End If
            Elseif Linia = "9" Then       'obsluga wszystkich linii jednoczesnie
               If Akcja = "1" Then
                  L1 = 1
                  L2 = 1
                  L3 = 1
                  L4 = 1
                  L5 = 1
                  L6 = 1
               Elseif Akcja = "0" Then
                  L1 = 0
                  L2 = 0
                  L3 = 0
                  L4 = 0
                  L5 = 0
                  L6 = 0
               Elseif Akcja = "2" Then
                  L1 = 1
                  L2 = 1
                  L3 = 1
                  L4 = 1
                  L5 = 1
                  L6 = 1
                  Wait 30
                  L1 = 0
                  L2 = 0
                  L3 = 0
                  L4 = 0
                  L5 = 0
                  L6 = 0
               End If
            End If
         End If
         Gosub Komendaok
      End If
   Elseif Zmianapinu = 1 Then       'procedura zmiany pinu
      If Len(kod) = 8 Then       'dlugosc dwoch pinow
         Pin = Left(kod , 4)       'stary pin
         If Pin = Mypin Then       'jesli obecny pin zgadza sie z zapamietanym
            Temppin = Right(kod , 4)
            Savedpin = Temppin
            Mypin = Temppin
         End If
      End If
   End If
Return

Komendaok:
   Funcled = 1
   Waitms 125
   Funcled = 0
   Waitms 50
   Funcled = 1
   Waitms 125
   Funcled = 0
Return

Komendaerr:
   Funcled = 1
   Waitms 300
   Funcled = 0
Return

Kody:
Data "D" , "1" , "2" , "3" , "4" , "5" , "6" , "7" , "8" , "9" , "0" , "*" , "#" , "A" , "B" , "C"
'-------------------------------------------------------------------------------


Załączone pliki
.pdf  dokumentacja-v.1.1.pdf (Rozmiar: 2.19 MB / Pobrań: 1313)
.lay  20110709-main.LAY (Rozmiar: 140.4 KB / Pobrań: 434)
.lay  20110709-extend.LAY (Rozmiar: 54.01 KB / Pobrań: 450)

...przede wszystkim nie zakłócać...
11-09-2011 9:52
Odwiedź stronę użytkownika Znajdź wszystkie posty użytkownika Odpowiedz cytując ten post
SQ9MDD Offline
Rysiek
****

Liczba postów: 378
Dołączył: 01-02-2009
Post: #2
RE: Sterownik DTMF (PUK 2011)
Dzisiaj w klubie SP5ZDH Jacek SP9HYX i Tomek SQ9ATC zaprezentowali przemiennik SR9NJ, w którym po raz pierwszy zastosowany został Sterownik DTMF.
Oprócz sterowania własnym nadajnikiem przemiennik ten będzie kontrolował digipiter SR9NWJ i przemiennik D-Star SR9UVJ.

Krótki filmik nakręcony w SP5ZDH

...przede wszystkim nie zakłócać...
05-10-2011 23:18
Odwiedź stronę użytkownika Znajdź wszystkie posty użytkownika Odpowiedz cytując ten post
SQ6OXK Online
Paweł
****

Liczba postów: 317
Dołączył: 23-06-2010
Post: #3
RE: Sterownik DTMF (PUK 2011)
Może się czepiam ale:

1) w dokumentacja używasz trzech oznaczeń dla dekodera DTMF, występuje od jako MT8870, CMD8870PI lub CM8870. Warto by było to ujednolicić.
2) w dokumentacji używasz oznaczenia dla przekaźników jako L1 ÷ L6, co bardziej kojarzy się jako cewka (sama cewka), a nie przekaźnik. Powinieneś chyba oznaczyć je jako np PK1 ÷ PK6 lub K1 ÷ K6.

--= SWL SP6-01-396 =--
09-10-2011 22:25
Znajdź wszystkie posty użytkownika Odpowiedz cytując ten post
SQ6ADE Offline
Radjoamator.
****

Liczba postów: 452
Dołączył: 05-04-2010
Post: #4
RE: Sterownik DTMF (PUK 2011)
Ten scalak dekodera występuje pod wieloma nazwami.
Podobnie jak przyjazny BASowi HD44780.
Jest bardzo popularny. Ostatnio wylutowywałem z jakiegoś grata kompatybilny
układ od producenta Sierra (SC-cośtam-niepamiętam).

qrv FM 145,250/70,260/sr6r/sr6wr/inne lokalne RPT
09-10-2011 22:56
Odwiedź stronę użytkownika Znajdź wszystkie posty użytkownika Odpowiedz cytując ten post
SQ9MDD Offline
Rysiek
****

Liczba postów: 378
Dołączył: 01-02-2009
Post: #5
RE: Sterownik DTMF (PUK 2011)
(09-10-2011 22:25)SQ6OXK napisał(a):  Może się czepiam ale:

1) w dokumentacja używasz trzech oznaczeń dla dekodera DTMF, występuje od jako MT8870, CMD8870PI lub CM8870. Warto by było to ujednolicić.
No tak można by napisać MT8870 i w tekście albo liście elementów podać zamienniki.

(09-10-2011 22:25)SQ6OXK napisał(a):  2) w dokumentacji używasz oznaczenia dla przekaźników jako L1 ÷ L6, co bardziej kojarzy się jako cewka (sama cewka), a nie przekaźnik. Powinieneś chyba oznaczyć je jako np PK1 ÷ PK6 lub K1 ÷ K6.

Hm... chyba masz rację że oznaczenie "PK" było by sensowniejsze. "L" miało być skrótem od "Linia".
Chyba użyłem sobie tylko znanego skrótu myślowego. Dokumentacja zapewne była by lepsza gdyby ktoś mi na to zwrócił uwagę wcześniej. Jednakże trzymając się wytycznych konkursu (o tym że projekt nie miał być publikowany nigdzie wcześniej), pracowałem nad tym sam.

W wolnej chwili poprawię te dwa punkty Wink

...przede wszystkim nie zakłócać...
10-10-2011 10:02
Odwiedź stronę użytkownika Znajdź wszystkie posty użytkownika Odpowiedz cytując ten post
SQ6OXK Online
Paweł
****

Liczba postów: 317
Dołączył: 23-06-2010
Post: #6
RE: Sterownik DTMF (PUK 2011)
Krzysiu powiem Ci że ja np znalazłem dokumentację chyba tylko jako CD8870, co mnie dziwiło bo nie miewałem wcześnie kłopotów ze znajdowanie takich rzeczy. Oczywiście domyślam się że chodzi oczywiście o klony te układu, no ale chyba w dokumentacji warto posługiwać się jednym.

Ryśku, no my tylko recenzujemy ją dla Ciebie, chyba nie można tego uznać za publikację, tym bardziej że najpierw zastrzegłeś że urządzenie staruje do konkursu, a później się podzieliłeś dokumentacją, a nie odwrotnie.

A czy pomoc w korekcie programu to też naruszenie zasad konkursu?

--= SWL SP6-01-396 =--
10-10-2011 20:43
Znajdź wszystkie posty użytkownika Odpowiedz cytując ten post
SQ9MDD Offline
Rysiek
****

Liczba postów: 378
Dołączył: 01-02-2009
Post: #7
RE: Sterownik DTMF (PUK 2011)
(10-10-2011 20:43)SQ6OXK napisał(a):  A czy pomoc w korekcie programu to też naruszenie zasad konkursu?

No nie wiem miało być nie publikowane to nie publikowałem i tyle.
Zmiany wprowadzę jakoś niebawem Wink Dziękuję za uwagi Paweł, jak coś jeszcze zauważysz to pisz.

...przede wszystkim nie zakłócać...
10-10-2011 20:56
Odwiedź stronę użytkownika Znajdź wszystkie posty użytkownika Odpowiedz cytując ten post
Odpowiedz 


Skocz do:


Użytkownicy przeglądający ten wątek: 1 gości