Como incluir outros arquivos ?

Software e Hardware para ATMEL

Moderadores: 51, guest2003, brasilma

Como incluir outros arquivos ?

Mensagempor lipesh » 16 Fev 2008 17:11

Estou ainda aprendendo a mexer com o AVR, mas já ando fazendo uns códigos meio grandinhos e o excesso de subrotinas me faz perder muito tempo.

Eu gostaria de separar em outros arquivos algumas das subrotinas que eu fiz e que sei que funcionam, não mexendo mais nesses trechos de código, modo a deixar mais limpo o ambiente de trabalho e visualizar apenas o código em que eu realmente estiver trabalhando.

Tentei da seguinte maneira: separei as subrotinas em um arquivo chamado LCD.asm e DELAYS.asm, na mesma pasta do projeto.
No código principal, coloquei o seguinte:

.include "m88def.inc"
.include "LCD.asm"
.include "DELAYS.ASM"

mas logo que cliquei em "Build" já apareceu um erro dizendo que os arquivos LCD.asm e DELAYS.ASM não foram encontrados: "Cannot find include file: LCD.asm"...

Tentei substituindo pelo seguinte:


.include "m88def.inc"
.include C:\AVR\Contador\LCD.asm
.include C:\AVR\Contador\DELAYS.asm

mas ainda não deu certo, e ainda uma última tentativa:

.include "m88def.inc"
.include "C:\AVR\Contador\LCD.asm"
.include "C:\AVR\Contador\DELAYS.asm"

e novamente o mesmo erro...

Alguém saberia dizer o que tenho que fazer para incluir estes arquivos ?

Obrigado.
include "Dominar_o_AVR.asm"
lipesh
Bit
 
Mensagens: 6
Registrado em: 03 Jan 2007 19:47

Mensagempor zurca1599 » 16 Fev 2008 19:19

Qual o software/IDE que está a usar ?

Verifique se eiste nesse software uma definição "default" onde procrura os ficheiros a incluir.
zurca1599
Bit
 
Mensagens: 31
Registrado em: 08 Jan 2007 14:47

Mensagempor lipesh » 17 Fev 2008 19:26

zurca1599 escreveu:Qual o software/IDE que está a usar ?

Verifique se eiste nesse software uma definição "default" onde procrura os ficheiros a incluir.


Estou usando o AVR Studio 4, mas não consegui encontrar essa opção que você citou... Onde seria ?

Obrigado.
include "Dominar_o_AVR.asm"
lipesh
Bit
 
Mensagens: 6
Registrado em: 03 Jan 2007 19:47

Mensagempor lipesh » 17 Fev 2008 20:03

Ueh, que estranho !

Simplesmente mudei o nome do arquivo a incluir, e aí deu uma série de erros, apenas variando o endereço (de 0x0 até 0x25):

"Overlap in .cseg: addr=0x0 conflicts with 0x0:0x40"
"Overlap in .cseg: addr=0x1 conflicts with 0x0:0x40"
"Overlap in .cseg: addr=0x2 conflicts with 0x0:0x40"
...

Aí, ao incluir o arquivo, em vez de colocar logo abaixo de include "m88def.inc" eu coloquei na última linha do código fonte. Não sei se deveria, mas deu certo... Vai entender. Vou postar o código aqui abaixo caso sirva para esclarecer algo:

contador.asm (esta é a versão do código que funcionou)
______________________________________________________________________________________
.include "m88def.inc"

.def W=R16 ;NOMES MAIS FÁCEIS PARA ENTENDER O PROGRAMA
.def AUXD=R17
.def TEMPO0=R18
.def TEMPO1=R19
.def AUX2=R20

.EQU DISPLAY = PORTD ;DISPLAY
.EQU ENABLE = 2
.EQU RS = 1

.org 0x00
RJMP CONFIG

;----------------------------------------------------------------------------------------------------------------------
;

CONFIG:
LDI W,LOW(RAMEND) ;CONFIGURA PILHA
OUT SPL,W
LDI W,HIGH(RAMEND)
OUT SPH,W

LDI W,0b11111111 ;CONFIGURA PORTD
OUT DDRD,W

RCALL INI_DISPLAY ;CONFIGURA DISPLAY

LDI AUX2,10
RJMP INICIO

;----------------------------------------------------------------------------------------------------------------------
;

INICIO:
CBI DISPLAY,RS ;CONFIGURA DISPLAY PARA COMANDOS
LDI W,1 ;CHAMA DELAY
RCALL DELAY_MS

LDI W,0X82 ;COMANDO PARA POSICIONAR O CURSOR NA LINHA 0 E COLUNA 2
RCALL ESCREVE

SBI DISPLAY,RS ;SELECIONA DISPLAY PARA DADOS
INC AUX2
MOV W,AUX2
RCALL ESCREVE

LDI W,255
RCALL DELAY_MS

RJMP INICIO

;----------------------------------------------------------------------------------------------------------------------
; DELAY PROPORCIONAL A W

DELAY_MS:
MOV TEMPO1,W ; CARREGA TEMPO1
DEL_INI:
LDI W,250
MOV TEMPO0,W ; CARREGA TEMPO0
NOP_INI:
NOP
NOP
NOP
NOP
DEC TEMPO0
IN W,SREG
SBRS W,1 ; FIM DE TEMPO0 ?
RJMP NOP_INI ; NÃO - VOLTA
; SIM - PASSOU-SE 1MS
DEC TEMPO1
IN W,SREG
SBRS W,1 ; FIM DE TEMPO1 ?
RJMP DEL_INI ; NÃO - VOLTA
; SIM
RET ; RETORNA


;----------------------------------------------------------------------------------------------------------------------
;
.include "TST.asm"
______________________________________________________________________________________







e este é o TST.asm (antigo LCD.asm)

______________________________________________________________________________________
;----------------------------------------------------------------------------------------------------------------------
; SUBROTINAS PRONTAS PARA TRABALHAR COM LCD
;
; AS VARIÁVEIS DAS FUNÇÕES SÃO:
;
; DISPLAY -> PORT A SER USADO PELO LCD. O NIBBLE MAIS SIGNIFICATIVO SÃO AS VIAS DE DADOS
; RS -> BIT DO PORT DO DISPLAY
; ENABLE -> BIT DO PORT DO DISPLAY
; W -> REGISTRADOR DE TRABALHO
; AUXD -> REGISTRADOR AUXILIAR
;
; AS SUBROTINAS ABAIXO DEPENDEM DA SUBROTINA "DELAY_MS"

.EQU MASC = 0b11110000 ;MASCARA PARA ESCRITA NO NIBBLE MAIS SIGNIFICATIVO

;----------------------------------------------------------------------------------------------------------------------
; CONFIGURAÇÕES INICIAIS DO DISPLAY
;
; A ROTINA INICIALIZA O DISPLAY P/ COMUNICAÇÃO DE 4 VIAS, 2 LINHAS, E CURSOR APAGADO COM DESLOCAMENTO À DIREITA.

INI_DISPLAY:
CBI DISPLAY,RS ;SELECIONA O DISPLAY P/ COMANDOS

LDI W,0X30 ;ESCREVE COMANDO 0X30 PARA
RCALL ESCREVE ;INICIALIZAÇÃO

LDI W,4
RCALL DELAY_MS ;DELAY DE 4MS (EXIGIDO PELO DISPLAY)

LDI W,0X30 ;ESCREVE COMANDO 0X30 PARA
RCALL ESCREVE ;INICIALIZAÇÃO

LDI W,0X30 ;ESCREVE COMANDO 0X30 PARA
RCALL ESCREVE ;INICIALIZAÇÃO

LDI W,0b00100000 ;ESCREVE COMANDO PARA
RCALL ESCREVEE ;INTERFACE DE 4 VIAS DE DADOS

LDI W,0b00101000 ;ESTABELECE CONDIÇÕES DE UTILIZAÇÃO
RCALL ESCREVE ;(4 VIAS DE DADOS, DUAS LINHAS E MATRIZ DE 7X5)

LDI W,0b00000001 ;ESCREVE COMANDO PARA
RCALL ESCREVE ;LIMPAR TODO O DISPLAY

LDI W,2
RCALL DELAY_MS ;DELAY DE 2MS

LDI W,0b00001100 ;ESCREVE COMANDO PARA
RCALL ESCREVE ;LIGAR O DISPLAY SEM CURSOR

LDI W,0b00000110 ;ESCREVE COMANDO PARA INCREM.
RCALL ESCREVE ;AUTOMÁTICO À DIREITA

SBI DISPLAY,RS ;SELECIONA O DISPLAY P/ DADOS

RET

;----------------------------------------------------------------------------------------------------------------------
; ROTINA DE ESCRITA DE UM CARACTER NO DISPLAY
;
; ROTINA QUE ENVIA UM CARACTER PREVIAMENTE COLOCADO EM W PARA O LCD.

ESCREVE:
MOV AUXD,W ;PASSA W PARA AUXD
ANDI W,MASC ;FAZ UM E LÓGICO COM A MASCARA 11110000
RCALL ESCREVEE
LSL AUXD ;DESLOCA QUATRO BITS À ESQUERDA
LSL AUXD
LSL AUXD
LSL AUXD
MOV W,AUXD ;COLOCA AUXD EM W
ANDI W,MASC ;MASCARA NOVAMENTE
RCALL ESCREVEE
RET

ESCREVEE:
SBRC W,7 ;TESTA SE O BIT 7 DE W ESTÁ ZERADO
RJMP SB7 ;NÃO: ENTÃO SETA BIT 7 DO DISPLAY
CBI DISPLAY,7 ;SIM: ENTÃO ZERA BIT 7 DO DISPLAY
RJMP TB6
SB7:
SBI DISPLAY,7 ;SETA BIT 7 DO DISPLAY
TB6:
SBRC W,6 ;TESTA SE O BIT 6 DE W ESTÁ ZERADO
RJMP SB6 ;NÃO: ENTÃO SETA BIT 6 DO DISPLAY
CBI DISPLAY,6 ;SIM: ENTÃO ZERA BIT 6 DO DISPLAY
RJMP TB5
SB6:
SBI DISPLAY,6 ;SETA BIT 6 DO DISPLAY
TB5:
SBRC W,5 ;TESTA SE O BIT 5 DE W ESTÁ ZERADO
RJMP SB5 ;NÃO: ENTÃO SETA BIT 5 DO DISPLAY
CBI DISPLAY,5 ;SIM: ENTÃO ZERA BIT 5 DO DISPLAY
RJMP TB4
SB5:
SBI DISPLAY,5 ;SETA BIT 5 DO DISPLAY
TB4:
SBRC W,4 ;TESTA SE O BIT 4 DE W ESTÁ ZERADO
RJMP SB4 ;NÃO: ENTÃO SETA BIT 4 DO DISPLAY
CBI DISPLAY,4 ;SIM: ENTÃO ZERA BIT 4 DO DISPLAY
RJMP CONT
SB4:
SBI DISPLAY,4 ;SETA BIT 4 DO DISPLAY

CONT:
NOP ;PERDE 1US PARA ESTABILIZAÇÃO
NOP
NOP
SBI DISPLAY,ENABLE ;ENVIA UM PULSO DE ENABLE AO DISPLAY
NOP
NOP
CBI DISPLAY,ENABLE ;RETIRA O PULSO DE ENABLE DO DISPLAY

LDI W,1
RCALL DELAY_MS ;DELAY DE 1MS
RET ;RETORNA

;----------------------------------------------------------------------------------------------------------------------

______________________________________________________________________________________
include "Dominar_o_AVR.asm"
lipesh
Bit
 
Mensagens: 6
Registrado em: 03 Jan 2007 19:47

Mensagempor LeandroPIC » 18 Fev 2008 12:53

Na verdade vc tem que salvar essas sub-rotinas com a extensão .INC e não .ASM, .ASM é só para o arquivo principal.
Avatar do usuário
LeandroPIC
Byte
 
Mensagens: 163
Registrado em: 06 Jul 2007 12:19

Mensagempor RobL » 18 Fev 2008 16:58

Faça o seguinte no seu arquivo principal:

.include "m88def.inc"
.include "C:\ caminho completo \nome arquivo . DEF (head aqui).
.include "C\ caminho completo \ macro.asm


.CSEG ( use essa diretiva ajudar o compilador e organizar seu pgm)

.include "C:\caminho completo\ nome do arquivo.asm1 ou inc1 (inicialização)
.include "C:\caminho completo\ nome do arquivo.asm1 ou inc2
.include "C:\caminho completo\ nome do arquivo.asm1 ou inc3
.include ... outros seguidos aqui.

Seu código principal nessa parte.

.include "C:\caminho completo\ Tabelas.asmN ou incN

.END


O que vai acontecer:
No seu primeiro arquivo após .CSEG, deverá ter a primeira linha com ORG 0x000.
A primeira inclusão vai iniciar aí em 0x000. Eu coloco nesse arquivo a inicialização, interrupções, stack, portas, etc.
A segunda inclusão, vai iniciar onde terminou a primeira (veja isso em Wieu - Diasassembler.
E assim por diante.
Após o seu último include acima inicia seu código principal.

Note que incluí uma tabela após meu arquivo principal. Nesta tabela eu coloco nos últimos 256 Words (linhas de pgm) através de um ORG. 0xFnn.

Desta forma não mais haverá overlap. O risco de sobreposição do código só acontecerá se seu programa principal atingir sua tabela em ORG 0XFnn.

Cuidado, se algum dos seus arquivos tiver um ORG 0xnnn poderá dar overlap, pois você está fixando o enderço inicial da inclusão. Neste caso ele não será movido automaticamente quando aumentar o código.

NOTA : INC ou ASM . Nesse compilador tanto faz, mas o editor de texto tratará os arquivos inc diferete dos asm, questão de cor e outros. Sugiro colocar .asm.
RobL
Dword
 
Mensagens: 1546
Registrado em: 20 Fev 2007 17:56

Mensagempor lipesh » 19 Fev 2008 01:07

Opa, muito obrigado mesmo pessoal.

Agora eu não tenho como testar, mas quando eu estiver no meu pc testarei isso cuidadosamente.

Ainda estou tentando entender direito os detalhes, mas os esclarecimentos por vocês prestados foram de grande ajuda.

Valeu mesmo !
include "Dominar_o_AVR.asm"
lipesh
Bit
 
Mensagens: 6
Registrado em: 03 Jan 2007 19:47

Mensagempor RobL » 19 Fev 2008 19:01

.include "m88def.inc"

.def W=R16 ;NOMES MAIS FÁCEIS PARA ENTENDER O PROGRAMA
.def AUXD=R17
.def TEMPO0=R18
.def TEMPO1=R19
.def AUX2=R20

.EQU DISPLAY = PORTD ;DISPLAY
.EQU ENABLE = 2
.EQU RS = 1

.org 0x00
RJMP CONFIG

;----------------------------------------------------------------------------------------------------------------------


Por que o overlap?

Observe acima, no seu código, a diretiva ORG 0x00.
Portanto, você forçou a entrada de um código na linha 0x00.
Quando colocou um arquivo include acima desse código, esse include entrou em 0x00 e se sobrepos (overlap) ao seu código.

Poderia ser desta forma, mas o seu include teria que ter um ORG 0xnn diferente de 0x00, ou o include ter a diretiva org 0x00.

Quando você colocou o include ao final do seu código, este foi incluido após a úlima linha do seu código e não houve overlap, pois não havia nada escrito após.
Isto sempre funcionará, mas pode não ser a melhor forma de organizar.

Porque o seu primeiro include deve ser ORG 0x00 mas com as interrupções já definidas neste arquivo?
Justamente para não se sobrepor a qualquer linha de interrupção que inicia em 0x00.

Não há uma só forma de fazer inclusões. Isto é a gosto do programador, mas deve tomar cuidado, com as primeiras linhas de 0x00.. até (depende do micro) que são os vetores de interrupção.
Por exemplo podemos iniciar um include forçando sua entrada após o último endereço do vetor de interrupção.

Por que prefiro incluir arquivos no ínicio, logo abaixo de .CSEG?
Desta forma, meu código principal poderá crescer sem overlap e tenho noção de onde se encontra essas inclusão.

Colocando-as no final do meu principal, ao crescer meu programa, as inclusões vão sendo empurradas, sem que se tenha noção onde estão. Isso não é relevante, apenas gosto de cada um.

Há uma diferença a observar nos arquivos, ou arquivo, de definição (.DEF), caso passe a criar as definições em um arquivo.
Este arquivo deve ser colocado antes de .CSEG. O mesmo para arquivos com macros. Estes devem estar antes da macro.
RobL
Dword
 
Mensagens: 1546
Registrado em: 20 Fev 2007 17:56

Mensagempor RobL » 19 Fev 2008 19:27

Ah, ia esquecendo.
Conforme o LeandroPic colocou, o correto, a rigor e bom hábito, toda inclusão deve ser .INC.
Há compiladores, mais antigos, que não se entendem bem quando não é feito desta forma.
No caso do compilador usado no AVR Studio 4 ele não fará distinção, a não ser quanto as cores no editor. Por outro lado, todo .inc será montado como um todo e vai virar um único código, conforme se vê num arquivo de listagem e neste se encontra a informação de onde foram incluídos os arquivos e seus nomes.

No meu caso, observando o acima narrado, uso .asm e .inc indiscriminadamente mas penso (sem certeza no Studio 4) que poderia configurar o editor para tratar .inc com cores de minha preferência.
RobL
Dword
 
Mensagens: 1546
Registrado em: 20 Fev 2007 17:56


Voltar para AVR

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

x