Как записать побитно число?

IneedHelp
Offline
Зарегистрирован: 12.10.2013

Всем привет! Недавно занимаюсь программированием.
Стоит задача

Есть датчик угла поворота, который выдает данные в коде Грея. Мне нужно считать эти данные и записать их в переменную типа int/byte но НЕ в МАССИВ!!!
Помогите плиз!
Датчик orlax p120.

maksim
Offline
Зарегистрирован: 12.02.2012
IneedHelp
Offline
Зарегистрирован: 12.10.2013

IneedHelp пишет:

Всем привет! Недавно занимаюсь программированием.
Стоит задача

Есть датчик угла поворота, который выдает данные в коде Грея. Мне нужно считать эти данные и записать их в переменную типа int/byte но НЕ в МАССИВ!!!
Помогите плиз!
Датчик Орлэкс p120.

maksim
Offline
Зарегистрирован: 12.02.2012

Никто вам ничего не напишит по двум причинам:

1. Вы некорректно/абстрактно задали вопрос.
2. А посмотреть что вы там пытаетесь подключить нет возможности, так как такого датчика угла поворота тоже не существует.

Можете еще разок продублировать свое кривое сообщение, только смысла от этого в нем больше не станет.

Bitwise Operators

  • & (bitwise and)
  • | (bitwise or)
  • ^ (bitwise xor)
  • ~ (bitwise not)
  • << (bitshift left)
  • >> (bitshift right)

Bits and Bytes

 

 

IneedHelp
Offline
Зарегистрирован: 12.10.2013

1) у меня идет считывание кода Грея. Поначалу записывали в массив. Например:

void loop(){
  digitalWrite(sclk,LOW);
  digitalWrite(convst,HIGH);
  delay(1);
  digitalWrite(convst,LOW);
  delay(0.05);
  digitalWrite(convst,HIGH);
  delay(5);
  for(int i=1;i<=15;i++){
    digitalWrite(sclk,HIGH);
    delay(0.02);
    digitalWrite(sclk,LOW);
    delay(0.02);
    data[i] = digitalRead(sdata);
    dec_data = dec_data + data[i]*pow(2,15-i); 
 
Но, чтобы преобразовать Грей в бинарник, необходимо пользоваться числом, а не массивом.
 
maksim
Offline
Зарегистрирован: 12.02.2012

Во-первых, почитайте о delay() и посмотрите какие значения она может принимать. delayMicroseconds()
Во-вторых, 
Вставка программного кода в тему/комментарий.
Втретих, по вашей ссылке датчик давления.

Как я понял этот датчик "общается" по SPI и вам нужно считать данные в переменную, почему у вас идет считывание с 1-го бита я не знаютак как нет описания датчика неизвестно в каком из 4-х режимов SPI датчик передает данные, но могу предположить что вы неверно считываете данные, так же неизвестно как передаются данные - младшим битом вперед (LSB) или старшим (MSB):

unsigned int gray = 0;
for(int i = 0; i < 16; i++) // LSB
//for(int i = 15; i >= 0; i--) // MSB
{
  digitalWrite(sclk,HIGH);
  delayMicroseconds(20);
  if(digitalRead(sdata)) gray |= 1<<i;
  digitalWrite(sclk,LOW);
  delayMicroseconds(20);
}

Ну а дальше само преобразование:

unsigned int bin;
for (bin = 0; gray; gray >>= 1) bin ^= gray;
Serial.println(bin);

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

 

IneedHelp
Offline
Зарегистрирован: 12.10.2013

Спасибо, будем пробовать!

IneedHelp
Offline
Зарегистрирован: 12.10.2013

Ну вот это снова я.

Почему-то не получается корректно опросить датчик.

Высылаю данные датчика. А задача состоит в том, чтобы снять данные,приходящие с датчика, а потом перевести эти данные в градусы. 
 

maksim
Offline
Зарегистрирован: 12.02.2012

А как вы подключаете дуину к этому энкодеру? Еще есть что то из документации? И можно картинку "Параметры сигналов" показать поближе?

maksim
Offline
Зарегистрирован: 12.02.2012

В общем не знаю как вы там его подключили, но если вы внимательно читали что написано в это бумажке, то "Способ передачи данных ______ RS-422" должен был вас натолкнуть на мысль что напрямую к дуине подключить этот энкодер не получится.

Что бы согласовать физические уповни дуины и энкодера нужно подключать их друг к другу либо через преобразователь RS-422<->TTL, либо через два преобразователя RS-485<->TTL.

IneedHelp
Offline
Зарегистрирован: 12.10.2013

IneedHelp
Offline
Зарегистрирован: 12.10.2013

Да, разумеется мы подключали через МАХ490

maksim
Offline
Зарегистрирован: 12.02.2012

То есть подключено так?

дуина  |  max490  
  sclk    |      DI
 sdata  |     RO

max490 | энкодер
     A       |   DATA
     B       |  /DATA
     Z       |  /CLOCK
     Y       |  CLOCK

верно?

maksim
Offline
Зарегистрирован: 12.02.2012

Датчик скольки разрядный? И как далеко находится от дуины?

IneedHelp
Offline
Зарегистрирован: 12.10.2013

Да подключали  так.
Разрядность 10

на расстоянии приблизительно 1 метра

 

IneedHelp
Offline
Зарегистрирован: 12.10.2013

Корпус MAX 490 - DIP

maksim
Offline
Зарегистрирован: 12.02.2012

Как то так

#define sclk 4
#define sdata 5


void setup() 
{
  Serial.begin(9600);
  pinMode(sclk, OUTPUT);
  digitalWrite(sclk, HIGH);
  digitalWrite(sdata, HIGH);
}

void loop() 
{
  unsigned int gray = readData();
  unsigned int bin = GrayToBin(gray);
  Serial.println(bin);
  delay(1000);
}


unsigned int readData()
{
  digitalWrite(sclk, LOW);
  delayMicroseconds(1);       // t1

  unsigned int gray = 0;
  for(char i = 9; i >= 0; i--) // T
  {
    digitalWrite(sclk, HIGH);
    delayMicroseconds(1);
    digitalWrite(sclk, LOW);
    delayMicroseconds(1);
    if(digitalRead(sdata)) gray |= 1<<i;
  }
  digitalWrite(sclk, HIGH);
  delayMicroseconds(15);       // t3
  return gray;
}

unsigned int GrayToBin(unsigned int gray)
{
  unsigned int bin;
  for (bin = 0; gray; gray >>= 1) bin ^= gray;
  return bin;
}

 

zuxe
Offline
Зарегистрирован: 03.11.2013

А что мешает организовать переменную типа word (для вашего 10-битного энкодера как раз хватит)?. Цикл от 0 до 16 и за каждый такт цикла читать пин порта куда подключён энкодер, а потом сдвигать влево-вправо на 1 бит по необходимости??????   Вот вам почитайте. http://robocraft.ru/blog/arduino/33.html про метод сдвига. 

maksim
Offline
Зарегистрирован: 12.02.2012

А что вам мешает почитать всю ветку, прочитать докуметацию на фото, посмотреть диаграммы, почитать описние word и посмотреть код из сообщения выше?

zuxe
Offline
Зарегистрирован: 03.11.2013

Реплика была не в ваш адрес, и вы правы, я ваш исходник не смотрел, но да идея такова. Как вы говорите: "...как-то так...".