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.