tarpn_logo
 home    builders    Search

buildersTARPN ProjectsNinoTNC USB ➜ History

NinoTNC N9600A History

page modified May 4, 2024

Nino (KK4HEJ) started working on a project to interface a single-chip-radio as a KISS serial port TNC in 2015. In 2018 he had a working prototype and brought it to the attention of TARPN. This has been an on-going project since then. While a couple of hams are working on the RF side of this system, Nino did a new project using some of the same code, and the same CPU to make a 9600 baud modem which could drive a data radio. The TARPN radio is not dead, but has been ignored and restored several times in the past couple of years.

Nino's TNC, announced on the TARPN groups-io, was delivered as a 9600 baud TNC in August 2019. He sold the unnamed TNC as a full kit for $26 and sold out in a day. Only 10 were made.

This first model was TTL serial in and out and had screw terminals for serial i/o, power, and radio connections. Nino coded and built the TNC as an experiment and was not planning on taking it further himself.
NCPACKET had its first site to site 9600 baud packet link using the first TNC model on October 1, 2019.


A1 prototype - getting ready for general release

Starting in early September 2019 and running until late November 2019 Nino worked with me, Tadd (KA2DEW), on the idea that the TNC would be used by the various TARPN projects and especially NCPACKET, eventually to be sold publicly. In all cases we desired that the unit not be burdened with a profit motive because that would break the community experimental atmosphere. The TNC was branded NinoTNC.

Nino and I hashed out a bunch of improvements to the TNC to make it easier for the TARPN participants to use.

At this time it was a 9600 baud G3RUH USB KISS TNC, ready for plug and play operation with the Tait TM8105 transceiver.

10 of the A1 board were made and 6 were put into full time operation using the Tait TM8105 radio in the NCPACKET network. I had purchased 20 of the Tait TM8105 radios to help the local networkers in rolling out 9600. I wrote A1 Assembly Instructions and Nino, myself, and many from the TARPN group were pondering how to distribute and fund the boards or kits.


Coastal Chipworks closing its business

Just after we got the first run boards of the A1 boards built, and instructions written, at the beginning of December 2019, Coastal Chipworks announced that it was closing its doors and that the $43 TNC-PI, mainstay of the NCPACKET network and other TARPN projects, would no longer be available. Every other 1200 baud TNC out there was either considerably more expensive than the TNC-PI, or considerably more difficult to get running than the TNC-PI. The TARPN project was suddenly at risk for lack of easy to use inexpensive 1200 baud TNC hardware! But, we had the solution in our hands. So... a bit more work was needed.


A2 prototype - reworked with 1200 baud

Nino reworked the design to include 1200 baud capability. There was some consideration for having the operator of the TNC send configuration to the TNC via USB KISS commands allowing selection of the different radio bit-rates. We decided instead to put a 2 bit DIP-switch on the NinoTNC giving access to the different features.

Still more changes to improve the NinoTNC:

December 31st 2019 we had our first prototypes of the A2 design. Here is our first assembled, first prototype, A2 board. Note the individual resistors near the LEDs. This would be a resistor pack but Nino didn't have the proper pack on hand to test with so this worked for the first board.

After the first prototype we replaced the two big electrolytic capacitors in the power supply circuit with two 10uF Tantalum capacitors, so now there would be 3 identical Tantalum capacitors instead of 3 different capacitors. This would make parts acquisition and placement slightly easier, and solves a minor problem where eletrolytic capacitors die of old age sooner than most of the components.


A2 release version -- first ETSY sale

January 27th 2020 we ordered 200 of this board, with only minor modifications, and changed the board color to black. Delivery expected February 12th (slightly slower than before because of Chinese New Year).
Then COVID19 happened. China shut-down.

In the mean time Nino continued developement, releasing a first cut of his IL2P specification, and tweaking 1200 baud. NinoTNC 1200 baud surpassed TNC-PI performance according to the test CD. The production board finally arrived in the USA Marth 5th. 3 weeks delayed. It seemed like longer at the time.

Here's the production A2 board. A2 boards are black.


This particular A2 board has the L2 resistor hack described under "A3 prototype", below.

Here are the assembly instructions for the A2 board

March 6th 2020 100 of the first 200 black A2 boards were put on sale on ETSY just before midnight. 64 were sold by 6am March 7th. March 8th we shipped 105 A2 boards, to 16 USA customers and one Netherlands customer. We had the remaining 95 boards up for sale on ETSY.

We ran into a problem where the FTDI modules we were using sold out and were back-ordered at Digikey. The backorder of the FTDI module would put some kit assembly back to July! We scrambled around trying to find another vendor of the FTDI module. Every other vendor of the chips either wouldn't ship to the US, or sold a slightly different FTDI module.

Of the first 105 boards sold, we heard of several cases where the builders broke the FTDI boards because the USB-micro socket would peel back from the top of the FTDI module. This was calamity after tragedy.

In the end we sold 150 of the A2 boards. NCPACKET kept 50 of the boards for its own project (only 25 were built, the rest were starved for FTDI modules).

David, K4DBZ [qrz.com], one of the NCPACKET node ops, came up with a home-brew replacement of the FTDI module [oshpark.com] which used a Microchip MCP2221 chip. We also decided the USB micro socket had to go. David put a USB-B socket on his little PCB. The point was that if we did another run of the A2 boards, we'd substitute David's board for the FTDI. In large quantity it was actually cheaper.


A3 project

March 10th 2020 we started a redesign.
The A3 will have 4 switches instead of 2, and will have David's USB-B socket with Microchip MCP2221 USB/I2C/SPI/UART interface chip down on the A3 board instead of as a daughter board.
This will save the purchaser $3 per board and besides being cheaper, it will be easier to install, more robust, and easier to buy, than the FTDI board.
The 4 switches will support future firmware improvements.
We also reduced the size of, and included cuttable shorting wires, supporting in-line ferrite beads for each of the DE-9 radio signals, PTT, TXA, RXA.
A3 will use the same CPUs as the A2 board and any new firmware we come out with for the A3 will work on the A2 as well.
Parts from un-built A2 parts caches could be updated to build A3 boards as most of the parts were common.


A3 prototype

A3 boards are blue.

We made 10 prototypes of the A3 and these were delivered March 28, 2020. We have lots of documentation to do and firmware needs to be written to support the new model (and the old model!)

Firmware for the A3, supporting 2400 baud and 4800 baud, was undergoing testing. In addition, Nino published a specification for Improved Layer 2 Protocol, or IL2P, to be supported on the A3 NinoTNC.

We discovered a bug in the 1200 baud microphone+speaker voice-radio support in the NinoTNC. The TX Audio output level was just too high and could not be turned down low enough to not overdrive the microphone input of some radios. This problem would exist in all of the A2 units as well. NCPACKET operators didn't detect this issue at first because most of the A2 units put into service were used with radios having a data input port. Also, each A2 put in service freed up a 1200-baud TNC-PI so we didn't have much need for an A2 at 1200 baud, at the start. New network participants eventually reached into the A2 and prototype A3 stock so we ran into the problem.

A cheap solution was implemented where a resistor would be placed in series with the TXA output to reduce the peak to peak voltage of the TXA signal. A2 and prototype-A3 board operators would have to kludge a resistor into the circuit someplace. In the production version A2 boards, and the prototype version of A3, a resistor could take the place of the L2 jumper wire.


A3 first shipping version (r2)

Resistor R3 is the in-circuit TXA audio reducer.

April 21 2020 - we ordered 200 boards to be sold on ETSY.
May 3, 2020 - A3 production boards arrived and one was built and tested. 187 of this board were shipped for ETSY orders on May 20, 2020. An additional 10 of these boards went to NCPACKET.

Notice resistor R3 near the DE9 radio connector.

A bug in our kludge solution was found where the linearity of the TX audio path is messed up slightly because of R3. R3 would have to be shorted out for use in a data-radio installation. R3 is important in bringing the TX audio level of the TNC down to microphone-input voltages but having it in-line when used in data-radio service messed up the high speed data. The instructions were modified to require installation of R3, but then shorting it out on the bottom of the board if the NinoTNC is used in data-radio service.


A3 second shipping version (r3)

We added a 2-pin jumper to bypass R3 as a fix for the TXA audio R3 resistor problem.

Notice the 2-pin jumper pins J6 just above and to the right of the USB connector. Insertion of the 2-pin jumper onto J6 pins would bring the TXA voltage to data-radio levels. Removal of the jumper would put R3 in circuit, letting the TNC drive microphone inputs.
There is a tiny "r3" silkscreen designation near the lower left mounting hole.

175 of this board were shipped for ETSY orders between June 13 and July 2, 2020. An additional 25 of the first r3 order went to NCPACKET.

200 boards were ordered by TARPN for sale at ETSY and are expected by the 15th of July 2020.
All 200 sold out by middle of August.
200 boards were ordered by TARPN for sale at ETSY and started shipping in the first week of September 2020. For those playing at home, this is 200 A2r2 boards, 200 A3r2 boards, and 600 A3r3 boards.

Here are the assembly instructions for the A3 board



A4 board process begins

The A4 board moves the TXA adjustment range control to a switch instead of a 2-pin jumper. The TXA filter circuit changes, and the RXA filter circuit changes. All of this will make an improvement in the quality and versatility of the packet transmission and reception, The reference designators and parts labels change in a couple of places.

August 30, 2020

We added a jumper to bypass the capacitor in the transmit audio path, allowing for DC coupling to a transceiver. This is useful for enhancing frequency response, but can't be used if the transmitter can't tollerate a voltage offset, or if the transmitter asserts a voltage offset. A 5th switch is provided to take the place of the Data Radio jumper from the A3r3 boards.

We built 10 of these boards, many of which were deployed in the NCPACKET network.


Bootloaders

October 2020
Bootloader applications released for TARPN nodes, Raspberry PI without TARPN, MSWIndows and other Linux.

November 2020

We added a high gain amplifier to the receive path, permitting support of some Kenwood ham mobiles which provided low level receive audio on the microphone connector. This option also allows connection to the internals of some radios for 4800 and 9600 bit-rate support. We also added an optional external DCD-active input on pin 2 of the DE9 radio connector. These options, plus the data-radio TXA selection, are selected using a new 4-bit DIP-switch called SIGNALS.

We ordered 10 of these, all of which were assembled, and most of which were deployed in the NCPACKET network.

December 2020

Some of the symbols were renamed, but no layout or schematic changes. This is the A4 model shipped in December.

We ordered 200 of the bare boards from SeedStudio in China and were able to sell and ship all 200, using ETSY, by late January 2021.
2.90, programmed into the dsPIC33EP512GP502, shipping with NinoTNC A4 in late December 2020. We had to switch CPUs in that order because the 256GP cpu was no longer available and was backordered until June. The new chip is very similar but with double the memory capacity, but also costs 70 cents more or so. The chip shipped with the A4 December order is designated the "FAT" chip and requires a new bootloader and a different firmware load.

Nino revised the Python code for the bootloader so it can recognize the different loads. The new bootloader in the firmware is now brick-resistant in that you can restart the bootload after it is interrupted. It also is now in 3 different versions.
'a' is the original 2.xx firmware bootloaderin the old chip.
'b' is the new firmware bootloaderin the old chip (THIN).
'B' is the new firmware bootloader in the new 'FAT' chip.
The TARPN scripting will take care of this automatically. TARPN is in the process of beta testing a new version, release probably in March or April 2021, maybe coincident with a new Raspberry PI OS release.

January 2021

In January, having had no complaints about the first 200 A4r2 boards we ordered 400 more bare PCBs from China. These were in-country (USA) by January 21st but got held up in import/customs control.

March 2, 2021

Fed-Ex finally let us have the 400 boards, held up for 8 weeks. These were for sale on ETSY from March until August.

April 23, 2021

All 400 boards from January-March 2021 sold out. 200 more boards ordered. CPUs are in short supply but we've been able to get enough to match the ordered PCBs.

May 2021

200 boards available for sale.

A bug in our bootloader was exposed.
If you have used the bootloader to update a v2 CPU to V2.9 through V3.05, then the CPU cannot be bootloaded another time. The fix for your CPU will be to get a PICKIT3 or PICKIT4 device to reflash the chip. We can help you with operating that tool. Some soldering to one NinoTNC is required to attach the PICKIT.
((the 3 and 4 nomenclature on the PICKIT is not related to our thin/fat firmware version designations -- either PICKIT3 or PICKIT4 is adaquate to flash the CPUs))
You'll need MSWindows 7 or later and some free Microchip software.
We can also ship you more CPUs for cost. Combined shipping is no problem.
Version V3.06 firmware has a bootloader which can handle a V2.20 through V2.89 CPU and fixes the bug, but only if you have not already bootloaded to version V2.90 through V3.05.
V4 firmware/CPUs did not have the problem.

September 2021

The May order is completely shipped.
We ordered another 200 PCBs for October sales.
CPUs are in very short supply but we have enough for October.
NCPACKET has removed and disposed of all but three TNC-PI and replaced them with NinoTNCs. We're very happy with the NinoTNC.

November 2021

September-October 200 boards are nearly all gone. Another 200 ordered for December sales. It looks like we're shipping 21 units per week.

To be continued!

 

 

NinoTNC Firmware history

Note: Shipped version are considered Released. Intermediate versions were for testing. We make test versions available to beta testers.

As of the implementation of the over-the-USB bootloader, we started putting test versions in the Bootload GIT repository and also in the TARPN webserver for the Raspberry PI based bootloaders. See the Operation web page for info about the bootloader.

The test versions have introduced powerful new features and powerful new bugs. We'd like to think the released versions included the features, but not the bugs. Please be careful and have a sense of adventure when testing the beta versions.

Note about bugs: If you see something go wrong, especially if it is stable and wrong, please take care to grab what information you can and get it to us on the ninotnc groups.io reflector. Please mention the firmware version you are using (revealed with the TX-TEST button USB test message), the board version, and what application/OS you are using. If you think the NinoTNC may have hung up, please try to prove that before cutting power. If the TX-TEST button doesn't light the TX LED, then that is a dead give-away, but it is possible for just one process in the NinoTNC CPU to hang, leaving the TX-LED still running.

Thanks for any help.

// 1.40 : 09-Nov-19 : add support for N9600A1 LEDS
// 1.41 : 24-Nov-19 : fix FTDI chip held in reset bug on N9600A1
// 1.42 : 29-Nov-19 : add AFSK transmit, streamline receive buffer usage
// 1.60 : 08-Dec-19 : add I2C KISS interface
// 2.00 : 24-Dec-19 : first N9600A2 version. Add IL2P, AFSK receive. Put preamble bits in their own buffer. Remove CTS pin. Add pin state detect. Add TXDELAY analog sampling.
// 2.01 : 05-Jan-20 : Added stand-alone AX.25 ID packet generator for IL2P modes.
// 2.10 : 10-Jan-20 : Added energy DCD, improved AFSK receive with higher sampling rate
// 2.11 : 14-Jan-20 : Improved DCD timing, deleted transmit inhibit logic

   2.11 shipped with NinoTNC A1

// 2.12 : 23-Jan-20 : Equalized AFSK demodulator
// 2.20 : 17-Feb-20 : Add bootloader, keep OC1 operating at half scale to reduce TX skew, add old-style DCD detection (CrossingsInSync)
//                  : Added TX/RX inversion option to A2 boards, increased DCD break to 100ms, changed min TXDELAY

   2.20 shipped with NinoTNC A2 r2 starting March 6th, 2020

// 2.22 : 21-Mar-20 : Fixed inverted transmit data bug on AFSK (inverted GFSK transmit filter table)
// 2.30 : 21-Mar-20 : Added 2400 DPSK mode, 4800 GFSK mode, support for N9600A3, KISS commands GETALL, GETVER, SETSERNO.
// 2.31 : 11-Apr-20 : Added PTT loopback test & test packet, boot packet.
// 2.32 : 25-Apr-20 : Fixed AFSK IL2P Sync DCD hang bug.
// 2.33 : 26-Apr-20 : Additional fix for AFSK IL2P Sync DCD hang. Also changed IL2P SYNCTOL to 0.
// 2.34 : 26-Apr-20 : Fixed IL2P Supervisory frame bit translations (chasing spurious REJ). Changed IL2P SYNCTOL back to 1.
// 2.35 : 27-Apr-20 : Removed ID packet SSID, fixed ID packet protocol bug.

   2.35 shipped with NinoTNC A3 r2 starting May 3, 2020


// 2.36 : 27-Apr-20 : Put DAPSK transmit waveform in lookup table.
// 2.37 : 09-May-20 : Special unreleased version (beta test at NCPACKET) to map all 3 fast bit rates to A2 dip switch in IL2P mode.
//                  : 00 - 1200 AFSK AX.25
//                  : 01 - 2400 DAPSK IL2P
//                  : 10 - 4800 GFSK IL2P
//                  : 11 - 9600 GFSK IL2P
// 2.38 : 10-May-20 : Merge 2.36 and 2.37
// 2.39 : 22-May-20 : Add WDT reset criteria for "aggressively safe" remote site. Fixed transmit hang bug (timer logic).
// 2.40 : 23-May-20 : Modifying timer management. Addressing additional transmit cycle bug that causes short transmits (about 5 ms) every 20,000 packets.)
//                  : Transitioned most TMR3 interrupts to main loop cycle.
//                  : Establish the GETVER as KISS command 0x08.
// 2.41 : 31-May-20 : Re-mapped A2 functions:
//                  : 00 - 9600 GFSK AX.25
//                  : 01 - 9600 GFSK IL2P
//                  : 10 - 1200 AFSK AX.25
//                  : 11 - 2400 DAPSK IL2P
//                  : Adjusted preamble times for 2400 and 4800 baud modes

   2.41 shipped with NinoTNC A3 r3 June 13


// 2.42 : 28-Jun-20 : Added N9600A4 support. Inverted DAC output for N9600A4.
//                  : Added IL2P receive inversion detection.
//                  : Added info dump to TEST_TX usb packet. -- note bug: Always 0 TxPktCnt figure.
// 2.44 : 5-Jul-20  : Added switch position to data dump.
// 2.45 : 5-Jul-20  : Moved modulation mode selection to transmit buffer to allow flexible transmit modulation.
//                  : Streamlined buffer memory.
//                  ; Changed the meaning of the orange LED from "stranger" to "pending".
//                  ; In 2.44 and before, the orange LED illuminated if a callsign other than the most recent from or to callsigns is heard on the channel.
//                  ; In 2.45 and later, the orange LED (Blue LED on the A4 board) illuminates if a TX message is ready to send but the NinoTNC has not yet sent it.
// 2.46 : 6-Jul-20  : Added mode ID beacon to all modes except AX.25 1200. Sent in AX.25 1200
//                  : Provided tuning tone selection based on mode switch settings. This allows the
//                  : user to chose the target deviation for the bessel null tuning procedure.
//                  : Notes:
//                  : - Deviation is set with the TX_DEV pot. Changing the operating mode switches
//                  :   does not change deviation, but does change the tuning tone.
//                  : - The "best" deviation will be based on many factors, such as the specific
//                  :   radios used in the link.
//                  : - 3kHz deviation should work for most setups.
//                  : - 2400 Baud mode does not REQUIRE 5kHz deviation (3kHz is fine).
//                  : - The tones selected in 4800 and 9600 mode provide Minimum Shift Keying,
//                  :   but more deviation may work well too.
//                  : 1200 Baud - 1248 Hz   (3kHz Dev)
//                  : 2400 Baud - 2079 Hz   (5kHz Dev)
//                  : 4800 Baud - 500 Hz    (1.2kHz Dev)
//                  : 9600 Baud - 999 Hz    (2.4kHz Dev)

   2.46 shipped with NinoTNC A3 r3 in July and August 2020

// 2.50 :26-Jul-20  : Experimental version to test an improvement to IL2P with more parity data.
// 2.51 :23-Aug-20  : Includes MAXFEC IL2P mode, and fixes the TxPktCnt bug. By default, this firmware sends IL2P using MAXFEC mode
//                  : with more parity bytes than old versions. IL2P packets sent with this firmware won’t be decoded by previous
//                  : firmware versions, though this will decode from previous versions.
//                  : This version decodes 948 packets on both test tracks on WA8LMF's test CD.

   2.51 shipping with NinoTNC A3 in early September 2020

// 2.71 : 26-Sep-20 : A2 NinoTNC switch arrangement is shuffled.  This is/will be fixed in 2.75.
//                  : This test-version turned off IL2P
//                  : Further AFSK receive improvement.
//                  : Added external INHIBIT input to RB4/Pin 11.
//                  : Added support for N9600A4r1.
//
// 2.73 : 03-Oct-20 : IL2P restored
//                  : A2 NinoTNC switch arrangement is shuffled.  This is/will be fixed in 2.75.
//                  : Increased UART 1 receive queue to 2.1kB to support MAXFRAME 7.
//                  : Added RXA Clip indication to CRCBADLED (lights when receive signal at max ADC count).
//
// 2.74 : 07-Oct-20 : Allow reception of AX.25 packet without proper callsign field.  This enables tncattach messages to be received.
//                  : A2 NinoTNC switch arrangement is shuffled.  This is/will be fixed in 2.75.
//
// 2.75 : 09-Oct-20 : fixes A2 switches to match 2.41 through 2.51 versions.
//
// 2.76 : 12-Oct-20 : Add repetitive GETALL dump back to TARPN node.
//
// 2.77 : 13-Oct-20 : Fix bug in 2400 baud processing.
//
// 2.78   20-Oct-20 : Fix bug where GETALL dump sending was eratic.  Now sent every minute for TARPN installations.
//
// 2.81   25-Oct-20 : Add 5 more figures to GETALL dump.  Now it shows mS and bytes transmitted and received as well as count of corrected IL2P bytes.
//                    Fix ordering of GETALL switch-positions output.
// 2.83 : 19-Nov-20 : Changed 9600 AX.25 preamble words from 0x0000 to 0x7E7E
// 2.84 : 21-Nov-20 : Added OPB 1200 AFSK low-pass emphasis filter option
// 2.85 : 21-Nov-20 : Increased DAPSK receive sample rate to 57600.
//                  : Enabled clip detect for DAPSK receive.
//                  : Improved DAPSK receive output LPF.
// 2.86 : 29-Nov-20 : Added LastGoodPacket tracking to filter CRC BAD LED trigger.
//                  : Removed DEVID logic (unused).
// 2.89 : 08-Dec-20 : Adjusted AX.25 receive packet min length to 10 bytes.
// 2.90 : 21-Dec-20 : Forked to dsPIC33EP512GP502
//                  : Increased AX25 receive buffer to 1068 bytes

   2.90, programmed into the dsPIC33EP512GP502, shipping with NinoTNC A4 in late December 2020.
   We had to switch CPUs in that order because the 256GP cpu was no longer available and was backordered until June.
   The new chip is very similar but with double the memory capacity.
   The chip shipped with the A4 December order is designated the "FAT" chip and requires a new bootloader and a different firmware load.

// 3.00 and 4.00
//        04-Jan-21 : Versioning convention change.
//                  : Major version 4 indicates dsPIC33EP512GP (fat CPU).
//                  : Major version 3 indicates dsPIC33EP256GP (original/thin CPU).
//                  : Updated bootloader to 'b' for 3.00 and 'B' for 4.00. New
//                  : bootloader is capable of restarting interrupted flash.
//                  : Changed PENDING LED logic to illuminated when packets
//                  : are waiting for transmit OR bytes are present in the
//                  : KISS UART receive queue.
//                  : ****************** MEMORY ALLOCATION ******************
//                  :   FUNCTION                  3.00            4.00
//                  : UART FROM HOST           2100 bytes      8192 bytes    Limits maximum window size (MAXFRAME) for connected links.
//                  : TX DATA BUFFER           541  words      541  words    Limits maximum transmit packet size to 541*16 = 8,656 bits including all overhead.
//                  : TX DATA BUFFER COUNT     3               3             Permits back-to-back transmits (a packet can be prepared for transmit while another is transmitted).
//                  : TX DAC SAMPLE BUFFER     144  words      144  words    Transmit audio samples, passed to OC module via DMA. 86,400 Hz sample rate.
//                  : TX DAC BUFFER COUNT      16              16            Permits 26.67mS of audio to be queued prior to transmit to prevent underruns.
//                  : RX ADC SAMPLE BUFFER     96   words      96   words    Receive audio samples collected by ADC via DMA. 57,600 Hz sample rate.
//                  : RX ADC BUFFER COUNT      16              16            Permits up to 26.67mS of demodulation processing delay prior to sample loss.
//                  : RX DATA BUFFER           8    words      8    words    Data buffers where sliced bits demodulated from receive audio are collected.
//                  : RX BUFFER COUNT          9               9             Allows additional data accumulation during packet decoding.
//                  : AX25 RECEIVER            300  bytes      1068 bytes    Limits maximum AX.25 receive packet size, inclusive of header, payload, and CRC.
//                  : IL2P RECEIVER            1023 bytes      1023 bytes    Limits maximum IL2P receive packet payload size, exclusive of header and parity symbols.
//                  : UART TO HOST             1100 bytes      1100 bytes    Limits maximum KISS frame size returned to host.
//
// 3.01 and 4.01
//        23-Jan-21 : Modified serial number storage in flash program memory.
//                  : Serial number can only be set if value in flash program memory is clear.
//                  : Serial number read directly from flash program memory when requested by host.

// 3.06 4.06
//         01-May-21 : New bootloader.
                     : A bug has been exposed.  The original bootloader could update older (2.20 -> 2.89) firmware to 3.00 and 3.01,
//                   : but elements of the original bootloader would remain in the CPU and the combined V3 bootloader and older
//                   : bootloader could not update the firmware another time.
//                   : It would get stuck, leaving you with a working, but not bootloadable, NinoTNC CPU.
//                   : The V3.06 bootloader is a serious rewrite.  It is now capable of rewriting version 2.20 through 2.89 to version 3.06,
//                   : but firmware updated into 2.90 through 3.05 are stuck.  Version 4.00 through 4.05 are bootloadable to 4.06.
//                   : If you have already updated v2.20 -> 2.89 to a version 2.90 through 3.05, then you are stuck.  The next update for that CPU
//                   : will have to be done with a PICKIT3 or 4 to reflash the chip.  See if somebody in your area is doing that.
//                   : PICKIT can be as cheap as $40 and runs on MSWindows 7 or later (maybe more compatability, I don't know).
//                   : The new bootloader is very robust.

// 3/4.07: 19-Feb-22 : Adjusted DAC neutral output 104 counts closer to ground to avoid over-driving MCP604 op-amp input.
//                   : Restructured memory, eliminated TX_PWM_QUEUE.
//                   : Organized program state flow.
//                   : Transitioned to xc16 v2.00 compiler, optimization level -O1.
//                   : Updated bootloader to 'd' for 256 chips and 'D' for 512 chips.
//                   : ****************** MEMORY ALLOCATION ******************
//                   :   FUNCTION                  3.07            4.07
//                   : UART FROM HOST           2100 bytes      8192 bytes    Limits maximum window size (MAXFRAME) for connected links.
//                   : TX DATA BUFFER           561  words      561  words    Limits maximum transmit packet size to 561*16 = 8,976 bits including all overhead.
//                   : TX DATA BUFFER COUNT     3               3             Permits back-to-back transmits (a packet can be prepared for transmit while another is transmitted).
//                   : RX ADC SAMPLE BUFFER     96   words      96   words    Receive audio samples collected by ADC via DMA. 57,600 Hz sample rate.
//                   : RX ADC BUFFER COUNT      16              16            Permits up to 26.67mS of demodulation processing delay prior to sample loss.
//                   : RX DATA BUFFER           8    words      8    words    Data buffers where sliced bits demodulated from receive audio are collected.
//                   : RX BUFFER COUNT          9               9             Allows additional data accumulation during packet decoding.
//                   : AX25 RECEIVER            1068  bytes     1068 bytes    Limits maximum AX.25 receive packet size, inclusive of header, payload, and CRC.
//                   : IL2P RECEIVER            1023 bytes      1023 bytes    Limits maximum IL2P receive packet payload size, exclusive of header and parity symbols.
//                   : UART TO HOST             1100 bytes      1100 bytes    Limits maximum KISS frame size returned to host.

// 3/4.08: 22-Feb-22 : This firmware adds 3-bit unit ID functionality set by MODE switches.
//                   : When the TNC boots up, if the unit ID has not been set by switch, then the LEDS follow the normal cylon pattern.
//                   : If the unit ID has been set by switches, at boot the CRC LED will flash rapidly for 2 seconds while the
//                   : unit ID is displayed on the middle 3 LEDs.
//                   : If the TEST TX button is pressed during the boot LED show, and held for 5 seconds after the LED show
//                   : completes, then the current MODE switch settings are stored as then new unit ID and displayed on the LEDs.
//                   : The CRC LED flashes at a slower rate while the 5 second timer is elapsing. The CRC LED flashes at a fast
//                   : rate once the 5 second timer is elapsed. The CRC LED stays in fast flash with unit ID displayed on the
//                   : middle LEDs until the TEST TX button is released.
//                   : The unit ID is stored in the SerNo (KAUP8R) memory area, so it will be returned in that field on data
//                   : dumps and in response to the GETSERNO command.
//                   : The unit ID can be overwritten through the existing KISS SETSERNO command.

// 3/4.09: 23-Feb-22 : Improved receive UART buffer overflow handling.

// 3/4.10: 27-Feb-22 : Restored cylon LED pattern at boot with serial number set from switches.

// 3/4.11: 02-Mar-22 : Bug Fixes: Corrected IL2P Transmit Buffer management, added Stranded Transmit Packet handling.
//                   : Increased RX ADC BUFFER COUNT to 24.
//                   : Added neutral DAC output on startup to prevent frequency skew on first transmit.
//                   : Added UART RX overflow (KISS frame lost) indication to CRCBAD LED.
//                   : ****************** MEMORY ALLOCATION ******************
//                   :   FUNCTION                  3.11            4.11
//                   : UART FROM HOST           2100 bytes      8192 bytes    Limits maximum window size (MAXFRAME) for connected links.
//                   : TX DATA BUFFER           561  words      561  words    Limits maximum transmit packet size to 561*16 = 8,976 bits including all overhead.
//                   : TX DATA BUFFER COUNT     3               3             Permits back-to-back transmits (a packet can be prepared for transmit while another is transmitted).
//                   : RX ADC SAMPLE BUFFER     96   words      96   words    Receive audio samples collected by ADC via DMA. 57,600 Hz sample rate.
//                   : RX ADC BUFFER COUNT      24              24            Permits up to 40mS of demodulation processing delay prior to sample loss.
//                   : RX DATA BUFFER           8    words      8    words    Data buffers where sliced bits demodulated from receive audio are collected.
//                   : RX BUFFER COUNT          9               9             Allows additional data accumulation during packet decoding.
//                   : AX25 RECEIVER            1068  bytes     1068 bytes    Limits maximum AX.25 receive packet size, inclusive of header, payload, and CRC.
//                   : IL2P RECEIVER            1023 bytes      1023 bytes    Limits maximum IL2P receive packet payload size, exclusive of header and parity symbols.
//                   : UART TO HOST             1100 bytes      1100 bytes    Limits maximum KISS frame size returned to host.

// 3/4.12: 04-Mar-22 : Added logic to process all KISS frames regardless of target port.
//                   : Fixed NVM write bug.
//                   : Added RXPKTLED double-flash after successful NVM write.
//                   : Improved TEST TX button debounce.

// 3/4.13: 04-Mar-22 : Fixed mode 0101 2400 DPSK IL2P - broken in 3/4.12.


###### 3.14 / 4.14 is a release version shipped with NinoTNC A4 from March 2022 through early 2023.
// 3/4.14: 07-Mar-22 : Restored GETALL data dump.

// 3/4.15  20-Apr-22 : Added Bit error rate transmit + receive + rapid beaconing for range testing

// 3/4.16            : Many fixes reorganization.  Added experimental SSB modes with MODE 1000 thru MODE 1111

// 3/4.17  08-Aug-22 : Fix bug where TARPN nodes would not get accelerated GETALL data used for the TINFO command.
//                   : There is a bug where releasing the TEST-TX button did not produce an AX.25 over USB test message.
//                   : Fixed in 3.23/4.23

// 3/4.18: 09-Jan-23 : Adjusted TEST_TX button debounce times.
//                   : Improved AFSK demodulator efficiency.
//                   : Adjusted Data Slicer PLL feedback rates.
//                   : Improved input filtering for GFSK and DPSK modes.
//                   : Added input overload detection for GFSK modes.
//                   : Fixed RX PKT LED bug on boot.

// 3/4.19: 12-Jan-23 : Optimize SSB AFSK receive.

// 3/4.20: 21-Jan-23 : Relax validity check for host callsign adoption. This is
//                   : the callsign the TNC uses as the source callsign of the
//                   : packet generated by the TEST_TX button. The TNC will now
//                   : adopt callsigns that have more than 1 numeric digit.

###### 3.21 / 4.21 is a release version shipped with NinoTNC A4 from March 2023

// 3/4.21: 21-Jan-23 : Inhibit slicer DCD logic for input signals below ~200mV.
//                   :
//                   : MODE switch mapping:
//                   :
//                   : 0000 9600 GFSK AX.25 ⌉ These modes require a data port or
//                   : 0001 9600 GFSK IL2P  ⎮ discriminator/varactor connection.
//                   : 0010 4800 GFSK AX.25 ⎮
//                   : 0011 4800 GFSK IL2P  ⌋
//                   :
//                   : 0100 2400 DPSK AX.25 ⌉ These modes are suitable for
//                   : 0101 2400 DPSK IL2P  ⎮ speaker/mic connection.
//                   : 0110 1200 AFSK AX.25 ⎮
//                   : 0111 1200 AFSK IL2P  ⌋
//                   :
//                   : 1100  300 AFSK AX.25 ⌉ These modes are intended for SSB
//                   : 1101  300 AFSK IL2P  ⎮ operation.
//                   : 1110  150 AFSK AX.25 ⎮
//                   : 1111  150 AFSK IL2P  ⌋
//                   :
//                   : 1000                 ⌉ These switch settings are reserved
//                   : 1001                 ⎮ for future modes. For now, they
//                   : 1010                 ⎮ will behave the same as the SSB
//                   : 1011                 ⌋ modes above.
//                   :
//                   : There is a bug where releasing the TEST-TX button did not produce an AX.25 over USB test message.
//                   : Fixed in 3.23/4.23

// 3/4.22: 26-Apr-23 : Improve spectral purity of 150 and 300 baud modes.

// 3/4.23: 28-Apr-23 : Fix AX.25 over USB test message upon release of TEST-TX button.
//                   : See chapter 16 of the Operators manual.

// 3/4.24: 08-Apr-23 : Deletes 2400 baud AX.25 mode to save space.  2400 baud IL2P is supported.
//                   : Fixes bug in IL2P decoder that allowed TNC to pass uncorrected erroneous frames to KISS under noisy conditions.
//                   : See Nino's message on [email protected] from April 8, 2023, for full details.

// 3/4.26: 01-Sep-23 : 3.26/4.26 includes four newly-added modulation formats that use PSK.
//                   : John Wiseman just posted a new version of QTSoundModem as well, which includes compatible PSK modes.
//                   : The compatible QTSoundModem version identifies as 0.0.0.67 in the title bar.
//                   :
//                   : 1010  1200 Baud BPSK   2.4 kHz wide
//                   : 1000   300 Baud BPSK   500 Hz wide
//                   : 1011  1200 Baud QPSK   (2400 bps), 2.4 kHz wide
//                   : 1001   300 Baud QPSK   (600 bps), 500 Hz wide
//                   :
//                   : These modes are all filtered for the specified bandwidth.
//                   : The QPSK modes follow the ITU V.26A phase change scheme.
//                   : They all use "vanilla" IL2P (that's a selectable option in QTSM).
//                   : The modes are suitable for use through SSB radios, or FM radios using Mic/Speaker, or data port connections.
/
// 3/4.27: 01-Oct-23 : Add QPSK 600 SSB mode (600 bps, 300 baud).
//                   : Add BPSK 1200 SSB mode (1200 bps, 1200 baud).
//                   : Add SSB ID in 300 baud AFSK AX.25.
//                   : Adjusted BPSK/QPSK RRC rolloff to 0.6, span 6 for 300 baud PSK.
//                   : BPSK/QPSK RRC rolloff 0.9, span 6 for 1200 baud PSK.
//                   : Adjusted DCDLED sensitivity for AFSK AX.25 300 mode.
//                   : Corrected DCDLED on-time tracking.
//                   : Corrected TX_DELAY time computation for QPSK modes.
//                   : Improved DCD response time for all modes.
//                   : Adjusted Data Slicer DCD LED Inhibit voltage down to ~65mV (better DCD LED loopback testing).
//                   : Added KISS TXDELAY command compliance with TX_DELAY pot set to 0.
//                   : Adjusted QPSK phase map to match ITU V.26A.
//                   : Fixed IL2P buffer memory address conflict, this was causing packet loss and retries in IL2P modes.
//                   :
//                   : Latest MODE switch mapping:
//                   :
//                   : 0000 9600 GFSK AX.25 ⌉ These modes require a data port or
//                   : 0001 9600 GFSK IL2P  ⎮ discriminator/varactor connection.
//                   : 0010 --------------- ⎮ Deleted 4800 AX.25
//                   : 0011 4800 GFSK IL2P  ⌋
//                   :
//                   : 0100 --------------- ⌉ Deleted 2400 DPSK AX.25
//                   : 0101 2400 DPSK IL2P  ⎮ These modes are suitable for
//                   : 0110 1200 AFSK AX.25 ⎮ speaker/mic connection on
//                   : 0111 1200 AFSK IL2P  ⌋ FM voice radios.
//                   :
//                   : 1100  300 AFSK AX.25 ⌉ Legacy SSB AFSK packet using
//                   : 1101  300 AFSK IL2P  ⎮ 1600/1800Hz tones.
//                   : 1110 --------------- ⎮ Deleted 150 AFSK AX.25.
//                   : 1111 --------------- ⌋ Deleted 150 AFSK IL2P.
//                   :
//                   : 1000 --------------- ⌉ PSK modes centered on 1500Hz carrier.
//                   : 1001  600 QPSK IL2P  ⎮ 500 Hz bandwidth, 300 baud.
//                   : 1010 1200 BPSK IL2P  ⎮ 2400 Hz bandwidth, 1200 baud.
//                   : 1011 --------------- ⌋
/
// 3/4.31: 24-Oct-23 :
//                   : Improved DCD LED coast time and CSMA logic.
//                   : Added IL2P+CRC (IL2Pc) modes to reduce false decodes.
//                   : Restored full dynamic range of AGC.
//                   : Change self-learn callsign algorithm to UI frames only.
//                   : Version-31-op-modes graphic showing the 16 MODE swith positions
//                   :
//                   :                 MODE SWITCH MAPPING
//                   :
//                   : ****************** GFSK MODES ***************************
//                   : These require a '9600' data port or                     *
//                   : discriminator/varactor connection.                      *
//                   : IL2P, IL2Pc modes included for performance comparison.  *
//                   : *********************************************************
//                   : 0000 9600 GFSK AX.25                                    *
//                   : 0001 9600 GFSK IL2P                                     *
//                   : 0010 9600 GFSK IL2Pc                                    *
//                   : 0011 4800 GFSK IL2P                                     *
//                   : 0100 4800 GFSK IL2Pc                                    *
//                   : *********************************************************
//                   :
//                   : ****************** FM AFSK MODES ************************
//                   : These are suitable for FM radio speaker/                *
//                   : mic connection.                                         *
//                   : *********************************************************
//                   : 0101 2400 DPSK IL2P  Phase reversal of 2400 Hz tone     *
//                   : 0110 1200 AFSK AX.25 Legacy FM Packet, APRS             *
//                   : 0111 1200 AFSK IL2P                                     *
//                   : *********************************************************
//                   :
//                   : ****************** SSB AFSK MODES ***********************
//                   : Legacy HF packet 1600/1800 Hz tone FSK.                 *
//                   : Filtered for 500 Hz occupied bandwidth.                 *
//                   : *********************************************************
//                   : 1100  300 AFSK AX.25                                    *
//                   : 1101  300 AFSK IL2P                                     *
//                   : 1110  300 AFSK IL2Pc                                    *
//                   : *********************************************************
//                   :
//                   : ****************** SHAPED PSK MODES *********************
//                   : These are suitable for SSB radios, or FM radios.        *
//                   : Phase modulation of 1500 Hz tone.                       *
//                   : Filtered for occupied bandwidth depending on baud.      *
//                   : 300 BPSK, 600 QPSK send 300 symbols/sec, 500 Hz OBW.    *
//                   : 1200 BPSK, 2400 QPSK send 1200 symbols/sec, 2400 Hz OBW.*
//                   : *********************************************************
//                   : 1000  300 BPSK IL2Pc                                    *
//                   : 1001  600 QPSK IL2Pc                                    *
//                   : 1010 1200 BPSK IL2Pc                                    *
//                   : 1011 2400 QPSK IL2Pc                                    *
//                   : 1111 1200 BPSK IL2P                                     *
//                   : *********************************************************

// 3/4.32 13-Nov-23  : Correct Reed Solomon error correction bounding.
//                   : Add "+CRC" to text of IDENT packet for IL2Pc modes.

// 3/4.33 6-Dec-23   : Add maximum test packet count. TNC will reboot after 100
//                   : test packets have been self-generated.
//                   : Add "1200 AFSK" mode-case to text of IDENT packet.

// 3/4.34 6-Jan-24   : Improve receive performance for BPSK and QPSK modes.
//                   : Maximum frequency mismatch for PSK modes:
//                   : QPSK 2400 +/- 25Hz
//                   : BPSK 1200 +/- 50Hz
//                   : QPSK 600  +/- 13Hz
//                   : BPSK 300  +/- 25Hz
//                   : Version-34-op-modes graphic showing the 16 MODE-switch positions

// 3/4.35 18-Jan-24  : Adjust DCD response for AFSK 300 and AFSK 1200 to
//                   : reduce false positives.

// 3/4.36 22-Mar-24  : Add KISS TXTAIL functionality for IC-9700 compatibility.
//                   :
//                   : Add CQBEEP remote tone command, enabled when TNC detects
//                   : it is attached to a TARPN host. Send a 440 Hz tone when
//                   : TNC receives a packet with destination callsign CQBEEP.
//                   : SSID in destination callsign is number of seconds of tone
//                   : to be sent. Only functional when connected to TARPN host.
//                   : TNC detects TARPN host when it receives a 'TARPNstat'
//                   : message over USB. Detection is non-persistent, resets
//                   : every reboot.
//                   :
//                   : Change test packet destination callsign to CQBEEP, with
//                   : SSID 5. Test packet is sent when the TEST TX button is
//                   : pressed.
//                   : Version-36-op-modes graphic showing the 16 MODE-switch positions

// 3/4.37 8-Apr-24   : Improve IL2P header translation compatibility check.
//                   : Previous versions may improperly translate some non-AX.25
//                   : frames due to non-mappable bit patterns in the callsign
//                   : octets, or the control and PID octets.

// 3/4.38 21-Apr-24  : Change IL2P+CRC syncword tolerance to 2 bit mismatch.
//                   : Demodulator performance improvements for AFSK, BPSK, and
//                   : QPSK modes.

// 3/4.39 09-May-24  : Add QPSK 3600 at MODE switch  position 0101. Delete DPSK 2400.

© Tadd Torborg, 2019↝2024 -- all rights reserved