Amateurfunkbasteln :: Foxcontrol, die Steuerung für Fuchsjagdsender



Amateurfunkbasteln :: Foxcontrol - Steuerung für Fuchsjagdsender


Features:


Wenig Aufwand bereitet die Steuerung des Senders, als Platine eignet sich auch ein Lochraster

Foxcontrol, die Steuerung für den Fuchsjagdsender

Das Schaltbild ist nicht allzu umfangreich: Kernelemente sind der Prozessor und die RTC PCF8583
Der Bestückungsplan zeigt u.a. die Belegung der beiden 4-poligen Stecker
Kaum größer als eine Streichholzschachtel: Das kompakte Layout

Der Aufbau

Die kleine Schaltung ist schnell bestückt. Sie kommt mit einer einseitigen Platine und ohne Drahtbrücken aus. Der Starttaster sollte so montiert werden, dass er aus dem Gehäuse herausschaut. Dann muß man es nicht öffnen, um Foxcontrol zu synchronisieren.

Die Software...

...wurde in Basic geschrieben und ist dank der Subroutinen sehr übersichtlich. Das folgende Listing zeigt unter anderem, wie man recht einfach Morsezeichen erzeugen kann.

Rem Steuerung für Fuchsjagdsender
Rem Bascom Compiler für 8051, Version 1.0.0.16
Rem by Michael Woeste, dg5dbz

' Hardware:

' Jumper, die bestimmen, welcher Fuchs es ist:
' P1.7 gesetzt für Fuchs 1 (sendet 1. Minute)
' P1.6 gesetzt für Fuchs 2 (sendet 2. Minute)
' P1.5 für Fuchs 3
' P1.4 für Fuchs 4
' P1.3 für Fuchs 5

' I2C:
' SDA auf P1.1
' SCL auf P1.0

' CW-Ausgabe auf P1.2
' Optionale, positiv arbeitende PTT auf P3.4
' Optionale PTT negativer Logik: /PTT an Pin P3.5

' Fuchs-Synchronkabel:
' Fuchs-Synchrontaster (Schliesser gegen Masse) an P3.7
' alle Füchse mit einem Kabel gleichzeitig synchronisieren
' oder mehrere Taster flott hintereinander drücken

' PCF8583
' Signal A0 auf GND

' mit 12 MHz getaktet
$crystal = 12000000

Config Scl = P1.0                                             ' hier ist SCL angeschlossen
Config Sda = P1.1                                             ' und hier SDA

Dim Fuchs1 As Bit
Dim Fuchs2 As Bit
Dim Fuchs3 As Bit
Dim Fuchs4 As Bit
Dim Fuchs5 As Bit
Dim Dummy As Bit
Dim Wadr As Byte , Radr As Byte                               ' Schreib- u. Leseadresse PCF8583
Dim On_air As Bit                                             ' Flag: Bin auf Sendung

Dim Sekunde As Byte , Minute As Byte                          ' für Zeit
Dim Temp As Byte                                              ' für alles und nichts
Dim D As Byte , I As Byte                                     ' in Rufz_senden benötigt

'bestimmt, welcher der 5 Füchse das ist
Declare Sub Senden_an
Declare Sub Senden_aus
Declare Sub Uhr_stellen
Declare Sub Hole_zeit
Declare Sub Rufz_senden
Declare Sub Readloop                                          ' wird von Rufz_senden aufgerufen


'Variablen-Initialisierungen
Dummy = 0
Fuchs1 = 0                                                    ' Flag: welcher Fuchs bin ich (1-5) ?
Fuchs2 = 0
Fuchs3 = 0
Fuchs4 = 0
Fuchs5 = 0

Wadr = &B10100000                                             ' 8583 mit A0 auf 0
Radr = &B10100001                                             ' 8583 mit A0 auf 0 !!


'Programm Start
'Initialisierungen
P1 = 255                                                      ' auf Eingang schalten
Reset P1.2                                                    ' cw aus
Call Welcher_fuchs                                            ' Abfrage Jumper
Call Senden_aus                                               ' zusätzliche PTT aus

'nur zum Test:
'Set Fuchs5
'Minute = 4



'Hauptschleife
Do

   If P3.7 = 0 Then
    Call Uhr_stellen                                          ' falls Sync-Signal auftritt
   End If

   Call Hole_zeit

   If Fuchs1 = 1 Then                                         ' falls ich der Fuchs 1 bin
      If Minute = 0 Then                                      ' falls erste Minute
         Set On_air                                           ' gehe auf Sendung
         Call Senden_an                                       ' zusätzlich PTT schalten
       Else                                                   ' falls nicht
         Reset On_air                                         ' bin nicht dran
         Call Senden_aus                                      ' PTT aus
      End If
   End If

   If Fuchs2 = 1 Then
      If Minute = 1 Then
         Set On_air
         Call Senden_an
       Else
         Reset On_air
         Call Senden_aus
      End If
   End If

   If Fuchs3 = 1 Then
      If Minute = 2 Then
         Set On_air
         Call Senden_an
       Else
         Reset On_air
         Call Senden_aus
      End If
   End If

   If Fuchs4 = 1 Then
      If Minute = 3 Then
         Set On_air
         Call Senden_an
       Else
         Reset On_air
         Call Senden_aus
      End If
   End If

   If Fuchs5 = 1 Then
      If Minute = 4 Then
         Set On_air
         Call Senden_an
       Else
         Reset On_air
         Call Senden_aus
      End If
   End If

   If Minute = 5 Then
      Call Uhr_stellen                                        ' sobald der 5. Fuchs fertig ist, alle Uhren auf 0:0
   End If

   If On_air = 1 Then
      ' Kennung geben
      Call Rufz_senden
      Wait 1                                                  ' eine Sekunde warten zwischen 2 Rufzeichen
   End If

Loop Until Dummy = 1                                          ' endlose Schleife
End


' liest Jumper aus
Sub Welcher_fuchs
   If P1.7 = 0 Then Set Fuchs1
   If P1.6 = 0 Then Set Fuchs2
   If P1.5 = 0 Then Set Fuchs3
   If P1.4 = 0 Then Set Fuchs4
   If P1.3 = 0 Then Set Fuchs5
End Sub


' zusätzliche PTT schalten
Sub Senden_an
   Set P3.4
   Reset P3.5
End Sub

' zusätzliche PTT aus
Sub Senden_aus
   Reset P3.4
   Set P3.5
End Sub

' Füchse haben die Rufzeichen MOE (Fuchs1) bis MO5 (Fuchs5)
Sub Rufz_senden                                               ' CW-Ausgang ist P1.2
'erst MO senden
   Restore Allfox:                                            ' m,o gilt für alle Füchse
   For I = 1 To 24
      Call Readloop                                           ' Read Data and Set/Reset Pin P1.2
   Next
' MO gesendet, jetz kommt es für jeden Fuchs getrennt

' E (einmal kurz) für Fuchs1
   If Fuchs1 = 1 Then
      Restore Fox1
      For I = 1 To 4                                          ' e und dreimal pause = 4 Ziffern in DATA
         Call Readloop
      Next
   End If

' I (zweimal kurz) für Fuchs2
   If Fuchs2 = 1 Then
      Restore Fox2
      For I = 1 To 6
         Call Readloop
      Next
   End If

' S (dreimal kurz) für Fuchs3
   If Fuchs3 = 1 Then
      Restore Fox3
      For I = 1 To 8
         Call Readloop
      Next
   End If

' H (viermal kurz) für Fuchs4
   If Fuchs4 = 1 Then
      Restore Fox4
      For I = 1 To 10
         Call Readloop
      Next
   End If

' 5 (fünfmal kurz) für Fuchs57
   If Fuchs5 = 1 Then
      Restore Fox5
      For I = 1 To 12                                         ' 12 = Anzahl der Ziffern in DATA
         Call Readloop
      Next
   End If
End Sub

' Wird mehrfach von Rufz_senden aufgerufen
' liest DATA und setzt / löscht CW-Out Pin P1.2

Sub Readloop
      Read D
      If D = 1 Then
         Set P1.2
      Else
         Reset P1.2
      End If
      Waitms 100                                              ' CW-Geschwindigkeit für ein e
End Sub


' Stellt Fuchs auf 0:00 Uhr
' z.B. nachdem der 5.Fuchs gesendet hat

Sub Uhr_stellen
    I2cstart                                                  'generate start
    I2cwbyte Wadr                                             'write address
    I2cwbyte 0                                                'select control register
    I2cwbyte 8                                                'set year and day bit for masking
    I2cstop                                                   'generate stop

    I2cstart                                                  'generate start
    I2cwbyte Wadr                                             'write mode
    I2cwbyte 2                                                'select seconds Register
    I2cwbyte 0                                                'write seconds
    I2cwbyte 0                                                'write minutes
    I2cwbyte 0                                                'Write Hours
    I2cwbyte 0                                                'write days
    I2cwbyte 0                                                'write months
    I2cstop
End Sub


Sub Hole_zeit                                                 ' liest Minute und Sek. aus Uhr

    I2cstart                                                  'generate start
    I2cwbyte Wadr                                             'write addres of PCF8583
    I2cwbyte 2                                                'select second register
    I2cstart                                                  'generate repeated start
    I2cwbyte Radr                                             'write address for reading info
    I2crbyte Sekunde , Ack                                    'read seconds
    I2crbyte Minute , Ack                                     'read minutes
    I2crbyte Temp , Ack                                       'read hours
    I2crbyte Temp , Ack                                       'read year and days
    I2crbyte Temp , Nack                                      'read weekday and month
    I2cstop                                                   'generate stop
    Sekunde = Makedec(sekunde)
    Minute = Makedec(minute)
End Sub



' Hier die Definitionen für MOE bis MO5
' Bei Allfox ist MO codiert, der Rest beim jeweiligen Fox1..5

Allfox:
Data 1 , 1 , 1 , 0 , 1 , 1 , 1 , 0 , 0 , 0 , 1 , 1 , 1 , 0 , 1 , 1 , 1 , 0 , 1 , 1 , 1 , 0 , 0 , 0

Fox1:
Data 1 , 0 , 0 , 0                                            'moe

Fox2:
Data 1 , 0 , 1 , 0 , 0 , 0                                    'moi

Fox3:
Data 1 , 0 , 1 , 0 , 1 , 0 , 0 , 0                            'mos

Fox4:
Data 1 , 0 , 1 , 0 , 1 , 0 , 1 , 0 , 0 , 0                    'moh

Fox5:
Data 1 , 0 , 1 , 0 , 1 , 0 , 1 , 0 , 1 , 0 , 0 , 0            'mo5

End

Download von Dateien zu diesem Projekt

Und hier geht es zum Download.


Platinen und Bausätze

Für dieses Projekt biete ich einen Programmierservice an.


Zurück

Copyright Michael Wöste