пытаюсь разобраться

fsdb
Offline
Зарегистрирован: 24.10.2015

Ребята добрый день!

Пытаюсь повторить проект который есть на ютубе с открытыми исходными кодами.

Цель получить значение с прибора в сериал порт

https://www.youtube.com/watch?v=Mr_RMcncrVY

 

Купил анализатор логики и он мне выдал вот такой рисунок

https://yadi.sk/i/aLjdQkCUEev28Q

Прикрутил конвертор логики 3в to 5в

https://aliexpress.ru/item/32696302250.html?spm=a2g0o.productlist.0.0.5aad5b5dAxsvPP&algo_pvid=25941ffc-d26f-4da5-b78d-c5526b246e9c&algo_expid=25941ffc-d26f-4da5-b78d-c5526b246e9c-33&btsid=0b8b034c16035677018601871e3818&ws_ab_test=searchweb0_0,searchweb201602_,searchweb201603_

 

Проверил снова анализатором логики . сигналы те же самые со стороны 5в линии выдает. на всякий случай измерил вольтаж на сигнальных линиях - стал выше. похоже что конвертор работает.

Подключил ардуинку нано. Взял скетч автора - подрихтовал как умел - у него там под arduino due но увы знаний видимо маловато и не идут данные у меня, скетч автора для меня сложноват.
копи паст не работает тут.......

Подскажите хотя бы суть. как происходит совмещение этих двух каналов в одно число. каким образом это присходит хотя бы примерно. хочу разобраться но не знаю как к этому протоколу подойти. не разу таким не занимался

mixail844
Offline
Зарегистрирован: 30.04.2012
с проeкта на GitHub, вроде все ясно , хотя я мог не углядеть чего 
в функции void Scale::wantNextBit_CaliperProtocol() происходит считывание данных : 
(мне не попонятно зачем там 3 преывания - одна линейка с 3мя осями или 3 линкейки - каждая на ось,я хз)
 
//--------------------------------------------------------------------------------------------------------------------------------------
void Scale::wantNextBit_CaliperProtocol()
{
    
  // это прерывание вызывается по изменению уровня. Здесь надо понять, что мы можем начинать читать значения.
  uint8_t level = digitalRead(clockPin);
    
  if(level == LOW) 
  {
    if(micros() - lastCaliperHighTime > 80000) // низкий уровень впервые за долгое время, это начало фрейма
    {
      // начало порции данных, подготавливаем переменные
      dataToRead = 0;
      caliperBitNumber = 0;
    }

      uint8_t readedCaliperBit = digitalRead(dataPin);
      dataToRead |= ( readedCaliperBit << caliperBitNumber );
      caliperBitNumber++;

      if(caliperBitNumber == 24) // всё прочитали, сигнализируем об этом
      {      
        caliperBitNumber = 0; // обнуляем счётчик бит, в следующий раз читать начнём сначала
        caliperDataReady = true;        
      }
  }  //if(level == LOW) 
  else
  {
     // высокий уровень, запоминаем время
     lastCaliperHighTime = micros();
  }
}
 
если я прявильно понял , если пин CLK совершил переход '1'->'0' и при этом он до этого был в '1' более 80 мили cек , значит началась передача новых данных.
если передача данных уже в процессе  и пин CLK = '0' ,то считываем что есть на пине Data и сдвигом помещаем в переменную dataToRead , потом dataToRead форматируються в фунции void Scale::update() и затем данные можно считать в функции ScaleFormattedData Scale::getData(MeasureMode mode, uint8_t multiplier, int32_t substitutedValue).
 
дерзайте :)