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

В результате получил 16 переменных, с значениями 1 или 0. Как их слепить в одну переменную, т.е. последовательно записать биты с 15 по 3? Там надо даже в принципе не 16, а всего 13, 3 последних у этого датчика всегда равняются нулю, но даже учитывая это длина числа получается очень большой.
Я в курсе, что это обычная ISP передача, но пока с бибилиотекой ISP не разобрался, да и тут она не нужна - передача идёт в одну сторону.
Sync, зачем вы делали 16 переменных? Складывайте всё в конечную переменную сразу по приёму бита. data|=(1<<i); где i -номер бита.
Sync, зачем вы делали 16 переменных? Складывайте всё в конечную переменную сразу по приёму бита. data|=(1<<i); где i -номер бита.
Спасибо, сделаю по нормальному сейчас.
А! А какой тип переменной должен быть? И можно пояснения по синтаксису...
data это перменная, куда будут складываться биты, | что это значит? У меня есть счётчик бит, это i в вашем примере - как его остановить, чтоб он на 16 переставал записывать? Просто добавить условие if (i > 16) ?
Sync, давайте ваш скетч, так проще будет понять как всё это внедрить.
Пока это выглядит как-то так. Правда датчик что-то перестал отвечать, я параллельно осцилографом смотрю у него сигналы, чтоб видеть фактически их наличие.
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; } }Как-то так: if (readbit) data|=(1<<(16-bitcount) ); В начале цикла data нужно обнулить
Чё-то при добавлении переменной data перестал компилироваться скетч. Хрень какая-то. Ругается на все перменные и войды. Самое странное, что и резервная копия не компилится.
Что то я вообще ничего не понял - if без условия и фигурных скобок - он же вообще выполняться не будет. переменная data какая-то непонятная, из-за которой компилятор не работает даже с резервной копией.
Sync, подобное бывает когда два схожих проекта в одной папке.
Самое странное, что и резервная копия не компилится.
Мда, Вы случайно не для гитары прибамбас делаете? А то с гитарами там ведь известное дело :))))))))))))