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

воскресенье, 20 декабря 2020 г.

КРУЖОК ОТ 21.12.20

На прошлом занятии мы с Вами успешно поработали с цифровой панелью из восьми светодиодов, смогли написать скетч управления, для последовательной индикации цифр. Освоили операторsы digitalWriter() и pinMode(),  а так же узнали про их эффективную замену при работе напрямую с портами микропроцессора. В нашем слчае это порты B, C, D. Тогда установка наппрвления пинов порта DDRB = 0xff, DDRC = 0xff, DDRD = 0xff, (все пины работают на выход) может производиться простым числом. Для подачи уровня сигнала (высокий/низкий) можно использовать обращения к регистрам портов PORTB, PORTC, PORTD. 

PORTD = 0b11111111 (PORTB = 0xff);// на всех пинах высокий сигнал

DDRD = 0x11110000 (DDRD = 0xf0);//пины 0,1,2,3 на вход  4,5,6,7 выход

обращение к единичному пину - назначение выборочно уровня сигнала

PORTD |= 1 << (номер бита) установка 1 - высокий уровень

PORTD &= ~(1 << (номер бита)) установка 0 - высокий уровень

PORTD |= (1 << (номер бита))|(1 << (номер бита)) одновременная установка "1" в несколько разрядов регистра порта

PORTD &= ~((1 << (номер бита))|(1 << (номер бита))) одновременная установка "0" в несколько разрядов регистра порта

Пользуясь полученными знаниями и навыками прошлого занятия мы должны создать схему управления двумя цифровыми табло на светодиодах, макет будет представлен ниже.  Правая часть табло цифры по порядку от 0 до 9. Левая часть от 0 до 5. Левая часть изменяется на еденицу по возрастанию после показа всех цифр правого табло.

макет для эксперемента
 

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

Теперь ваши алгоритмы начнем превращать в программу управления. Для начала необходимо нарисовать схему Вашего алгоритма. Думаю у Вас она получиться примерно такая


 

примерная схема алгоритма


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

Прикрепим каждому объекту команду на языке программирования и собирем нашу прогамму. ну приерно так:

int schetchik1, schetchik2;
void setup()
{
  DDRB = 0XFF;
  DDRD = 0XFF;
}
void loop()
{

    // ==================== Шампур

    // 3. Заголовок / начало

    // 4. Действие / обнуляем счетчик
schetchik1 = 0;

    // 5. Действие / левый 0
PORTD &= ~(1<< 7); 
PORTB = 0b11000100;


    // 6. Цикл Вставка / правый 0 - 9
goto L1_22;

L7: ;
    // 7. Действие / счетчик ++
schetchik1 ++;

    // 8. Выбор / выбор левой цифры
if (schetchik1 == 1) goto L12; // 11. счетчик = 1
if (schetchik1 == 2) goto L14; // 13. счетчик = 2
if (schetchik1 == 3) goto L16; // 15. счетчик = 3
if (schetchik1 == 4) goto L18; // 17. счетчик = 4
if (schetchik1 == 5) goto L20; // 19. счетчик = 5

    // 9. Вариант / счетчик > 5

    // 10. Конец / Конец
goto L_end1;

    // ==================== Шампур

    // 11. Вариант / счетчик = 1

L12: ;
    // 12. Действие / левый 1
PORTD &= ~(1 << 7);
PORTB = 0B11011111;
goto L1_22;

    // ==================== Шампур

    // 13. Вариант / счетчик = 2

L14: ;
    // 14. Действие / левый 2
PORTD |=(1 << 7);
PORTB = 0B11001000;
      //delay(10000);
goto L1_22;

    // ==================== Шампур

    // 15. Вариант / счетчик = 3

L16: ;
    // 16. Действие / левый 3
PORTD &= ~(1 << 7);
PORTB = 0B11001010;
goto L1_22;

    // ==================== Шампур

    // 17. Вариант / счетчик = 4

L18: ;
    // 18. Действие / левый 4
PORTD &= ~(1 << 7);
PORTB = 0B11010011;
goto L1_22;

    // ==================== Шампур

    // 19. Вариант / счетчик = 5

L20: ;
    // 20. Действие / левый 5
PORTD &= ~(1 << 7);
PORTB = 0B11100010;

    // Z:\home\kovi\DRACON\др длкр-20201219T045303Z-001\др длкр\tablo_to.drt
    // 2. Схема - вставка, Изменение 20.12.2020 11:49:32, Начало

    // ==================== Шампур

    // 21. Заголовок / правый 0 - 9

L1_22: ;
    // 22. Действие / обнуляем счетчик2
schetchik2 = 0;

L1_23: ;
 

    // 24. Выбор / выбор цифры
if (schetchik2 == 0) goto L1_26; // 66. ?Вариант
if (schetchik2 == 1) goto L1_31; // 30. 1
if (schetchik2 == 2) goto L1_33; // 32. 2
if (schetchik2 == 3) goto L1_35; // 34. 3
if (schetchik2 == 4) goto L1_37; // 36. 4
if (schetchik2 == 5) goto L1_39; // 38. 5
if (schetchik2 == 6) goto L1_41; // 40. 6
if (schetchik2 == 7) goto L1_43; // 42. 7
if (schetchik2 == 8) goto L1_45; // 44. 8
if (schetchik2 == 9) goto L1_47; // 46. 9

    // 25. Вариант / 10

L1_27: ;
    // 23. Цикл Пауза / 1 с
delay(1000);
    // 27. Действие / счетчик2 ++
schetchik2 ++;

    // 28. Вопрос / счетчик2 == 10 == Нет
if (!(schetchik2 == 10)) goto L1_23;

    // 29. Конец / Конец
goto L7;

    // ==================== Шампур

    // 66. Вариант / ?Вариант

L1_26: ;
    // 26. Действие / правый 0
  //PORTD = PORTD + 10000000;
PORTD &= ~((1 << 0)|(1 << 1)|(1 << 2)|(1 << 4)|(1 << 5)|(1 << 6)); //ВКЛЮЧЕНИЕ СВЕТОДИОДА ПО ПИНУ
PORTD |= 1 << 3; //ВКЛЮЧЕНИЕ СВЕТОДИОДА ПО ПИНУ
goto L1_27;

    // ==================== Шампур

    // 30. Вариант / 1

L1_31: ;
    // 31. Действие / правый 1
  PORTD &= ~((1 << 0)|(1 << 6));
PORTD |= (1 << 1)|(1 << 2)|(1 << 3)|(1 << 4)|(1 << 5);
goto L1_27;

    // ==================== Шампур

    // 32. Вариант / 2

L1_33: ;
    // 33. Действие / правый 2
PORTD &= ~((1 << 1)|(1 << 2)|(1 << 3)|(1 << 5)|(1 << 6 ));
PORTD |= (1 << 0)|(1 << 4);
goto L1_27;

    // ==================== Шампур

    // 34. Вариант / 3

L1_35: ;
    // 35. Действие / правый 3
PORTD &= ~((1 << 0)|(1 << 1)|(1 << 3)|(1 << 5)|(1 << 6 ));
PORTD |= (1 << 2)|(1 << 4);
goto L1_27;

    // ==================== Шампур

    // 36. Вариант / 4

L1_37: ;
    // 37. Действие / правый 4
PORTD &= ~((1 << 0)|(1 << 3)|(1 << 4)|(1 << 6 ));
PORTD |= (1 << 1)|(1 << 2)|(1 << 5);
goto L1_27;

    // ==================== Шампур

    // 38. Вариант / 5

L1_39: ;
    // 39. Действие / правый 5
PORTD &= ~((1 << 0)|(1 << 1)|(1 << 3)|(1 << 4)|(1 << 5));
PORTD |= (1 << 2)|(1 << 6);
goto L1_27;

    // ==================== Шампур

    // 40. Вариант / 6

L1_41: ;
    // 41. Действие / правый 6
PORTD &= ~((1 << 1)|(1 << 2)|(1 << 3)|(1 << 5)|(1 << 0)|(1 << 4));
PORTD |= 1 << 6;
goto L1_27;

    // ==================== Шампур

    // 42. Вариант / 7

L1_43: ;
    // 43. Действие / правый 7
PORTD &= ~((1 << 0)|(1 << 5)|(1 << 6));
PORTD |= (1 << 1)|(1 << 2)|(1 << 3)|(1 << 4);
goto L1_27;

    // ==================== Шампур

    // 44. Вариант / 8

L1_45: ;
    // 45. Действие / правый 8
PORTD &= ~((1 << 0)|(1 << 1)|(1 << 2)|(1 << 3)|(1 << 4)|(1 << 5)|(1 << 6));
goto L1_27;

    // ==================== Шампур

    // 46. Вариант / 9

L1_47: ;
    // 47. Действие / правый 9
PORTD &= ~((1 << 0)|(1 << 1)|(1 << 3)|(1 << 4)|(1 << 5)|(1 << 6));
PORTD |= 1 << 2;
goto L1_27;

    // 1. Схема, Конец
L_end1: ;
//
}