Заполнить массив

Roman-12
Offline
Зарегистрирован: 06.04.2012

 На порт поступают данные они распознаются как 0 и 1 и передаются в функцию для заполнения массива data[8]

{10111101}-{11000000}-…..

 

 

void SendBit(byte b)

{
bitWrite(data[0],1,1);
bitWrite(data[0],1,0);
bitWrite(data[0],1,1);
bitWrite(data[0],1,1);
bitWrite(data[0],1,1);
bitWrite(data[0],1,0);
bitWrite(data[0],1,1);

Как реализовать запись остальных данных в массив?

bitWrite(data[1],1,1);
bitWrite(data[1],1,1);
bitWrite(data[1],1,0);
bitWrite(data[1],1,0);
bitWrite(data[1],1,0);
bitWrite(data[1],1,0);
bitWrite(data[1],1,0);
}
 

Roman-12
Offline
Зарегистрирован: 06.04.2012

массива  

step962
Offline
Зарегистрирован: 23.05.2011

 В чем смысл второго аргумента функции bitWrite? Того, что у вас везде равен единице?

И что за функциё такоё void SendBit(byte b)? Где у нее начало и где конец? Для чего в нее передается байт по имени b?

Roman-12
Offline
Зарегистрирован: 06.04.2012

Индекс массива  data[1], Байт по имени b это аргумент функции 0 или 1

Roman-12
Offline
Зарегистрирован: 06.04.2012

Может у кого-то есть пример как «побитово» заполнить массив из 8 значений byte
 

Roman-12
Offline
Зарегистрирован: 06.04.2012

bitWrite(data[0],1,b);
bitWrite(data[0],1,b);
bitWrite(data[0],1,b);
bitWrite(data[0],1,b);
bitWrite(data[0],1,b);
bitWrite(data[0],1,b);
bitWrite(data[0],1,b);

Затупил 

step962
Offline
Зарегистрирован: 23.05.2011

И еще раз - зачем нужен второй аргумент в функции bitWrite()? Отмаза про индекс массива не прокатывает - вы явно задаете этот индекс в первом аргументе - data[0].

Далее, если вы передаете в функцию 0 или 1 (аргумент b), то какого рожна восемь раз подряд вызывать функцию bitWrite c одним и тем же значением третьего аргумента?

 

Не понимаю... (с)

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

Если я правильно понял:

bool B[8] = byte A; // Как?

 

int i = 0;
 while(i < 8){
   B[i] = bitRead(A, i);
   i++;   
 }

или так:

int i = 7;
 while(i >= 0){
   B[i] = bitRead(A, i);
   i--;   
 }

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

Roman-12
Offline
Зарегистрирован: 06.04.2012

Моё почтение за Вашу толерантность step962, попробую изложить проблему:

Есть пустой массив объявлен как:
byte data[8];

Необходимо заполнить его значениями при помощи функции bitWrite чтобы получился
Вот например такой массив с такими значениями:

byte signal[8] = {77,95,143,42,7,10,1,2};
где 77 в бинарном 01001101
где 95 в бинарном 01011111
и так до конца 64 бита

1001101
bitWrite(data[0], 7, 0);
bitWrite(data[0], 6, 1);
bitWrite(data[0], 5, 0);
bitWrite(data[0], 4, 0);
bitWrite(data[0], 3, 1);
bitWrite(data[0], 2, 1);
bitWrite(data[0], 1, 0);
bitWrite(data[0], 0, 1);

1001101
bitWrite(data[1], 7, 0);
bitWrite(data[1], 6, 1);
bitWrite(data[1], 5, 0);
bitWrite(data[1], 4, 1);
bitWrite(data[1], 3, 1);
bitWrite(data[1], 2, 1);
bitWrite(data[1], 1, 1);
bitWrite(data[1], 0, 1);

На каком принципе построить функцию, чтобы поступающие данные, где качестве аргументов 0100110101001101 заполнялся массив. Сначала 0-левой индекс массива signal[0]=01001101 затем signal[1]=01011111 и так до конца заполнить 64 битами весь массив
Спасибо.
 

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

А данные в каком виде у вас должны поступать в вашу функцию? Тип данных какой?

Roman-12
Offline
Зарегистрирован: 06.04.2012

boolean

0100110101001101101011111101101110100011

 

void savebit(boolean val){

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

Если  boolean то только один бит, а у вас их много, откуда вы эти данные берете?

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

Я так предпологаю, вы их с какого-то входа получаете?

Roman-12
Offline
Зарегистрирован: 06.04.2012

 Да, чтобы просто  декодировать хотел загнать в массив..

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

Что декодировать?

Roman-12
Offline
Зарегистрирован: 06.04.2012

Пульт радиоупровления 

step962
Offline
Зарегистрирован: 23.05.2011

Roman-12 пишет:
 

bitWrite(data[0], 7, 0);
bitWrite(data[0], 6, 1);
bitWrite(data[0], 5, 0);
bitWrite(data[0], 4, 0);
bitWrite(data[0], 3, 1);
bitWrite(data[0], 2, 1);
bitWrite(data[0], 1, 0);
bitWrite(data[0], 0, 1);

В-о-о-о-т.

Уже пости понятно.

Есть входной поток, который надо загнать в байтовый массив, используя функцию bitWrite(), реализация которой пока не дается. Так?

Для начала организуем цикл приема:

cntr=0;
done=0;
while(!done) { // читаем пока не надоест
// здесь каким-то образом загоняем в переменную b очередной принятый бит
  bitWrite(data[cntr/8],cntr%8,b); 
  cntr++;
// здесь организуем проверку на завершение цикла
// например, приняли 129-й бит, а в массиве date у кас вчего 16 байт:
if(cntr>128) done=1;
}

 Далее городим функцию bitWrite:

void bitWrite(byte target,int bit,int val) {
  if(val==1) { // необходимо занести единичку
    target != (1<<bit);
  }
  if(val==0) { // необходимо занести нулик
    target &= ~(1<<bit);
  }
}

 На выходе получаем поток битов, разложенный порциями по восемь.

Оно? 

В смысле - искомое решение?

Нет - попробуйте сформулировать свой проблемус еще раз.

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

Так давайте не будем играть в угадайку, опишите, что хотите сделать? 

step962
Offline
Зарегистрирован: 23.05.2011

Roman-12 пишет:

Пульт радиоупровления 

Вы, кстате, с какими параметрами сигнал обрабатываете (частота следования битов прежде всего интересует)? Может быть, он средствами UART может приниматься?

Roman-12
Offline
Зарегистрирован: 06.04.2012

 Есть несколько пультов радиоуправления на частоту 433,92. Есть модуль приёмник. С пульта летит 64 бита информации C8 5F 8F 2A 07 0A 01 4D в зависимости от начатой кнопки меняется данные, которые необходимо сравнивать

Roman-12
Offline
Зарегистрирован: 06.04.2012
maksim
Offline
Зарегистрирован: 12.02.2012

А к приемнику вы куда и как подключаетесь?

Roman-12
Offline
Зарегистрирован: 06.04.2012

 Это радиомодуль 433 мГц к любому Digital

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

Вы сигнал как демодулируете?

Roman-12
Offline
Зарегистрирован: 06.04.2012

Огромное Спасибо Maksim  буду разбирать твои примеры

Roman-12
Offline
Зарегистрирован: 06.04.2012

interrupts();
}
void pinint(){
if(digitalRead(rxd)==HIGH)oldtime=micros();
else{
time=micros()-oldtime;
if(time<mintime)return;
if(constrain(time,log0-delta,log0+delta)==time)savebit(false);
else if(constrain(time,log1-delta,log1+delta)==time)savebit(true);
else{
count=0;
}
}
}

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

Поробуйте так:

#define DATAPIN 4

void setup() {
  digitalWrite(DATAPIN, HIGH);
  Serial.begin(9600);
}

void loop() {
  Serial.println(pulseIn(DATAPIN, HIGH), DEC);
}

 

и покажите, что у вас в сериал-мониторе 

Roman-12
Offline
Зарегистрирован: 06.04.2012

Сейчас не смогу, не у себя дома :)

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

DATAPIN -это вывод к которому подключаетесь, у меня в коде он 4

Roman-12
Offline
Зарегистрирован: 06.04.2012

interrupts();

4 нельзя

attachInterrupt(interrupt, function, mode)

Задает функцию обработки внешнего прерывания, то есть функция, которая будет вызвана по внешнему прерыванию. Если до это была задана другая функция, то назначается новая. Большинство контроллеров Arduino умеют обрабатывать до двух внешних прерываний, пронумерованных так: 0 (на цифровом порту 2) и 1 (на цифровом порту 3). Arduino Mega обрабатывает дополнительно еще четыра прерывания: 2 (порт 21), 3 (порт 20), 4 (порт 19) и 5 (порт 18). 

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

Как проверете, выложите, что дает сериал-монитор.

Roman-12
Offline
Зарегистрирован: 06.04.2012

 Ок! Спасибо

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

Вы мне зачем про прерывания расказываете? 

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

И вы путаете понятие порта с воводом (пином). 

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

Вы, кстати, до этого хотябы в с-монитор эти 64-бита выводили? Вы уверены, что ваш код правильно демодулирует сигнал?