дешифратор для АКПП

b707
Offline
Зарегистрирован: 26.05.2017

SLKH пишет:

строка 27 и дальше - некузяво.

Конечно некузяво. Строчки с кучей digitalRead() и условий - некрасиво.

Смотрим, у нас все входа на одном порту. порту D:

uint8_t k1 = 4; // Входа 1-4
uint8_t k2 = 5;
uint8_t k3 = 6;
uint8_t k4 = 7;

значит достаточно дополнить их маской:

uint8_t mask = 0b11110000;

чтобы можно было читать все входа разом и заменить кучу условий в строке 27 на элегантный case



void loop() {
  uint8_t inputs = PORTD & mask; // читаем весь порт Д целиком и выделяем нужное маской

 switch (inputs)
  // 1-й
  case (0b00100000)
      digitalWrite(rA,HIGH);
       digitalWrite(rB,LOW);
       digitalWrite(rC,HIGH);
       digitalWrite(rD,LOW);
       break;
  
  // 2-й и далее аналогично
  }
 }

можно тоже самое проделать и с выходами, будет еще короче

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

b707 пишет:

SLKH пишет:

строка 27 и дальше - некузяво.

Конечно некузяво. Строчки с кучей digitalRead() и условий - некрасиво.

Смотрим, у нас все входа на одном порту. порту D:

uint8_t k1 = 4; // Входа 1-4
uint8_t k2 = 5;
uint8_t k3 = 6;
uint8_t k4 = 7;

значит достаточно дополнить их маской:

uint8_t mask = 0b11110000;

чтобы можно было читать все входа разом и заменить кучу условий в строке 27 на элегантный case



void loop() {
  uint8_t inputs = PORTD & mask; // читаем весь порт Д целиком и выделяем нужное маской

 switch (inputs)
  // 1-й
  case (0b00100000)
      digitalWrite(rA,HIGH);
       digitalWrite(rB,LOW);
       digitalWrite(rC,HIGH);
       digitalWrite(rD,LOW);
       break;
  
  // 2-й и далее аналогично
  }
 }

можно тоже самое проделать и с выходами, будет еще короче

можно поинтересоваться? а сколько блоков CASE планируется (на выход)?

b707
Offline
Зарегистрирован: 26.05.2017

ua6em пишет:

можно поинтересоваться? а сколько блоков CASE планируется (на выход)?

ровно столько же, сколько строчек IF планировалось у вас. Видите - я в коде даже ваши комментарии // 1-1 //2-ой оставил.

Схема работы осталась та же, только вместо каждого

if(!digitalRead(k1) && digitalRead(k2) && !digitalRead(k3) && !digitalRead(k4))

будет

case (0b00100000)

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

я пока еще не планировал, как только с тумблерами потренируется хотел показать, где влетит на логике )))

Ты сильно тему не развивай, дай человеку светодиодиками поиграться, дальше покажу на if, а уже далее для расшаренных код )))

SLKH
Offline
Зарегистрирован: 17.08.2015

b707 пишет:

SLKH пишет:

строка 27 и дальше - некузяво.

Конечно некузяво. Строчки с кучей digitalRead() и условий - некрасиво.

Смотрим, у нас все входа на одном порту. порту D:

uint8_t k1 = 4; // Входа 1-4
uint8_t k2 = 5;
uint8_t k3 = 6;
uint8_t k4 = 7;

значит достаточно дополнить их маской:

uint8_t mask = 0b11110000;

чтобы можно было читать все входа разом и заменить кучу условий в строке 27 на элегантный case


void loop() {
  uint8_t inputs = PORTD & mask; // читаем весь порт Д целиком и выделяем нужное маской

 switch (inputs)
  // 1-й
  case (0b00100000)
      digitalWrite(rA,HIGH);
       digitalWrite(rB,LOW);
       digitalWrite(rC,HIGH);
       digitalWrite(rD,LOW);
       break;
  
  // 2-й и далее аналогично
  }
 }

можно тоже самое проделать и с выходами, будет еще короче

привязываться к конкретным пинам - тоже нехорошо. и неоднократные case и digitalWrite.

вариант

/* рисуем таблицу, например:

01 4321 DCBA
02 0000 0000
03 0001 0100
04 0010 0101
05 0011 0000
06 0100 1001
07 0101 0000
08 0110 0000
09 0111 1010
10 1000 0000
11 1001 0000
12 1010 0000
13 1011 0000
14 1100 0000
15 1101 1000
16 1110 0000
17 1111 0000

*/

//  объявляем и настраиваем пины, дальше вся программа в 6 операторов:

const byte out = {B00000000, 00000100, 00000101, ....... B00000000};

loop() {

byte index = digitalRead(k4)*8 + digitalRead(k3)*4 + digitalRead(k2)*2 + digitalRead(k1);

digitalWrite(rD, bitRead(out[index], 3));

digitalWrite(rC, bitRead(out[index], 2));

digitalWrite(rB, bitRead(out[index], 1));

digitalWrite(rA, bitRead(out[index], 0));

}

 
b707
Offline
Зарегистрирован: 26.05.2017

ua6em пишет:

Ты сильно тему не развивай, дай человеку светодиодиками поиграться, дальше покажу на if, а уже далее для расшаренных код )))

а что тут развивать, тут уже все написано. Осталось еще два-три состояния таблички добавить - и все готово

b707
Offline
Зарегистрирован: 26.05.2017

SLKH пишет:

привязываться к конкретным пинам - тоже нехорошо. и неоднократные case и digitalWrite.

 

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

Зато мой код будет читать состояние на порядок быстрее, чем ваша сложная формула :) А если повесить все выходы тоже на один порт - можно будет и писать выходы все разом, еще выиграв в быстроте

yakomi
Offline
Зарегистрирован: 02.11.2020

эй!... СТОП !

дайте:

ua6em пишет:

..., дай человеку светодиодиками поиграться, дальше покажу на if, а уже далее для расшаренных код )))

 

а реально все расписали, пообсуждали :) бери и собирай и заливай..

 

мне еще контроллер для горелки на отработке делать, а Вы тут уже все выложили :)

Спасибо.

 

пс. пытаюсь установить и подключить свежекупленную "уно"

 

ппс. Установил, запустил, как сказано тут: http://arduino.ru/Guide/Windows

светодиод заморгал.

 

завтра, если магазины работают, посмотрю, может в наличии платы с релюшками есть..

сейчас пока со светодиодиками и тумблерами побалуюсь.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

b707 пишет:

А если повесить все выходы тоже на один порт - можно будет и писать выходы все разом, еще выиграв в быстроте

не можно, а нужно, пины назначал с потолка

SLKH
Offline
Зарегистрирован: 17.08.2015

b707 пишет:

SLKH пишет:

привязываться к конкретным пинам - тоже нехорошо. и неоднократные case и digitalWrite.

 

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

Зато мой код будет читать состояние на порядок быстрее, чем ваша сложная формула :) А если повесить все выходы тоже на один порт - можно будет и писать выходы все разом, еще выиграв в быстроте

куда торопиться-то? на выходах у нас автомобильные реле с типовым временем срабатывания порядка  10 миллисекунд - никакого заметного выигрыша в скорости не будет.

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

Как так?

А дребезг кто воспроизводить будет?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ТС гайды читает, видимо заинтересуется )))

yakomi
Offline
Зарегистрирован: 02.11.2020

продолжаю песочные вопросы/эксперементы... 

(как же весело Вам :) :) ), а я радуюсь, как в школе с БК-0010 :)

решил сделать мигающий диод, чтоб горел постоянно при замкнутом 4 пине.

Замкнут 4 пин на корпус - горит постоянно, если отпустили - моргает, как прежде.

 

Как можно это сделать проще и правильно?

uint8_t k1 = 4;     // НАЗНАЧИЛ ПЕРЕМЕННУЮ к1 НА 4 пин

void setup() {
  // initialize digital pin LED_BUILTIN as an output.
  pinMode(LED_BUILTIN, OUTPUT);
  pinMode(k1,INPUT_PULLUP); // ОБОЗНАЧИЛ к1 НА ВХОД
}

// the loop function runs over and over again forever
void loop() {
digitalWrite(LED_BUILTIN, HIGH);   // turn the LED on (HIGH is the voltage level)
 delay(1000);                       // wait for a second
 if(!digitalRead(k1)) {goto lll;}   // ПРОВЕРИЛ НА замыкание на - и если замкнуто, то переход на 111
 digitalWrite(LED_BUILTIN, LOW);    // turn the LED off by making the voltage LOW
 delay(1000);                       // wait for a second
lll:{digitalWrite(LED_BUILTIN, HIGH);} //  включить светодиод
}

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015
void loop() {
  digitalWrite(LED_BUILTIN, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);                       // wait for a second
  digitalWrite(LED_BUILTIN, !digitalRead(k1));    // turn the LED off or on
  delay(1000);                       // wait for a second
}

 

yakomi
Offline
Зарегистрирован: 02.11.2020

andriano пишет:

  digitalWrite(LED_BUILTIN, !digitalRead(k1));    // turn the LED off or on

 

Блин - работает, но в голове не укладывается.. слишком просто и сложно одновременно.

Получается, что по этой строке светодиод принимает то состояние в котором вход к1 ?

пошел долго думать....

 

спасибо.

пс...

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

 

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

 

ппс...

дошло... если с воскл знаком - то св.диод принимает "активное" состояние по "активному состоянию - замкнут на минус вывод.

если разомкнут контакт, то сост неактивное, тухнет, но в цикле снова загорается.

 

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

восклицательным знаком реализуется логическая функция НЕ (инверсия сигнала), в формате логических уравнений она записывалась штрихом над переменной

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

yakomi пишет:

дошло... если с воскл знаком - то св.диод принимает "активное" состояние по "активному состоянию - замкнут на минус вывод.

Не нужно ничего сочинять. Нужно хоть немного почитать что-нибудь о языке, на котором Вы пытаетесь программировать. Или "чукча не читатель, чукча - писатель"?

SLKH
Offline
Зарегистрирован: 17.08.2015

ua6em пишет:

inspiritus пишет:

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

у ТС задача сделать на ардуино

я нарисовал дешифратор в #56. легко читаемый и конфигурируемый (что в массиве объявишь, то и сработает) и без хитровымудренных запутин со сложными условиями.

inspiritus
Offline
Зарегистрирован: 17.12.2012

Вы это с запутиными поосторожнее

yakomi
Offline
Зарегистрирован: 02.11.2020

inspiritus пишет:

Вы это с запутиными поосторожнее

ну, он же "за", а не против..

 

с фронта нет новостей - магазины были закрыты... 

занимался переводом "мерина" на "январь" ...     многие должны понять

-NMi-
Offline
Зарегистрирован: 20.08.2018

yakomi пишет:

занимался переводом "мерина" на "январь" ...     многие должны понять

Ну этт ты зря... про многих то.

Давай посмотрим, скока ответят на вапрос: а нахрена мерину январь?

nik182
Offline
Зарегистрирован: 04.05.2015

Особенно пятый январь с прошивкой под мерс

-NMi-
Offline
Зарегистрирован: 20.08.2018

Один есть.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

у меня Ногайский мерин, он без прошивок

-NMi-
Offline
Зарегистрирован: 20.08.2018

Зря.

yakomi
Offline
Зарегистрирован: 02.11.2020

Доброго времени суток.

Потихоньку делаю..

плата с релюшками работает.

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

будет ли это работать? необходимо после поступления на входы определенной комбинации сначала включить определенные выходы, потом через 0,5 сек другие...


// проверка P
if(!digitalRead(k1) && digitalRead(k2) && !digitalRead(k3) && !digitalRead(k4))
{digitalWrite(rA,HIGH);digitalWrite(rB,LOW);digitalWrite(rC,HIGH);digitalWrite(rD,LOW); delay(500); digitalWrite(rA,LOW);digitalWrite(rB,LOW);digitalWrite(rC,LOW);digitalWrite(rD,HIGH); }

 

Проверить сразу не могу - все оставил в гараже в машине, только завтра вечером смогу снова заняться

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

yakomi пишет:

...есть ньюансы с "мозгами" акпп...

будет ли это работать? необходимо после поступления на входы определенной комбинации сначала включить определенные выходы, потом через 0,5 сек другие...

Ардуино так работать заставить можно. А вот как на это отреагируют "мозги" АКПП - это вопрос для другого форума.

Цитата:

// проверка P
if(!digitalRead(k1) && digitalRead(k2) && !digitalRead(k3) && !digitalRead(k4))
{digitalWrite(rA,HIGH);digitalWrite(rB,LOW);digitalWrite(rC,HIGH);digitalWrite(rD,LOW); delay(500); digitalWrite(rA,LOW);digitalWrite(rB,LOW);digitalWrite(rC,LOW);digitalWrite(rD,HIGH); }

Ну, вообще-то подход к составлению кода идеологически неправилен:

1. Обычно проверять следует не текущее состояние кнопок/реле/и пр., а отслеживать их переход из одного состояния в другое. Т.е. под if() должен быть номер состояния, описывающий общее состояние органов управления, основанное на анализе переходов, а не текущее состояние самих органов управления.

2. Программа на время delay() полностью блокирует всю работу контроллера. Иногда это годится. Но, если Вам нужно, чтобы контроллера реагировал на изменение ситуации своевременно, то лучше переходить с идеологии "blink" на идеологию "blink without delay".

Цитата:

Проверить сразу не могу - все оставил в гараже в машине, только завтра вечером смогу снова заняться

Ну так проверите - напишете. Зачем писать до проверки?

Или Вы всерьез думаете, что кто-то вот прямо сейчас побежит в Ваш гараж это проверять?

yakomi
Offline
Зарегистрирован: 02.11.2020

если кратко: заработало в самом простом варианте.

большое спасибо, ua6em !

Есть проблемка, но не совсем пока разобрался. Иногда при быстром переключении рычага акпп мозги "падают" в аварию.  релюшки отрабатывают четко, "дребезга" осциллографом не наблюдаю.

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

в целом было интересно.

так и не смог запустить драйвера мега2560 под 7-64 виндовозину. Дрова ставятся некорректно (чип ch340g)

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

yakomi пишет:

Есть проблемка, но не совсем пока разобрался. Иногда при быстром переключении рычага акпп мозги "падают" в аварию.  релюшки отрабатывают четко, "дребезга" осциллографом не наблюдаю.

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

"Слишком быстро" - в каком смысле? Тот сигнал, что должен быть позже другого, на самом деле приходит раньше (т.е. нарушена последовательность сигналов), или сигналы приходят в нужном порядки но со слишком маленьким интервалом?

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

Первый вариант также маловеероятен - это как же надо напутать в прошивке, чтобы сигналы "перехлестнулись"!

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

yakomi
Offline
Зарегистрирован: 02.11.2020

andriano пишет:

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

Спасибо.

Подключу все 4 выхода с релюшек к осц-фу. Посмотрю, что там происходит.

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

В целом, все, что задумывалось - получилось.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

а выложи код, что заработал