Ależ się nam offtop zrobił, ale to dobrze, może będzie można wątek pociachać i fajny dział o programowaniu wyjdzie.
Jak obiecałem usiadłem w niedzielę do nauki bascoma.
I oto co mi wyszło z pod palców:
Kod:
'-------------------------------------------------------------------------------
' REPEATER CONTROLER v.2.0.L
' L - obsługa LCD
' N - brak sygnalizacji zewnętrznej
' D - sygnalizacja diodowa
' SQ9MDD <rlabus@luxmat.com> 2010
'
' 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.
'-------------------------------------------------------------------------------
$regfile = Attiny2313.def
$crystal = 4000000
$baud = 9600
$hwstack = 24
$swstack = 0
$framesize = 32
Config Portb = &B11111111
Config Portd = &B1001101
Portb = &B00000000
Portd = &B0110010
Rx_signal Alias Pind.1
Morsepin Alias Portb.0
Ptt Alias Portd.6
Beep_option_jumper Alias Pind.4
Ident_after_jumper Alias Pind.5
'zegar on
Enable Interrupts
Config Timer1 = Timer , Prescale = 64
Enable Timer1
'definicje stałych
Const Speed = 12
Const Czestotliwosc = 450
Const Kropka = Czestotliwosc / Speed
Const Kreska = 3 * Kropka
'definicje zmiennych
Dim Sendchar As String * 1
Dim Charcode As Byte
Dim Dataindex As Byte
Dim Charindex As Byte
Dim Nextcharindex As Byte
Dim Charstring As String * 12
Dim Stringlength As Byte
Dim Codelength As Byte
Dim Codeindex As Byte
Dim Codeelement As String * 1
Dim Sendcw As Bit
Dim Tx_flag As Bit
Dim Rx_flag As Bit
Dim Beep_flag As Bit
Dim Podtrzymanie_flag As Bit
Dim Rx As Bit
Dim Rxa As Bit
Dim Sekunda As Byte
Dim Minuta As Byte
Dim Countdown As Byte
Dim Beep_option As Bit
Dim Inputtekst As String * 6
Dim Ident_after_tx As Bit
Dim Sendcwinterwal As Byte
Dim Czaspodtrzymania As Byte
'konfiguracja zmiennych sterownika
Inputtekst = "SR5WM" 'znamiennik max 6 znaków jesli chcesz wiekszy zmien rozmiar zmiennej Inputtekst
Sendcwinterwal = 5 'czas automatycznego wysyłania znamiennika w minutach
Czaspodtrzymania = 4 'czas podtrzymania nosnej w sekundach
'Beep_option = 1
'Ident_after_tx = 1
'-------------------------------------------------------------------------------
'tutaj zaczynamy prace programu
'tutaj uruchamiam timer do odliczania wyłączania flag
On Timer1 Liczmy
Wait 3
'Uruchomienie Przemiennika Wysyłamy znamiennik
Sendcw = 1
If Beep_option_jumper = 1 Then
Beep_option = 0 '0/1 beepek na koniec RX
Else
Beep_option = 1
End If
If Ident_after_jumper = 1 Then
Ident_after_tx = 0 '0/1 czy nadawac znamiennik na koniec kazdego tx-a czy tylko co ustalony interwał czasowy
Else
Ident_after_tx = 1
End If
'główna pętla programu
'-------------------------------------------------------------------------------
Do
'obsługa sygnału RX i ustawianie flagi RX i Beep
'-------------------------------------------------------------------------------
'jesli pin RX zwarty do masy
If Rx_signal = 0 Then
'ustawiam bit pomocniczy
Rx = 1
'jeśli po 20ms nadal wciśnięty
If Rx = 1 And Rxa = 0 Then
Rxa = 1
'ustawiamy flage jest RX
Rx_flag = 1
End If
'jeśli sygnał braku zajętości znika to
Elseif Rxa = 1 Then
Beep_flag = 1
Rx_flag = 0
'zeruj obydwa bity pomocnicze
Rx = 0 : Rxa = 0
End If
'ustawianie flagi TX jesli ustawione flagi RX lub podtrzymanie
'-------------------------------------------------------------------------------
'ustawianie flagi podtrzymanie jesli zapalony RX
If Rx_flag = 1 Then
Podtrzymanie_flag = 1
Countdown = 0
End If
'ustawiamy flage TX jesli mamy RX-a lub dziala podtrzymanie
If Rx_flag = 1 Or Podtrzymanie_flag = 1 Then
Tx_flag = 1
Else
Tx_flag = 0
End If
'ustawiamy port PTT jesli mamy flage tx
If Tx_flag = 1 Then
'wysterowanie nadajnika
Ptt = 1
'tutaj beep jesli koniec nadawania i beep_option enabled
If Beep_flag = 1 And Rx_flag = 0 And Beep_option = 1 Then
Waitms 150
Sound Morsepin , Kropka , Czestotliwosc
Beep_flag = 0
End If
Else
'wysterowanie nadajnika
Ptt = 0
End If
'procedura wysylania znamiennika
'-------------------------------------------------------------------------------
If Sendcw = 1 Then
'uruchamiam sobie TX
Ptt = 1
'blokujemy timer na czas wysylania znamiennikabo chrypi2
Stop Timer1
Waitms 300
Stringlength = Len(inputtekst)
'wlaczyc pin PTT tutaj
'tutaj przesuwamy się po ciągu znaków i będziemy odtwarzać każdą literę z osobna
For Charindex = 1 To Stringlength
Sendchar = Mid(inputtekst , Charindex , 1)
Charcode = Asc(sendchar)
Dataindex = Charcode - 48
Charstring = Lookupstr(dataindex , Alfabet)
Codelength = Len(charstring)
'ta pętla generuje kazda litere znaku
For Codeindex = 1 To Codelength
Codeelement = Mid(charstring , Codeindex , 1)
If Codeelement = "." Then
'Zagraj kropke
Sound Morsepin , Kropka , Czestotliwosc
Else
'Zagraj kreske
Sound Morsepin , Kreska , Czestotliwosc
End If
If Codeindex < Codelength Then
Waitms Kropka
End If
Next Codeelement
'odstęp pomiedzy znakami 3 x kropka
Waitms Kreska
'i wracamy do początku pętli po następną literę
Next Charindex
'skonczylismy gasimy flaga nadawania znamiennika
'resetujemy lflagi
Sendcw = 0
Tx_flag = 0
Sekunda = 0
'skonczylismy nadawac znamiennik odpalamy timer 1
Start Timer1
End If
'koniec pętli
Loop
'koniec programu
End
'obsługa
'-------------------------------------------------------------------------------
Liczmy:
Timer1 = 0
'tutaj proste naliczanie w sekundzie i cos (dla uproszczenia i skrocenia kodu uzyłem timera tc1/64 to daje 1s = 1,05S)
Sekunda = Sekunda + 1
If Sekunda = 60 Then
Minuta = Minuta + 1
If Minuta = 60 Then
Minuta = 0
End If
Sekunda = 0
End If
'jesli podtrzymanie na 1 a rx spadl zczynamy odliczanie do wylaczenia
If Podtrzymanie_flag = 1 And Rx_flag = 0 Then
Countdown = Countdown + 1
'jesli doszlismy do konca gas flagi
If Countdown >= Czaspodtrzymania Then
Podtrzymanie_flag = 0
Tx_flag = 0
Countdown = 0
'jesli zaznaczona flaga identylfikacji po odpuszczeniu tx to zagraj znamiennik
If Ident_after_tx = 1 Then
Minuta = Sendcwinterwal
End If
End If
'reset licznika jesli pojawi sie flaga rx w trakcie podtrzymania
Elseif Podtrzymanie_flag = 1 And Rx_flag = 1 Then
Countdown = 0
End If
'okresowe wysyłanie znamiennika jesli przekroczono czas i nikt nie nadaje
If Minuta >= Sendcwinterwal And Rx_flag = 0 Then
Tx_flag = 1
Sendcw = 1
Minuta = 0
End If
Return
'-------------------------------------------------------------------------------
Alfabet:
Data "-----" '0 Znaki pokolei tak jak są ustawione w tablicy ASCII
Data ".----" '1 przy wywoływaniu musimy tylko przestawić indeks o 48
Data "..---" '2 ponieważ cyfra 0 ma kod ASCII 48
Data "...--" '3
Data "....-" '4
Data "....." '5
Data "-...." '6
Data "--..." '7
Data "---.." '8
Data "----." '9
Data "." ': do generowania znamienników znaki specjalne nie są potrzebne
Data "." ';
Data "." '<
Data "." '=
Data "." '>
Data "." '?
Data "." '@
Data ".-" 'A Literki
Data "-..." 'B
Data "-.-." 'C
Data "-.." 'D
Data "." 'E
Data "..-." 'F
Data "--." 'G
Data "...." 'H
Data ".." 'I
Data ".---" 'J
Data "-.-" 'K
Data ".-.." 'L
Data "--" 'M
Data "-." 'N
Data "---" 'O
Data ".--." 'P
Data "--.-" 'Q
Data ".-." 'R
Data "..." 'S
Data "-" 'T
Data "..-" 'U
Data "...-" 'V
Data ".--" 'W
Data "-..-" 'X
Data "-.--" 'Y
Data "--.." 'Z
Jest to bardzo prosty sterownik przemiennika, zrealizowany na ATTiny2313.
Funkcje które posiada:
- opcje konfigurujemy przed kompilacją programu
- podtrzymanie nośnej w sekundach
- beep po zdjęciu sygnału RX jako opcja
- identyfikacja cw co zadany okres czasu w minutach
- identyfikacja cw po każdym tx jako opcja
Obsługę czasów zrealizowałem na zegarze i przerwaniu od tegoż zegara.
Źródło które tutaj wkleiłem starałem się mocno skomentować by umożliwić kolegom szybką analizę i ewentualne poprawki. Całość została skompilowana i przetestowana na płytce testowej. W tym tygodniu uruchomię układ z tym programem w realnych warunkach.
Kod jest na licencji GPL, można kopiować modyfikować, umieszczać we własnych projektach sprzedawać itd...
2010.08.18 UPDATE
Poprawiłem w kodzie kilka oczywistych błędów, zmieniłem opcję beep i identyfikacja cw na obsługiwaną z dipswitcha.
Pracujący sterownik wersja bardzo mocno testowa:
2010.08.19 UPDATE
Kolega narysował schemat do mojego programu. W załączeniu poniżej.