"Вы читаете о роботах и программировании и думаете: «Было бы здорово сделать что-то подобное самому!» Теми, кем эта идея овладевает чуть больше просто мыслей смотрят кто и как делал своего робота. Читают статьи, смотрят видео. На картинках все понятно. В видеороликах тоже обычно показываются уже готовые продукты, а также сжато показываются технологии их изготовления. И вроде бы то же всё понятно: отпилил, прикрутил, припаял, соединил, запрограммировал вон на той программе вот этим кодом."

среда, 27 января 2021 г.

КРУЖОК ОТ 29.01.21

Программа, которая была представлена 25.01.21 естественно не заработала. Ниже представлен программный код этой программы.

void setup() {
  DDRB = 0xff;
  DDRD = 0xff;
}
int counter0 = 0;
int counter1 = 0;
int counter2 = 0;
int counter3 = 0;
int counter4 = 0;
int counter5 = 0;
int counter6 = 0;

void loop() {
  counter1++;
  if (counter1 == 100)
  {
    counter1 = 0;
    counter2++;
  }
  if (counter2 == 10)
  {
    counter2 = 0;
    counter3++;
  }
  if (counter3 == 6)
  {
    counter3 = 0;
    counter4++;
  }
  if (counter4 == 10)
  {
    counter4 = 0;
    counter5++;
  }
  if (counter5 == 6)
  {
    counter1 = 0;
    counter2 = 0;
    counter2 = 0;
    counter3 = 0;
    counter4 = 0;
  }
  switch(counter6){
    case 1:
    PORTD = 0b00001000;
    counter0 = counter2;
    case 2:
    PORTD = 0b00010000;
    counter0 = counter3;
    case 3:
    PORTD = 0b00010000;
    counter0 = counter4;
    case 4:
    PORTD = 0b00100000;
    counter0 = counter5;
    }
  switch(counter0){
    case 0:
    PORTD &=~( 1<<7);
    PORTB = 0b00001000;
    case 1:
    PORTD &=~( 1<<7);
    PORTB = 0b11011111;
    case 2:
    PORTD |= 1<<7;
    PORTB = 0b11001000;
    case 3:
    PORTD &=~( 1<<7);
    PORTB = 0b11001001;
    case 4:
    PORTD &=~( 1<<7);
    PORTB = 0b11010011;
    case 5:
    PORTD &=~( 1<<7);
    PORTB = 0b11100100;
    case 6:
    PORTD &=~( 1<<7);
    PORTB = 0b11100000;
    case 7:
    PORTD &=~( 1<<7);
    PORTB = 0b11001111;
    case 8:
    PORTD &=~( 1<<7);
    PORTB = 0b11000100;
    case 9:
    PORTD &=~( 1<<7);
    PORTB = 0b11000010;
    }
}

Проанализируем данную программу графически. Тоесть нарисуем схему алгоритма этой программы. Результат показан ниже.

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


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

 void setup()
{
  pinMode(1, INPUT);
}

void loop()
{
  digitalRead(1);
  delay(10); // Delay a little bit to improve simulation performance
}

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

void setup()
{
  DDRD = 0b11111101; //настройка пина 1 на вход и  пинов 0,2,3,4,5,6,7 на выход
}

void loop()
{
  // 38. Цикл Вопрос / кнопка нажата? == Да
if (PIND & (1 << PORTD1)) ...; //за условием помещается команда выполняемая при нажатии кнопки
}

Кстати отсутствие комментариев в тексте программы - дурной тон в программировании

Итак задача на этом уроке следующая - Поправить текст программы ипроверить ее рабоспособность. Далее усложнить предложенную схему кнопкой управления и откорректировать программу.