Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.06.2012, 16:38   #1
Vova777
Уважаемый
Форумчанин
 
Аватар для Vova777
 
Регистрация: 04.07.2010
Сообщений: 318
Восклицание Ошибка в цикле.

В цикле подпрограммы Loop, программа зацикливается, почему? Она должна выполнить его необходимое число раз и выйти из него, но она зациклена в нем.
Код:
; ******************************
; Автор: ххх                   *
; Дата: 11.06.2012             *
; Версия: 0.1                  *
; Имя файла: Indicator         *
; Для AVR: ATmega8L-8PU        *
; Тактовая частота: 4 МГц      *
; ******************************
; Выполняемые функции: Управление семисегментным ЖК-индикатором, функция подавления дребезга контактов
; ==============================
.device ATmega8
.nolist
.include "C:\Program Files\Atmel\AVR Studio 5.0\avrassembler\include\m8def.inc"
.list
; ==============================
; Блок объявлений
.def temp    = r16
.def counter = r17
.def delay1  = r16         ; так надо
.def delay2  = r18
.def delay3  = r19
; ==============================
; Начало программы
rjmp Init
; ==============================
; Подпрограммы
Debounce:                 ; инициализируем регистры счетчика числом 0x13880 (для четности добавляем 0: 0х013880)
ldi delay1, 0x80          ;
ldi delay2, 0x38          ;
ldi delay3, 0x01          ;

Loop:                     ; формируем задержку
subi delay1, 1            ;
subi delay2, 0            ;
subi delay3, 0            ;
brcc Loop                 ;
ret
; ==============================
Init:
; Тело программы
; ==========
; Подблок инициализации стека
ldi temp, low(ramend)     ;
out spl, temp             ;
ldi temp, high(ramend)    ;
out sph, temp             ;
; ==========

ser temp                  ;
out DDRD, temp            ; выходы
ldi temp, 0b11111110      ;
out DDRB, temp            ; PB0 - вход, остальные не используются

ldi r20, 0b01111110       ; код для цифры "0"
out PortD, temp           ; показать цифру "0"
ldi temp, 0b00000001      ;
out PortB, temp           ; PB0 - подтяжка, остальные не используются

ldi r21, 0b00110000       ; коды цифр индикатора
ldi r22, 0b01101101       ;
ldi r23, 0b01111001       ;
ldi r24, 0b00110011       ;
ldi r25, 0b01011011       ;
ldi r26, 0b01011111       ;
ldi r27, 0b01110000       ;
ldi r28, 0b01111111       ;
ldi r29, 0b01111011       ;
clr counter               ;
; ==============================
Start:
sbic PinB, 0              ;
rjmp Start                ; если нет
inc counter               ;

cpi counter, 10           ;
brne PC + 2               ; если нет
clr counter               ;

ldi ZL, 20                ;
add ZL, counter           ;
ld temp, Z                ;
out PortD, temp           ;
rcall Debounce            ; задержка

ReleaseWait:
sbis PinB, 0              ;
rjmp ReleaseWait          ; если да
rcall Debounce            ; задержка
rjmp Start                ;
; ==============================
даешь высокое напряжение

Последний раз редактировалось Vova777; 11.06.2012 в 16:45.
Vova777 вне форума Ответить с цитированием
Старый 12.06.2012, 17:12   #2
Fatal Error
Пользователь
 
Аватар для Fatal Error
 
Регистрация: 20.05.2012
Сообщений: 58
По умолчанию

архитектуру в студию, или объясни как тут циклы работают
Fatal Error вне форума Ответить с цитированием
Старый 12.06.2012, 17:17   #3
Vova777
Уважаемый
Форумчанин
 
Аватар для Vova777
 
Регистрация: 04.07.2010
Сообщений: 318
Восклицание

Цитата:
Сообщение от Fatal Error Посмотреть сообщение
архитектуру в студию, или объясни как тут циклы работают
1)Архитектуру микроконтроллера Вам в студию выдать?
2)Циклы здесь работают также, как и везде, где они применяются.
Код:
Loop:                     ; формируем задержку
subi delay1, 1            ;
SBCI delay2, 0            ; исправил здесь
SBCI delay3, 0            ; исправил здесь
brcc Loop                 ;
ret
Все, спасибо, я уже сам понял где ошибка.
даешь высокое напряжение
Vova777 вне форума Ответить с цитированием
Старый 12.06.2012, 17:20   #4
Fatal Error
Пользователь
 
Аватар для Fatal Error
 
Регистрация: 20.05.2012
Сообщений: 58
По умолчанию

объяснил млин, я так и не понял как циклы организуются
Fatal Error вне форума Ответить с цитированием
Старый 12.06.2012, 17:36   #5
Vova777
Уважаемый
Форумчанин
 
Аватар для Vova777
 
Регистрация: 04.07.2010
Сообщений: 318
Восклицание

Цитата:
Сообщение от Fatal Error Посмотреть сообщение
объяснил млин, я так и не понял как циклы организуются
В моей программе задержка на 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 секунда.
даешь высокое напряжение
Vova777 вне форума Ответить с цитированием
Старый 12.06.2012, 17:46   #6
Fatal Error
Пользователь
 
Аватар для Fatal Error
 
Регистрация: 20.05.2012
Сообщений: 58
По умолчанию

нефиговые вы кулибины
Fatal Error вне форума Ответить с цитированием
Старый 12.06.2012, 17:47   #7
Fatal Error
Пользователь
 
Аватар для Fatal Error
 
Регистрация: 20.05.2012
Сообщений: 58
По умолчанию

а на досе тока обработчик прерываний ставь и делай задержку скока надо)))
Fatal Error вне форума Ответить с цитированием
Старый 12.06.2012, 18:14   #8
Vova777
Уважаемый
Форумчанин
 
Аватар для Vova777
 
Регистрация: 04.07.2010
Сообщений: 318
По умолчанию

Цитата:
Сообщение от Fatal Error Посмотреть сообщение
а на досе тока обработчик прерываний ставь и делай задержку скока надо)))
можно еще через регистр таймера, но таймером делать задержки расточительно, его можно для других целей применять.
даешь высокое напряжение
Vova777 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка в цикле 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