#include <Arduino.h>
#include "config.h"
#define SCLK B00000001 //D8 -> B0
#define MAX_CANT_ADC 4
#define BITS_ADC 24
#define DOUT1 B00001000 // DOUT del ADS1231 1
#define DOUT2 B00010000 // DOUT del ADS1231 2
#define DOUT3 B00100000 // DOUT del ADS1231 3
#define DOUT4 B01000000 // DOUT del ADS1231 4
struct {
struct {
long raw[MAX_CANT_ADC]; // 0
long filtered[MAX_CANT_ADC]; // 8
} data;
struct {
uint8_t filter; // 16.0
uint8_t mode; // 16.8
union {
struct {
int enabled : 4; // 17.0
int flags : 4; // 17.4
};
uint8_t mask : 8; // 17.0
} adc;
uint8_t modbus_id; // 17.8
unsigned int modbus_baudrate; // 18
unsigned int modbus_format; // 19
} config;
union {
struct {
int overload : 4; // 20.0
bool underload : 4; // 20.4
bool adc_mask_changed : 1; // 20.8
};
unsigned int word; // 20
} status;
unsigned int isr_duration; // 21
unsigned int loop_duration; // 22
unsigned int command; // 23
unsigned int jitter_time[MAX_CANT_ADC]; // 24 - 27
long dac_sample; // 28 - 29
long offset; // 30 - 31
float span; // 32 - 33
} registers;
int adc_dout[MAX_CANT_ADC] = {DOUT1, DOUT2, DOUT3, DOUT4};
#define SCLK_PORT PORTB
#define SCLK_PIN 8
#define SCLK_HIGH() (SCLK_PORT |= (1 << SCLK_PIN))
#define SCLK_LOW() (SCLK_PORT &= ~(1 << SCLK_PIN))
void setup()
{
pinMode(LED_BUILTIN, OUTPUT);
//pinMode(SCLK, OUTPUT);
DDRB |= B00000001; // set PORTB (D8) to output SCLK
DDRD &= B10000111; // set PORTD (D3 D4 D5 D6) to input
Serial.begin(115200, SERIAL_8N1);
}
void loop()
{
//long data[4];
long data[4]; // pasar a STATIC .. para ahorrar tiempo?
long micros_end;
long micros_start;
//digitalWrite(LED_BUILTIN, HIGH);
micros_start = micros();
// Resetea el buffer de lectura
data[0] = 0;
data[1] = 0;
data[2] = 0;
data[3] = 0;
// Lectura de los puertos bit a bit
//------------------------------------------------------------------------
for (int bit_index = 0; bit_index < BITS_ADC; bit_index++) {
// Pulso alto para iniciar la salida de un BIT
//digitalWrite(SCLK, HIGH); // ____
//digitalWrite(SCLK, LOW); // |___
PORTB |= SCLK; // D8->>HIGH
PORTB &=~SCLK; // D8->>LOW
// SCLK_HIGH();
// SCLK_LOW();
data[0] = (data[0] << 1) | (PIND & adc_dout[0]);
data[1] = (data[1] << 1) | (PIND & adc_dout[1]);
data[2] = (data[2] << 1) | (PIND & adc_dout[2]);
data[3] = (data[3] << 1) | (PIND & adc_dout[3]);
}
registers.data.raw[0] = data[0];
registers.data.raw[1] = data[1];
registers.data.raw[2] = data[2];
registers.data.raw[3] = data[3];
// pulso #25 para forzar a los DOUT-> HIGH
//digitalWrite(SCLK, HIGH);
//digitalWrite(SCLK, LOW);
PORTB |= SCLK; // D8->>HIGH
PORTB &=~SCLK; // D8->>LOW
// Propago el signo de la señal
if (registers.data.raw[0] & 0x800000) registers.data.raw[0] |= 0xFF000000;
if (registers.data.raw[1] & 0x800000) registers.data.raw[1] |= 0xFF000000;
if (registers.data.raw[2] & 0x800000) registers.data.raw[2] |= 0xFF000000;
if (registers.data.raw[3] & 0x800000) registers.data.raw[3] |= 0xFF000000;
micros_end = micros();
digitalWrite(LED_BUILTIN, LOW);
Serial.print("Tiempo: ");
Serial.println(micros_end - micros_start);
}