Line Address Opcode Label DisAssy
1 000 2805 GOTO 0x5
2 001 3400 RETLW 0x0
3 002 3400 RETLW 0x0
4 003 3FFF ADDLW 0xFF
5 004 0008 RETURN
6 005 1405 BSF PORTA, 0x0
7 006 2805 GOTO 0x5
Error[113] /home/fabian/workspace/MPLAB/PIC16asm.X/main.asm 16 : Symbol not previously defined (TEST)
Error[128] /home/fabian/workspace/MPLAB/PIC16asm.X/main.asm 16 : Missing argument(s)
Line Address Opcode Label DisAssy
1 000 2805 GOTO 0x5
2 001 3400 RETLW 0x0
3 002 3400 RETLW 0x0
4 003 3FFF ADDLW 0xFF
5 004 0008 RETURN
6 005 2007 CALL 0x7
7 006 2805 GOTO 0x5
8 007 1405 BSF PORTA, 0x0
9 008 0008 RETURN
Error[150] /home/fabian/workspace/MPLAB/PIC16asm.X/test.inc 4 : Labels must be defined in a code or data section when making an object file
Error[152] /home/fabian/workspace/MPLAB/PIC16asm.X/test.inc 5 : Executable code and data must be defined in an appropriate section
Error[152] /home/fabian/workspace/MPLAB/PIC16asm.X/test.inc 6 : Executable code and data must be defined in an appropriate section
Line Address Opcode Label DisAssy
1 000 2807 GOTO 0x7
2 001 3400 RETLW 0x0
3 002 3400 RETLW 0x0
4 003 3FFF ADDLW 0xFF
5 004 0008 RETURN
6 005 1405 BSF PORTA, 0x0
7 006 0008 RETURN
8 007 2005 CALL 0x5
9 008 2807 GOTO 0x7
make[2]: Entering directory '/home/fabian/workspace/MPLAB/PIC16asm.X'
"/opt/microchip/mplabx/v3.26/mpasmx/mpasmx" -q -p16f84a -u -l\"build/default/production/main.lst\" -e\"build/default/production/main.err\" -o\"build/default/production/main.o\" \"main.asm\"
"/opt/microchip/mplabx/v3.26/mpasmx/mplink" -p16f84a -w -m"dist/default/production/PIC16asm.X.production.map" -z__MPLAB_BUILD=1 -odist/default/production/PIC16asm.X.production.cof build/default/production/main.o
00001 LIST P=16F84A , r=DEC
00002 ;RADIX DEC
00003 INCLUDE <p16f84a.inc>
00001 LIST
00002
00003 ;==========================================================================
00004 ; Build date : Feb 01 2016
00005 ; MPASM PIC16F84A processor include
00006 ;
00007 ; (c) Copyright 1999-2016 Microchip Technology, All rights reserved
00008 ;==========================================================================
00009
00209 LIST
00004
2007 3FFD 00005 __CONFIG _CP_OFF & _PWRTE_OFF & _WDT_ON & _XT_OSC
00006
00007
0000 00008 ORG 0
0000 2807 00009 GOTO PRINCIPAL
00010
0004 00011 ORG 4
0004 0008 00012 RETURN
00013
00014 INCLUDE "test.inc"
00001
00002
00003
0005 00004 TEST
0005 1405 00005 BSF PORTA,0
0006 0008 00006 RETURN
00015
0007 00016 PRINCIPAL:
0007 2005 00017 CALL TEST
0008 2807 00018 GOTO PRINCIPAL
00019
00020 END
....................
SYMBOL TABLE
LABEL VALUE
TEST 00000005
Hay mucho mas simbolos pero solo muestro el de interes.
........................
gracias por tu extensa explicacion.yo lo que he aprendido de asm.ha sido de ejemplos en este foro y otros sitios
de intenet.no he hecho ningun curso y por eso igual cometo errores aunque finalmente funcione el programa.
el problema que yo veo en todo esto de situar los include en diversos sitios es que cuando cree una libreria
habria que realizar un .inc solo para este tipo de instrucciones.y si uso varias librerias tendria
que cojer datos de todas estas librerias para crear un archivo para el programa principal.
supongo que esto es asi.si hubiera una forma de entrelazar este tipo de definiciones de forma global.como se hace en C
y que la definicion no fuera exclusivo de cada archivo.nos ahorrariamos este tipo de inconpatibilidades y errores.
voy a intentar hacer lo que dices.no pongo el programa aqui porque esta muy sucio.en cuanto lo limpie lo subo aqui.
aunque quiero preguntarte algo.como te dije antes.yo les pongo a los archivos .inc un ORG para indicar al compilador donde quiero poner el codigo en memoria.
pero si ese archivo .inc tiene dentro unas tablas que hay que especificar el inicio de estas.no seria un problema al darle al compilador la opcion de que
pongan nuestros archivos inc.sin especificar una direccion?
aunque supongo que lo que habria que hacer es poner las tablas lo mas alejadas posible del codigo principal para que hallan errores.
;*************************************************www.ingeniopic.com*******************************************************
; PROGRAMA : CamaraOV7670
; Funcion : Control de la camara OV7670
;
;
; Revision : 1.0 10/1/2015 Programa para : PIC18F87K22
; CPU Clock : 64 MHz Reloj instruccion :6.25ns
; WDT : Deshabilitado Tipo de reloj : INTOSC
; Code Prot : OFF Crystal:
;*****************************************************www.ingeniopic.com***************************************************
;FUNCIONAMIENTO:
;
;
;Pins utilizados:
;PORTC,3=pin44 SCL1 ;para I2C
;PORTC,4=pin45 SDA1 ;para I2C
;PORTC,5=pin46 ;reset de la OV7670
;PORTC,6=pin37 TX1 ;eusart1 (poner resistencia serie de 1k)
;PORTJ,7=pin42 ;conexion a WRST de la FIFO
;PORTJ,6=pin41 ;conexion a RRST de la FIFO
;PORTJ,5=pin40 ;conexion a Vsync de la camara
;PORTJ,4=pin39 ;conexion a WR = WE o WEN del AL422
;PORTJ,3=pin59 ;conexion a OE del AL422
;PORTJ,2=pin60 ;conexion a RCK del AL422
;PORT3,3=pin77 ;conexion a XCLK de la camara
;PORTH ;puerto de entrada para el bufer de la FIFO.
;PORTE,0=pin4 ;RS de la TFT ILI9325
;PORTE,1=pin3 ;CS de la TFT ILI9325
;PORTE,4=pin76 ;WR de la TFT ILI9325
;PORTE,5=pin75 ;RD de la TFT ILI9325
;PORTE,6=pin74 ;RST de la TFT ILI9325
LIST P=PIC18F87K22 ;Se indica el modo de procesador
#INCLUDE <P18F87K22.inc>
RADIX HEX ;Sistema de numeracion hexadecimal
CONFIG RETEN=OFF ; VREG Sleep Disable bit:
CONFIG INTOSCSEL=LOW ; LF-INTOSC Low-power Enable bit:
CONFIG SOSCSEL=DIG ; SOSC Power Selection and mode Configuration bits:
CONFIG XINST=OFF ; Extended Instruction Set:
CONFIG FOSC=INTIO2;INTIO1 ; Oscillator RC interno con funcion 1/4 Fosc en OSC2 (pin RA6)
CONFIG PLLCFG=ON ; PLL x4 Enable bit:
CONFIG FCMEN=OFF ; Fail-Safe Clock Monitor:
CONFIG IESO=OFF ; Internal External Oscillator Switch Over Mode:
CONFIG PWRTEN=OFF ; Power-up Timer:
CONFIG BOREN=OFF ; Brown-out Detect:
CONFIG BORV=1;3 ; Brown-out Reset Voltage bits:
CONFIG BORPWR=LOW ; BORMV Power level:
CONFIG WDTEN=OFF;ON ; Watchdog Timer:
CONFIG WDTPS=1024 ; Watchdog Postscaler:
CONFIG MSSPMSK=MSK7 ; MSSP address masking:
CONFIG MCLRE=ON ; Master Clear Enable:
CONFIG STVREN=ON ; Stack Overflow Reset:
CONFIG BBSIZ=BB1K ; Boot Block Size:
CONFIG CCP2MX=PORTC
CONFIG DEBUG = OFF
ERRORLEVEL -302
CBLOCK 0x070A ;comienza el bloque de ram
CONT_FIFO1
CONT_FIFO2
CONT_FIFO3
IMPAR
ENDC
OV7670_VAR EQU 0x000
RETARDOS_VAR EQU 0X700 ;variables de la libreria "retardos.inc" hubicados en una zona de memoria accedida desde todos los bancos
;ILI9340_VAR EQU 0X750
ILI_TFT_VAR EQU 0X750
SPI_VAR EQU 0X760
;***************Bit Definitions****************************************
#define BANK0 movlb 0x00
#define BANK1 movlb 0x01
#define BANK2 movlb 0x02
#define BANK3 movlb 0x03
#define BANK4 movlb 0x04
#define BANK5 movlb 0x05
#define BANK6 movlb 0x06
#define BANK7 movlb 0x07
#define BANK8 movlb 0x08
#define BANK9 movlb 0x09
#define BANK10 movlb 0x0A
#define BANK11 movlb 0x0B
#define BANK12 movlb 0x0C
#define BANK13 movlb 0x0D
#define BANK14 movlb 0x0E
#define BANK15 movlb 0x0F
#define GENERAL_BANK movlb 0x07 ;banco de trabajo general
#define GIE_HI_ON bsf INTCON,GIE;;;;;;;;;;;;;;;;;;;;;bsf
#define GIE_HI_OFF bcf INTCON,GIE
#define GIE_LO_ON bsf INTCON,PEIE;;;;;;;;;;;;;;;;;;;;;bsf
#define GIE_LO_OFF bcf INTCON,PEIE
#define I2C_18F 0X1750 ;direccion donde hubicaremos las rutinas de temporizacion
#define retardos 0X2100 ;direccion donde hubicaremos las rutinas de temporizacion
#define OV7670_18f87k22 0x2200 ;rutinas de la camara OV7670
#define Eusart 0x2500 ;rutinas de la Usart
#define ILI9341 0x2600 ;rutinas de la TFT
#define SPI_18f 0x2900 ;
;#define ID_WRITE movlw 0xD0 ;valor de direccion para escritura del DS1307
;#define ID_READ movlw 0xD1 ;valor de direccion para lectura del DS1307
;#define ID_WRITE movlw 0x42 ;valor de direccion para escritura del OV7670
;#define ID_READ movlw 0x43 ;valor de direccion para lectura del OV7670
;#define ID_WRITE movlw 0xA0 ;valor de direccion para escritura del 24c16
;#define ID_READ movlw 0xA1 ;valor de direccion para lectura del 24c16
#define CS_ON_OV7670 bsf LATC,5
#define CS_OFF_OV7670 bcf LATC,5
;referente a AL422
#define WRST_HI bsf LATJ,7
#define WRST_LO bcf LATJ,7
#define RRST_HI bsf LATJ,6
#define RRST_LO bcf LATJ,6
#define WEN_HI bsf LATJ,4
#define WEN_LO bcf LATJ,4
#define RCLK_HI bsf LATJ,2
#define RCLK_LO bcf LATJ,2
#define OE_HI bsf LATJ,3
#define OE_LO bcf LATJ,3
;<<<<<<---------------------- VECTOR DE RESET ------------------------>>>>>>>
ORG 0x00 ;Inicio en el Vector de Reset
goto INICIO ;ir a la primera instruccion del programa
;<<<<<<---------------------- VECTOR DE INTERRUPCIONES ALTA PRIORIDAD ---------------->>>>>>>>>>
ORG 0X08
goto INTERRUP_HI
;<<<<<<---------------------- VECTOR DE INTERRUPCIONES BAJA PRIORIDAD ---------------->>>>>>>>>>
ORG 0X18
goto INTERRUP_LO
ORG 0X0020
include "I2C_18F.inc"
include "retardos.inc"
include "OV7670_18f87k22.inc"
include "Eusart.inc"
include "ILI9341.inc"
include "SPI_18f.inc"
;<<<<<<----------------- INICIO PROGRAMA PRINCIPAL ------------------->>>>>>>
INICIO BANK15 ;conmuta banco 15.por si se usan rgistros por debajo de 0x760.ya que no pueden accederse sin conmutacion.
;Configura oscilador interno
movlw b'01110000' ; 16 mhz clock,HF INTOSC
movwf OSCCON ; Oscon calibrado, ahora...
btfss OSCCON,HFIOFS ; El oscilador se ha estabilizado?
bra $-2 ; si no esta estabilizado,espera
nop ; NOP para terminar de estabilizar el reloj
btfss RCON,POR ; espera a que se estabilice la alimentacion.
bra $+2
movlw .27
call retardo_ms ; retardo de 10 ms para que se estabilize la fuente de alimentación...
movlw b'01000000' ; activa PLL para trabajar a 64Mhz
movwf OSCTUNE ;
;Configura PORTA
clrf PORTA ;inicializa PORTA
clrf LATA ;inicializa LATA
movlw b'00001111' ;PA0,PA1,PA2 y PA3 como entradas
movwf TRISA
movlw b'00001111' ;AN0,AN1,AN2 y AN3 como entradas analogicas
movwf ANCON0,ACCESS
;Configura PORTB
clrf PORTB ;inicializa PORTB
clrf LATB ;inicializa LATB
clrf TRISB ;PORTB como salidas
;Configura PORTC
clrf PORTC ;inicializa PORTC
clrf LATC ;inicializa LATC
setf TRISC ;PORTC como entradas
;Configura PORTD
clrf PORTD ;inicializa PORTD
clrf LATD ;inicializa LATD
setf TRISD ;PORTD como entradas
;movlw b'00000010' ;T5CKI como entrada.para señal de RPM
;movwf TRISD
;bsf PADCFG1,RDPU ;activa resistencias pull-up para el puerto D
;bsf PADCFG1,REPU ;activa resistencias pull-up para el puerto E
;Configura PORTH
clrf PORTH ;inicializa PORTH
clrf LATH ;inicializa LATH
movlw 0x0f
movwf ANCON2 ;I/O digitales
movlw 0x0f
movwf ANCON1 ;I/O digitales
setf TRISH ;PORTH como entradas
;Configura PORTJ
clrf PORTJ ;inicializa PORTJ
clrf LATJ ;inicializa LATJ
movlw b'11111110'
movwf TRISJ ;configura PORTJ
CLRF ADCON0
CLRF ADCON1
;tmr0
movlw b'11000000'
movwf T0CON
;asociado con las interrupciones
; movlw b'00100000'
; movwf INTCON ;habilita interrupciones por desbordamiento de TMR0
bsf RCON,IPEN ;activar interrupciones con prioridad
movlw b'01110000' ;activa pull-up del PORTB,TMR0 con interrupciones baja prioridad,
movwf INTCON2
clrf IPR1 ;prioridades de Interrupcion baja
clrf IPR2 ;prioridades de Interrupcion baja
clrf IPR3 ;prioridades de Interrupcion baja
clrf IPR4 ;prioridades de Interrupcion baja
clrf IPR5 ;prioridades de Interrupcion baja
; clrf IPR6 ;prioridades de Interrupcion baja
;inicializa modulos internos
call EUSART1_INI
;call I2C1_INI
;call OV7670_INI
call SPI1_INI
call ILI_TFT_INI
GIE_LO_OFF
GIE_HI_OFF
;BSF PADCFG1,RDPU
;BSF PADCFG1,RJPU
;<<<<<<<<-------------------------------ENVIO DE DATOS--------------------------->>>>>>>>>>>>>>
PRINCIPAL ;call ILI_TFT_INI
BANK7
movlw UPPER(TFT_CONF_9341)
movwf TBLPTRU
movlw HIGH(TFT_CONF_9341)
movwf TBLPTRH
movlw LOW(TFT_CONF_9341)
movwf TBLPTRL movlw UPPER(TFT_CONF_9341)
movwf TBLPTRU
movlw HIGH(TFT_CONF_9341)
movwf TBLPTRH
movlw LOW(TFT_CONF_9341)
movwf TBLPTRL