Библиотека MAX6675, поясните суть процесса

Discover0708
Offline
Зарегистрирован: 20.09.2020

Подскажите, что происходит в следующем кусочке кода( не понимаю сокращения).

****              ВЗЯТО из БИБЛИОТЕКИ MAX     ***********************************

uint16_t v;

v = spiread();   Здесь,записывается первый байт в младшую позицию в слове(двухбайтной переменной:spiread  возвращает один байт)
                        

 

  v <<= 8;      Здесь, происходит перемещение младшего байта в старший
  v |= spiread(); А вот здесь что происходит?

********************************

 

double readCelsius(void) {
 
  uint16_t v;
 
  digitalWrite(thermoCS, LOW);
  //_delay_ms(1);
 
  v = spiread();
  v <<= 8;
  v |= spiread();
 
  digitalWrite(thermoCS, HIGH);
 
  if (v & 0x4) {
    // uh oh, no thermocouple attached!
    return NAN;
    //return -100;
  }
 
  v >>= 3;
 
  return v * 0.25;
}
 
// Функция чтения SPI - взята из библиотеки MAX6675
byte spiread(void) {
  int i;
  byte d = 0;
 
  for (i = 7; i >= 0; i--)
  {
    digitalWrite(thermoCLK, LOW);
    //_delay_ms(1);
    if (digitalRead(thermoDO)) {
      //set the bit to 0 no matter what
      d |= (1 << i);
    }
 
    digitalWrite(thermoCLK, HIGH);
    // _delay_ms(1);
  }
 
  return d;
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Полгода на форуме! А код вставлять так и не научились? Вставьте нормально!

Discover0708
Offline
Зарегистрирован: 20.09.2020

Я скопировал с соседней ветки...

// this library is public domain. enjoy!
// https://learn.adafruit.com/thermocouple/

#include "max6675.h"

/**************************************************************************/
/*!
    @brief  Initialize a MAX6675 sensor
    @param   SCLK The Arduino pin connected to Clock
    @param   CS The Arduino pin connected to Chip Select
    @param   MISO The Arduino pin connected to Data Out
*/
/**************************************************************************/
MAX6675::MAX6675(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);
}

/**************************************************************************/
/*!
    @brief  Read the Celsius temperature
    @returns Temperature in C or NAN on failure!
*/
/**************************************************************************/
float MAX6675::readCelsius(void) {

  uint16_t v;

  digitalWrite(cs, LOW);
  delayMicroseconds(10);

  v = spiread();
  v <<= 8;
  v |= spiread();

  digitalWrite(cs, HIGH);

  if (v & 0x4) {
    // uh oh, no thermocouple attached!
    return NAN;
    // return -100;
  }

  v >>= 3;

  return v * 0.25;
}

/**************************************************************************/
/*!
    @brief  Read the Fahenheit temperature
    @returns Temperature in F or NAN on failure!
*/
/**************************************************************************/
float MAX6675::readFahrenheit(void) { return readCelsius() * 9.0 / 5.0 + 32; }

byte MAX6675::spiread(void) {
  int i;
  byte d = 0;

  for (i = 7; i >= 0; i--) {
    digitalWrite(sclk, LOW);
    delayMicroseconds(10);
    if (digitalRead(miso)) {
      // set the bit to 0 no matter what
      d |= (1 << i);
    }

    digitalWrite(sclk, HIGH);
    delayMicroseconds(10);
  }

  return d;
} 

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Discover0708 пишет:

 v <<= 8;      Здесь, происходит перемещение младшего байта в старший
  v |= spiread(); А вот здесь что происходит?

Вновь прочитанный байт вписывается на место младшего байта переменной v не затирая старшего, который туда уже вписан.

Discover0708
Offline
Зарегистрирован: 20.09.2020

Евгений П, Спасибо!