несколько герконов

Bodkuss
Offline
Зарегистрирован: 24.12.2017

есть 6 герконов, подключено к А0-А5
и 6 светодиодов - D8-D13.

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

код прошивки ниже

void setup() {
  // put your setup code here, to run once:
DDRC = B00000000;
DDRB = B11111111;
PORTB = B00000000;
}

void loop() {
  // put your main code here, to run repeatedly:
  switch(PORTC){
  case B00111110:
  PORTB == B00000100;
  delay(500);
  PORTB == B00000000;
  delay(500);
  PORTB == B00000100;
  delay(500);
  PORTB == B00000000;
  delay(500);
  PORTB == B00000100;
  delay(500);
  PORTB == B00000000;
  delay(500);
  PORTB == B00000100;
  break;
  
  case B00111101:
  PORTB == B00001000;
  delay(500);
  PORTB == B00000000;
  delay(500);
  PORTB == B00001000;
  delay(500);
  PORTB == B00000000;
  delay(500);
  PORTB == B00001000;
  delay(500);
  PORTB == B00000000;
  delay(500);
  PORTB == B00001000;
  break;

  case B00111011:
  PORTB == B00010000;
  delay(500);
  PORTB == B00000000;
  delay(500);
  PORTB == B00010000;
  delay(500);
  PORTB == B00000000;
  delay(500);
  PORTB == B00010000;
  delay(500);
  PORTB == B00000000;
  delay(500);
  PORTB == B00010000;
  break;

   case B00110111:
  PORTB == B00100000;
  delay(500);
  PORTB == B00000000;
  delay(500);
  PORTB == B00100000;
  delay(500);
  PORTB == B00000000;
  delay(500);
  PORTB == B00100000;
  delay(500);
  PORTB == B00000000;
  delay(500);
  PORTB == B00100000;
  break;

   case B00101111:
  PORTB == B00000010;
  delay(500);
  PORTB == B00000000;
  delay(500);
  PORTB == B00000010;
  delay(500);
  PORTB == B00000000;
  delay(500);
  PORTB == B00000010;
  delay(500);
  PORTB == B00000000;
  delay(500);
  PORTB == B00000010;
  break;

   case B00011111:
  PORTB == B00000001;
  delay(500);
  PORTB == B00000000;
  delay(500);
  PORTB == B00000001;
  delay(500);
  PORTB == B00000000;
  delay(500);
  PORTB == B00000001;
  delay(500);
  PORTB == B00000000;
  delay(500);
  PORTB == B00000001;
  break;
  }
}

 почему то оно не работает, я что то упустил

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

 PORTB == B00000100

Перепутан оператор присваивания с оператором сравнения.

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

Выпендриваться надо меньше. С портами он работает напрямую - нармальный пацан, не лох какой!

Green
Offline
Зарегистрирован: 01.10.2015

И как стройненько всё. Рядами и колоннами!

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

Ворота пишет:

Выпендриваться надо меньше. С портами он работает напрямую - нармальный пацан, не лох какой!

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

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

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

и что из того, что делеев куча, стиль то ардуиновский...

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

ua6em пишет:

и что из того, что делеев куча, стиль то ардуиновский...

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

противоречие, однако...

Green
Offline
Зарегистрирован: 01.10.2015

Зато какой стиль, какие манеры!

Bodkuss
Offline
Зарегистрирован: 24.12.2017

ну я не нашел иного способа считать одновременно все 6 входов

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

Bodkuss пишет:

ну я не нашел иного способа считать одновременно все 6 входов

как раз считывание входов у вас написано хорошо. А вот все остальное....

Green
Offline
Зарегистрирован: 01.10.2015

Жаль что я не вижу самого "считывания входов"...

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

Green пишет:

Жаль что я не вижу самого "считывания входов"...

ну перепутал чутка :)

Bodkuss
Offline
Зарегистрирован: 24.12.2017

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

int i;
void setup() {
DDRC = B00000000;
DDRB = B11111111;
PORTB = B00000000;
PORTC = B00000000;
}

void loop() {
  while(i=0)
{
i = PINC;
}
  switch(i){
  case B00000001:
  PORTB = B00000100;
  delay(500);
  PORTB = B00000000;
  delay(500);
  PORTB = B00000100;
  delay(500);
  PORTB = B00000000;
  delay(500);
  PORTB = B00000100;
  delay(500);
  PORTB = B00000000;
  delay(500);
  PORTB = B00000100;
  break;
  
  case B0000010:
  PORTB = B00001000;
  delay(500);
  PORTB = B00000000;
  delay(500);
  PORTB = B00001000;
  delay(500);
  PORTB = B00000000;
  delay(500);
  PORTB = B00001000;
  delay(500);
  PORTB = B00000000;
  delay(500);
  PORTB = B00001000;
  break;

  case B00000100:
  PORTB = B00010000;
  delay(500);
  PORTB = B00000000;
  delay(500);
  PORTB = B00010000;
  delay(500);
  PORTB = B00000000;
  delay(500);
  PORTB = B00010000;
  delay(500);
  PORTB = B00000000;
  delay(500);
  PORTB = B00010000;
  break;

   case B00001000:
  PORTB = B00100000;
  delay(500);
  PORTB = B00000000;
  delay(500);
  PORTB = B00100000;
  delay(500);
  PORTB = B00000000;
  delay(500);
  PORTB = B00100000;
  delay(500);
  PORTB = B00000000;
  delay(500);
  PORTB = B00100000;
  break;

   case B00010000:
  PORTB = B00000010;
  delay(500);
  PORTB = B00000000;
  delay(500);
  PORTB = B00000010;
  delay(500);
  PORTB = B00000000;
  delay(500);
  PORTB = B00000010;
  delay(500);
  PORTB = B00000000;
  delay(500);
  PORTB = B00000010;
  break;

   case B00100000:
  PORTB = B00000001;
  delay(500);
  PORTB = B00000000;
  delay(500);
  PORTB = B00000001;
  delay(500);
  PORTB = B00000000;
  delay(500);
  PORTB = B00000001;
  delay(500);
  PORTB = B00000000;
  delay(500);
  PORTB = B00000001;
  break;
  }
}

 

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Bodkuss пишет:

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

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

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

Слабо в 13 строке вывести значение i в консоль? Многое прояснится.

sadman41
Offline
Зарегистрирован: 19.10.2016

А вот это вообще зачем?

  while(i = 0) { i = PINC; }
 
Bodkuss
Offline
Зарегистрирован: 24.12.2017

 

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

Ну вот. Точно в воздухе. К процессору нужно точку соединения геркона и резистора подключать. В последней программе резистор должен быть подключён к земле, а геркон к +5V.

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

При таком подключении нужно еще добавить по резистору 5-10К между каждым пином А0-А5 и землей.

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

asam пишет:

При таком подключении нужно еще добавить по резистору 5-10К между каждым пином А0-А5 и землей.

А сколько вольт единица? Если 5к поставить то будет 1.5 вольта при замыкании геркона. Почувствует процессор единицу? Если добавлять от ноги процессора на массу то килоом 50 - 100.

Bodkuss
Offline
Зарегистрирован: 24.12.2017

Как то так, я правильно понял?

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

Да, так. Если геркон замыкается. Если размыкается, то gnd и 5В  надо поменять местами.

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Да, невнимательно на схему глянул, показалось что там 1К к +5В стоит. 

В случае 10К резисторов к 5В нужно будет 20-50К к земле. !00К, пожалуй, многовато, возрастает риск ложных срабатываний. А единица будет надежно детектироваться в случае 0.7 VCC. 

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

asam пишет:

Да, невнимательно на схему глянул, показалось что там 1К к +5В стоит. 

В случае 10К резисторов к 5В нужно будет 20-50К к земле. !00К, пожалуй, многовато, возрастает риск ложных срабатываний. А единица будет надежно детектироваться в случае 0.7 VCC. 

А мне казалось что на входе есть гитерезис и переключение вверх идёт при напряжении больше 1.8 вольта , а вниз при 1.4 вольта. Все цифры для питания 5 вольт. 0.7 Vcc в этот предел входит.

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Минимум 0.7Vcc  для логической единицы и максимум 0.3Vcc для логического 0 это из даташита, для 100% гарантированной работы.

Если посмотреть там же графики I/O Pin Input Threshold Voltage то получается, что при 5В питании единица считываетя если напряжение на пине больше 2.6В а ноль если меньше 2.2В

 

 

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

Ок. Спасибо.