В HTML      В PDF
микроэлектроника, микросхема, транзистор, диод, микроконтроллер, память, msp430, Atmel, Maxim, LCD, hd44780, t6963, sed1335, avr, mega128
Предприятия Компоненты Документация Применения Статьи Новости

 
Пересюхтюмя


13-я Международная выставка электронных компонентов и комплектующих для электронной промышленности





Выставка Передовые Технологии Автоматизации





Главная страница > Обзоры по типам > Микроконтроллеры > MAXQ
Пересюхтюмя


13-я Международная выставка электронных компонентов и комплектующих для электронной промышленности





Выставка Передовые Технологии Автоматизации


Организации работы циклов

Организация цикличности программы может быть осуществлено при помощи команд условного перехода. Однако есть встроенные функциональные возможности в виде команды 'DJNZ LC[n], src', позволяющей сформировать более компактную процедуру цикла при помощи кольцевого счетчика. Для хранения содержимого этого кольцевого регистра используются 16- разрядные регистры LC[0] и LC[1]. Команда 'DJNZ LC[n], src' автоматически уменьшает содержимое регистра цикла и при достижении нулевого значения этого регистра переходит по адресу, указанному в регистре источнике.

Чтобы инициализировать цикл, установите в регистре LC[n] необходимое значение.

Необходимое значение должно содержаться в операнде src команды 'DJNZ LC[n], src'. Когда в команду 'DJNZ LC[n]', как это обычно бывает, будет передано относительное значение, ассемблер автоматически вычисляет смещение относительного значения и вставляет это непосредственное значение в объектный код.

    move     LC[1], #10h       ; 16 циклов
    LoopTop:                   ; относительный адрес для djnz LC[n],src 
    call     LoopSub
    djnz     LC[1], LoopTop    ; декремент LC[1] и переход если не нулевое значение

Если адрес цикла находится вне диапазона перехода, то для задания старшего байта адреса используется префиксный регистр смещения PFX [0].

    move     LC[1], #10h      ; 16 циклов
    LoopTop:                  ; не относительный адрес для djnz LC[n],src
    call     LoopSub
    ...
    djnz     LC[1], LoopTop   ; декремент LC[1] и переход если не нулевое значение
                              ; транслируется в команды: move PFX[0], #high(LoopTop)
                              ; djnz LC[1], #low(LoopTop)

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

    move    LC[0], #LoopTop    ; использование LC[0] в качестве регистра хранения адреса
                               ; транслируется в команды: move PFX[0], #high(LoopTop)
                               ; move LC[0], #low(LoopTop)
    move    LC[1], #10h        ; 16 циклов
    ...
    LoopTop:                   ; не относительный адрес для djnz LC[n],src
    call    LoopSub
    ...
    djnz    LC[1], LC[0]       ; декремент LC[1] и переход если не нулевое значение

В режиме предварительной загрузки адреса загрузка должна быть осуществлена до начала цикла:

    move    LC[1], #10h     ; запись в счетчик цикла значения, равного 16
    move    LC[0], IP       ; установка адреса цикла на следующий адрес
    LoopTop:                ; не относительный адрес для djnz LC[n],src
    ...


<-- Предыдущая страница Оглавление Следующая страница -->