c++ - guardar - ¿Qué hace este código Arduino?
programacion arduino pdf (3)
Lee el valor de un pin digital especificado, ya sea ALTO o BAJO.
MISO (Master In Slave Out): la entrada del registro de desplazamiento del Maestro y la salida del registro de desplazamiento del Esclavo.
|
es el operador O bit a bit.
d |= 1
es la notación abreviada de
d = d | 1
Este código establece el último bit de d
en 1 si la condición es verdadera.
Entonces, lo que estás haciendo es leer la salida del registro esclavo, y si es 1, está ajustando el último bit de d
a 1. Justo antes de esa línea, cambia d
izquierda por un bit con d <<= 1;
. Y lo hace en un bucle:
- Shift
d
dejó 1 bit - Lea miso, si es
1
, establezca el bit menos significativo ded
en1
. - repetir
Entiendo lo que la mayoría de esto está haciendo, sin embargo, el
if (digitalRead(miso)) { d |= 1; }
Es una frase que no entiendo Este código es de la biblioteca Adafruit MAX31855 que se utiliza para las placas Arduino. Estoy tratando de portar el código a mi MCU C8051F020 en c. Este código se lee desde un termopar y el MAX31855 es la interfaz digital de la MCU. aquí está el código completo para este archivo. No estoy familiarizado con digitalRead()
. La declaración if publicada arriba es donde no puedo interpretar. Esta instrucción if está en la función uint32_t Adafruit_MAX31855::spiread32(void)
.
/***************************************************
This is a library for the Adafruit Thermocouple Sensor w/MAX31855K
Designed specifically to work with the Adafruit Thermocouple Sensor
----> https://www.adafruit.com/products/269
These displays use SPI to communicate, 3 pins are required to
interface
Adafruit invests time and resources providing this open source code,
please support Adafruit and open-source hardware by purchasing
products from Adafruit!
Written by Limor Fried/Ladyada for Adafruit Industries.
BSD license, all text above must be included in any redistribution
****************************************************/
#include "Adafruit_MAX31855.h"
#include <avr/pgmspace.h>
#include <util/delay.h>
#include <stdlib.h>
Adafruit_MAX31855::Adafruit_MAX31855(int8_t SCLK, int8_t CS, int8_t MISO) {
sclk = SCLK;
cs = CS;
miso = MISO;
//define pin modes
pinMode(cs, OUTPUT);
pinMode(sclk, OUTPUT);
pinMode(miso, INPUT);
digitalWrite(cs, HIGH);
}
double Adafruit_MAX31855::readInternal(void) {
uint32_t v;
v = spiread32();
// ignore bottom 4 bits - they''re just thermocouple data
v >>= 4;
// pull the bottom 11 bits off
float internal = v & 0x7FF;
internal *= 0.0625; // LSB = 0.0625 degrees
// check sign bit!
if (v & 0x800)
internal *= -1;
//Serial.print("/tInternal Temp: "); Serial.println(internal);
return internal;
}
double Adafruit_MAX31855::readCelsius(void) {
int32_t v;
v = spiread32();
//Serial.print("0x"); Serial.println(v, HEX);
/*
float internal = (v >> 4) & 0x7FF;
internal *= 0.0625;
if ((v >> 4) & 0x800)
internal *= -1;
Serial.print("/tInternal Temp: "); Serial.println(internal);
*/
if (v & 0x7) {
// uh oh, a serious problem!
return NAN;
}
// get rid of internal temp data, and any fault bits
v >>= 18;
//Serial.println(v, HEX);
// pull the bottom 13 bits off
int16_t temp = v & 0x3FFF;
// check sign bit
if (v & 0x2000)
temp |= 0xC000;
//Serial.println(temp);
double centigrade = v;
// LSB = 0.25 degrees C
centigrade *= 0.25;
return centigrade;
}
uint8_t Adafruit_MAX31855::readError() {
return spiread32() & 0x7;
}
double Adafruit_MAX31855::readFarenheit(void) {
float f = readCelsius();
f *= 9.0;
f /= 5.0;
f += 32;
return f;
}
uint32_t Adafruit_MAX31855::spiread32(void) {
int i;
uint32_t d = 0;
digitalWrite(sclk, LOW);
_delay_ms(1);
digitalWrite(cs, LOW);
_delay_ms(1);
for (i=31; i>=0; i--)
{
digitalWrite(sclk, LOW);
_delay_ms(1);
d <<= 1;
if (digitalRead(miso)) {
d |= 1;
}
digitalWrite(sclk, HIGH);
_delay_ms(1);
}
digitalWrite(cs, HIGH);
//Serial.println(d, HEX);
return d;
}
MISO es el pin Master In / Slave Out en un bus SPI. En este código, usted está jugando la parte del Master, entonces ese es el pin donde lee la entrada del esclavo. d | = 1 simplemente ajusta el último bit en d a 1 si lee un 1 del esclavo (y todos los otros bits no se verán afectados). Cada iteración establece el último bit (LSB) de d en 1 si lee un 1, y luego, al comienzo de la siguiente iteración, cambia d a la izquierda.
No tengo experiencia en absoluto con esta API, sin embargo ...
Si ve la documentación de digitalRead () , toda la función lo hace es leer el bit en el pin que proporciona como argumento. Devuelve HIGH
o LOW
.
Entonces, básicamente, lo que veo: si el miso
bit está miso
, haga el primer bit en d
on.