Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как вызвать процедуры из другого модуля?
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Все остальные микроконтроллеры > PIC
Firebird
Добрый день!
Всех поздравляю с победой сборной России на чемпионате мира по хокею!!! 08.gif

У меня такая задача, есть файл main.asm, здесь вся логика программы, решил вывести процедуры инициализации в отдельный файл init.asm

main.asm
Main
call InitProc
.....
goto Main


init.asm
InitProc
.....
return

Однако компилятор выдает ошибки, как правильно организовать вызов процедур расположенных в другом модуле. Какие директивы нужно использовать???
Grigorij
Цитата(Firebird @ May 19 2008, 15:14) *
Добрый день!
Всех поздравляю с победой сборной России на чемпионате мира по хокею!!! 08.gif

У меня такая задача, есть файл main.asm, здесь вся логика программы, решил вывести процедуры инициализации в отдельный файл init.asm

main.asm
Main
call InitProc
.....
goto Main
init.asm
InitProc
.....
return

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

В MPLab я делал следующим образом:

файл main.asm
Код
....
#include "uart.inc"

....

;основная программа
MAIN:
    
     CALL   INIT_UART

....

     MAIN_CYCLE:    
     GOTO MAIN_CYCLE

END


файл uart.inc
Код
;настройка UART
INIT_UART

....

RETURN


В Вашем случае, создаем файл init.inc в него выносим подпрограммы инициализации. В файле main.asm добавляем #include "init.inc".
vanner
Когда же вы начнете читать манулы?

В модуле init.asm объяви процедуру как глобальную, т.е.
Код
GLOBAL InitProc

Можеш создать файл init.inc и приинклюдить его к main.asm или прямо в main.asm объявить эту процедуру как внешнюю.
Код
EXTERN InitProc
Firebird
Я сделал так:

Полный код
main.asm
Код
LIST P=18F458    ;директива для указания процессора
#include <P18F458.INC>;файл спецификации процессора
;******************************************************************************

;Биты конфигурации
CONFIG    OSC = LP    ;Выбор осциллятора
;******************************************************************************


;******************************************************************************

;Вектор сброса
ORG    0x0000

goto    start    ;переход к началу программы
;******************************************************************************

;Вектор прерывания высокого приоритета
;Этот код начнет выполнение при возникновении прерывания высокого приоритета,
;или любого прерывания, если приоритеты не используются

ORG    0x0008

bra    HighInt    ;переход к обработке прерывания высокого приоритета
;******************************************************************************

;Обработка прерывания высокого приоритета
HighInt:

;*** код обработки прерывания высокого приоритета размещается здесь ***
retfie    FAST

start
    call    StartInit
    goto    Main
;******************************************************************************

;Начало главной программы
Main:
    call    StartInit
    nop
    goto    Main

;    *** главный код размещается здесь ***

; Подключаемые модули
    #include <MyINI.ASM>
;******************************************************************************
    END


MyIni.asm

Код
StartInit
        clrf    RegA
        clrf    RegB
        movlw    0x01
        movwf    RegA
        movlw    0x05
        movwf    RegB
return


делал как написано в справке с помощью директив GLOBAL и EXTERN, но при компиляции выдается ошибка: "Directive only allowed when generating an object file", т.е. НЕ РАБОТАЕТ.
volodya
Цитата(Firebird @ May 20 2008, 13:26) *
Я сделал так:

Полный код
main.asm
Код
LIST P=18F458;директива для указания процессора
#include <P18F458.INC>;файл спецификации процессора
-------
;Вектор сброса
ORG    0x0000

goto    start;переход к началу программы
;******************************************************************************

;Вектор прерывания высокого приоритета
;Этот код начнет выполнение при возникновении прерывания высокого приоритета,
;или любого прерывания, если приоритеты не используются

ORG    0x0008

bra    HighInt;переход к обработке прерывания высокого приоритета
;******************************************************************************

;Обработка прерывания высокого приоритета
HighInt:

;*** код обработки прерывания высокого приоритета размещается здесь ***
retfie    FAST

start
    call    StartInit
    goto    Main
;******************************************************************************

;Начало главной программы
Main:
    call    StartInit
    nop
    goto    Main

;    *** главный код размещается здесь ***

; Подключаемые модули
    #include <MyINI.ASM>
;******************************************************************************
    END


MyIni.asm

Код
StartInit
        clrf    RegA
        clrf    RegB
        movlw    0x01
        movwf    RegA
        movlw    0x05
        movwf    RegB
return


делал как написано в справке с помощью директив GLOBAL и EXTERN, но при компиляции выдается ошибка: "Directive only allowed when generating an object file", т.е. НЕ РАБОТАЕТ.


ORG - директива для программ минующих стадию линковки (АСМ -> HEX)- весь текст в одном файле

при организации объектных модулей используется CODE - (эквивалент ORG адрес необязателен можно отдать на откуп линкеру) для программ и UDATA(UDATA_ACS etc.)

GLOBAL & EXTERN используется для передачи меток ОЗУ, ПЗУ между объектными модулями.
а ругается софтинка на ОРГ(если в проекте несколько ASM файлов)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.