Может ли micro:bit читать, пока в другое время?

Так что у меня проблема с программированием микро: бит. Я кодирую его на интернет-странице, затем скачиваю шестнадцатеричный файл и переношу его в микро: бит. В симуляторе интернета все работает. Очевидно, когда я передаю его в микро: битовый код не работает. Код действительно прост, выглядит примерно так.

  • анимация повторяется, а переменная равна 0 (эта часть работает отлично)

  • Кнопка делает переменную 1, B делает ее 2 (эта часть работает)

  • когда переменная не равна 0, она прерывает первый цикл анимации. (эта часть также работает)

  • затем переходит ко второму циклу, который повторяется, в то время как переменная НЕ равна 0 (она никогда не будет 0, потому что нет кнопки, которая делает переменную 0), поэтому она повторяется навсегда (это работает)

  • во втором цикле есть еще 2 цикла. Первый повторяется, когда переменная равна 1, второй - когда переменная равна 2. Это позволяет мне переключаться между этими 2 циклами в любое время, когда я захочу. (Проблема появляется здесь: я нахожусь в цикле 2, например, я не могу переключиться на первый цикл и иначе.)

Все эти ошибки возникают в микро: бит робот, когда код передается. В симуляторе интернета код работает отлично. Можно ли сделать этот код в микро: бит, я достиг предела? Или робот неисправен? Спасибо за ответы и сообщите мне, если что-то не понятно.

2 ответа

Решение

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

Однако это может быть проблемой планирования из-за того, как вы меняете переменную при нажатии кнопки. Возможно, стоит подумать о реструктуризации ваших блоков таким образом, чтобы они были более управляемыми событиями, используя блоки, такие как кнопка A. Нажатие немного лучше, бесконечное время, в то время как циклы всегда лучше избегать. Также, возможно, стоит добавить паузу (100) в циклы while.

Надеюсь это поможет;)

Редактировать:

ОП подтвердил, что пауза (100) сработала (см. Комментарии к этому ответу), демонстрируя, что это была проблема планирования!

Для тех, кому это интересно;)... это потому, что процессор занят выполнением цикла while и не имеет времени думать о нажатых кнопках. Пауза (100) позволяет процессору немного отдохнуть и не думать о цикле while, давая ему время, необходимое для нажатия кнопки. Это известно как совместное планирование!

Вы можете узнать больше о совместном планировании на:

https://www.microbit.co.uk/device/reactive

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

while (unset):
  Animate
  Check for button
While (set): // Intend to be stuck in this loop forever
  While (one):
    Do first
  While (two):
    Do Second

Что вам нужно, чтобы иметь возможность обновить свое состояние:

...
  While (one):
    Do First
    if (button_b.was_pressed()):
      state = two
...

Это все еще не идеально, вы можете подумать о том, что произойдет, если кнопки нажимаются в "необычной" последовательности. Симулятор должен быть идентичным, но может быть что-то необычное в том, как обрабатываются нажатия кнопок и ваш код, который сломал симулятор. Если симулятор действительно не работает, вам нужно поделиться тестовым примером с командой micro: bit.

Другие вопросы по тегам