"Складывание" бит в двоичное число

Sync
Offline
Зарегистрирован: 12.01.2016

Пытаюсь написать код для "чтения" для датчика температуры TMP121

Там он выдаёт при пропадании питания на одном из пинов (CS) последовательность из 16 бит с тактовой частотой задаваемой с ардуины (контакт SCK). Тактовый генератор я изобразил, генератор измерения/передачи тоже. Считывание бит на подъеме фронта SCK тоже.

В результате получил 16 переменных, с значениями 1 или 0. Как их слепить в одну переменную, т.е. последовательно записать биты с 15 по 3? Там надо даже в принципе не 16, а всего 13, 3 последних у этого датчика всегда равняются нулю, но даже учитывая это длина числа получается очень большой.

Я в курсе, что это обычная ISP передача, но пока с бибилиотекой ISP не разобрался, да и тут она не нужна - передача идёт в одну сторону.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Sync, зачем вы делали 16 переменных? Складывайте всё в конечную переменную сразу по приёму бита.  data|=(1<<i);   где i -номер бита.

Sync
Offline
Зарегистрирован: 12.01.2016

dimax пишет:

Sync, зачем вы делали 16 переменных? Складывайте всё в конечную переменную сразу по приёму бита.  data|=(1<<i);   где i -номер бита.

Потому что это мой второй скетч не считая блинка :)

Спасибо, сделаю по нормальному сейчас.

А! А какой тип переменной должен быть? И можно пояснения по синтаксису...

data это перменная, куда будут складываться биты, | что это значит? У меня есть счётчик бит, это i в вашем примере - как его остановить, чтоб он на 16 переставал записывать? Просто добавить условие if (i > 16) ?

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Sync, давайте ваш скетч, так проще будет понять как всё это внедрить.

Sync
Offline
Зарегистрирован: 12.01.2016

Пока это выглядит как-то так. Правда датчик что-то перестал отвечать, я параллельно осцилографом смотрю у него сигналы, чтоб видеть фактически их наличие.

int cs = 13; //пин переключения чтение/передача
int csstate = LOW;
unsigned long cspreviousMillis = 0;
const long csinterval = 500;  
int sck = 2; //тактовый пин
int sckstate = HIGH;
unsigned long sckpreviousMicros = 0;
const long sckinterval = 20000;
int tempdata = 3; //вход для данных от датчика
long temperatureBinary; // температура в бинарном виде
int temperature; //температура
 
//Создаём детектор фронта

int sckReadstate = 0;
int sckReadlaststate = 0;
int bitcount = 0;

//создадим регистры памяти

byte readbit;

int D15;
int D14;
int D13;
int D12;
int D10;
int D11;
int D9;
int D8;
int D7;
int D6;
int D5;
int D4;
int D3;
int D2;
int D1;
int D0;

void setup() {
  pinMode(tempdata, INPUT);
  Serial.begin(115200);
}

void loop() {
  unsigned long cscurrentMillis = millis();
  if (cscurrentMillis - cspreviousMillis >= csinterval) {
    cspreviousMillis = cscurrentMillis;
    if (csstate == LOW) {
      csstate = HIGH;
    } else {
      csstate = LOW;
    }
    digitalWrite(cs, csstate);

temperatureBinary = (D14, D13, D12, D11, D10, D9, D8, D7);
//temperature =  ;   
    Serial.print(D14);
    Serial.print(D13);
    Serial.print(D12);
    Serial.print(D10);
    Serial.print(D9);
    Serial.print(D8);
    Serial.print(D7);
    Serial.println("");
  }
if (csstate == HIGH){
    bitcount = 0;
    sckstate = HIGH;
}
  unsigned long sckcurrentMicros = micros();
  if (csstate == LOW) {
    if (sckcurrentMicros - sckpreviousMicros >= sckinterval) {
      sckpreviousMicros = sckcurrentMicros;
      if (sckstate == HIGH) {
        sckstate = LOW;
      } else {
        sckstate = HIGH;
      }
      digitalWrite(sck, sckstate);
    }
  }
  if (csstate == HIGH){
      bitcount = 0;
      sckstate = HIGH;
  }
  
  sckReadstate = digitalRead(sck); //я намеренно считываю состояние с пина на случай внешней синхронизации
  if (sckReadstate !=  sckReadlaststate){ //проверяем изменилось ли состояние такта
        if (sckReadstate == HIGH) { //если фронт набегающий
      bitcount ++;
      readbit = digitalRead(tempdata);
  }
 }
  sckReadlaststate = sckReadstate;

if (bitcount == 1){
  D15 = readbit;
}
if (bitcount == 2){
  D14 = readbit;
}
if (bitcount == 3){
  D13 = readbit;
}
if (bitcount == 4){
  D12 = readbit;
}
if (bitcount == 5){
  D11 = readbit;
}
if (bitcount == 6){
  D10 = readbit;
}
if (bitcount == 7){
  D9 = readbit;
}
if (bitcount == 8){
  D8 = readbit;
}
if (bitcount == 9){
  D7 = readbit;
}
if (bitcount == 10){
  D6 = readbit;
}
if (bitcount == 11){
  D5 = readbit;
}
if (bitcount == 12){
  D4 = readbit;
}
if (bitcount == 13){
  D3 = readbit;
}
if (bitcount == 14){ //для TMP121(123) всегда равен нулю 
  D2 = readbit;
}  
if (bitcount == 15){ //для TMP121(123) всегда равен нулю
  D1 = readbit;
}
if (bitcount == 16){ //для TMP121(123) всегда равен нулю
  D0 = readbit;
}
}

 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Как-то так:  if (readbit)  data|=(1<<(16-bitcount) ); В начале цикла data нужно обнулить

Sync
Offline
Зарегистрирован: 12.01.2016

Чё-то при добавлении переменной data перестал компилироваться скетч. Хрень какая-то. Ругается на все перменные и войды. Самое странное, что и резервная копия не компилится.

Sync
Offline
Зарегистрирован: 12.01.2016

Что то я вообще ничего не понял - if без условия и фигурных скобок - он же вообще выполняться не будет. переменная data какая-то непонятная, из-за которой компилятор не работает даже с резервной копией.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Sync, подобное бывает когда два схожих проекта в одной папке.

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

Sync пишет:

Самое странное, что и резервная копия не компилится.

Мда, Вы случайно не для гитары прибамбас делаете? А то с гитарами там ведь известное дело :))))))))))))