не просто мигать а определенные сигналы.

b707
Онлайн
Зарегистрирован: 26.05.2017

maxvalin пишет:
Когда в сериал посмотрел то увидел что при делении на 7 переход осуществляется через 0. Тоисть всего 8 что соответствует одной маске.

Нет там деления на 7. И "перехода через ноль" нет.

Мне кажется, тебе будет проще, если использовать строго формальные обозначения. "Деление" появляется уже потом. Операция & - это никакое не деление, это побитовое логическое "И".

Результатом операции  (x & 0x07) будет установка в ноль всех битов числа х, начиная с третьего (считаем от нуля). Поскольку 2 в степени 3 = 8, то арифметически это эквивалентно операции x%8 - взятию остатка от деления на восемь.

НА ВОСЕМЬ, а не "на семь с переходом через ноль".

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

Если тебе надо мигать определенными кодами, лучше всего взять переменную типа unsigned long и договориться, что один бит в ней имеет длительность, допустим, 100 миллисекунд и кодировать длительности нулями и единицами. Ведущие нули пропускай.  Допустим, тот же SOS закодируется как 

0b1010100110110110010101

три точки, три тире, три точки.

Единица - гореть, Ноль - не гореть. 

 Длительность точки  - 100мс, длительность тире = 2*длительность точки, паузы в знаке = длительности точки, пауза между знаками = длительсти тире.  Думаю, в long влезуть все желаемые коды, там 32 бита. Не влезуть, тогда long long (если есть такой)

Могу написать код на моем таймере, для примера. нужна 1 функция всего, на все коды. 

maxvalin
Offline
Зарегистрирован: 22.02.2016

Вот! Вот то и надо! unit_32. В сообщение √12 я и спросил об этом варианте. Ибо хоть я и не программист но нестандартная логика мышления подсказывала что нужно просто взять одну большую маску высчитать паузы и блинки и перебирать ее опять же таки с высчитаным интервалом. Вот это и будет самый простой вариант.
Полноценно не могу ответить. Пигу с тел. До компа доберусь после обеда и если глаза позволят то изваяю именно так.
Спасибо за объяснения! Насчет & надо еще погрызть для твердого понимания.

b707
Онлайн
Зарегистрирован: 26.05.2017

maxvalin пишет:
логика мышления подсказывала что нужно просто взять одну большую маску высчитать паузы и блинки и перебирать ее опять же таки с высчитаным интервалом. .

ты удивишься. но все (ВСЕ) представленные в этой ветке примеры с битовой маской - именно так и работают. Начиная с самого первого, который ты скопировал в заголовке темы...

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

maxvalin пишет:
Вот! Вот то и надо! unit_32.
Точно? Вы же хотели там интервалы по целых 6 секунд! Хватит 32-то? Посчитайте внимательно какого размера у Вас будет минимальный (атомарный) интервал при этом. Может сразу на 64 бита забиваться? Такой тип данных тоже есть, если что.

maxvalin
Offline
Зарегистрирован: 22.02.2016

DetSimen пишет:

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

для вас просто а я вот сижу и никак не пойму как этот "регистр " заставить переходить 20 раз например...

то что вылезло стыдно выкладывать.

Одним словом :закидайте тапочками((

uint32_t modes = 0B1010100000000000000001;

uint32_t ms, ms1 = 0;  // большая переменная для милисекунд ms и 1 и 2
uint8_t  blink_loop = 0;

void setup() {
  pinMode(13, OUTPUT);  // выход для светодиода
  digitalWrite(13, LOW); //выключить светодиод на всякий случай
  Serial.begin(9600);
}

void loop() {
   ms = millis();
// Событие срабатывающее каждые 125 мс тоисть длительность  
   if( ( ms - ms1 ) > 500|| ms < ms1 ){
       ms1 = ms;
// Режим светодиода ищем по битовой маске       
       if(  modes & 1<<(blink_loop) ) digitalWrite(13, HIGH);//
       else  digitalWrite(13, LOW);
       blink_loop++; 
       if( blink_loop >= 20 )
        {
          
          blink_loop = 0;
        }
       Serial.println(blink_loop);   
    }

 }

млятьвот что значит не учится.

сижу и читаю сдвиговый регистр, что-то говорит что это немного не то.

(http://robotclass.ru/tutorials/arduino-shift-register/)

как заставить принимать состояние блинка из числа uint32_t modes = 0B1010100000000000000001;

понять не могу.

b707
Онлайн
Зарегистрирован: 26.05.2017

maxvalin пишет:

как заставить принимать состояние блинка из числа uint32_t modes = 0B1010100000000000000001;

понять не могу.

посмотри пример по ссылке из сообщения №13 (в ветке по ссылке см сообщение 14 - на случай если ссылка не отработает правильно)

maxvalin
Offline
Зарегистрирован: 22.02.2016

посмотрел. Хороший пример, настроить под себя в принципе не сложно. 

Хотелось понять для себя)))

const uint32_t mode = ( ((uint32_t)B10101000) << 24)  
                      + ( ((uint32_t)B11101110) <<16 ) 
                      + ( ((uint32_t)B11100010) <<8 ) + B10100000;

разжуйте пожалуйста эти строчки

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

maxvalin, а чего здесь разжевывать? Что имелось в виду - понятно, непонятно только, почему написано именно в таком виде. Ну так этого, кроме автора, все равно никто сказать не может.

b707
Онлайн
Зарегистрирован: 26.05.2017

andriano пишет:

непонятно только, почему написано именно в таком виде.

Так написано, чтобы каждый бит 32-битной маски был виден. Бинарный тип записи типа B00110110 определен только для типа byte. поэтому long int формируется из четырех байт путем сдвига. Еще можно было описать маску как union байтового массива и лонга...

Если знаете, как сделать это лучше - с удовольствием послушаю.