Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Warning[18]:
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > MSP430
Fynjy86
Есть такая программка:
NAME slave
PUBLIC slave

slave:
RSEG CODE
MEM0: MOV.W #1100h, R12
MOV.W #0000h, R11
MOV.W #2100h, R13
MEMZERO: MOV.W @R11, 0(R12)
INCD.W R12
CMP R13,R12
JL MEMZERO
nop
RETI
END
она лежит в отдельном файлике и вызывается командой CALL из главной программы.
Вроде должно работать, но выдаётся ошибка:
Warning[18]: END of program while in include file C:\Document\..\mem0.s43
и
Error[e6]: Program module slave redeclared in file C:\Document\..\mem0.s43
Где и что нужно поправить?? maniac.gif
msalov
Если ваша процедура вызывается из основной программы, то RETI -- совсем не то, что надо.

Каким образом у вас связывают файл основной программы и этот?
Fynjy86
Я хочу процедуру обнуления оперативы вынести в другой файл и прописать его через #include "xxx"
в основном файле ууу. основная программа из файла ууу обращается к подпрограмме лежащей в ххх через call
msalov
Цитата(Fynjy86 @ Apr 3 2008, 13:39) *
Я хочу процедуру обнуления оперативы вынести в другой файл и прописать его через #include "xxx"
в основном файле ууу. основная программа из файла ууу обращается к подпрограмме лежащей в ххх через call

Если через #include то END в конце включаемого лишний. И всё таки убедитесь что вам нужна именно инструкция reti в конце функции, а не ret

Мне кажется, обнуление сделано у вас не совем корректно, читая нулевой адрес, вы много не занулите
Код
mov @R11,0(R12)

я бы сделал
Код
mov R3,0(R12)

или
Код
mov #0,0(R12)
Сергей Борщ
Цитата(Fynjy86 @ Apr 3 2008, 13:39) *
Я хочу процедуру обнуления оперативы вынести в другой файл и прописать его через #include "xxx"
Тогда уберите из него END. Текст этого файла просто вставляется по #include в основной исходник и компилятор встречает там END. END должен быть один в конце основного файла. Непонятно, зачем вы включаете этот файл по #include. Вам надо его просто добавить в проект как отдельный файл, а в основном написать extern slave (или import slave, посмотрите в описани компилятора). Через #include обычно подключется файл, содержащий макросы.
Fynjy86
Cвёл код к такому виду
MEM0: MOV.W #1100h, R12
MOV.W #0000h, R11
MOV.W #2100h, R13
MEMZERO: MOV.W @R11, 0(R12)
INCD.W R12
CMP R13,R12
JL MEMZERO
nop
RET
запускаю дебугер, когда доходит до команды CALL, то выдеёт ошибку
User error: illegal opcode on address 0x403Ch
хотя по этому адресу все нули и ни кокого отношения к программам он не имеет

Цитата(gotty @ Apr 3 2008, 13:43) *
Если через #include то END в конце включаемого лишний. И всё таки убедитесь что вам нужна именно инструкция reti в конце функции, а не ret

Мне кажется, обнуление сделано у вас не совем корректно, читая нулевой адрес, вы много не занулите
Код
mov @R11,0(R12)

я бы сделал
Код
mov R3,0(R12)

или
Код
mov #0,0(R12)

Возможно вы правы, но нужный мне диапазон обнуляется без продблем.
попробую Ваш код, посмотрим, если он быстрее, то попробую его применить.
msalov
Цитата(Fynjy86 @ Apr 3 2008, 14:02) *
Возможно вы правы, но нужный мне диапазон обнуляется без продблем.
попробую Ваш код, посмотрим, если он быстрее, то попробую его применить.


вы копируете содержимое ячейки памяти по адресу 0 во все ячейки RAM. А по нулевому адресу у нас что? правильно:
Цитата
SFR interrupt enable1 IE1 000h
Fynjy86
Цитата(gotty @ Apr 3 2008, 14:07) *
вы копируете содержимое ячейки памяти по адресу 0 во все ячейки RAM. А по нулевому адресу у нас что? правильно:

lol.gifконечно!! я ошибся, но и мой код работает и Ваш))
тоько ошибка User error: illegal opcode on address 0x403Ch всёравно остаётся
msalov
Цитата(Fynjy86 @ Apr 3 2008, 14:19) *
lol.gifконечно!! я ошибся, но и мой код работает и Ваш))

Только мой код будет работать всегда, а Ваш -- нет wink.gif
Fynjy86
Цитата(gotty @ Apr 3 2008, 14:36) *
Только мой код будет работать всегда, а Ваш -- нет wink.gif

я свою ошибку понял, что писал в память чёрти что, только этом чёрти что были нули.
ваш код верен, но как быть с User error: illegal opcode on address 0x403Ch ???
подскажите плз
msalov
Цитата(Fynjy86 @ Apr 3 2008, 14:38) *
я свою ошибку понял, что писал в память чёрти что, только этом чёрти что были нули.
ваш код верен, но как быть с User error: illegal opcode on address 0x403Ch ???
подскажите плз

а вы листинг приведите, и когда будете вставлять в сообщение, не забудьте про тег [code]
Fynjy86
#include "msp430.h" ; #define controlled include file
#include "mem0.s43"
NAME main ; module name

PUBLIC main ; make the main label vissible

ORG 0FFFEh
DC16 main

ASEG CODE
ORG 2150h

main:
MOV #20C0h, SP ; set up stack
call MEM0

MOV.W #WDTPW+WDTHOLD,&WDTCTL ; Stop watchdog timer
JMP $ ; jump to current location '$'
; (endless loop)
END

;_подпрограмма из соседнего файлика mem0.s43

MEM0: MOV.W #1100h, R12
MOV.W #2100h, R13
MEMZERO: MOV.W #0, 0(R12)
INCD.W R12
CMP R13,R12
JL MEMZERO
nop
RET
msalov
Цитата(Fynjy86 @ Apr 3 2008, 14:44) *

Не текст программы,
В листинге содержатся адреса и коды команд. Пример:
Код
TACTL = TASSEL1 + TACLR; // SMCLK, Clear TAR
004D04   40B2 0204 0160    mov.w   #0x204,&TACTL
TACCR0 = 8000-1;   // Frequency 1000Hz, XT1 = 8.0 MHz
004D0A   40B2 1F3F 0172    mov.w   #0x1F3F,&TACCR0
TACCTL0 = CCIE;    // TACCR0 interrupt enabled
004D10   40B2 0010 0162    mov.w   #0x10,&TACCTL0
TACCTL1 = CM_3|CCIS1|SCS|CAP;  // TACTL1 - software controlled capture mode, trigger - XOR CCIS0
004D16   40B2 E900 0164    mov.w   #0xE900,&TACCTL1
TACTL |= MC0;    // Start TA up Mode
004D1C   D0B2 0010 0160    bis.w   #0x10,&TACTL
Fynjy86
MOV #20C0h, SP ; set up stack
main:
002150 4031 20C0 mov.w #0x20C0,SP
call MEM0
002154 1290 003A call MEM0
MOV.W #WDTPW+WDTHOLD,&WDTCTL ; Stop watchdog timer
_____________________________________________________:
002158 40B2 5A80 0120 mov.w #0x5A80,&WDTCTL
JMP $ ; jump to current location '$'
00215E 3FFF jmp 0x215E


Подпрограмма

MEM0: MOV.W #1100h, R12
MEM0:
002190 403C 1100 mov.w #0x1100,R12
MOV.W #2100h, R13
002194 403D 2100 mov.w #0x2100,R13
MEMZERO: MOV.W #0, 0(R12)
MEMZERO:
002198 438C 0000 clr.w 0x0(R12)
INCD.W R12
00219C 532C incd.w R12
CMP R13,R12
00219E 9D0C cmp.w R13,R12
JL MEMZERO
0021A0 3BFB jl MEMZERO
nop
0021A2 4303 nop
RET
msalov
Цитата(Fynjy86 @ Apr 3 2008, 14:52) *


А где же адрес 0x403C ? и как туда переходит программа?
P.S. останавливать WDT лучше в самом начале программы
Fynjy86
Цитата(gotty @ Apr 3 2008, 15:00) *
А где же адрес 0x403C ? и как туда переходит программа?
P.S. останавливать WDT лучше в самом начале программы

по адресу 403Сh 0000 а как прога туда попадает предстаить не могу 07.gif
если отказаться от идеи использовать вызов подпрограммы, то всё работает...
но вопрос-то не решен...
msalov
Цитата(Fynjy86 @ Apr 3 2008, 15:08) *
по адресу 403Сh 0000 а как прога туда попадает предстаить не могу 07.gif
если отказаться от идеи использовать вызов подпрограммы, то всё работает...
но вопрос-то не решен...

lol.gif
Ваша программа берёт из стека адрес возврата из подпрограммы, а всю оперативную память вы только что очистили a14.gif
Fynjy86
07.gif а программа отчистки даже не начинается wink.gif выдовая ошибку на команде CALL
но косяк с отчисткой стека я уже убрал, не отчищая последние 10 байт оперативы(они под стек оставленны)

Решил обмануть сделал:
; call MEM0
MOV PC, SP
jmp 2190h (адрес подпрограммы)
всё чистит нормально...
баян
таже ошибка, только адрес чуть меньше...
останавливается на этой строчке
INCD.W R12
msalov
Цитата(Fynjy86 @ Apr 3 2008, 14:52) *
call MEM0
002154 1290 003A call MEM0

Мне кажется вам тут надо использовать другой способ адресации.
а именно
Код
call #MEM0


Цитата(Fynjy86 @ Apr 3 2008, 15:39) *
jmp 2190h (адрес подпрограммы)
И тут тоже
Код
jmp #2190h (адрес подпрограммы)
Fynjy86
Цитата(gotty @ Apr 3 2008, 16:13) *
Мне кажется вам тут надо использовать другой способ адресации.
а именно
Код
call #MEM0


И тут тоже
Код
jmp #2190h (адрес подпрограммы)

beer.gif
jmp #2190h - ерунда....
а #MEM0 работает!!!! огромное спасибо!!! a14.gif a14.gif a14.gif


значёк # не пропечатан в книге, тоько если знаешь, что он там есть, можно догадаться... блин, столько времени убил...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.