![]() |
![]() |
|||||||||||||||
Бегущий огонек v1.0
Автор: Ну вот, что-то уже сделали. По крайней мере, наша железка перестала быть ничего не делающей. Теперь на ней светятся некоторые светодиодики… Сейчас мы немного отвлечемся от светодиодиков и поговорим о такой страшной вещи как ветвящийся алгоритм.
Алгоритм - это некоторая последовательность команд. Это вы, надеюсь знаете.
1.Прийти домой Нелинейный (ветвящийся) алгоритм, выглядит так:
1.Прийти домой Ветвящийся алгоритм отличается от линейного тем, что в зависимости от каких-то воздействий, он может выполняться либо так, либо сяк, либо эдак, либо хрен знает как… Линейный алгоритм от начала до конца выполняется в одной и той же последовательности.
Ветвящимся алгоритм делают именно команды выбора: В ассемблере тоже есть такие команды. Сегодня мы рассмотрим некоторые из них.
brne (Branch if Not Equal) - переход к метке, если результат предыдущего действия - не ноль
Кстати! Я ж еще не рассказал про метки! В Асме метка ставится так:
... То есть, при переходе на метку Label, программа начнет выполняться с команды "ldi Temp1,14". Кстати, перейти на метку можно не только по условию, но и за "просто так". Такой переход называется безусловным:
rjmp - безусловный переход к метке Ну и для полной красоты, вот еще несколько условных переходов:
breq - (Branch if Equal)переход, если результат предыдущего действие - ноль Все, теперь можно писать ветвящийся алгоритм. Но до того, вот вам еще две команды:
inc - (Increment) увеличение значения РОН на 1 (инкремент) Ну а теперь, скажите мне, как работает вот такая программа:
ldi Temp,0 Сначала мы инициализировали Temp числом 0. Далее из Temp вычитается 1. Его значение становится -1 (иначе говоря, 255). Далее мы проверяем, не получился ли у нас ноль. Поскольку число 255 не равно нулю, нас снова перекидывают на операцию декремента. Значение Temp уменьшается еще на 1. Теперь оно - 254. Но это тоже - явно не ноль, и нас снова кидают в начало… И так до тех пор, пока в один прекрасный момент в ответе не получится 0. Как только сие свершилось, нас "отпускают" из цикла дальше… То что мы только что рассмотрели, называется циклом задержки. Почему? Да потому что, этот кусок программы по сути - ничего толкового не делает, но жрет процессорные такты, а стало быть - время. Однако, нам этот цикл задержки очень пригодится. Он будет определять скорость "бега" огоньков. Кстати, можно делать несколько вложенных циклов задержки:
ldi Temp1,0
Итак, у нас уже есть все необходимые знания, чтобы написать программу для бегущего огонька.
.cseg Программа написана только для 4-х светодиодов. Я думаю, что дописать код для остальных светодиодов не составит большого труда. Ну, как всегда: компилируем, шьем, наблюдаем… Я думаю, что без лишних комментариев понятно, что программа получилась громоздкая. В следующий раз, мы поговорим о том, как ее оптимизировать. <<--Вспомним пройденное----Поехали дальше-->>
|
|
|||||||||||||||
![]() |
![]() |


![]() |
![]() |
|||
|
||||
![]() |
![]() |