Are Some I/O Pins Faster For Bit-Banging?

Liam

Member
Hello All...

I'm attempting To Bit-Bang A 14 Bit ADC and need to read the ADC as fast as possible.

My Teensy4.1 is running @ 1.008 gHz Clock With heat sink and fan

I'm using pin 20 as my clock pin

For reasons I won't trouble you with here, I can't use the "canned" SPI library, so I'm bit banging it.

So... I'm using digitalWriteFast to clock/request a bit, waiting with a number of asm volatile("nop;");'s then reading the bit value with digitalReadFast()

The best I can get is about 32 nS per bit read ( About 31 mHz Data Clock ) about 2.2 million complete 14 bit conversions per second ( the ADC is capable of 4.5 million 14 bit conversions per second )

I'm the first to admit I'm no expert, just a guy trying to build an instrument to do a job I need done, and can't justify buying a $10k+ High Frequency power meter.

I guess my main question is... "Am I using the fastest I/O pin available on the Teensy4.1" or is there a faster way to read a digital signal without SPI.

Thanks for reading!
 
Ok. you force me to reveal my poor coding skills...

Code:
/************************************************************************************************************
  Power Meter >> 1.008 gHz Clock


 ************************************************************************************************************/



// Begin Above Setup Amp Volts Calibration Stuff ============================================================

// Set Up 3000 Element Array ( Lookup Table ) For 3000 Millamps

volatile int ampVoltsCal[3000];
volatile int inputMillAmps;
volatile int outPutMilliAmps;
volatile float interpolatedPercent;
volatile int arrayLocationPointer;
volatile int interpolatedOutput;
volatile int upperStoredValueAddress;
volatile int lowerStoredValueAddress;
volatile int upperLowerAddressRange;
volatile int upperStoredValue;
volatile int lowerStoredValue;
volatile int upperLowerStoredValueRange;

int ampsCalibrateMode = 1 ;     // 1 =  Amps Calibration Mode, Display Un-Corrected Input

int ampsZeroOffsetMode = 1 ;    // 1 =  Zero Offset Calibration Mode, Display Un-Corrected Input

float ampsZeroOffset = 0;    // Amps Zero Offset Correction.. Subtract This Value From Amps Before Correction

// End Above Setup Amp Volts Calibration Stuff ==============================================================

// Begin Above Setup Display Stuff ==========================================================================

#include <ILI9341_t3.h>
#include <font_Arial.h> // from ILI9341_t3
#include <XPT2046_Touchscreen.h>

// Colors To Be Used
#define BLACK    0x0000
#define WHITE    0xFFFF
#define RED      0xF800

#define CS_PIN  8
#define TFT_DC  9
#define TFT_CS 10
// MOSI=11, MISO=12, SCK=13 Standard SPI interface pins

XPT2046_Touchscreen ts(CS_PIN);
#define TIRQ_PIN  7  // Define Touch Screen Interrupt Pin I/O 7

ILI9341_t3 tft = ILI9341_t3(TFT_CS, TFT_DC);

// End Above Setup Display Stuff ============================================================================



// Begin Above Setup Current volts ADC Stuff ================================================================

const int ampVoltsDataPin = 17;   // Define volts data Input Pin From volts LTC2314

// End Above Setup Current Amps & Volts Common ADC Stuff ====================================================

int byteBinaryTotal = 0;        // Binary Equiv Of Volts ADC volts Input ( 1 Sample )

// Begin Above Setup Amp Volts ADC Stuff ====================================================================

long long int ampVoltsAccumTotal = 0;   // Accumulated Current Volts Binary Total
float ampVoltsAveragedBinaryTotal = 0;  // Current Volts Averaged Binary Total
float ampVolts = 0;                     // Final Calculated Current Voltage
float ampBinaryFactor = 0;              // Multiplier Determined By The Number Of Bit Possibilities ( 12 = 4096 )

float referenceVoltage = 4.096;        //  ( Increasing This Number Increases Displayed Amps )

// End Above Setup Currrent Amp Volts

// Begin Above Setup Volt Volts ADC Stuff ===================================================================

long long int voltVoltsAccumTotal = 0;               // Accumulated Volts Binary Total
float voltVoltsAveragedBinaryTotal = 0;              // Volts Averaged Binary Total
float voltVolts = 0;                                // Final Calculated Current Voltage
float volts_A = 0;                                  // Actual Volts For ADC
float novoltVolts = 0.264;                          // Voltage Output From Sensor A With Current Inputs Shorted
float voltBinaryFactor = 0;                         // Multiplier Determined By The Number Of Bit Possibilities ( 12 = 4096 )

// End Above Setup Volt Volts ADC Stuff =====================================================================

// Begin Above Setup volts @ Current Common Stuff ===========================================================

float averagevolts = 0;           // Define Average Amp Volts
uint32_t sampleCount = 0;         // Volts & Current Sample Count

// End Above Setup volts @ Current Common Stuff =============================================================

// **********************************************************************************************************
// **********************************************************************************************************
//                                                   Begin Setup
// **********************************************************************************************************
// **********************************************************************************************************

void setup()
{

  // //Serial..begin(9600);

  // Begin In Setup  Amp Volts Calibration Setup Stuff ======================================================

  // Store Known Values In ampVoltsCal Array

  // todo: These Values Should Be Acquired Through Screen Accessed Calibration Routine
  // todo: These Values Should Be Stored On SIM Card To Be Loaded At Boot

  // To Calibrate...
  // Connect Power Supply Directly Across Input Pins Of Current Sensor... Let The Sensor Be The Entire Load
  // Set Power Supply to .100 Amp, The Enter ADC Displayed Value In First Column

  //         ADC        Actual
  //         Value      Value

  ampVoltsCal[0]     =  0;
  ampVoltsCal[112]   =  100;
  ampVoltsCal[221]   =  200;
  ampVoltsCal[299]   =  300;
  ampVoltsCal[393]   =  400;
  ampVoltsCal[487]   =  500;
  ampVoltsCal[611]   =  600;
  ampVoltsCal[677]   =  700;
  ampVoltsCal[799]   =  800;
  ampVoltsCal[926]   =  900;
  ampVoltsCal[987]  =  1000;
  ampVoltsCal[1081]  =  1100;
  ampVoltsCal[1208]  =  1200;
  ampVoltsCal[1277]  =  1300;
  ampVoltsCal[1371]  =  1400;
  ampVoltsCal[1484]  =  1500;
  ampVoltsCal[1614]  =  1600;
  ampVoltsCal[1739]  =  1700;
  ampVoltsCal[1802]  =  1800;
  ampVoltsCal[1927]  =  1900;
  ampVoltsCal[1992]  =  2000;
  ampVoltsCal[2115]  =  2100;
  ampVoltsCal[2209]  =  2200;
  ampVoltsCal[2303]  =  2300;
  ampVoltsCal[2430]  =  2400;
  ampVoltsCal[2491]  =  2500;
  ampVoltsCal[2587]  =  2600;
  ampVoltsCal[2742]  =  2700;
  ampVoltsCal[2781]  =  2800;
  ampVoltsCal[2875]  =  2900;
  ampVoltsCal[2992]  =  3000;

  // End In Setup  Amp Volts Calibration Setup Stuff ========================================================

  // Begin In Setup Display Stuff ===========================================================================

  tft.begin();
  tft.setRotation(3);
  tft.fillScreen(ILI9341_BLACK);
  ts.begin();
  ts.setRotation(3);

  // End In Setup Display Stuff =============================================================================

  // Begin In Setup LTC2314 Stuff ============================================================================

  pinMode(ampVoltsDataPin, INPUT_PULLDOWN);   // Set Input Pin  For LTC2314
  pinMode (23, OUTPUT);                       // Set Amp Volts LTC2314 ADC-A Chip Select Pin
  pinMode(20, OUTPUT);                        //  Output Pulse To Amp Volts LTC2314 Data Clock

  //IOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_08 = 0xFF;   // Turn Off Slew On Pin 5 For Fastest Rise & Fall Time


  // End In Setup LTC2314 Stuff ==============================================================================

}
// **********************************************************************************************************
// **********************************************************************************************************
//                                                   End Setup
// **********************************************************************************************************
// **********************************************************************************************************

// Begin Below Setup Display Stuff ==========================================================================

boolean wastouched = true;                  // Enable Touch Screen

// End Below Setup Display Stuff ============================================================================

// **********************************************************************************************************
// **********************************************************************************************************
// **********************************************************************************************************
//                                               Begin Main Loop
// **********************************************************************************************************
// **********************************************************************************************************
// **********************************************************************************************************

void yield () {} // Disable Hidden Functions

FASTRUN void loop() {             // Use " FASTRUN " To Load Program Into Ram For Faster Speed

  digitalWriteFast(20, HIGH);     // Preset ADC CS Pin HIGH

  noInterrupts(); // Disable Interrupts

  while (1)
  {

    // ******************************************************************************************************
    // Begin Read Amp Volts ADC
    // ******************************************************************************************************

    // 1 NOP = .35 nS Estimated @ 1.008 gHz Clock...

    byteBinaryTotal = 0;  // Reset Byte Binary Total


    // Select Amp Volts ADC  ==========================================================================================

    digitalWriteFast(23, LOW); // Set Amp Volts ADC CS Pin LOW

    // This Counts As Falling Edge 1.. First Zero Is Clocked Out

    // Wait To Begin Data Transfer...

    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");

    // Begin Data Transfer ==================================================================================
    // Begin Data Transfer ==================================================================================
    // Begin Data Transfer ==================================================================================

    //-------------------------------------------------------------------------------------------------------
    //-------------------------------------------------------------------------------------------------------

    digitalWriteFast(20, HIGH); // Set Data Clock HIGH Rising Edge 1

    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");


    digitalWriteFast(20, LOW); // Set Data Clock LOW Falling Edge 1

    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");

    //-------------------------------------------------------------------------------------------------------
    //-------------------------------------------------------------------------------------------------------

    digitalWriteFast(20, HIGH); // Set Data Clock HIGH Rising Edge 2

    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");

    digitalWriteFast(20, LOW); // Set Data Clock LOW Falling Edge 2

    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");

    //-------------------------------------------------------------------------------------------------------
    //-------------------------------------------------------------------------------------------------------

    digitalWriteFast(20, HIGH); // Set Data Clock HIGH Rising Edge 3

    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");


    digitalWriteFast(20, LOW); // Set Data Clock LOW Falling Edge 3


    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    
    //-------------------------------------------------------------------------------------------------------

    //-------------------------------------------------------------------------------------------------------


    digitalWriteFast(20, HIGH); // Set Data Clock HIGH Rising Edge 4

    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");


    byteBinaryTotal = byteBinaryTotal + digitalReadFast(ampVoltsDataPin) * 8192 ; // Read Data Bit 1 Value = 8192


    digitalWriteFast(20, LOW); // Set Data Clock LOW Falling Edge 4

    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");


    //-------------------------------------------------------------------------------------------------------
    //-------------------------------------------------------------------------------------------------------

    digitalWriteFast(20, HIGH); // Set Data Clock HIGH Rising Edge 5

    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");


    digitalWriteFast(20, LOW); // Set Data Clock LOW Falling Edge 5

    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");

   byteBinaryTotal = byteBinaryTotal + digitalReadFast(ampVoltsDataPin) * 4096 ; // Read Data Bit 2 Value = 4096

    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");

    //-------------------------------------------------------------------------------------------------------
    //-------------------------------------------------------------------------------------------------------

    digitalWriteFast(20, HIGH); // Set Data Clock HIGH Rising Edge 6

    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");


    digitalWriteFast(20, LOW); // Set Data Clock LOW Falling Edge 6

    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");


    byteBinaryTotal = byteBinaryTotal + digitalReadFast(ampVoltsDataPin) * 2048 ; // Read Data Bit 3 Value = 2048

    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");

    //-------------------------------------------------------------------------------------------------------
    //-------------------------------------------------------------------------------------------------------

    digitalWriteFast(20, HIGH); // Set Data Clock HIGH Rising Edge 7

    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");


    digitalWriteFast(20, LOW); // Set Data Clock LOW Falling Edge 7

    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");


    byteBinaryTotal = byteBinaryTotal + digitalReadFast(ampVoltsDataPin) * 1024 ; // Read Data Bit 4 Value = 1024

    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");

    //-------------------------------------------------------------------------------------------------------
    //-------------------------------------------------------------------------------------------------------

    digitalWriteFast(20, HIGH); // Set Data Clock HIGH Rising Edge 8

    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");


    digitalWriteFast(20, LOW); // Set Data Clock LOW Falling Edge 8

    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");

    byteBinaryTotal = byteBinaryTotal + digitalReadFast(ampVoltsDataPin) * 512 ; // Read Data Bit 5 Value = 512

    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");

    //-------------------------------------------------------------------------------------------------------
    //-------------------------------------------------------------------------------------------------------

    digitalWriteFast(20, HIGH); // Set Data Clock HIGH Rising Edge 9

    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");


    digitalWriteFast(20, LOW); // Set Data Clock LOW Falling Edge 9

    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");

    byteBinaryTotal = byteBinaryTotal + digitalReadFast(ampVoltsDataPin) * 256 ; // Read Data Bit 6 Value = 256

    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");

    //-------------------------------------------------------------------------------------------------------
    //-------------------------------------------------------------------------------------------------------

    digitalWriteFast(20, HIGH); // Set Data Clock HIGH Rising Edge 10

    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");


    digitalWriteFast(20, LOW); // Set Data Clock LOW Falling Edge 10

    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");

    byteBinaryTotal = byteBinaryTotal + digitalReadFast(ampVoltsDataPin) * 128 ; // Read Data Bit 7 Value = 128

    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");

    //-------------------------------------------------------------------------------------------------------
    //-------------------------------------------------------------------------------------------------------

    digitalWriteFast(20, HIGH); // Set Data Clock HIGH Rising Edge 11

    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");


    digitalWriteFast(20, LOW); // Set Data Clock LOW Falling Edge 11

    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");

    byteBinaryTotal = byteBinaryTotal + digitalReadFast(ampVoltsDataPin) * 64 ; // Read Data Bit 8 Value = 64

    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");

    //-------------------------------------------------------------------------------------------------------
    //-------------------------------------------------------------------------------------------------------

    digitalWriteFast(20, HIGH); // Set Data Clock HIGH Rising Edge 12

    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");


    digitalWriteFast(20, LOW); // Set Data Clock LOW Falling Edge 12

    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");

    byteBinaryTotal = byteBinaryTotal + digitalReadFast(ampVoltsDataPin) * 32 ; // Read Data Bit 9 Value = 32

    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");

    //-------------------------------------------------------------------------------------------------------
    //-------------------------------------------------------------------------------------------------------

    digitalWriteFast(20, HIGH); // Set Data Clock HIGH Rising

    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");


    digitalWriteFast(20, LOW); // Set Data Clock LOW Falling Edge 13

    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");

    byteBinaryTotal = byteBinaryTotal + digitalReadFast(ampVoltsDataPin) * 16 ; // Read Data Bit 10 Value = 16

    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");

    //-------------------------------------------------------------------------------------------------------
    //-------------------------------------------------------------------------------------------------------

    digitalWriteFast(20, HIGH); // Set Data Clock HIGH Rising Edge 14

    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");


    digitalWriteFast(20, LOW); // Set Data Clock LOW Falling Edge 14

    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");

    byteBinaryTotal = byteBinaryTotal + digitalReadFast(ampVoltsDataPin) * 8 ; // Read Data Bit 11 Value = 8

    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");

    //-------------------------------------------------------------------------------------------------------
    //-------------------------------------------------------------------------------------------------------

    digitalWriteFast(20, HIGH); // Set Data Clock HIGH Rising Edge 15

    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");


    digitalWriteFast(20, LOW); // Set Data Clock LOW Falling Edge 15

    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");

    byteBinaryTotal = byteBinaryTotal + digitalReadFast(ampVoltsDataPin) * 4 ; // Read Data Bit 12 Value = 4

    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");

    //-------------------------------------------------------------------------------------------------------
    //-------------------------------------------------------------------------------------------------------

    digitalWriteFast(20, HIGH); // Set Data Clock HIGH Rising Edge 16

    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");


    digitalWriteFast(20, LOW); // Set Data Clock LOW Falling Edge 16

    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");

    
   byteBinaryTotal = byteBinaryTotal + digitalReadFast(ampVoltsDataPin) * 2 ; // Read Data Bit 13 Value = 2


    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");

    //-------------------------------------------------------------------------------------------------------

    byteBinaryTotal = byteBinaryTotal + digitalReadFast(ampVoltsDataPin) * 1 ; // Read Data Bit 14 Value = 1

    //-------------------------------------------------------------------------------------------------------


    // Begin Delay Before CS Is PUlled High

    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");
    asm volatile("nop;");



    //-------------------------------------------------------------------------------------------------------
    //-------------------------------------------------------------------------------------------------------

    digitalWriteFast(23, HIGH); // Set Amp Volts ADC CS Pin HIGH, End Conversion


    // End Data Transfer ====================================================================================

    asm(".rept 900 ; nop ; .endr");  // ToDo Insert  No Ops Delay To Simulate Volt Volt ADC Reading Time ##############################################################################################

    // ******************************************************************************************************
    // End Read Amp Volts ADC
    // ******************************************************************************************************

    ampVoltsAccumTotal = ampVoltsAccumTotal + byteBinaryTotal;

    // ******************************************************************************************************
    // Begin Read Volt Volts ADC
    // ******************************************************************************************************

    // ******************************************************************************************************
    // End Read Volt Volts ADC
    // ******************************************************************************************************

    sampleCount++; // Increment Sample Count

    // Average Data & Update Screen After 1 Million Samples ( One Million Complete Amps / Volts Reads ) =====

    if ( sampleCount > 999999 ) {  // If One Million ( > 999999 ) Samples, Go Average & Display Them sb 999999

      // Begin Amp Volts Calculations =======================================================================

      ampVoltsAveragedBinaryTotal = float( ampVoltsAccumTotal) / 1000000;   // Divide Total Binary By One Million Samples

      ampVoltsAveragedBinaryTotal = round(ampVoltsAveragedBinaryTotal);     // Round Result Up Or Down

      ampVoltsAveragedBinaryTotal = ampVoltsAveragedBinaryTotal + 1;        // Add 1 To Compensate For Zero Being Counted As 1

      ampBinaryFactor = ( ampVoltsAveragedBinaryTotal / 16384 );            // Divide By Number Of Possibilities In 14 Bits

      ampVolts = ampBinaryFactor  * referenceVoltage;                       // Determine Amp Volts By Multiplying Factor Times Reference Voltage

      //ampVolts = ( ampVolts - 2.096 );                                      // Subtract The Instrumentation Amp Offset

      //ampVolts = ( ampVolts * 2 );                                          // Multiply Times Two Because We're Using .5 Ohm Current Sense Resistor

      // ====================================================================================================

      if ( ampsZeroOffsetMode == 0 ) {// If Not In Calibreation Mode ( 1 ) ... Apply Zero Offset

        ampVolts = ampVolts - ampsZeroOffset;

      }

      // ====================================================================================================

      //Serial..begin(9600);

      //Serial..print("Input Amps ");
      //Serial..print(ampVolts, 10);
      //Serial..println();
      //Serial..println();

      ampVolts = ampVolts * 1000;   // Multiply Amp Volts Because Map Function Cant Handle Fractions !! Do I Need This Anymore? ######################################################################

      //Serial..print("x1000 Amps = ");
      //Serial..print(ampVolts, 3);
      //Serial..println();
      //Serial..println();

      inputMillAmps = round(ampVolts);  // Round Up Or Down To Nearest Integer

      //Serial..print("Rounded inputMillAmps = ");
      //Serial..print(inputMillAmps);
      //Serial..println();
      //Serial..println();


      /*

              // *******************************************************************************************************
              // Begin Positive Amp Volts Correction From Look Up Table
              // *******************************************************************************************************

              if ( inputMillAmps > 0 ) {

              if ( ampVoltsCal[inputMillAmps] != 0 && ampsCalibrateMode == 0 ) {

                //Serial..print("Calibration Point Hit... ");

                ampVolts = ampVoltsCal[inputMillAmps];

                //Serial..print("OutPut Will Be ");
                //Serial..print(ampVolts);
                //Serial..println();
                //Serial..println();

              }

              if ( ampVoltsCal[inputMillAmps] == 0 ) {  // If 0 Is Returned From Selected Array Element, No Calibration Data Is Available For Current Input, Enter This Loop

                //Serial..print("No Calibration Value Found At Location ");
                //Serial..print(inputMillAmps);
                //Serial..println();
                //Serial..println();

                // ====================================================================================================

                //Serial..print("... Begin Searching Up The Array For Any Stored Value...");
                //Serial..println();

                arrayLocationPointer = inputMillAmps ; // Set Array Location Pointer To Current Location ( Input Millamp Value )

                do {  // Begin Searching Elements Up The Array

                  arrayLocationPointer ++;  // Increment Location Pointer

                  //  //Serial..print("Searching Element Position: ");
                  //  //Serial..print(arrayLocationPointer);
                  //   //Serial..println();

                } while ( ampVoltsCal[arrayLocationPointer] == 0); // Search As Long As 0 ( No Data ) Is Found In Each Element

                upperStoredValueAddress = arrayLocationPointer;                               // Define Upper Address
                upperStoredValue = ampVoltsCal[upperStoredValueAddress];                         // Value Stored In Upper Address

                //Serial..println();
                //Serial..print("Upper Calibration Value Found At Adress Number ");
                //Serial..print(upperStoredValueAddress);
                //Serial..println();
                //Serial..println();

                // ====================================================================================================

                //Serial..print("... Begin Searching Down The Array For Any Stored Value...");
                //Serial..println();

                arrayLocationPointer = inputMillAmps ; // Set Array Location Pointer To Current Location ( Input Millamp Value )

                do {  // Begin Searching Elements Down The Array

                  arrayLocationPointer --;  // Increment Location Pointer

                  //Serial..print("Searching Element Position: ");
                  //Serial..print(arrayLocationPointer);
                  //Serial..println();

                } while ( ampVoltsCal[arrayLocationPointer] == 0 && arrayLocationPointer > 0 ); // Search As Long As 0 ( No Data ) Is Found In Each Element

                lowerStoredValueAddress = arrayLocationPointer;                         // Since We Know Addresses With Stored Data Are 100 Locations Apart, We Can Define Lower Address
                lowerStoredValue = ampVoltsCal[lowerStoredValueAddress];                         // Value Stored In Lower Address

                //Serial..println();
                //Serial..print("Lower Calibration Value Found At Adress Number ");
                //Serial..print(lowerStoredValueAddress);
                //Serial..println();
                //Serial..println();

                upperLowerAddressRange = upperStoredValueAddress - upperLowerAddressRange;    // Define Address Range
                upperLowerStoredValueRange = upperStoredValue - lowerStoredValue;             // Define Stored Value Range

                //Serial..print("Input Value = ");
                //Serial..print(inputMillAmps);
                //Serial..println();

                // Calculate Interpolated Value =====================================================================

                //Serial..println();
                //Serial..print("Upper Stored Value Address = ");
                //Serial..print(upperStoredValueAddress);
                //Serial..println();

                //Serial..print("Lower Stored Value Address = ");
                //Serial..print(lowerStoredValueAddress);
                //Serial..println();

                upperLowerAddressRange = upperStoredValueAddress - lowerStoredValueAddress; // Calculate Upper Value / Lower Value Range

                //Serial..print("Upper/Lower Address Range = ");
                //Serial..print(upperLowerAddressRange);

                //Serial..println();
                //Serial..println();

                //Serial..print("Upper Stored Value = ");
                //Serial..print(upperStoredValue);
                //Serial..println();

                //Serial..print("Lower Stored Value = ");
                //Serial..print(lowerStoredValue);
                //Serial..println();

                //Serial..print("Upper/Lower Stored Value Range = ");
                //Serial..print(upperLowerStoredValueRange);
                //Serial..println();
                //Serial..println();

                // Calculate Interpolated Percent

                interpolatedPercent = ( float(inputMillAmps) - float(lowerStoredValueAddress) ) / ( float(upperStoredValueAddress) - float(lowerStoredValueAddress) );

                //Serial..print("Inpterpolated Percent = ");
                //Serial..print(interpolatedPercent, 10);
                //Serial..println();

                // Calculate Interpolated Output

                interpolatedOutput = int(lowerStoredValue) +  ( float(interpolatedPercent) * upperLowerStoredValueRange );

                //Serial..println();
                //Serial..print("Interpolated Output = ");
                //Serial..print(interpolatedOutput);
                //Serial..println();
                //Serial..println();

                //Serial..print("*** End Run ***");
                //Serial..println();

                //delay(1000000);

              }
              }

              // ****************************************************************************************************
              // End Positive Amp Volts Correction From Look Up Table
              // ****************************************************************************************************

      */

      if ( ampsCalibrateMode == 0 ) { // Corrected Output

        ampVolts = float(ampVolts) / 1000; // Divide Positive Amp Volts Back To Original Value

      }

      if ( ampsCalibrateMode == 1 ) { // Un-Corrected Output

        ampVolts = float(inputMillAmps) / 1000; // Divide Positive Amp Volts Back To Original Value

      }

      // End Amp Volts Calculations =========================================================================

      // Begin Volt Volts Calculations

      //voltVoltsAveragedBinaryTotal = voltVoltsAccumTotal / 1000000;       // Divide Total Binary By One Million Samples
      //voltBinaryFactor = ( voltVoltsAveragedBinaryTotal / 4096 );         // Divide By Number Of Possibilities In 12 Bits
      //voltVolts = voltBinaryFactor  * 3.0 ;                               // Adjust To Known Voltage Input To LTC2314 Pin 8 lowering this value lowers indicated voltage

      // End Volt Volts Calculations

      displayResults();

      ampVolts = 0;
      ampVoltsAccumTotal = 0;

      voltVolts = 0;
      voltVoltsAccumTotal = 0;
      sampleCount = 0;


      //Serial..print("Begin New Read Sequence ===============================");
      //Serial..println();
      //Serial..println();


    }
  }
}

// **********************************************************************************************************
// **********************************************************************************************************
// **********************************************************************************************************
//                                                  End Main Loop
// **********************************************************************************************************
// **********************************************************************************************************
// **********************************************************************************************************

// **********************************************************************************************************
// Begin Average And Display The Collected Results
// **********************************************************************************************************

void displayResults() {

  tft.fillScreen(ILI9341_BLACK);
  tft.setTextColor(ILI9341_YELLOW);
  tft.setFont(Arial_12);
  tft.setCursor(1, 1);

  tft.print("ampVoltsAccumTotal = ");
  tft.println(ampVoltsAccumTotal);
  tft.println();

  tft.print("ampVoltsAveragedBinaryTotal = ");
  tft.println(ampVoltsAveragedBinaryTotal, 0);
  tft.println();

  tft.print("ampBinaryFactor =  ");
  tft.println(ampBinaryFactor, 10);
  tft.println();

  tft.print("Reference Voltage = ");
  tft.println(referenceVoltage, 3);
  tft.println();

  tft.print("Reference Voltage * Factor = ");
  tft.println(referenceVoltage * ampBinaryFactor, 3);
  tft.println();

  tft.print("ampVolts =  ");
  tft.print(ampVolts, 3);

  if ( ampsCalibrateMode == 0 ) {
    tft.print("  << Calibrated >>");
    tft.println();
  }

  if ( ampsCalibrateMode == 1 ) {
    tft.print("  << Un-Calibrated >>");
    tft.println();
  }

  tft.println();

}

// **********************************************************************************************************
// End Average And Display The Collected Results
// **********************************************************************************************************




//###########################################################################################################
//###########################################################################################################
//###########################################################################################################
// Program End  Program End  Program End  Program End  Program End  Program End  Program End  Program End
//###########################################################################################################
//###########################################################################################################
//###########################################################################################################
 
Last edited by a moderator:
Code:
/************************************************** ************************************************** ********
Power Meter >> 1.008 gHz Clock


************************************************** ************************************************** ********/



// Begin Above Setup Amp Volts Calibration Stuff ================================================== ==========

// Set Up 3000 Element Array ( Lookup Table ) For 3000 Millamps

volatile int ampVoltsCal[3000];
volatile int inputMillAmps;
volatile int outPutMilliAmps;
volatile float interpolatedPercent;
volatile int arrayLocationPointer;
volatile int interpolatedOutput;
volatile int upperStoredValueAddress;
volatile int lowerStoredValueAddress;
volatile int upperLowerAddressRange;
volatile int upperStoredValue;
volatile int lowerStoredValue;
volatile int upperLowerStoredValueRange;

int ampsCalibrateMode = 1; // 1 = Amps Calibration Mode, Display Un-Corrected Input

int ampsZeroOffsetMode = 1; // 1 = Zero Offset Calibration Mode, Display Un-Corrected Input

float ampsZeroOffset = 0; // Amps Zero Offset Correction.. Subtract This Value From Amps Before Correction

// End Above Setup Amp Volts Calibration Stuff ================================================== ============

// Begin Above Setup Display Stuff ================================================== ========================

#include <ILI9341_t3.h>
#include <font_Arial.h> // from ILI9341_t3
#include <XPT2046_Touchscreen.h>

// Colors To Be Used
#define BLACK 0x0000
#define WHITE 0xFFFF
#define RED 0xF800

#define CS_PIN 8
#define TFT_DC 9
#define TFT_CS 10
// MOSI=11, MISO=12, SCK=13 Standard SPI interface pins

XPT2046_Touchscreen ts(CS_PIN);
#define TIRQ_PIN 7 // Define Touch Screen Interrupt Pin I/O 7

ILI9341_t3 tft = ILI9341_t3(TFT_CS, TFT_DC);

// End Above Setup Display Stuff ================================================== ==========================



// Begin Above Setup Current volts ADC Stuff ================================================== ==============

const int ampVoltsDataPin = 17; // Define volts data Input Pin From volts LTC2314

// End Above Setup Current Amps & Volts Common ADC Stuff ================================================== ==

int byteBinaryTotal = 0; // Binary Equiv Of Volts ADC volts Input ( 1 Sample )

// Begin Above Setup Amp Volts ADC Stuff ================================================== ==================

long long int ampVoltsAccumTotal = 0; // Accumulated Current Volts Binary Total
float ampVoltsAveragedBinaryTotal = 0; // Current Volts Averaged Binary Total
float ampVolts = 0; // Final Calculated Current Voltage
float ampBinaryFactor = 0; // Multiplier Determined By The Number Of Bit Possibilities ( 12 = 4096 )

float referenceVoltage = 4.096; // ( Increasing This Number Increases Displayed Amps )

// End Above Setup Currrent Amp Volts

// Begin Above Setup Volt Volts ADC Stuff ================================================== =================

long long int voltVoltsAccumTotal = 0; // Accumulated Volts Binary Total
float voltVoltsAveragedBinaryTotal = 0; // Volts Averaged Binary Total
float voltVolts = 0; // Final Calculated Current Voltage
float volts_A = 0; // Actual Volts For ADC
float novoltVolts = 0.264; // Voltage Output From Sensor A With Current Inputs Shorted
float voltBinaryFactor = 0; // Multiplier Determined By The Number Of Bit Possibilities ( 12 = 4096 )

// End Above Setup Volt Volts ADC Stuff ================================================== ===================

// Begin Above Setup volts @ Current Common Stuff ================================================== =========

float averagevolts = 0; // Define Average Amp Volts
uint32_t sampleCount = 0; // Volts & Current Sample Count

// End Above Setup volts @ Current Common Stuff ================================================== ===========

// ************************************************** ************************************************** ******
// ************************************************** ************************************************** ******
// Begin Setup
// ************************************************** ************************************************** ******
// ************************************************** ************************************************** ******

void setup()
{

	// //Serial..begin(9600);

	// Begin In Setup Amp Volts Calibration Setup Stuff ================================================== ====

	// Store Known Values In ampVoltsCal Array

	// todo: These Values Should Be Acquired Through Screen Accessed Calibration Routine
	// todo: These Values Should Be Stored On SIM Card To Be Loaded At Boot

	// To Calibrate...
	// Connect Power Supply Directly Across Input Pins Of Current Sensor... Let The Sensor Be The Entire Load
	// Set Power Supply to .100 Amp, The Enter ADC Displayed Value In First Column

	// ADC Actual
	// Value Value

	ampVoltsCal[0] = 0;
	ampVoltsCal[112] = 100;
	ampVoltsCal[221] = 200;
	ampVoltsCal[299] = 300;
	ampVoltsCal[393] = 400;
	ampVoltsCal[487] = 500;
	ampVoltsCal[611] = 600;
	ampVoltsCal[677] = 700;
	ampVoltsCal[799] = 800;
	ampVoltsCal[926] = 900;
	ampVoltsCal[987] = 1000;
	ampVoltsCal[1081] = 1100;
	ampVoltsCal[1208] = 1200;
	ampVoltsCal[1277] = 1300;
	ampVoltsCal[1371] = 1400;
	ampVoltsCal[1484] = 1500;
	ampVoltsCal[1614] = 1600;
	ampVoltsCal[1739] = 1700;
	ampVoltsCal[1802] = 1800;
	ampVoltsCal[1927] = 1900;
	ampVoltsCal[1992] = 2000;
	ampVoltsCal[2115] = 2100;
	ampVoltsCal[2209] = 2200;
	ampVoltsCal[2303] = 2300;
	ampVoltsCal[2430] = 2400;
	ampVoltsCal[2491] = 2500;
	ampVoltsCal[2587] = 2600;
	ampVoltsCal[2742] = 2700;
	ampVoltsCal[2781] = 2800;
	ampVoltsCal[2875] = 2900;
	ampVoltsCal[2992] = 3000;

	// End In Setup Amp Volts Calibration Setup Stuff ================================================== ======

	// Begin In Setup Display Stuff ================================================== =========================

	tft.begin();
	tft.setRotation(3);
	tft.fillScreen(ILI9341_BLACK);
	ts.begin();
	ts.setRotation(3);

	// End In Setup Display Stuff ================================================== ===========================

	// Begin In Setup LTC2314 Stuff ================================================== ==========================

	pinMode(ampVoltsDataPin, INPUT_PULLDOWN); // Set Input Pin For LTC2314
	pinMode(23, OUTPUT); // Set Amp Volts LTC2314 ADC-A Chip Select Pin
	pinMode(20, OUTPUT); // Output Pulse To Amp Volts LTC2314 Data Clock

	//IOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_08 = 0xFF; // Turn Off Slew On Pin 5 For Fastest Rise & Fall Time


	// End In Setup LTC2314 Stuff ================================================== ============================

}
// ************************************************** ************************************************** ******
// ************************************************** ************************************************** ******
// End Setup
// ************************************************** ************************************************** ******
// ************************************************** ************************************************** ******

// Begin Below Setup Display Stuff ================================================== ========================

boolean wastouched = true; // Enable Touch Screen

// End Below Setup Display Stuff ================================================== ==========================

// ************************************************** ************************************************** ******
// ************************************************** ************************************************** ******
// ************************************************** ************************************************** ******
// Begin Main Loop
// ************************************************** ************************************************** ******
// ************************************************** ************************************************** ******
// ************************************************** ************************************************** ******

void yield() {} // Disable Hidden Functions

FASTRUN void loop() { // Use " FASTRUN " To Load Program Into Ram For Faster Speed

	digitalWriteFast(20, HIGH); // Preset ADC CS Pin HIGH

	noInterrupts(); // Disable Interrupts

	while (1)
	{

		// ************************************************** ************************************************** **
		// Begin Read Amp Volts ADC
		// ************************************************** ************************************************** **

		// 1 NOP = .35 nS Estimated @ 1.008 gHz Clock...

		byteBinaryTotal = 0; // Reset Byte Binary Total


		// Select Amp Volts ADC ================================================== ========================================

		digitalWriteFast(23, LOW); // Set Amp Volts ADC CS Pin LOW

		// This Counts As Falling Edge 1.. First Zero Is Clocked Out

		// Wait To Begin Data Transfer...

		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");

		// Begin Data Transfer ================================================== ================================
		// Begin Data Transfer ================================================== ================================
		// Begin Data Transfer ================================================== ================================

		//-------------------------------------------------------------------------------------------------------
		//-------------------------------------------------------------------------------------------------------

		digitalWriteFast(20, HIGH); // Set Data Clock HIGH Rising Edge 1

		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");


		digitalWriteFast(20, LOW); // Set Data Clock LOW Falling Edge 1

		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");

		//-------------------------------------------------------------------------------------------------------
		//-------------------------------------------------------------------------------------------------------

		digitalWriteFast(20, HIGH); // Set Data Clock HIGH Rising Edge 2

		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");

		digitalWriteFast(20, LOW); // Set Data Clock LOW Falling Edge 2

		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");

		//-------------------------------------------------------------------------------------------------------
		//-------------------------------------------------------------------------------------------------------

		digitalWriteFast(20, HIGH); // Set Data Clock HIGH Rising Edge 3

		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");


		digitalWriteFast(20, LOW); // Set Data Clock LOW Falling Edge 3


		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");

		//-------------------------------------------------------------------------------------------------------

		//-------------------------------------------------------------------------------------------------------


		digitalWriteFast(20, HIGH); // Set Data Clock HIGH Rising Edge 4

		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");


		byteBinaryTotal = byteBinaryTotal + digitalReadFast(ampVoltsDataPin) * 8192; // Read Data Bit 1 Value = 8192


		digitalWriteFast(20, LOW); // Set Data Clock LOW Falling Edge 4

		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");


		//-------------------------------------------------------------------------------------------------------
		//-------------------------------------------------------------------------------------------------------

		digitalWriteFast(20, HIGH); // Set Data Clock HIGH Rising Edge 5

		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");


		digitalWriteFast(20, LOW); // Set Data Clock LOW Falling Edge 5

		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");

		byteBinaryTotal = byteBinaryTotal + digitalReadFast(ampVoltsDataPin) * 4096; // Read Data Bit 2 Value = 4096

		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");

		//-------------------------------------------------------------------------------------------------------
		//-------------------------------------------------------------------------------------------------------

		digitalWriteFast(20, HIGH); // Set Data Clock HIGH Rising Edge 6

		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");


		digitalWriteFast(20, LOW); // Set Data Clock LOW Falling Edge 6

		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");


		byteBinaryTotal = byteBinaryTotal + digitalReadFast(ampVoltsDataPin) * 2048; // Read Data Bit 3 Value = 2048

		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");

		//-------------------------------------------------------------------------------------------------------
		//-------------------------------------------------------------------------------------------------------

		digitalWriteFast(20, HIGH); // Set Data Clock HIGH Rising Edge 7

		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");


		digitalWriteFast(20, LOW); // Set Data Clock LOW Falling Edge 7

		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");


		byteBinaryTotal = byteBinaryTotal + digitalReadFast(ampVoltsDataPin) * 1024; // Read Data Bit 4 Value = 1024

		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");

		//-------------------------------------------------------------------------------------------------------
		//-------------------------------------------------------------------------------------------------------

		digitalWriteFast(20, HIGH); // Set Data Clock HIGH Rising Edge 8

		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");


		digitalWriteFast(20, LOW); // Set Data Clock LOW Falling Edge 8

		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");

		byteBinaryTotal = byteBinaryTotal + digitalReadFast(ampVoltsDataPin) * 512; // Read Data Bit 5 Value = 512

		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");

		//-------------------------------------------------------------------------------------------------------
		//-------------------------------------------------------------------------------------------------------

		digitalWriteFast(20, HIGH); // Set Data Clock HIGH Rising Edge 9

		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");


		digitalWriteFast(20, LOW); // Set Data Clock LOW Falling Edge 9

		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");

		byteBinaryTotal = byteBinaryTotal + digitalReadFast(ampVoltsDataPin) * 256; // Read Data Bit 6 Value = 256

		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");

		//-------------------------------------------------------------------------------------------------------
		//-------------------------------------------------------------------------------------------------------

		digitalWriteFast(20, HIGH); // Set Data Clock HIGH Rising Edge 10

		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");


		digitalWriteFast(20, LOW); // Set Data Clock LOW Falling Edge 10

		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");

		byteBinaryTotal = byteBinaryTotal + digitalReadFast(ampVoltsDataPin) * 128; // Read Data Bit 7 Value = 128

		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");

		//-------------------------------------------------------------------------------------------------------
		//-------------------------------------------------------------------------------------------------------

		digitalWriteFast(20, HIGH); // Set Data Clock HIGH Rising Edge 11

		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");


		digitalWriteFast(20, LOW); // Set Data Clock LOW Falling Edge 11

		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");

		byteBinaryTotal = byteBinaryTotal + digitalReadFast(ampVoltsDataPin) * 64; // Read Data Bit 8 Value = 64

		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");

		//-------------------------------------------------------------------------------------------------------
		//-------------------------------------------------------------------------------------------------------

		digitalWriteFast(20, HIGH); // Set Data Clock HIGH Rising Edge 12

		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");


		digitalWriteFast(20, LOW); // Set Data Clock LOW Falling Edge 12

		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");

		byteBinaryTotal = byteBinaryTotal + digitalReadFast(ampVoltsDataPin) * 32; // Read Data Bit 9 Value = 32

		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");

		//-------------------------------------------------------------------------------------------------------
		//-------------------------------------------------------------------------------------------------------

		digitalWriteFast(20, HIGH); // Set Data Clock HIGH Rising

		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");


		digitalWriteFast(20, LOW); // Set Data Clock LOW Falling Edge 13

		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");

		byteBinaryTotal = byteBinaryTotal + digitalReadFast(ampVoltsDataPin) * 16; // Read Data Bit 10 Value = 16

		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");

		//-------------------------------------------------------------------------------------------------------
		//-------------------------------------------------------------------------------------------------------

		digitalWriteFast(20, HIGH); // Set Data Clock HIGH Rising Edge 14

		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");


		digitalWriteFast(20, LOW); // Set Data Clock LOW Falling Edge 14

		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");

		byteBinaryTotal = byteBinaryTotal + digitalReadFast(ampVoltsDataPin) * 8; // Read Data Bit 11 Value = 8

		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");

		//-------------------------------------------------------------------------------------------------------
		//-------------------------------------------------------------------------------------------------------

		digitalWriteFast(20, HIGH); // Set Data Clock HIGH Rising Edge 15

		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");


		digitalWriteFast(20, LOW); // Set Data Clock LOW Falling Edge 15

		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");

		byteBinaryTotal = byteBinaryTotal + digitalReadFast(ampVoltsDataPin) * 4; // Read Data Bit 12 Value = 4

		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");

		//-------------------------------------------------------------------------------------------------------
		//-------------------------------------------------------------------------------------------------------

		digitalWriteFast(20, HIGH); // Set Data Clock HIGH Rising Edge 16

		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");


		digitalWriteFast(20, LOW); // Set Data Clock LOW Falling Edge 16

		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");


		byteBinaryTotal = byteBinaryTotal + digitalReadFast(ampVoltsDataPin) * 2; // Read Data Bit 13 Value = 2


		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");

		//-------------------------------------------------------------------------------------------------------

		byteBinaryTotal = byteBinaryTotal + digitalReadFast(ampVoltsDataPin) * 1; // Read Data Bit 14 Value = 1

		//-------------------------------------------------------------------------------------------------------


		// Begin Delay Before CS Is PUlled High

		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");
		asm volatile("nop;");



		//-------------------------------------------------------------------------------------------------------
		//-------------------------------------------------------------------------------------------------------

		digitalWriteFast(23, HIGH); // Set Amp Volts ADC CS Pin HIGH, End Conversion


		// End Data Transfer ================================================== ==================================

		asm(".rept 900 ; nop ; .endr"); // ToDo Insert No Ops Delay To Simulate Volt Volt ADC Reading Time ################################################## ############################################

		// ************************************************** ************************************************** **
		// End Read Amp Volts ADC
		// ************************************************** ************************************************** **

		ampVoltsAccumTotal = ampVoltsAccumTotal + byteBinaryTotal;

		// ************************************************** ************************************************** **
		// Begin Read Volt Volts ADC
		// ************************************************** ************************************************** **

		// ************************************************** ************************************************** **
		// End Read Volt Volts ADC
		// ************************************************** ************************************************** **

		sampleCount++; // Increment Sample Count

		// Average Data & Update Screen After 1 Million Samples ( One Million Complete Amps / Volts Reads ) =====

		if (sampleCount > 999999) { // If One Million ( > 999999 ) Samples, Go Average & Display Them sb 999999

			// Begin Amp Volts Calculations ================================================== =====================

			ampVoltsAveragedBinaryTotal = float(ampVoltsAccumTotal) / 1000000; // Divide Total Binary By One Million Samples

			ampVoltsAveragedBinaryTotal = round(ampVoltsAveragedBinaryTotal); // Round Result Up Or Down

			ampVoltsAveragedBinaryTotal = ampVoltsAveragedBinaryTotal + 1; // Add 1 To Compensate For Zero Being Counted As 1

			ampBinaryFactor = (ampVoltsAveragedBinaryTotal / 16384); // Divide By Number Of Possibilities In 14 Bits

			ampVolts = ampBinaryFactor * referenceVoltage; // Determine Amp Volts By Multiplying Factor Times Reference Voltage

			//ampVolts = ( ampVolts - 2.096 ); // Subtract The Instrumentation Amp Offset

			//ampVolts = ( ampVolts * 2 ); // Multiply Times Two Because We're Using .5 Ohm Current Sense Resistor

			// ================================================== ==================================================

			if (ampsZeroOffsetMode == 0) {// If Not In Calibreation Mode ( 1 ) ... Apply Zero Offset

				ampVolts = ampVolts - ampsZeroOffset;

			}

			// ================================================== ==================================================

			//Serial..begin(9600);

			//Serial..print("Input Amps ");
			//Serial..print(ampVolts, 10);
			//Serial..println();
			//Serial..println();

			ampVolts = ampVolts * 1000; // Multiply Amp Volts Because Map Function Cant Handle Fractions !! Do I Need This Anymore? ################################################## ####################

			//Serial..print("x1000 Amps = ");
			//Serial..print(ampVolts, 3);
			//Serial..println();
			//Serial..println();

			inputMillAmps = round(ampVolts); // Round Up Or Down To Nearest Integer

			//Serial..print("Rounded inputMillAmps = ");
			//Serial..print(inputMillAmps);
			//Serial..println();
			//Serial..println();


			/*

			// ************************************************** ************************************************** ***
			// Begin Positive Amp Volts Correction From Look Up Table
			// ************************************************** ************************************************** ***

			if ( inputMillAmps > 0 ) {

			if ( ampVoltsCal[inputMillAmps] != 0 && ampsCalibrateMode == 0 ) {

			//Serial..print("Calibration Point Hit... ");

			ampVolts = ampVoltsCal[inputMillAmps];

			//Serial..print("OutPut Will Be ");
			//Serial..print(ampVolts);
			//Serial..println();
			//Serial..println();

			}

			if ( ampVoltsCal[inputMillAmps] == 0 ) { // If 0 Is Returned From Selected Array Element, No Calibration Data Is Available For Current Input, Enter This Loop

			//Serial..print("No Calibration Value Found At Location ");
			//Serial..print(inputMillAmps);
			//Serial..println();
			//Serial..println();

			// ================================================== ==================================================

			//Serial..print("... Begin Searching Up The Array For Any Stored Value...");
			//Serial..println();

			arrayLocationPointer = inputMillAmps ; // Set Array Location Pointer To Current Location ( Input Millamp Value )

			do { // Begin Searching Elements Up The Array

			arrayLocationPointer ++; // Increment Location Pointer

			// //Serial..print("Searching Element Position: ");
			// //Serial..print(arrayLocationPointer);
			// //Serial..println();

			} while ( ampVoltsCal[arrayLocationPointer] == 0); // Search As Long As 0 ( No Data ) Is Found In Each Element

			upperStoredValueAddress = arrayLocationPointer; // Define Upper Address
			upperStoredValue = ampVoltsCal[upperStoredValueAddress]; // Value Stored In Upper Address

			//Serial..println();
			//Serial..print("Upper Calibration Value Found At Adress Number ");
			//Serial..print(upperStoredValueAddress);
			//Serial..println();
			//Serial..println();

			// ================================================== ==================================================

			//Serial..print("... Begin Searching Down The Array For Any Stored Value...");
			//Serial..println();

			arrayLocationPointer = inputMillAmps ; // Set Array Location Pointer To Current Location ( Input Millamp Value )

			do { // Begin Searching Elements Down The Array

			arrayLocationPointer --; // Increment Location Pointer

			//Serial..print("Searching Element Position: ");
			//Serial..print(arrayLocationPointer);
			//Serial..println();

			} while ( ampVoltsCal[arrayLocationPointer] == 0 && arrayLocationPointer > 0 ); // Search As Long As 0 ( No Data ) Is Found In Each Element

			lowerStoredValueAddress = arrayLocationPointer; // Since We Know Addresses With Stored Data Are 100 Locations Apart, We Can Define Lower Address
			lowerStoredValue = ampVoltsCal[lowerStoredValueAddress]; // Value Stored In Lower Address

			//Serial..println();
			//Serial..print("Lower Calibration Value Found At Adress Number ");
			//Serial..print(lowerStoredValueAddress);
			//Serial..println();
			//Serial..println();

			upperLowerAddressRange = upperStoredValueAddress - upperLowerAddressRange; // Define Address Range
			upperLowerStoredValueRange = upperStoredValue - lowerStoredValue; // Define Stored Value Range

			//Serial..print("Input Value = ");
			//Serial..print(inputMillAmps);
			//Serial..println();

			// Calculate Interpolated Value ================================================== ===================

			//Serial..println();
			//Serial..print("Upper Stored Value Address = ");
			//Serial..print(upperStoredValueAddress);
			//Serial..println();

			//Serial..print("Lower Stored Value Address = ");
			//Serial..print(lowerStoredValueAddress);
			//Serial..println();

			upperLowerAddressRange = upperStoredValueAddress - lowerStoredValueAddress; // Calculate Upper Value / Lower Value Range

			//Serial..print("Upper/Lower Address Range = ");
			//Serial..print(upperLowerAddressRange);

			//Serial..println();
			//Serial..println();

			//Serial..print("Upper Stored Value = ");
			//Serial..print(upperStoredValue);
			//Serial..println();

			//Serial..print("Lower Stored Value = ");
			//Serial..print(lowerStoredValue);
			//Serial..println();

			//Serial..print("Upper/Lower Stored Value Range = ");
			//Serial..print(upperLowerStoredValueRange);
			//Serial..println();
			//Serial..println();

			// Calculate Interpolated Percent

			interpolatedPercent = ( float(inputMillAmps) - float(lowerStoredValueAddress) ) / ( float(upperStoredValueAddress) - float(lowerStoredValueAddress) );

			//Serial..print("Inpterpolated Percent = ");
			//Serial..print(interpolatedPercent, 10);
			//Serial..println();

			// Calculate Interpolated Output

			interpolatedOutput = int(lowerStoredValue) + ( float(interpolatedPercent) * upperLowerStoredValueRange );

			//Serial..println();
			//Serial..print("Interpolated Output = ");
			//Serial..print(interpolatedOutput);
			//Serial..println();
			//Serial..println();

			//Serial..print("*** End Run ***");
			//Serial..println();

			//delay(1000000);

			}
			}

			// ************************************************** **************************************************
			// End Positive Amp Volts Correction From Look Up Table
			// ************************************************** **************************************************

			*/

			if (ampsCalibrateMode == 0) { // Corrected Output

				ampVolts = float(ampVolts) / 1000; // Divide Positive Amp Volts Back To Original Value

			}

			if (ampsCalibrateMode == 1) { // Un-Corrected Output

				ampVolts = float(inputMillAmps) / 1000; // Divide Positive Amp Volts Back To Original Value

			}

			// End Amp Volts Calculations ================================================== =======================

			// Begin Volt Volts Calculations

			//voltVoltsAveragedBinaryTotal = voltVoltsAccumTotal / 1000000; // Divide Total Binary By One Million Samples
			//voltBinaryFactor = ( voltVoltsAveragedBinaryTotal / 4096 ); // Divide By Number Of Possibilities In 12 Bits
			//voltVolts = voltBinaryFactor * 3.0 ; // Adjust To Known Voltage Input To LTC2314 Pin 8 lowering this value lowers indicated voltage

			// End Volt Volts Calculations

			displayResults();

			ampVolts = 0;
			ampVoltsAccumTotal = 0;

			voltVolts = 0;
			voltVoltsAccumTotal = 0;
			sampleCount = 0;


			//Serial..print("Begin New Read Sequence ===============================");
			//Serial..println();
			//Serial..println();


		}
	}
}

// ************************************************** ************************************************** ******
// ************************************************** ************************************************** ******
// ************************************************** ************************************************** ******
// End Main Loop
// ************************************************** ************************************************** ******
// ************************************************** ************************************************** ******
// ************************************************** ************************************************** ******

// ************************************************** ************************************************** ******
// Begin Average And Display The Collected Results
// ************************************************** ************************************************** ******

void displayResults() {

	tft.fillScreen(ILI9341_BLACK);
	tft.setTextColor(ILI9341_YELLOW);
	tft.setFont(Arial_12);
	tft.setCursor(1, 1);

	tft.print("ampVoltsAccumTotal = ");
	tft.println(ampVoltsAccumTotal);
	tft.println();

	tft.print("ampVoltsAveragedBinaryTotal = ");
	tft.println(ampVoltsAveragedBinaryTotal, 0);
	tft.println();

	tft.print("ampBinaryFactor = ");
	tft.println(ampBinaryFactor, 10);
	tft.println();

	tft.print("Reference Voltage = ");
	tft.println(referenceVoltage, 3);
	tft.println();

	tft.print("Reference Voltage * Factor = ");
	tft.println(referenceVoltage * ampBinaryFactor, 3);
	tft.println();

	tft.print("ampVolts = ");
	tft.print(ampVolts, 3);

	if (ampsCalibrateMode == 0) {
		tft.print(" << Calibrated >>");
		tft.println();
	}

	if (ampsCalibrateMode == 1) {
		tft.print(" << Un-Calibrated >>");
		tft.println();
	}

	tft.println();

}

// ************************************************** ************************************************** ******
// End Average And Display The Collected Results
// ************************************************** ************************************************** ******




//################################################## ################################################## #######
//################################################## ################################################## #######
//################################################## ################################################## #######
// Program End Program End Program End Program End Program End Program End Program End Program End
//################################################## ################################################## #######
//################################################## ################################################## #######
//################################################## ################################################## #######
Sorry to say this, but could you enclose your code between CODE tags using the # button above.
It makes your code so much more easy to understand and potentially help you.
Ok. you force me to reveal my poor coding skills...
Don't worry about that, we all have to start somewhere.
I hate to think what some of my early code was like.....still is sometimes today!!
 
I know the ReadFast / WriteFast routines are very fast, especially when fed with constant data.
I don't know how long a "NOP" takes, but seem to remember Paul saying that this sort of thing may not be consistent due to the way the MCU handles it.
There is always the delayNanoseconds() see here.
 
As far as I can measure...

1 NOP = .35 nS Estimated @ 1.008 gHz Clock...

I tried delayNanoseconds() ... seems to choke under 200 nS

nops seem more stable with interrupts and overhead disabled.

The Teensy output pin is driving a APS1551AZ opto isolator ( needed to keep the high voltage away from the Teensy ) , can't drive it very hard @ 8mA so the rise time is about 14 nS ( its capable of 5 nS ).

Maybe I should buffer the Teensy Output pin to hit the opto harder?? Your thoughts?
 
The Teensy output pin is driving a APS1551AZ opto isolator ( needed to keep the high voltage away from the Teensy ) , can't drive it very hard @ 8mA so the rise time is about 14 nS ( its capable of 5 nS ).
Why not use a 74HC125 instead of the opto-isolator?
 
I measuring up to 900 Volts. Too risky if something shorts. All connections ( data, clock, and Chip Select ) to the Teensy control board are opto-isolated.

Thanks For Reading.
 
Will try. Thanks.

Ok.

Placed A 74LVC1G00 Gate Between the teensy4 output pin and the opto.

Now driving the opto 5 Volts @ 12 mA.

Joy Joy Happy Joy.

Bit clock time is reduced from 32nS To 19nS, for a clock speed of 58.6 mHz and a conversion speed of 3.58 million 14 Bit conversions per second.

I think maybe can be even faster...

The opto can take up to 25mA ( not recommended ) Maybe will try 18mA, but not today.

Have to rest up for the Super Bowl. ( I live 50 miles from Philadelphia, Big Eagles fan. )

Enough for a Saturday 10:34 AM here. I Like to quit on a success.

Thanks for helping, you are a true gentleman.

Liam

P.S. Will provide updates if anyone is interested.
 
Back
Top