![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Уважаемый
Форумчанин
Регистрация: 04.07.2010
Сообщений: 318
|
![]()
В цикле подпрограммы Loop, программа зацикливается, почему? Она должна выполнить его необходимое число раз и выйти из него, но она зациклена в нем.
Код:
даешь высокое напряжение
Последний раз редактировалось Vova777; 11.06.2012 в 16:45. |
![]() |
![]() |
![]() |
#2 |
Пользователь
Регистрация: 20.05.2012
Сообщений: 58
|
![]()
архитектуру в студию, или объясни как тут циклы работают
|
![]() |
![]() |
![]() |
#3 |
Уважаемый
Форумчанин
Регистрация: 04.07.2010
Сообщений: 318
|
![]()
1)Архитектуру микроконтроллера Вам в студию выдать?
2)Циклы здесь работают также, как и везде, где они применяются. Код:
даешь высокое напряжение
|
![]() |
![]() |
![]() |
#4 |
Пользователь
Регистрация: 20.05.2012
Сообщений: 58
|
![]()
объяснил млин, я так и не понял как циклы организуются
|
![]() |
![]() |
![]() |
#5 |
Уважаемый
Форумчанин
Регистрация: 04.07.2010
Сообщений: 318
|
![]()
В моей программе задержка на 0.5 сек. Я приведу пример для задержки на 1 секунду, чтобы было понятнее.
Микроконтроллер использует внешний кварцевый резонатор с частотой 4 МГц, т.е. 4 000 000 Гц. Значит, для задержки выполнения программы ровно на 1 секунду, нужно пропустить ("убить") в цикле 4 000 000 тактов. Причем сам цикл должен выполняться за 5 тактов. Значит 4 000 000/5 = 800 000. Переводим в hex = 0хС3500. Т.к. AVR микроконтроллеры 8-битные, для записи этого числа, его нужно разбить по 3 регистрам. Для четности добавляем "0" перед старшим разрядом, получилось 0х0С3500. Разбиваем его: 0х00, 0х35, 0х0С. Пишем его в регистры delay1, delay2, delay3. Команда subi вычитает константу из регистра, а команда sbci также вычитает константу, но через флаг переноса "С". Т.е. если флаг "С = 1", тогда вычитается не "0", а "1". Команда brcc возвращается к метке, если флаг "С" сброшен, причем она выполняется за 2 такта. Вот вам 5 тактов. К моменту выхода из цикла, пройдет ровно 1 секунда.
даешь высокое напряжение
|
![]() |
![]() |
![]() |
#6 |
Пользователь
Регистрация: 20.05.2012
Сообщений: 58
|
![]() ![]() |
![]() |
![]() |
![]() |
#7 |
Пользователь
Регистрация: 20.05.2012
Сообщений: 58
|
![]()
а на досе тока обработчик прерываний ставь и делай задержку скока надо)))
|
![]() |
![]() |
![]() |
#8 |
Уважаемый
Форумчанин
Регистрация: 04.07.2010
Сообщений: 318
|
![]()
можно еще через регистр таймера, но таймером делать задержки расточительно, его можно для других целей применять.
даешь высокое напряжение
|
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Ошибка в цикле | Oleg Romanchuk | Помощь студентам | 10 | 17.11.2009 06:34 |
Ошибка в цикле | Belokuraya | Microsoft Office Excel | 11 | 18.08.2009 15:52 |
Ошибка в цикле | Alamez | Общие вопросы Delphi | 2 | 05.04.2009 15:12 |