From 5527497c5ca29cf9d9c4724cec56513b0e772594 Mon Sep 17 00:00:00 2001
From: OpenARDF <66529806+OpenARDF@users.noreply.github.com>
Date: Wed, 10 Jun 2020 19:42:17 -0400
Subject: [PATCH 01/38] Update README.md
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index d17e76e..d810aaf 100644
--- a/README.md
+++ b/README.md
@@ -11,7 +11,7 @@
The controller includes an output pin for controlling a transmitter for sending Morse code characters (high = key down; low = key up) and a separate pin that sends the Morse code as audio tones that can be used to drive a speaker. The controller can also provide a sequence of starting-tones prompting competitors to begin a competition, and can thus serve as an electronic starting "gun" for use in ARDF events.
Serial Commands
-The controller serial interface operates at 57600 baud that can be accessed using any serial TTY interface program such as PuTTY or Arduino's own Serial Monitor tool. It provides a command prompt > indicating that it is ready to receive recognized the following commands.
+
The controller serial interface operates at 57600 baud that can be accessed using any serial TTY interface program such as PuTTY or Arduino's own Serial Monitor tool. It provides a command prompt > indicating that it is ready to receive any of the following commands.
> CAL [num] <= * Sets the clock calibration for precise timing
> CAL <= Displays the clock calibration setting
From 40a3e2a5040e753d84c2530faeeac4be339853ae Mon Sep 17 00:00:00 2001
From: OpenARDF <66529806+OpenARDF@users.noreply.github.com>
Date: Thu, 11 Jun 2020 10:36:18 -0400
Subject: [PATCH 02/38] Update README.md
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index d810aaf..7b5bc98 100644
--- a/README.md
+++ b/README.md
@@ -4,7 +4,7 @@
Controller support for all the common ARDF competition formats is provided: Classic, Sprint, and Foxoring.
Software
-The software is a proper Arduino script that will open and build without warnings or errors in Arduino IDE version 1.8.12 and later. The Arduino IDE can also be used to program a device that holds a compatible bootloader. Most Arduino products ship with a bootloader pre-installed.
+The software is a proper Arduino script that will open and build without warnings or errors in Arduino IDE version 1.8.12 and later. It has also been shown to work with the online Arduino Web Editor. The Arduino IDE can also be used to program a device that contains a compatible bootloader. Most Arduino products ship with a bootloader pre-installed.
After being programmed, the controller can be configured via a serial port on the board. An Arduino board that includes a USB-to-Serial converter will allow you to configure the controller with a simple USB cable (standard to micro) connected between a USB port on your computer to one on the Arduino board. Less sophisticated Arduino boards lacking a USB-to-Serial converter will require a special FTDI cable like AdaFruit's FTDI Serial TTL-232 USB Cable, or SparkFun's FTDI Cable 5V.
From 57a4dc704ffcd3ee7a13a8b3f8ce014d2fbdf7cf Mon Sep 17 00:00:00 2001
From: OpenARDF <66529806+OpenARDF@users.noreply.github.com>
Date: Fri, 12 Jun 2020 21:17:13 -0400
Subject: [PATCH 03/38] Update README.md
---
README.md | 176 ++++++++++++++++++++++++++++++++++++++++++++++++------
1 file changed, 158 insertions(+), 18 deletions(-)
diff --git a/README.md b/README.md
index 7b5bc98..2a24ff7 100644
--- a/README.md
+++ b/README.md
@@ -1,22 +1,44 @@
+
+
+
WB8WFK ARDF Foxoring Transmitter
This is a simple, inexpensive, transmitter controller for conducting ARDF Foxoring competitions and for demonstrating ARDF principles. The software project is an Arduino script that builds for and runs on most Arduino-like products, including AdaFruit's Metro Mini 328, or SparkFun's Arduino Pro Mini 328, and many more.
Controller support for all the common ARDF competition formats is provided: Classic, Sprint, and Foxoring.
-
Software
-The software is a proper Arduino script that will open and build without warnings or errors in Arduino IDE version 1.8.12 and later. It has also been shown to work with the online Arduino Web Editor. The Arduino IDE can also be used to program a device that contains a compatible bootloader. Most Arduino products ship with a bootloader pre-installed.
+ Software
+ The software is a proper Arduino script that will open and build without warnings or errors in Arduino IDE version 1.8.12 and later. It has also been shown to work with the online Arduino Web Editor. The Arduino IDE can also be used to program a device that contains a compatible bootloader. Most Arduino products ship with a bootloader pre-installed.
-After being programmed, the controller can be configured via a serial port on the board. An Arduino board that includes a USB-to-Serial converter will allow you to configure the controller with a simple USB cable (standard to micro) connected between a USB port on your computer to one on the Arduino board. Less sophisticated Arduino boards lacking a USB-to-Serial converter will require a special FTDI cable like AdaFruit's FTDI Serial TTL-232 USB Cable, or SparkFun's FTDI Cable 5V.
+ After being programmed, the controller can be configured via a serial port on the board. An Arduino board that includes a USB-to-Serial converter will allow you to configure the controller with a simple USB cable (standard to micro) connected between a USB port on your computer to one on the Arduino board. Less sophisticated Arduino boards lacking a USB-to-Serial converter will require a special FTDI cable like AdaFruit's FTDI Serial TTL-232 USB Cable, or SparkFun's FTDI Cable 5V.
-The controller includes an output pin for controlling a transmitter for sending Morse code characters (high = key down; low = key up) and a separate pin that sends the Morse code as audio tones that can be used to drive a speaker. The controller can also provide a sequence of starting-tones prompting competitors to begin a competition, and can thus serve as an electronic starting "gun" for use in ARDF events.
+ The controller includes an output pin for controlling a transmitter for sending Morse code characters (high = key down; low = key up) and a separate pin that sends the Morse code as audio tones that can be used to drive a speaker. The controller can also provide a sequence of starting-tones prompting competitors to begin a competition, and can thus serve as an electronic starting "gun" for use in ARDF events.
-Serial Commands
-The controller serial interface operates at 57600 baud that can be accessed using any serial TTY interface program such as PuTTY or Arduino's own Serial Monitor tool. It provides a command prompt > indicating that it is ready to receive any of the following commands.
+
Serial Commands
+ The controller serial interface operates at 57600 baud that can be accessed using any serial TTY interface program such as PuTTY or Arduino's own Serial Monitor tool. It provides a command prompt > indicating that it is ready to receive any of the following commands.
+
-
> CAL [num] <= * Sets the clock calibration for precise timing
+
> CAL [num] <= * Sets the clock calibration for precise timing
> CAL <= Displays the clock calibration setting
-> DIP [val] <= * Sets the competition format, overriding the DIP switch settings
-> DIP <= Displays the competition format setting
+> DIP [val] <= * Sets the competition format, overriding the DIP switch settings
+> DIP <= Displays the competition format setting
> FAC <= Sets saved EEPROM values to their original defaults
> GO <= Starts operation from zero seconds, equivalent to pressing the sync button
> ID [string] <= * Sets the callsign that gets sent
@@ -24,23 +46,141 @@
> LED [on|off] <= * Turns on/off LED pin
> LED <= Displays the LED pin setting
> RST <= Resets the processor
-> SPD ID [num] <= * Sets the ID code speed in WPM
-> SPD <= Displays the ID code speed setting
+> SPD ID [num] <= * Sets the ID code speed in WPM
+> SPD <= Displays the ID code speed setting
> STA [on|off] <= * Turns on/off the starting tones function
> STA <= Displays the starting tones setting
> SYN [on|off] <= * Turns on/off synchronization using sync button or "GO" command
> SYN <= Displays the synchronization setting
> TEM <= Displays the processor's temperature in C
-> VER <= Displays the software version number
-
- * These values get stored to EEPROM and are retained between power cycles.
-Hardware
-Look in the Hardware folder for all hardware-related documents
-Pinout
-PB1 - Board Pin 9 (Output) <= Audio Out (=Gnd when no tone)
+> VER <= Displays the software version number
+
+ * These values get stored to EEPROM and are retained between power cycles.
+ Hardware
+ Look in the Hardware folder for all hardware-related documents
+ Pinout
+ PB1 - Board Pin 9 (Output) <= Audio Out (=Gnd when no tone)
PB5 - Board Pin 13 (Output) <= LED On=+V
PD2 - Board Pin 2 (Output) <= Key/PTT On=+V
PD3 - Board Pin 3 (Input) <= Synchronize (mom. switch to Gnd)
PD4 - Board Pin 4 (Input) <= DIP Switch Bit 0 (switch to Gnd)
PD5 - Board Pin 5 (Input) <= DIP Switch Bit 1 (switch to Gnd)
PD6 - Board Pin 6 (Input) <= DIP Switch Bit 2 (switch to Gnd)
+
+ Usage
+ The transmitter can be configured using the serial port, or using the DIP switch and sync-button hardware interface. Only a subset of the available configurations is available when using only the hardware interface. Configuring the DIP setting with a serial port command to anything but 0 (zero) will disable the hardware DIP switch.
+
+
+
+ Configuration |
+ Software Commands |
+ Hardware Settings |
+
+
+ Homing Beacon |
+ > DIP CLASSIC BEACON [Note: the DIP switch must also be set to 0-0-0] |
+ DIP = 0-0-0 |
+
+
+ Classic Fox#1 |
+ > DIP CLASSIC 1 > GO |
+ DIP = 0-0-1 Sync to start |
+
+
+ Classic Fox#2 |
+ > DIP CLASSIC 2 > GO |
+ DIP = 0-1-0 Sync to start |
+
+
+ Classic Fox#3 |
+ > DIP CLASSIC 3 > GO |
+ DIP = 0-1-1 Sync to start |
+
+
+ Classic Fox#4 |
+ > DIP CLASSIC 4 > GO |
+ DIP = 1-0-0 Sync to start |
+
+
+ Classic Fox#5 |
+ > DIP CLASSIC 5 > GO |
+ DIP = 1-0-1 Sync to start |
+
+
+ Classic Demonstration |
+ > DIP CLASSIC DEMO |
+ DIP = 1-1-0 |
+
+
+ Foxoring |
+ > DIP FOXORING |
+ DIP = 1-1-1 |
+
+
+ Spectator Beacon |
+ > DIP FOXORING SPEC |
+ N/A |
+
+
+ Sprint Fox Slow #1 |
+ > DIP SPRINT S1 |
+ N/A |
+
+
+ Sprint Fox Slow #2 |
+ > DIP SPRINT S2 |
+ N/A |
+
+
+ Sprint Fox Slow #3 |
+ > DIP SPRINT S3 |
+ N/A |
+
+
+ Sprint Fox Slow #4 |
+ > DIP SPRINT S4 |
+ N/A |
+
+
+ Sprint Fox Slow #5 |
+ > DIP SPRINT S5 |
+ N/A |
+
+
+ Sprint Fox Fast #1 |
+ > DIP SPRINT F1 |
+ N/A |
+
+
+ Sprint Fox Fast #2 |
+ > DIP SPRINT F2 |
+ N/A |
+
+
+ Sprint Fox Fast #3 |
+ > DIP SPRINT F3 |
+ N/A |
+
+
+ Sprint Fox Fast #4 |
+ > DIP SPRINT F4 |
+ N/A |
+
+
+ Sprint Fox Fast #5 |
+ > DIP SPRINT F5 |
+ N/A |
+
+
+ Sprint Demonstration |
+ > DIP SPRINT DEMO |
+ N/A |
+
+
+ Starting Tone Generator |
+ > DIP [any of the above] > STA ON > GO |
+ DIP = any Sync to start [Note: Starting Tone Generator can only be enabled with a serial command.] |
+
+
+
+
From 23e8e8e6c976aa3b9b1546b1fa83c0628555eef3 Mon Sep 17 00:00:00 2001
From: OpenARDF <66529806+OpenARDF@users.noreply.github.com>
Date: Fri, 12 Jun 2020 21:17:49 -0400
Subject: [PATCH 04/38] Update README.md
---
README.md | 21 ---------------------
1 file changed, 21 deletions(-)
diff --git a/README.md b/README.md
index 2a24ff7..95b9663 100644
--- a/README.md
+++ b/README.md
@@ -1,24 +1,3 @@
-
-
-
WB8WFK ARDF Foxoring Transmitter
This is a simple, inexpensive, transmitter controller for conducting ARDF Foxoring competitions and for demonstrating ARDF principles. The software project is an Arduino script that builds for and runs on most Arduino-like products, including AdaFruit's Metro Mini 328, or SparkFun's Arduino Pro Mini 328, and many more.
From 5993d94ecc1a2e84ae6e04f08b286ef6144394a2 Mon Sep 17 00:00:00 2001
From: OpenARDF <66529806+OpenARDF@users.noreply.github.com>
Date: Fri, 12 Jun 2020 21:22:25 -0400
Subject: [PATCH 06/38] Update README.md
---
README.md | 260 +++++++++++++++++++++++++++---------------------------
1 file changed, 130 insertions(+), 130 deletions(-)
diff --git a/README.md b/README.md
index 95b9663..9b90c4a 100644
--- a/README.md
+++ b/README.md
@@ -1,20 +1,20 @@
WB8WFK ARDF Foxoring Transmitter
This is a simple, inexpensive, transmitter controller for conducting ARDF Foxoring competitions and for demonstrating ARDF principles. The software project is an Arduino script that builds for and runs on most Arduino-like products, including AdaFruit's Metro Mini 328, or SparkFun's Arduino Pro Mini 328, and many more.
-Controller support for all the common ARDF competition formats is provided: Classic, Sprint, and Foxoring.
+
Controller support for all the common ARDF competition formats is provided: Classic, Sprint, and Foxoring.
- Software
- The software is a proper Arduino script that will open and build without warnings or errors in Arduino IDE version 1.8.12 and later. It has also been shown to work with the online Arduino Web Editor. The Arduino IDE can also be used to program a device that contains a compatible bootloader. Most Arduino products ship with a bootloader pre-installed.
+Software
+The software is a proper Arduino script that will open and build without warnings or errors in Arduino IDE version 1.8.12 and later. It has also been shown to work with the online Arduino Web Editor. The Arduino IDE can also be used to program a device that contains a compatible bootloader. Most Arduino products ship with a bootloader pre-installed.
- After being programmed, the controller can be configured via a serial port on the board. An Arduino board that includes a USB-to-Serial converter will allow you to configure the controller with a simple USB cable (standard to micro) connected between a USB port on your computer to one on the Arduino board. Less sophisticated Arduino boards lacking a USB-to-Serial converter will require a special FTDI cable like AdaFruit's FTDI Serial TTL-232 USB Cable, or SparkFun's FTDI Cable 5V.
+After being programmed, the controller can be configured via a serial port on the board. An Arduino board that includes a USB-to-Serial converter will allow you to configure the controller with a simple USB cable (standard to micro) connected between a USB port on your computer to one on the Arduino board. Less sophisticated Arduino boards lacking a USB-to-Serial converter will require a special FTDI cable like AdaFruit's FTDI Serial TTL-232 USB Cable, or SparkFun's FTDI Cable 5V.
- The controller includes an output pin for controlling a transmitter for sending Morse code characters (high = key down; low = key up) and a separate pin that sends the Morse code as audio tones that can be used to drive a speaker. The controller can also provide a sequence of starting-tones prompting competitors to begin a competition, and can thus serve as an electronic starting "gun" for use in ARDF events.
+The controller includes an output pin for controlling a transmitter for sending Morse code characters (high = key down; low = key up) and a separate pin that sends the Morse code as audio tones that can be used to drive a speaker. The controller can also provide a sequence of starting-tones prompting competitors to begin a competition, and can thus serve as an electronic starting "gun" for use in ARDF events.
- Serial Commands
- The controller serial interface operates at 57600 baud that can be accessed using any serial TTY interface program such as PuTTY or Arduino's own Serial Monitor tool. It provides a command prompt > indicating that it is ready to receive any of the following commands.
-
+
Serial Commands
+The controller serial interface operates at 57600 baud that can be accessed using any serial TTY interface program such as PuTTY or Arduino's own Serial Monitor tool. It provides a command prompt > indicating that it is ready to receive any of the following commands.
+
-
> CAL [num] <= * Sets the clock calibration for precise timing
+
> CAL [num] <= * Sets the clock calibration for precise timing
> CAL <= Displays the clock calibration setting
> DIP [val] <= * Sets the competition format, overriding the DIP switch settings
> DIP <= Displays the competition format setting
@@ -34,11 +34,11 @@
> TEM <= Displays the processor's temperature in C
> VER <= Displays the software version number
- * These values get stored to EEPROM and are retained between power cycles.
- Hardware
- Look in the Hardware folder for all hardware-related documents
- Pinout
- PB1 - Board Pin 9 (Output) <= Audio Out (=Gnd when no tone)
+
* These values get stored to EEPROM and are retained between power cycles.
+ Hardware
+ Look in the Hardware folder for all hardware-related documents
+ Pinout
+ PB1 - Board Pin 9 (Output) <= Audio Out (=Gnd when no tone)
PB5 - Board Pin 13 (Output) <= LED On=+V
PD2 - Board Pin 2 (Output) <= Key/PTT On=+V
PD3 - Board Pin 3 (Input) <= Synchronize (mom. switch to Gnd)
@@ -46,120 +46,120 @@
PD5 - Board Pin 5 (Input) <= DIP Switch Bit 1 (switch to Gnd)
PD6 - Board Pin 6 (Input) <= DIP Switch Bit 2 (switch to Gnd)
- Usage
- The transmitter can be configured using the serial port, or using the DIP switch and sync-button hardware interface. Only a subset of the available configurations is available when using only the hardware interface. Configuring the DIP setting with a serial port command to anything but 0 (zero) will disable the hardware DIP switch.
-
-
-
- Configuration |
- Software Commands |
- Hardware Settings |
-
-
- Homing Beacon |
- > DIP CLASSIC BEACON [Note: the DIP switch must also be set to 0-0-0] |
- DIP = 0-0-0 |
-
-
- Classic Fox#1 |
- > DIP CLASSIC 1 > GO |
- DIP = 0-0-1 Sync to start |
-
-
- Classic Fox#2 |
- > DIP CLASSIC 2 > GO |
- DIP = 0-1-0 Sync to start |
-
-
- Classic Fox#3 |
- > DIP CLASSIC 3 > GO |
- DIP = 0-1-1 Sync to start |
-
-
- Classic Fox#4 |
- > DIP CLASSIC 4 > GO |
- DIP = 1-0-0 Sync to start |
-
-
- Classic Fox#5 |
- > DIP CLASSIC 5 > GO |
- DIP = 1-0-1 Sync to start |
-
-
- Classic Demonstration |
- > DIP CLASSIC DEMO |
- DIP = 1-1-0 |
-
-
- Foxoring |
- > DIP FOXORING |
- DIP = 1-1-1 |
-
-
- Spectator Beacon |
- > DIP FOXORING SPEC |
- N/A |
-
-
- Sprint Fox Slow #1 |
- > DIP SPRINT S1 |
- N/A |
-
-
- Sprint Fox Slow #2 |
- > DIP SPRINT S2 |
- N/A |
-
-
- Sprint Fox Slow #3 |
- > DIP SPRINT S3 |
- N/A |
-
-
- Sprint Fox Slow #4 |
- > DIP SPRINT S4 |
- N/A |
-
-
- Sprint Fox Slow #5 |
- > DIP SPRINT S5 |
- N/A |
-
-
- Sprint Fox Fast #1 |
- > DIP SPRINT F1 |
- N/A |
-
-
- Sprint Fox Fast #2 |
- > DIP SPRINT F2 |
- N/A |
-
-
- Sprint Fox Fast #3 |
- > DIP SPRINT F3 |
- N/A |
-
-
- Sprint Fox Fast #4 |
- > DIP SPRINT F4 |
- N/A |
-
-
- Sprint Fox Fast #5 |
- > DIP SPRINT F5 |
- N/A |
-
-
- Sprint Demonstration |
- > DIP SPRINT DEMO |
- N/A |
-
-
- Starting Tone Generator |
- > DIP [any of the above] > STA ON > GO |
- DIP = any Sync to start [Note: Starting Tone Generator can only be enabled with a serial command.] |
-
-
+ Usage
+ The transmitter can be configured using the serial port, or using the DIP switch and sync-button hardware interface. Only a subset of the available configurations is available when using only the hardware interface. Configuring the DIP setting with a serial port command to anything but 0 (zero) will disable the hardware DIP switch.
+
+
+
+ Configuration |
+ Software Commands |
+ Hardware Settings |
+
+
+ Homing Beacon |
+ > DIP CLASSIC BEACON [Note: the DIP switch must also be set to 0-0-0] |
+ DIP = 0-0-0 |
+
+
+ Classic Fox#1 |
+ > DIP CLASSIC 1 > GO |
+ DIP = 0-0-1 Sync to start |
+
+
+ Classic Fox#2 |
+ > DIP CLASSIC 2 > GO |
+ DIP = 0-1-0 Sync to start |
+
+
+ Classic Fox#3 |
+ > DIP CLASSIC 3 > GO |
+ DIP = 0-1-1 Sync to start |
+
+
+ Classic Fox#4 |
+ > DIP CLASSIC 4 > GO |
+ DIP = 1-0-0 Sync to start |
+
+
+ Classic Fox#5 |
+ > DIP CLASSIC 5 > GO |
+ DIP = 1-0-1 Sync to start |
+
+
+ Classic Demonstration |
+ > DIP CLASSIC DEMO |
+ DIP = 1-1-0 |
+
+
+ Foxoring |
+ > DIP FOXORING |
+ DIP = 1-1-1 |
+
+
+ Spectator Beacon |
+ > DIP FOXORING SPEC |
+ N/A |
+
+
+ Sprint Fox Slow #1 |
+ > DIP SPRINT S1 |
+ N/A |
+
+
+ Sprint Fox Slow #2 |
+ > DIP SPRINT S2 |
+ N/A |
+
+
+ Sprint Fox Slow #3 |
+ > DIP SPRINT S3 |
+ N/A |
+
+
+ Sprint Fox Slow #4 |
+ > DIP SPRINT S4 |
+ N/A |
+
+
+ Sprint Fox Slow #5 |
+ > DIP SPRINT S5 |
+ N/A |
+
+
+ Sprint Fox Fast #1 |
+ > DIP SPRINT F1 |
+ N/A |
+
+
+ Sprint Fox Fast #2 |
+ > DIP SPRINT F2 |
+ N/A |
+
+
+ Sprint Fox Fast #3 |
+ > DIP SPRINT F3 |
+ N/A |
+
+
+ Sprint Fox Fast #4 |
+ > DIP SPRINT F4 |
+ N/A |
+
+
+ Sprint Fox Fast #5 |
+ > DIP SPRINT F5 |
+ N/A |
+
+
+ Sprint Demonstration |
+ > DIP SPRINT DEMO |
+ N/A |
+
+
+ Starting Tone Generator |
+ > DIP [any of the above] > STA ON > GO |
+ DIP = any Sync to start [Note: Starting Tone Generator can only be enabled with a serial command.] |
+
+
-
+
From 21f83a397acaff2a0e3be061949f8f7302c1f2c5 Mon Sep 17 00:00:00 2001
From: OpenARDF <66529806+OpenARDF@users.noreply.github.com>
Date: Fri, 12 Jun 2020 21:24:49 -0400
Subject: [PATCH 07/38] Update README.md
---
README.md | 246 +++++++++++++++++++++++++++---------------------------
1 file changed, 123 insertions(+), 123 deletions(-)
diff --git a/README.md b/README.md
index 9b90c4a..d82312d 100644
--- a/README.md
+++ b/README.md
@@ -12,9 +12,9 @@
Serial Commands
The controller serial interface operates at 57600 baud that can be accessed using any serial TTY interface program such as PuTTY or Arduino's own Serial Monitor tool. It provides a command prompt > indicating that it is ready to receive any of the following commands.
-
+
- > CAL [num] <= * Sets the clock calibration for precise timing
+
> CAL [num] <= * Sets the clock calibration for precise timing
> CAL <= Displays the clock calibration setting
> DIP [val] <= * Sets the competition format, overriding the DIP switch settings
> DIP <= Displays the competition format setting
@@ -34,11 +34,11 @@
> TEM <= Displays the processor's temperature in C
> VER <= Displays the software version number
- * These values get stored to EEPROM and are retained between power cycles.
- Hardware
- Look in the Hardware folder for all hardware-related documents
- Pinout
- PB1 - Board Pin 9 (Output) <= Audio Out (=Gnd when no tone)
+
* These values get stored to EEPROM and are retained between power cycles.
+Hardware
+Look in the Hardware folder for all hardware-related documents
+Pinout
+PB1 - Board Pin 9 (Output) <= Audio Out (=Gnd when no tone)
PB5 - Board Pin 13 (Output) <= LED On=+V
PD2 - Board Pin 2 (Output) <= Key/PTT On=+V
PD3 - Board Pin 3 (Input) <= Synchronize (mom. switch to Gnd)
@@ -46,120 +46,120 @@
PD5 - Board Pin 5 (Input) <= DIP Switch Bit 1 (switch to Gnd)
PD6 - Board Pin 6 (Input) <= DIP Switch Bit 2 (switch to Gnd)
- Usage
- The transmitter can be configured using the serial port, or using the DIP switch and sync-button hardware interface. Only a subset of the available configurations is available when using only the hardware interface. Configuring the DIP setting with a serial port command to anything but 0 (zero) will disable the hardware DIP switch.
-
-
-
- Configuration |
- Software Commands |
- Hardware Settings |
-
-
- Homing Beacon |
- > DIP CLASSIC BEACON [Note: the DIP switch must also be set to 0-0-0] |
- DIP = 0-0-0 |
-
-
- Classic Fox#1 |
- > DIP CLASSIC 1 > GO |
- DIP = 0-0-1 Sync to start |
-
-
- Classic Fox#2 |
- > DIP CLASSIC 2 > GO |
- DIP = 0-1-0 Sync to start |
-
-
- Classic Fox#3 |
- > DIP CLASSIC 3 > GO |
- DIP = 0-1-1 Sync to start |
-
-
- Classic Fox#4 |
- > DIP CLASSIC 4 > GO |
- DIP = 1-0-0 Sync to start |
-
-
- Classic Fox#5 |
- > DIP CLASSIC 5 > GO |
- DIP = 1-0-1 Sync to start |
-
-
- Classic Demonstration |
- > DIP CLASSIC DEMO |
- DIP = 1-1-0 |
-
-
- Foxoring |
- > DIP FOXORING |
- DIP = 1-1-1 |
-
-
- Spectator Beacon |
- > DIP FOXORING SPEC |
- N/A |
-
-
- Sprint Fox Slow #1 |
- > DIP SPRINT S1 |
- N/A |
-
-
- Sprint Fox Slow #2 |
- > DIP SPRINT S2 |
- N/A |
-
-
- Sprint Fox Slow #3 |
- > DIP SPRINT S3 |
- N/A |
-
-
- Sprint Fox Slow #4 |
- > DIP SPRINT S4 |
- N/A |
-
-
- Sprint Fox Slow #5 |
- > DIP SPRINT S5 |
- N/A |
-
-
- Sprint Fox Fast #1 |
- > DIP SPRINT F1 |
- N/A |
-
-
- Sprint Fox Fast #2 |
- > DIP SPRINT F2 |
- N/A |
-
-
- Sprint Fox Fast #3 |
- > DIP SPRINT F3 |
- N/A |
-
-
- Sprint Fox Fast #4 |
- > DIP SPRINT F4 |
- N/A |
-
-
- Sprint Fox Fast #5 |
- > DIP SPRINT F5 |
- N/A |
-
-
- Sprint Demonstration |
- > DIP SPRINT DEMO |
- N/A |
-
-
- Starting Tone Generator |
- > DIP [any of the above] > STA ON > GO |
- DIP = any Sync to start [Note: Starting Tone Generator can only be enabled with a serial command.] |
-
-
+Usage
+The transmitter can be configured using the serial port, or using the DIP switch and sync-button hardware interface. Only a subset of the available configurations is available when using only the hardware interface. Configuring the DIP setting with a serial port command to anything but 0 (zero) will disable the hardware DIP switch.
+
+
+
+ Configuration |
+ Software Commands |
+ Hardware Settings |
+
+
+ Homing Beacon |
+ > DIP CLASSIC BEACON [Note: the DIP switch must also be set to 0-0-0] |
+ DIP = 0-0-0 |
+
+
+ Classic Fox#1 |
+ > DIP CLASSIC 1 > GO |
+ DIP = 0-0-1 Sync to start |
+
+
+ Classic Fox#2 |
+ > DIP CLASSIC 2 > GO |
+ DIP = 0-1-0 Sync to start |
+
+
+ Classic Fox#3 |
+ > DIP CLASSIC 3 > GO |
+ DIP = 0-1-1 Sync to start |
+
+
+ Classic Fox#4 |
+ > DIP CLASSIC 4 > GO |
+ DIP = 1-0-0 Sync to start |
+
+
+ Classic Fox#5 |
+ > DIP CLASSIC 5 > GO |
+ DIP = 1-0-1 Sync to start |
+
+
+ Classic Demonstration |
+ > DIP CLASSIC DEMO |
+ DIP = 1-1-0 |
+
+
+ Foxoring |
+ > DIP FOXORING |
+ DIP = 1-1-1 |
+
+
+ Spectator Beacon |
+ > DIP FOXORING SPEC |
+ N/A |
+
+
+ Sprint Fox Slow #1 |
+ > DIP SPRINT S1 |
+ N/A |
+
+
+ Sprint Fox Slow #2 |
+ > DIP SPRINT S2 |
+ N/A |
+
+
+ Sprint Fox Slow #3 |
+ > DIP SPRINT S3 |
+ N/A |
+
+
+ Sprint Fox Slow #4 |
+ > DIP SPRINT S4 |
+ N/A |
+
+
+ Sprint Fox Slow #5 |
+ > DIP SPRINT S5 |
+ N/A |
+
+
+ Sprint Fox Fast #1 |
+ > DIP SPRINT F1 |
+ N/A |
+
+
+ Sprint Fox Fast #2 |
+ > DIP SPRINT F2 |
+ N/A |
+
+
+ Sprint Fox Fast #3 |
+ > DIP SPRINT F3 |
+ N/A |
+
+
+ Sprint Fox Fast #4 |
+ > DIP SPRINT F4 |
+ N/A |
+
+
+ Sprint Fox Fast #5 |
+ > DIP SPRINT F5 |
+ N/A |
+
+
+ Sprint Demonstration |
+ > DIP SPRINT DEMO |
+ N/A |
+
+
+ Starting Tone Generator |
+ > DIP [any of the above] > STA ON > GO |
+ DIP = any Sync to start [Note: Starting Tone Generator can only be enabled with a serial command.] |
+
+
-
+
From ed4805818d5b8931b794bb62ec45abe7a4358450 Mon Sep 17 00:00:00 2001
From: OpenARDF <66529806+OpenARDF@users.noreply.github.com>
Date: Fri, 12 Jun 2020 21:46:08 -0400
Subject: [PATCH 08/38] Update README.md
---
README.md | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/README.md b/README.md
index d82312d..63c8851 100644
--- a/README.md
+++ b/README.md
@@ -158,8 +158,7 @@
Starting Tone Generator |
> DIP [any of the above] > STA ON > GO |
- DIP = any Sync to start [Note: Starting Tone Generator can only be enabled with a serial command.] |
+ N/A |
-
From 5a29fe3518cfeeea29b7ff51e6e32bfdb5f6c3cc Mon Sep 17 00:00:00 2001
From: OpenARDF <66529806+OpenARDF@users.noreply.github.com>
Date: Sat, 13 Jun 2020 11:50:21 -0400
Subject: [PATCH 09/38] Update README.md
---
README.md | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/README.md b/README.md
index 63c8851..99123c2 100644
--- a/README.md
+++ b/README.md
@@ -47,7 +47,7 @@
PD6 - Board Pin 6 (Input) <= DIP Switch Bit 2 (switch to Gnd)
Usage
-The transmitter can be configured using the serial port, or using the DIP switch and sync-button hardware interface. Only a subset of the available configurations is available when using only the hardware interface. Configuring the DIP setting with a serial port command to anything but 0 (zero) will disable the hardware DIP switch.
+The transmitter can be configured using the serial port, or using the DIP switch and sync-button hardware interface. Only a subset of the available configurations is available when using only the hardware interface. Configuring the DIP setting with a serial port command to anything but 0 (zero) will disable the hardware DIP switch. Default settings are shown in boldface.
@@ -57,7 +57,7 @@
Homing Beacon |
- > DIP CLASSIC BEACON [Note: the DIP switch must also be set to 0-0-0] |
+ > DIP CLASSIC BEACON [Note: the DIP switch must also be set to 0-0-0] |
DIP = 0-0-0 |
From 94d2718ffb58ed99b07162c4a62f34e05e3c243a Mon Sep 17 00:00:00 2001
From: OpenARDF <66529806+OpenARDF@users.noreply.github.com>
Date: Sat, 13 Jun 2020 13:34:00 -0400
Subject: [PATCH 10/38] Update README.md
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index 99123c2..23b612d 100644
--- a/README.md
+++ b/README.md
@@ -157,7 +157,7 @@
Starting Tone Generator |
- > DIP [any of the above] > STA ON > GO |
+ > DIP [any of the above] > STA ON > GO |
N/A |
From 6ce6ebfc3444437e8580bd8e1d9899cf13b001e0 Mon Sep 17 00:00:00 2001
From: OpenARDF <66529806+OpenARDF@users.noreply.github.com>
Date: Sat, 13 Jun 2020 16:22:46 -0400
Subject: [PATCH 11/38] Update README.md
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index 23b612d..a8937ae 100644
--- a/README.md
+++ b/README.md
@@ -47,7 +47,7 @@
PD6 - Board Pin 6 (Input) <= DIP Switch Bit 2 (switch to Gnd)
Usage
-The transmitter can be configured using the serial port, or using the DIP switch and sync-button hardware interface. Only a subset of the available configurations is available when using only the hardware interface. Configuring the DIP setting with a serial port command to anything but 0 (zero) will disable the hardware DIP switch. Default settings are shown in boldface.
+The transmitter can be configured using the serial port, or using the DIP switch and sync-button hardware interface. Only a subset of the available configurations is available when using only the hardware interface. Configuring the DIP setting with a serial port command to anything but 0 (zero) will disable the hardware DIP switch. Default settings are shown in boldface. Serial command arguments may be abbreviated using the first letter of the word. For example: > DIP CLASSIC BEACON can be shortened to > DIP C B.
From 90063c5deda6fc6da51b93fbd4eed5b4ee986dba Mon Sep 17 00:00:00 2001
From: DigitalConfections
Date: Sun, 14 Jun 2020 14:01:59 -0400
Subject: [PATCH 12/38] Version 0.11
o Adds optional compile for external port pin pull-ups. When the HARDWARE_EXTERNAL_DIP_PULLUPS_INSTALLED is set to FALSE (default) the software will turn on the internal port pin pull-ups prior to reading DIP and SYNC pins. Those pins will then be set to outputs (LOW) after all pins have been read, to save power.
o Fixes a bug that prevented the FAC command from resetting the time calibration (CAL) and callsign (ID) settings.
o Reverses the logic of DIP pins so that ON corresponds to "1".
o Turned off the OC0A pin toggle when audio output is active. Only pin 9 is audio output now.
o Minor cleanup and formatting changes
---
Arduino-microfox/Arduino-microfox.ino | 133 +++++++++++++++-----------
Arduino-microfox/defs.h | 13 +--
2 files changed, 86 insertions(+), 60 deletions(-)
diff --git a/Arduino-microfox/Arduino-microfox.ino b/Arduino-microfox/Arduino-microfox.ino
index 2fc28dc..900e1e4 100644
--- a/Arduino-microfox/Arduino-microfox.ino
+++ b/Arduino-microfox/Arduino-microfox.ino
@@ -32,6 +32,7 @@
#include "defs.h"
#include "linkbus.h"
#include "morse.h"
+#include
#ifdef COMPILE_FOR_ATMELSTUDIO7
#include
@@ -45,10 +46,6 @@
#include "ardooweeno.h"
#endif /* COMPILE_FOR_ATMELSTUDIO7 */
-#ifdef USE_WATCHDOG
-#include
-#endif
-
#define MAX_PATTERN_TEXT_LENGTH 20
#define TEMP_STRING_LENGTH (MAX_PATTERN_TEXT_LENGTH + 10)
@@ -98,6 +95,28 @@ volatile uint8_t g_lastSeconds = 0x00;
{
return( a = static_cast < FoxType > (a + b));
}
+
+ FoxType& operator-- (FoxType & orig)
+ {
+ orig = static_cast < FoxType > (orig - 1); /* static_cast required because enum - int -> int */
+ if(orig < BEACON)
+ {
+ orig = BEACON;
+ }
+ return( orig);
+ }
+
+ FoxType operator-- (FoxType & orig, int)
+ {
+ FoxType rVal = orig;
+ --orig;
+ return(rVal);
+ }
+
+ FoxType& operator -= (FoxType & a, int b)
+ {
+ return( a = static_cast < FoxType > (a - b));
+ }
#endif /* COMPILE_FOR_ATMELSTUDIO7 */
@@ -150,10 +169,6 @@ void sendMorseTone(BOOL onOff);
void playStartingTone(uint8_t toneFreq);
void wdt_init(WDReset resetType);
-#ifndef USE_WATCHDOG
- void (* resetFunc)(void) = 0; /*declare reset function @ address 0 */
-#endif
-
#ifdef COMPILE_FOR_ATMELSTUDIO7
void loop(void);
int main(void)
@@ -163,7 +178,7 @@ void wdt_init(WDReset resetType);
{
while(initializeEEPROMVars())
{
- ; /* Initialize variables stored in EEPROM */
+ ; /* Initialize variables stored in EEPROM */
}
setUpTemp();
@@ -178,24 +193,24 @@ void wdt_init(WDReset resetType);
pinMode(PIN_AUDIO_OUT, OUTPUT);
digitalWrite(PIN_AUDIO_OUT, OFF);
-/* set the pins that are inputs */
- pinMode(PIN_NANO_SYNC, INPUT); /* This pin is used as the sync line
- * NOTE: The original albq PIC controllers used the CPU reset line as the
- * sync line. We had issues with transmitters getting out of sync during transport.
- * later investigation found that ESD events during transport was resetting the
- * PIC. This code will read this I/O line for sync and after finding that the I/O line
- * has switched to the high state it never reads it again until a power cycle.
- * The Arduino reset line does not go off board. ESD event caused out of sync issue fixed. */
- pinMode(PIN_NANO_DIP_0, INPUT); /* fox switch LSB */
- pinMode(PIN_NANO_DIP_1, INPUT); /* fox switch middle bit */
- pinMode(PIN_NANO_DIP_2, INPUT); /* fox switch MSB */
+#if !HARDWARE_EXTERNAL_DIP_PULLUPS_INSTALLED
+ pinMode(PIN_NANO_SYNC, INPUT_PULLUP); /* Sync button */
+ pinMode(PIN_NANO_DIP_0, INPUT_PULLUP); /* DIP switch LSB */
+ pinMode(PIN_NANO_DIP_1, INPUT_PULLUP); /* DIP switch middle bit */
+ pinMode(PIN_NANO_DIP_2, INPUT_PULLUP); /* DIP switch MSB */
+#else
+ pinMode(PIN_NANO_SYNC, INPUT); /* Sync button */
+ pinMode(PIN_NANO_DIP_0, INPUT); /* DIP switch LSB */
+ pinMode(PIN_NANO_DIP_1, INPUT); /* DIP switch middle bit */
+ pinMode(PIN_NANO_DIP_2, INPUT); /* DIP switch MSB */
+#endif /* HARDWARE_EXTERNAL_DIP_PULLUPS_INSTALLED */
- digitalWrite(PIN_NANO_LED, OFF); /* Turn off led sync switch is now open */
+ digitalWrite(PIN_NANO_LED, OFF); /* Turn off led sync switch is now open */
/* set timer1 interrupt at 1Hz */
- TCCR1A = 0; /* set entire TCCR1A register to 0 */
- TCCR1B = 0; /* same for TCCR1B */
- TCNT1 = 0; /*initialize counter value to 0 */
+ TCCR1A = 0; /* set entire TCCR1A register to 0 */
+ TCCR1B = 0; /* same for TCCR1B */
+ TCNT1 = 0; /*initialize counter value to 0 */
/* Set compare match register for 1hz increments
************************************************************
@@ -262,19 +277,23 @@ void wdt_init(WDReset resetType);
if(g_override_DIP_switches)
{
- g_fox = (FoxType)g_override_DIP_switches;
+ g_fox = CLAMP(BEACON, (FoxType)g_override_DIP_switches, INVALID_FOX);
+ if(g_fox == INVALID_FOX)
+ {
+ g_fox = BEACON;
+ }
}
- else /* Read DIP Switches */
+ else /* Read DIP Switches */
{
- if(digitalRead(PIN_NANO_DIP_0) == HIGH ) /*Lsb */
+ if(digitalRead(PIN_NANO_DIP_0) == LOW) /*Lsb */
{
g_fox++;
}
- if(digitalRead(PIN_NANO_DIP_1) == HIGH ) /* middle bit */
+ if(digitalRead(PIN_NANO_DIP_1) == LOW) /* middle bit */
{
g_fox += 2;
}
- if(digitalRead(PIN_NANO_DIP_2) == HIGH ) /* MSB */
+ if(digitalRead(PIN_NANO_DIP_2) == LOW) /* MSB */
{
g_fox += 4;
}
@@ -312,6 +331,18 @@ void wdt_init(WDReset resetType);
g_start_override = TRUE;
+#if !HARDWARE_EXTERNAL_DIP_PULLUPS_INSTALLED
+ /* Disable pull-ups to save power */
+ pinMode(PIN_NANO_SYNC, INPUT); /* Sync button input */
+ pinMode(PIN_NANO_DIP_0, INPUT); /* fox switch LSB */
+ pinMode(PIN_NANO_DIP_1, INPUT); /* fox switch middle bit */
+ pinMode(PIN_NANO_DIP_2, INPUT); /* fox switch MSB */
+ pinMode(PIN_NANO_SYNC, OUTPUT);
+ pinMode(PIN_NANO_DIP_0, OUTPUT);
+ pinMode(PIN_NANO_DIP_1, OUTPUT);
+ pinMode(PIN_NANO_DIP_2, OUTPUT);
+#endif /* HARDWARE_EXTERNAL_DIP_PULLUPS_INSTALLED */
+
if((g_fox == BEACON) || (g_fox == SPECTATOR))
{
g_on_air_interval = 600;
@@ -893,14 +924,10 @@ SIGNAL(TIMER0_COMPA_vect)
{
digitalWrite(PIN_AUDIO_OUT,OFF);
}
-
- TCCR0A |= (1 << COM0A0);
}
else
{
- TCCR0A = (1 << WGM01);
digitalWrite(PIN_AUDIO_OUT,OFF);
-/* digitalWrite(6,OFF); */
}
}
@@ -1072,15 +1099,11 @@ void __attribute__((optimize("O0"))) handleLinkBusMsgs()
{
case MESSAGE_RESET:
{
-#ifdef USE_WATCHDOG
- wdt_init(WD_FORCE_RESET);
- while(1)
- {
- ;
- }
-#else
- resetFunc(); /*call reset */
-#endif /* USE_WATCHDOG */
+ wdt_init(WD_FORCE_RESET);
+ while(1)
+ {
+ ;
+ }
}
break;
@@ -1137,7 +1160,7 @@ void __attribute__((optimize("O0"))) handleLinkBusMsgs()
{
x = BEACON;
}
- if(t == 'F')
+ else if(t == 'F')
{
if((u > '0') && (u < '6'))
{
@@ -1170,7 +1193,7 @@ void __attribute__((optimize("O0"))) handleLinkBusMsgs()
}
}
- if(x)
+ if(x != BEACON)
{
c = CLAMP(SPECTATOR,x,SPRINT_F5);
}
@@ -1274,15 +1297,18 @@ void __attribute__((optimize("O0"))) handleLinkBusMsgs()
{
uint8_t flag = EEPROM_INITIALIZED_FLAG + 1;
eeprom_write_byte(&ee_interface_eeprom_initialization_flag,flag);
-#ifdef USE_WATCHDOG
- wdt_init(WD_FORCE_RESET);
- while(1)
- {
- ;
- }
-#else
- resetFunc(); /*call reset */
-#endif /* USE_WATCHDOG */
+ g_clock_calibration = 0xFFFF;
+ eeprom_update_word(&ee_clock_calibration,g_clock_calibration);
+ for(uint8_t i = 0; i < strlen(g_messages_text[STATION_ID]); i++)
+ {
+ eeprom_write_byte((uint8_t*)&ee_stationID_text,0xFF);
+ }
+
+ wdt_init(WD_FORCE_RESET);
+ while(1)
+ {
+ ;
+ }
}
break;
@@ -1593,4 +1619,3 @@ float getTemp(void)
readADC(); /* throw away first reading */
return(offset + (readADC() - 324.31) / 1.22);
}
-
diff --git a/Arduino-microfox/defs.h b/Arduino-microfox/defs.h
index 49203f9..b8453cb 100644
--- a/Arduino-microfox/defs.h
+++ b/Arduino-microfox/defs.h
@@ -27,6 +27,7 @@
#define DEFS_H
// #define COMPILE_FOR_ATMELSTUDIO7
+#define HARDWARE_EXTERNAL_DIP_PULLUPS_INSTALLED FALSE
#ifdef COMPILE_FOR_ATMELSTUDIO7
#include
@@ -52,12 +53,15 @@
#define OUTPUT 0x1
#endif
-/* #define F_CPU 16000000UL / * gets declared in makefile * / */
+#ifndef INPUT_PULLUP
+#define INPUT_PULLUP 0x3
+#endif
+/* #define F_CPU 16000000UL / * gets declared in makefile * / */
/******************************************************
* Set the text that gets displayed to the user */
-#define SW_REVISION "0.10"
+#define SW_REVISION "0.11"
//#define TRANQUILIZE_WATCHDOG
@@ -120,8 +124,6 @@ INVALID_FOX
#define MAX_CODE_SPEED_WPM 20
#define MIN_CODE_SPEED_WPM 5
-#define USE_WATCHDOG
-
typedef enum
{
WD_SW_RESETS,
@@ -197,10 +199,9 @@ typedef enum
#define UINT16_MAX __INT16_MAX__
#endif
-#define ON 1
#define OFF 0
+#define ON 1
#define TOGGLE 2
-
#define UNDETERMINED 3
#define MIN(A,B) ({ __typeof__(A) __a = (A); __typeof__(B) __b = (B); __a < __b ? __a : __b; })
From a295a52b8ca7002891c45af0fdb9f5d120c105b0 Mon Sep 17 00:00:00 2001
From: DigitalConfections
Date: Sun, 14 Jun 2020 14:52:07 -0400
Subject: [PATCH 13/38] Update README.md
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index a8937ae..0e5108a 100644
--- a/README.md
+++ b/README.md
@@ -47,7 +47,7 @@
PD6 - Board Pin 6 (Input) <= DIP Switch Bit 2 (switch to Gnd)
Usage
-The transmitter can be configured using the serial port, or using the DIP switch and sync-button hardware interface. Only a subset of the available configurations is available when using only the hardware interface. Configuring the DIP setting with a serial port command to anything but 0 (zero) will disable the hardware DIP switch. Default settings are shown in boldface. Serial command arguments may be abbreviated using the first letter of the word. For example: > DIP CLASSIC BEACON can be shortened to > DIP C B.
+The transmitter can be configured using the serial port, or using the DIP switch and sync-button hardware interface. Only a subset of the possible configurations is available when using only the hardware interface. Configuring the DIP setting with a serial port command to anything but 0 (zero) will disable the hardware DIP switch. Default settings are shown in boldface. Serial command arguments may be abbreviated using the first letter of the word. For example: > DIP CLASSIC BEACON can be shortened to > DIP C B.
From 401ebece9224f3624e2ee8f15fa0a08355437c9a Mon Sep 17 00:00:00 2001
From: DigitalConfections
Date: Sun, 14 Jun 2020 15:19:05 -0400
Subject: [PATCH 14/38] Version 0.12
The > GO serial command can now be used anytime to re-sync the transmitter, not just right after power-up
---
Arduino-microfox/Arduino-microfox.ino | 19 ++++++++++++++++---
1 file changed, 16 insertions(+), 3 deletions(-)
diff --git a/Arduino-microfox/Arduino-microfox.ino b/Arduino-microfox/Arduino-microfox.ino
index 900e1e4..0d81f06 100644
--- a/Arduino-microfox/Arduino-microfox.ino
+++ b/Arduino-microfox/Arduino-microfox.ino
@@ -178,7 +178,7 @@ void wdt_init(WDReset resetType);
{
while(initializeEEPROMVars())
{
- ; /* Initialize variables stored in EEPROM */
+ ; /* Initialize variables stored in EEPROM */
}
setUpTemp();
@@ -867,10 +867,17 @@ ISR( TIMER2_COMPB_vect )
* modified from ISR example for microfox by Jerry Boyd WB8WFK
* this runs once a second and generates the cycle and sets control flags for the main controller.
*/
-ISR(TIMER1_COMPA_vect) /*timer1 interrupt 1Hz */
+ISR(TIMER1_COMPA_vect) /*timer1 interrupt 1Hz */
{
static int id_countdown = 0;
+ if(g_seconds_since_sync == 0) /* sync just occurred */
+ {
+ id_countdown = g_id_interval;
+ g_fox_counter = 1;
+ g_lastSeconds = 0;
+ }
+
g_seconds_since_sync++; /* Total elapsed time counter */
g_fox_seconds_into_interval++;
@@ -1283,13 +1290,19 @@ void __attribute__((optimize("O0"))) handleLinkBusMsgs()
{
if(g_start_override)
{
- lb_send_string((char*)"Already synced!\n",FALSE);
+ lb_send_string((char*)"Re-sync successful!\n",FALSE);
}
else
{
g_start_override = TRUE;
lb_send_string((char*)"Running!\n",FALSE);
}
+
+ cli();
+ TCNT1 = 0; /* Initialize 1-second counter value to 0 */
+ g_seconds_since_sync = 0;
+ g_fox_seconds_into_interval = 0;
+ sei();
}
break;
From 2e393e90e993f6da71cfc60aa206a17e2277eccf Mon Sep 17 00:00:00 2001
From: DigitalConfections
Date: Sun, 14 Jun 2020 15:47:05 -0400
Subject: [PATCH 15/38] Update README.md
---
README.md | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/README.md b/README.md
index 0e5108a..ad13291 100644
--- a/README.md
+++ b/README.md
@@ -47,7 +47,8 @@
PD6 - Board Pin 6 (Input) <= DIP Switch Bit 2 (switch to Gnd)
Usage
-The transmitter can be configured using the serial port, or using the DIP switch and sync-button hardware interface. Only a subset of the possible configurations is available when using only the hardware interface. Configuring the DIP setting with a serial port command to anything but 0 (zero) will disable the hardware DIP switch. Default settings are shown in boldface. Serial command arguments may be abbreviated using the first letter of the word. For example: > DIP CLASSIC BEACON can be shortened to > DIP C B.
+The transmitter can be configured using the serial port, or using the DIP switch and sync-button hardware interface. Only a subset of the possible configurations is available when using only the hardware interface. Configuring the DIP setting with a serial port command to anything but CLASSIC BEACON (zero) will disable the hardware DIP switch.
+In the table below, default settings are shown in boldface. Serial command arguments may be abbreviated using the first letter of the word. For example: > DIP CLASSIC BEACON can be shortened to > DIP C B.
From 55fa8d6ed3869aabe2dc10e4fe2a52162a85cfaa Mon Sep 17 00:00:00 2001
From: DigitalConfections
Date: Tue, 16 Jun 2020 10:17:26 -0400
Subject: [PATCH 16/38] Version 0.13
o Synchronization using the hardware sync pin can now be performed at any time, so long as the sync pin is enabled.
o The sync pin is enabled from power up, but gets disabled after the first transmitter cycle: (5 mins for Classic, 1 min for Sprint)
o Sync is accomplished by pulling the sync pin low for at least one second, and then setting it high. Its internal pull-up resistor is enabled. The pin is effectively debounced in software.
o Removed the SYN serial command, so there is now no way to disable sync using a command.
o Fixed a few minor bugs in the TEM command.
o Some refactoring of macro names
---
Arduino-microfox/Arduino-microfox.ino | 237 +++++++++++++-------------
Arduino-microfox/defs.h | 34 +---
Arduino-microfox/linkbus.h | 1 -
3 files changed, 128 insertions(+), 144 deletions(-)
diff --git a/Arduino-microfox/Arduino-microfox.ino b/Arduino-microfox/Arduino-microfox.ino
index 0d81f06..8965053 100644
--- a/Arduino-microfox/Arduino-microfox.ino
+++ b/Arduino-microfox/Arduino-microfox.ino
@@ -72,6 +72,9 @@ volatile int g_startclock_interval = 60;
volatile BOOL g_audio_tone_on = FALSE;
volatile uint8_t g_lastSeconds = 0x00;
+volatile int16_t g_sync_pin_timer = 0;
+volatile BOOL g_sync_pin_stable = FALSE;
+volatile BOOL g_sync_enabled = TRUE;
#ifndef COMPILE_FOR_ATMELSTUDIO7
FoxType& operator++ (FoxType & orig)
@@ -136,7 +139,6 @@ static uint16_t EEMEM ee_ID_time;
static uint16_t EEMEM ee_clock_calibration;
static uint8_t EEMEM ee_override_DIP_switches;
static uint8_t EEMEM ee_enable_LEDs;
-static uint8_t EEMEM ee_enable_sync;
static int16_t EEMEM ee_temp_calibration;
static uint8_t EEMEM ee_enable_start_timer;
@@ -149,13 +151,10 @@ static volatile uint16_t g_clock_calibration = EEPROM_CLOCK_CALIBRATION_DEFAULT;
static volatile int16_t g_temp_calibration = EEPROM_TEMP_CALIBRATION_DEFAULT;
static volatile uint8_t g_override_DIP_switches = EEPROM_OVERRIDE_DIP_SW_DEFAULT;
static volatile uint8_t g_enable_LEDs;
-static volatile uint8_t g_enable_sync;
static volatile uint8_t g_enable_start_timer;
static char g_tempStr[TEMP_STRING_LENGTH] = { '\0' };
-static volatile uint8_t g_start_override = FALSE;
-
/*
* Function Prototypes
*/
@@ -168,6 +167,7 @@ void setUpTemp(void);
void sendMorseTone(BOOL onOff);
void playStartingTone(uint8_t toneFreq);
void wdt_init(WDReset resetType);
+void doSynchronization(void);
#ifdef COMPILE_FOR_ATMELSTUDIO7
void loop(void);
@@ -178,7 +178,7 @@ void wdt_init(WDReset resetType);
{
while(initializeEEPROMVars())
{
- ; /* Initialize variables stored in EEPROM */
+ ; /* Initialize variables stored in EEPROM */
}
setUpTemp();
@@ -186,26 +186,26 @@ void wdt_init(WDReset resetType);
cli(); /*stop interrupts for setup */
/* set pins as outputs */
- pinMode(PIN_NANO_LED, OUTPUT); /* The nano amber LED: This led blinks when off cycle and blinks with code when on cycle. */
- digitalWrite(PIN_NANO_LED, OFF);
- pinMode(PIN_NANO_KEY, OUTPUT); /* This pin is used to control the KEY line to the transmittter only active on cycle. */
- digitalWrite(PIN_NANO_KEY, OFF);
+ pinMode(PIN_LED, OUTPUT); /* The nano amber LED: This led blinks when off cycle and blinks with code when on cycle. */
+ digitalWrite(PIN_LED, OFF);
+ pinMode(PIN_MORSE_KEY, OUTPUT); /* This pin is used to control the KEY line to the transmittter only active on cycle. */
+ digitalWrite(PIN_MORSE_KEY, OFF);
pinMode(PIN_AUDIO_OUT, OUTPUT);
digitalWrite(PIN_AUDIO_OUT, OFF);
#if !HARDWARE_EXTERNAL_DIP_PULLUPS_INSTALLED
- pinMode(PIN_NANO_SYNC, INPUT_PULLUP); /* Sync button */
- pinMode(PIN_NANO_DIP_0, INPUT_PULLUP); /* DIP switch LSB */
- pinMode(PIN_NANO_DIP_1, INPUT_PULLUP); /* DIP switch middle bit */
- pinMode(PIN_NANO_DIP_2, INPUT_PULLUP); /* DIP switch MSB */
+ pinMode(PIN_SYNC, INPUT_PULLUP); /* Sync button */
+ pinMode(PIN_DIP_0, INPUT_PULLUP); /* DIP switch LSB */
+ pinMode(PIN_DIP_1, INPUT_PULLUP); /* DIP switch middle bit */
+ pinMode(PIN_DIP_2, INPUT_PULLUP); /* DIP switch MSB */
#else
- pinMode(PIN_NANO_SYNC, INPUT); /* Sync button */
- pinMode(PIN_NANO_DIP_0, INPUT); /* DIP switch LSB */
- pinMode(PIN_NANO_DIP_1, INPUT); /* DIP switch middle bit */
- pinMode(PIN_NANO_DIP_2, INPUT); /* DIP switch MSB */
+ pinMode(PIN_SYNC, INPUT); /* Sync button */
+ pinMode(PIN_DIP_0, INPUT); /* DIP switch LSB */
+ pinMode(PIN_DIP_1, INPUT); /* DIP switch middle bit */
+ pinMode(PIN_DIP_2, INPUT); /* DIP switch MSB */
#endif /* HARDWARE_EXTERNAL_DIP_PULLUPS_INSTALLED */
- digitalWrite(PIN_NANO_LED, OFF); /* Turn off led sync switch is now open */
+ digitalWrite(PIN_LED, OFF); /* Turn off led sync switch is now open */
/* set timer1 interrupt at 1Hz */
TCCR1A = 0; /* set entire TCCR1A register to 0 */
@@ -248,17 +248,22 @@ void wdt_init(WDReset resetType);
/* Timer 0 is for audio Start tone generation and control
* Note: Do not use millis() or DELAY() after TIMER0 has been reconfigured here! */
TCCR0A = 0x00;
-/* TCCR0A |= (1 << COM0A0) | (1 << WGM01); / * Set toggle OC0A, CTC mode * / */
- TCCR0A |= (1 << WGM01); /* Set CTC mode */
+ TCCR0A |= (1 << WGM01); /* Set CTC mode */
TCCR0B = 0x00;
- TCCR0B |= (1 << CS02); /* Prescale 256 */
+ TCCR0B |= (1 << CS02); /* Prescale 256 */
OCR0A = DEFAULT_TONE_FREQUENCY;
TIMSK0 = 0x00;
TIMSK0 |= (1 << OCIE0A);
- sei(); /*allow interrupts. Arm and run */
+ /* Sync button pin change interrupt */
+ PCMSK2 = 0x00;
+ PCMSK2 = (1 << PCINT19); /* Enable PCINT19 */
+ PCICR = 0x00;
+ PCICR = (1 << PCIE2); /* Enable pin change interrupt 2 */
- linkbus_init(BAUD); /* Start the Link Bus serial comms */
+ sei(); /*allow interrupts. Arm and run */
+
+ linkbus_init(BAUD); /* Start the Link Bus serial comms */
lb_send_string((char*)"\n\nStored Data:\n", TRUE);
sprintf(g_tempStr, " ID: %s\n", g_messages_text[STATION_ID]);
@@ -269,8 +274,6 @@ void wdt_init(WDReset resetType);
lb_send_string(g_tempStr, TRUE);
sprintf(g_tempStr, " LED: %s\n", g_enable_LEDs ? "ON" : "OFF");
lb_send_string(g_tempStr, TRUE);
- sprintf(g_tempStr, " SYN: %s\n", g_enable_sync ? "ON" : "OFF");
- lb_send_string(g_tempStr, TRUE);
sprintf(g_tempStr, " STA: %s\n", g_enable_start_timer ? "ON" : "OFF");
lb_send_string(g_tempStr, TRUE);
lb_send_NewPrompt();
@@ -285,62 +288,28 @@ void wdt_init(WDReset resetType);
}
else /* Read DIP Switches */
{
- if(digitalRead(PIN_NANO_DIP_0) == LOW) /*Lsb */
+ if(digitalRead(PIN_DIP_0) == LOW) /*Lsb */
{
g_fox++;
}
- if(digitalRead(PIN_NANO_DIP_1) == LOW) /* middle bit */
+ if(digitalRead(PIN_DIP_1) == LOW) /* middle bit */
{
g_fox += 2;
}
- if(digitalRead(PIN_NANO_DIP_2) == LOW) /* MSB */
+ if(digitalRead(PIN_DIP_2) == LOW) /* MSB */
{
g_fox += 4;
}
}
-/*
- * we now look at the sync line and then reset the time counters
- * when the sync switch is released.
- * */
- if(g_enable_sync && (g_enable_start_timer || ((g_fox != FOXORING) && (g_fox != BEACON) && (g_fox != FOX_DEMO) && (g_fox != SPRINT_DEMO) && (g_fox != SPECTATOR))))
- {
- lb_send_string((char*)"Waiting for sync.\n", TRUE);
- lb_send_string((char*)"Type \"GO\"\n", TRUE);
- lb_send_NewPrompt();
-
- while(( digitalRead(PIN_NANO_SYNC) == LOW) && !g_start_override)
- {
- if(g_enable_LEDs)
- {
- digitalWrite(PIN_NANO_LED, HIGH); /* arduino nano LED turn on led to show sync switch is closed */
- }
-
- handleLinkBusMsgs();
- }
- }
- else
- {
- lb_send_string((char*)"Tx is running!\n", TRUE);
- lb_send_NewPrompt();
- }
-
- TCNT1 = 0; /* Initialize 1-second counter value to 0 */
- g_seconds_since_sync = 0;
- g_fox_seconds_into_interval = 0;
-
- g_start_override = TRUE;
-
#if !HARDWARE_EXTERNAL_DIP_PULLUPS_INSTALLED
/* Disable pull-ups to save power */
- pinMode(PIN_NANO_SYNC, INPUT); /* Sync button input */
- pinMode(PIN_NANO_DIP_0, INPUT); /* fox switch LSB */
- pinMode(PIN_NANO_DIP_1, INPUT); /* fox switch middle bit */
- pinMode(PIN_NANO_DIP_2, INPUT); /* fox switch MSB */
- pinMode(PIN_NANO_SYNC, OUTPUT);
- pinMode(PIN_NANO_DIP_0, OUTPUT);
- pinMode(PIN_NANO_DIP_1, OUTPUT);
- pinMode(PIN_NANO_DIP_2, OUTPUT);
+ pinMode(PIN_DIP_0, INPUT); /* fox switch LSB */
+ pinMode(PIN_DIP_1, INPUT); /* fox switch middle bit */
+ pinMode(PIN_DIP_2, INPUT); /* fox switch MSB */
+ pinMode(PIN_DIP_0, OUTPUT);
+ pinMode(PIN_DIP_1, OUTPUT);
+ pinMode(PIN_DIP_2, OUTPUT);
#endif /* HARDWARE_EXTERNAL_DIP_PULLUPS_INSTALLED */
if((g_fox == BEACON) || (g_fox == SPECTATOR))
@@ -424,6 +393,28 @@ void __attribute__((optimize("O1"))) wdt_init(WDReset resetType)
}
+/***********************************************************************
+ * Pin Change Interrupt 2 ISR
+ *
+ * Handles SYNC pin operation
+ *
+ ************************************************************************/
+ISR(PCINT2_vect)
+{
+ BOOL pinVal = digitalRead(3);
+
+ if(pinVal) /* Sync is high */
+ {
+ if(g_sync_pin_stable)
+ {
+ doSynchronization();
+ }
+ }
+
+ g_sync_pin_timer = 0;
+}
+
+
/***********************************************************************
* Watchdog Timeout ISR
*
@@ -708,6 +699,23 @@ ISR( TIMER2_COMPB_vect )
static BOOL playMorse = TRUE;
BOOL repeat = TRUE, finished = FALSE;
+ if(g_sync_enabled)
+ {
+ if(digitalRead(PIN_SYNC) == LOW)
+ {
+ if(g_sync_pin_timer < TIMER2_SECONDS_3)
+ {
+ g_sync_pin_timer++;
+ }
+
+ if(g_sync_pin_timer > TIMER2_SECONDS_1)
+ {
+ g_sync_pin_stable = TRUE;
+ digitalWrite(PIN_LED, HIGH);
+ }
+ }
+ }
+
if(blink_counter < -BLINK_LONG)
{
blink_count_direction = 1;
@@ -812,10 +820,10 @@ ISR( TIMER2_COMPB_vect )
{
if(g_enable_LEDs)
{
- digitalWrite(PIN_NANO_LED, HIGH); /* Nano LED */
+ digitalWrite(PIN_LED, HIGH); /* LED */
}
- digitalWrite(PIN_NANO_KEY, HIGH); /* TX key line */
+ digitalWrite(PIN_MORSE_KEY, HIGH); /* TX key line */
}
if(playMorse)
@@ -826,12 +834,12 @@ ISR( TIMER2_COMPB_vect )
}
else
{
- if(g_enable_LEDs)
+ if(g_enable_LEDs && !g_sync_pin_stable)
{
- digitalWrite(PIN_NANO_LED, key); /* nano LED */
+ digitalWrite(PIN_LED, key); /* LED */
}
- digitalWrite(PIN_NANO_KEY, key); /* TX key line */
+ digitalWrite(PIN_MORSE_KEY, key); /* TX key line */
codeInc = g_code_throttle;
if(playMorse)
{
@@ -844,8 +852,11 @@ ISR( TIMER2_COMPB_vect )
if(key)
{
key = OFF;
- digitalWrite(PIN_NANO_LED, LOW); /* nano LED */
- digitalWrite(PIN_NANO_KEY, LOW); /* TX key line */
+ if(!g_sync_pin_stable)
+ {
+ digitalWrite(PIN_LED, LOW); /* LED Off */
+ }
+ digitalWrite(PIN_MORSE_KEY, LOW); /* TX key line */
}
if(playMorse)
@@ -893,6 +904,15 @@ ISR(TIMER1_COMPA_vect) /*timer1 interrupt 1Hz */
if(g_fox_counter > g_number_of_foxes)
{
g_fox_counter = 1;
+
+ if(g_sync_enabled)
+ {
+ PCMSK2 &= ~(1 << PCINT19); /* Disable PCINT19 */
+ PCICR &= ~(1 << PCIE2); /* Disable pin change interrupt 2 */
+ pinMode(PIN_SYNC, INPUT);
+ pinMode(PIN_SYNC, OUTPUT); /* Set sync pin as output low */
+ g_sync_enabled = FALSE;
+ }
}
g_fox_transition = TRUE;
g_fox_seconds_into_interval = 0;
@@ -1002,11 +1022,14 @@ void loop()
{
if(g_blinky_time)
{
- digitalWrite(PIN_NANO_LED,OFF);
+ if(!g_sync_pin_stable)
+ {
+ digitalWrite(PIN_LED,OFF);
+ }
}
else
{
- digitalWrite(PIN_NANO_LED,ON);
+ digitalWrite(PIN_LED,ON);
}
}
}
@@ -1244,27 +1267,6 @@ void __attribute__((optimize("O0"))) handleLinkBusMsgs()
}
break;
- case MESSAGE_SYNC_ENABLE:
- {
- if(lb_buff->fields[FIELD1][0])
- {
- if((lb_buff->fields[FIELD1][1] == 'F') || (lb_buff->fields[FIELD1][0] == '0'))
- {
- g_enable_sync = FALSE;
- }
- else
- {
- g_enable_sync = TRUE;
- }
-
- saveAllEEPROM();
- }
-
- sprintf(g_tempStr,"SYN:%s\n",g_enable_sync ? "ON" : "OFF");
- lb_send_string(g_tempStr,FALSE);
- }
- break;
-
case MESSAGE_STARTTONES_ENABLE:
{
if(lb_buff->fields[FIELD1][0])
@@ -1288,21 +1290,8 @@ void __attribute__((optimize("O0"))) handleLinkBusMsgs()
case MESSAGE_GO:
{
- if(g_start_override)
- {
- lb_send_string((char*)"Re-sync successful!\n",FALSE);
- }
- else
- {
- g_start_override = TRUE;
- lb_send_string((char*)"Running!\n",FALSE);
- }
-
- cli();
- TCNT1 = 0; /* Initialize 1-second counter value to 0 */
- g_seconds_since_sync = 0;
- g_fox_seconds_into_interval = 0;
- sei();
+ doSynchronization();
+ lb_send_string((char*)"Re-sync successful!\n",FALSE);
}
break;
@@ -1450,7 +1439,7 @@ void __attribute__((optimize("O0"))) handleLinkBusMsgs()
}
float temp = 10. * getTemp();
- sprintf(g_tempStr,"Temp: %d.%dC\n",(int)temp / 10,(int)temp % 10);
+ sprintf(g_tempStr,"Temp: %d.%dC\n",(int)temp / 10,abs((int)temp % 10));
lb_send_string(g_tempStr,FALSE);
}
break;
@@ -1488,7 +1477,6 @@ BOOL initializeEEPROMVars()
g_temp_calibration = (int16_t)eeprom_read_word((uint16_t*)&ee_temp_calibration);
g_override_DIP_switches = eeprom_read_byte(&ee_override_DIP_switches);
g_enable_LEDs = eeprom_read_byte(&ee_enable_LEDs);
- g_enable_sync = eeprom_read_byte(&ee_enable_sync);
g_enable_start_timer = eeprom_read_byte(&ee_enable_start_timer);
for(i = 0; i < 20; i++)
@@ -1519,7 +1507,6 @@ BOOL initializeEEPROMVars()
g_temp_calibration = EEPROM_TEMP_CALIBRATION_DEFAULT;
g_override_DIP_switches = EEPROM_OVERRIDE_DIP_SW_DEFAULT;
g_enable_LEDs = EEPROM_ENABLE_LEDS_DEFAULT;
- g_enable_sync = EEPROM_ENABLE_SYNC_DEFAULT;
g_enable_start_timer = EEPROM_ENABLE_STARTTIMER_DEFAULT;
strncpy(g_messages_text[STATION_ID],EEPROM_STATION_ID_DEFAULT,MAX_PATTERN_TEXT_LENGTH);
strncpy(g_messages_text[PATTERN_TEXT],EEPROM_PATTERN_TEXT_DEFAULT,MAX_PATTERN_TEXT_LENGTH);
@@ -1549,7 +1536,6 @@ void saveAllEEPROM()
eeprom_update_word((uint16_t*)&ee_temp_calibration,(uint16_t)g_temp_calibration);
eeprom_update_byte(&ee_override_DIP_switches,g_override_DIP_switches);
eeprom_update_byte(&ee_enable_LEDs,g_enable_LEDs);
- eeprom_update_byte(&ee_enable_sync,g_enable_sync);
eeprom_update_byte(&ee_enable_start_timer,g_enable_start_timer);
for(i = 0; i < strlen(g_messages_text[STATION_ID]); i++)
@@ -1626,9 +1612,24 @@ uint16_t readADC()
*/
float getTemp(void)
{
- float offset = (float)g_temp_calibration / 10.;
+ float offset = CLAMP(-200.,(float)g_temp_calibration / 10.,200.);
/* The offset (first term) was determined empirically */
readADC(); /* throw away first reading */
return(offset + (readADC() - 324.31) / 1.22);
}
+
+
+void doSynchronization(void)
+{
+ cli();
+ TCNT1 = 0; /* Initialize 1-second counter value to 0 */
+ g_seconds_since_sync = 0;
+ g_fox_seconds_into_interval = 0;
+ g_sync_pin_stable = FALSE;
+ digitalWrite(PIN_LED,LOW);
+ g_on_the_air = 0;
+ g_fox_counter = 1; /* Don't count on the 1-sec timer setting this in time */
+ sei();
+}
+
diff --git a/Arduino-microfox/defs.h b/Arduino-microfox/defs.h
index b8453cb..490dd0a 100644
--- a/Arduino-microfox/defs.h
+++ b/Arduino-microfox/defs.h
@@ -61,7 +61,7 @@
/******************************************************
* Set the text that gets displayed to the user */
-#define SW_REVISION "0.11"
+#define SW_REVISION "0.13"
//#define TRANQUILIZE_WATCHDOG
@@ -89,12 +89,12 @@ typedef unsigned char uint8_t;
#define null 0
#endif
-#define PIN_NANO_LED 13
-#define PIN_NANO_KEY 2
-#define PIN_NANO_SYNC 3
-#define PIN_NANO_DIP_0 4
-#define PIN_NANO_DIP_1 5
-#define PIN_NANO_DIP_2 6
+#define PIN_LED 13
+#define PIN_MORSE_KEY 2
+#define PIN_SYNC 3
+#define PIN_DIP_0 4
+#define PIN_DIP_1 5
+#define PIN_DIP_2 6
#define PIN_AUDIO_OUT 9
typedef enum {
@@ -141,7 +141,7 @@ typedef enum
/******************************************************
* EEPROM definitions */
-#define EEPROM_INITIALIZED_FLAG 0xB3
+#define EEPROM_INITIALIZED_FLAG 0xB4
#define EEPROM_UNINITIALIZED 0x00
#define EEPROM_STATION_ID_DEFAULT "FOXBOX"
@@ -160,25 +160,8 @@ typedef enum
#define EEPROM_TEMP_CALIBRATION_DEFAULT 147
#define EEPROM_OVERRIDE_DIP_SW_DEFAULT 0
#define EEPROM_ENABLE_LEDS_DEFAULT 1
-#define EEPROM_ENABLE_SYNC_DEFAULT 1
#define EEPROM_ENABLE_STARTTIMER_DEFAULT 1
-#define EEPROM_SI5351_CALIBRATION_DEFAULT 0x00
-#define EEPROM_CLK0_OUT_DEFAULT 133000000
-#define EEPROM_CLK1_OUT_DEFAULT 70000000
-#define EEPROM_CLK2_OUT_DEFAULT 10700000
-#define EEPROM_CLK0_ONOFF_DEFAULT OFF
-#define EEPROM_CLK1_ONOFF_DEFAULT OFF
-#define EEPROM_CLK2_ONOFF_DEFAULT OFF
-
-#define EEPROM_BATTERY_EMPTY_MV 3430
-
-/******************************************************
- * General definitions for making the code easier to understand */
-#define SDA_PIN (1 << PINC4)
-#define SCL_PIN (1 << PINC5)
-#define I2C_PINS (SCL_PIN | SDA_PIN)
-
#ifndef FALSE
#define FALSE 0
#endif
@@ -217,6 +200,7 @@ typedef enum
#define MAX_TIME 4294967295L
#define MAX_UINT16 65535
#define MAX_INT16 32767
+#define MIN_INT16 -32768
/* Periodic TIMER2 interrupt timing definitions */
#define TIMER2_57HZ 10
diff --git a/Arduino-microfox/linkbus.h b/Arduino-microfox/linkbus.h
index abcc394..58df2bc 100644
--- a/Arduino-microfox/linkbus.h
+++ b/Arduino-microfox/linkbus.h
@@ -96,7 +96,6 @@ typedef enum
MESSAGE_FACTORY_RESET = 'F' * 100 + 'A' * 10 + 'C', /* Sets EEPROM back to defaults */
MESSAGE_OVERRIDE_DIP = 'D' * 100 + 'I' * 10 + 'P', /* Override DIP switch settings using this value */
MESSAGE_LEDS = 'L' * 100 + 'E' * 10 + 'D', /* Turn on or off LEDs - accepts 1 or 0 or ON or OFF */
- MESSAGE_SYNC_ENABLE = 'S' * 100 + 'Y' * 10 + 'N', /* Enable or disable transmitter syncing */
MESSAGE_TEMP = 'T' * 100 + 'E' * 10 + 'M', /* Temperature data */
MESSAGE_SET_STATION_ID = 'I' * 10 + 'D', /* Sets amateur radio callsign text */
MESSAGE_GO = 'G' * 10 + 'O', /* Synchronizes clock */
From f525a4ded285a56b4c7145a584868b14c3a72540 Mon Sep 17 00:00:00 2001
From: DigitalConfections
Date: Tue, 16 Jun 2020 10:21:25 -0400
Subject: [PATCH 17/38] Update README.md
---
README.md | 2 --
1 file changed, 2 deletions(-)
diff --git a/README.md b/README.md
index ad13291..3d90fc9 100644
--- a/README.md
+++ b/README.md
@@ -29,8 +29,6 @@
> SPD <= Displays the ID code speed setting
> STA [on|off] <= * Turns on/off the starting tones function
> STA <= Displays the starting tones setting
-> SYN [on|off] <= * Turns on/off synchronization using sync button or "GO" command
-> SYN <= Displays the synchronization setting
> TEM <= Displays the processor's temperature in C
> VER <= Displays the software version number
From a68a7cef80b7006dd4cf2bfaad391fc4c9a8164c Mon Sep 17 00:00:00 2001
From: DigitalConfections
Date: Tue, 16 Jun 2020 17:47:30 -0400
Subject: [PATCH 18/38] Hardware File Updates
o Added CAD files to Hardware folder
o Renamed schematic diagram file
---
...pdf => Microfox Schematic - 19 May 2020.pdf} | Bin
Hardware/Transmitter CAD Files/80mbase.stl | Bin 0 -> 41484 bytes
.../Transmitter CAD Files/9vbattery_adaptor.stl | Bin 0 -> 14084 bytes
.../Transmitter CAD Files/audio_jack_holder.stl | Bin 0 -> 16384 bytes
Hardware/Transmitter CAD Files/bottom_half.stl | Bin 0 -> 42484 bytes
Hardware/Transmitter CAD Files/case_lid.stl | Bin 0 -> 6884 bytes
Hardware/Transmitter CAD Files/readme.txt | 10 ++++++++++
7 files changed, 10 insertions(+)
rename Hardware/{80 meter microfox may 19 2020 PCB.pdf => Microfox Schematic - 19 May 2020.pdf} (100%)
create mode 100644 Hardware/Transmitter CAD Files/80mbase.stl
create mode 100644 Hardware/Transmitter CAD Files/9vbattery_adaptor.stl
create mode 100644 Hardware/Transmitter CAD Files/audio_jack_holder.stl
create mode 100644 Hardware/Transmitter CAD Files/bottom_half.stl
create mode 100644 Hardware/Transmitter CAD Files/case_lid.stl
create mode 100644 Hardware/Transmitter CAD Files/readme.txt
diff --git a/Hardware/80 meter microfox may 19 2020 PCB.pdf b/Hardware/Microfox Schematic - 19 May 2020.pdf
similarity index 100%
rename from Hardware/80 meter microfox may 19 2020 PCB.pdf
rename to Hardware/Microfox Schematic - 19 May 2020.pdf
diff --git a/Hardware/Transmitter CAD Files/80mbase.stl b/Hardware/Transmitter CAD Files/80mbase.stl
new file mode 100644
index 0000000000000000000000000000000000000000..5aaa0db513552f340aad7a5d356198483d9649c7
GIT binary patch
literal 41484
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
Dg8UO0
literal 0
HcmV?d00001
diff --git a/Hardware/Transmitter CAD Files/9vbattery_adaptor.stl b/Hardware/Transmitter CAD Files/9vbattery_adaptor.stl
new file mode 100644
index 0000000000000000000000000000000000000000..a856b26dc5366e36778b993afbf453dae1ac0f50
GIT binary patch
literal 14084
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
LV?@^t=@9-0<^iQQ
literal 0
HcmV?d00001
diff --git a/Hardware/Transmitter CAD Files/audio_jack_holder.stl b/Hardware/Transmitter CAD Files/audio_jack_holder.stl
new file mode 100644
index 0000000000000000000000000000000000000000..1718324b20097fef570e54f38300f35a2ac6b68f
GIT binary patch
literal 16384
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
O6FMhKK!!Ctss9CMGmhv0
literal 0
HcmV?d00001
diff --git a/Hardware/Transmitter CAD Files/readme.txt b/Hardware/Transmitter CAD Files/readme.txt
new file mode 100644
index 0000000..841ebb3
--- /dev/null
+++ b/Hardware/Transmitter CAD Files/readme.txt
@@ -0,0 +1,10 @@
+files in this zip are:
+
+1. readme.txt this file.
+2. case_lid.stl the lid for the transmitter case.
+3. bottom_half.stl the bottom main part of the case.
+4. 80mbase.stl the sub chaassis that the PCB mounts on. Glue inside case.
+5. audio_jack_holder.stl a bracket to hold optional audio jack for tone outputs.
+6. 9vbattery_adaptor.stl a test adaptor for testbench testing with a powersupply.
+
+All units are mm
\ No newline at end of file
From bb973ecc1d455a2c68ada292fe7a925b9ea1e8f3 Mon Sep 17 00:00:00 2001
From: DigitalConfections
Date: Tue, 16 Jun 2020 19:53:17 -0400
Subject: [PATCH 19/38] Project Description
Added project description document
---
Hardware/Transmitter Project Description.pdf | Bin 0 -> 550999 bytes
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 Hardware/Transmitter Project Description.pdf
diff --git a/Hardware/Transmitter Project Description.pdf b/Hardware/Transmitter Project Description.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..543125fad7ae815ec585bb6842cb182eb79f568a
GIT binary patch
literal 550999
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