TODOPIC
Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: black_flowers en 11 de Abril de 2007, 19:01:03
-
hola cómo se puede implementar esta tabla:
tabla addwf pc , 1
retlw 0
retlw 1
retlw 2
en este codigo?
#include "p16f84a.inc"
bank0 udata
W_save res 1
Status_save res 1
PCLATH_save res 1
FSR_save res 1
contador res 1
segundos res 1
entradas_actuales res 1
entradas_anteriores res 1
PDel0 res 1
PDel1 res 1
minutos res 1
STARTUP code
pagesel main
goto main
nop
InterruptServiceVector
bcf INTCON,GIE ;enmascarar int general
banksel W_save
movwf W_save
movf STATUS,W
clrf STATUS
movwf Status_save
movf PCLATH,w
movwf PCLATH_save
movf FSR,w
movwf FSR_save
Process_ISR
clrwdt
btfsc INTCON,T0IF ; Timer 0
call timer0 ;llamar rutina del t0 (recargar y borrar flag)
EndISR
clrf STATUS ; select bank 0
movf FSR_save,w ; restore the FSR
movwf FSR
movf PCLATH_save,w ; restore PCLATH
movwf PCLATH
movf Status_save,w ; restore Status
movwf STATUS
swapf W_save,f ; restore W without corrupting STATUS
swapf W_save,w
bsf INTCON,GIE ; habilitar int general
retfie
code
main
banksel PORTA
clrf PORTA
banksel PORTB
clrf PORTB
...
como podeis ver es codigo objeto y no tiene la directiva org o sea que tiene que haber otra forma de declarar la tabla dentro de un banko,
que opinais? un saludo
-
como podeis ver es codigo objeto y no tiene la directiva org o sea que tiene que haber otra forma de declarar la tabla dentro de un banko,
que opinais? un saludo
Opino que no se trata de código objeto. El código objeto se un archivo .o que no entenderías tu, sino más bien el linker.
Esto es código escrito en formato "relocatable" o "reubicable"...
-
ok, sí es eso, de todas formas lo que quería saber es cómo declarar una tabla en este tipo de codigo ya que para declarar variables se utiliza res, se utiliza res tambien para tablas o hay otra directiva?
sl2. :-)
-
ok, sí es eso, de todas formas lo que quería saber es cómo declarar una tabla en este tipo de codigo ya que para declarar variables se utiliza res, se utiliza res tambien para tablas o hay otra directiva?
sl2. :-)
Es que no te alcanzo a entender.
¿Te referis a una tabla en RAM o en Memoria de Programa?
-
a ver en otras palabras, estaría bien declarada la tabla de esta manera?: (ah por cierto se trata de una tabla con valores constantes, no de variables).
#include "p16f84a.inc"
bank0 udata
W_save res 1
Status_save res 1
PCLATH_save res 1
FSR_save res 1
contador res 1
segundos res 1
entradas_actuales res 1
entradas_anteriores res 1
PDel0 res 1
PDel1 res 1
minutos res 1
tabla addwf pc , 1
retlw 0
retlw 1
retlw 2
STARTUP code
pagesel main
goto main
nop
....
sl2 :-)
-
Esa 'tabla' debe ir en una sección de código ya que esas constantes serán leídas cuando se llame a una operación de lectura de la tabla.
Debes poner algo así como
page0 code
tabla addwf pc , 1
retlw 0
retlw 1
retlw 2
Donde page0 debe ser una seccion definida en el linker file.
Saludos
-
he declarado así la tabla (compila ok)¿está bien?
#include "p16f84a.inc"
bank0 udata
W_save res 1
Status_save res 1
PCLATH_save res 1
FSR_save res 1
contador res 1
segundos res 1
entradas_actuales res 1
entradas_anteriores res 1
PDel0 res 1
PDel1 res 1
minutos res 1
STARTUP code
pagesel main
goto main
nop
pagina
tabla addwf PCL , 1
retlw 0
retlw 1
retlw 2
InterruptServiceVector
bcf INTCON,GIE ;enmascarar int general
banksel W_save
movwf W_save
movf STATUS,W
clrf STATUS
movwf Status_save
movf PCLATH,w
movwf PCLATH_save
movf FSR,w
movwf FSR_save
Process_ISR
clrwdt
btfsc INTCON,T0IF ; Timer 0
call timer0 ;llamar rutina del t0 (recargar y borrar flag)
EndISR
clrf STATUS ; select bank 0
movf FSR_save,w ; restore the FSR
movwf FSR
movf PCLATH_save,w ; restore PCLATH
movwf PCLATH
movf Status_save,w ; restore Status
movwf STATUS
swapf W_save,f ; restore W without corrupting STATUS
swapf W_save,w
bsf INTCON,GIE ; habilitar int general
retfie
code
lo que no sé es en qué sitio del linkerscript debo declarar "pagina" si como un CODEPAGE o como SECTION. En el primer caso debo especificar la longitud y en el segundo una variable "ROM=?"
me echais una mano?? gracias!! este es el código del linkerscript
// Sample linker command file for 16F84A
// $Id: 16f84a.lkr,v 1.4 2002/01/29 22:10:01 sealep Exp $
LIBPATH .
CODEPAGE NAME=vectors START=0x0 END=0x28 PROTECTED
CODEPAGE NAME=page START=0x29 END=0x3FF
CODEPAGE NAME=.idlocs START=0x2000 END=0x2003 PROTECTED
CODEPAGE NAME=.config START=0x2007 END=0x2007 PROTECTED
CODEPAGE NAME=eedata START=0x2100 END=0x213F PROTECTED
DATABANK NAME=sfr0 START=0x0 END=0xB PROTECTED
DATABANK NAME=sfr1 START=0x80 END=0x8B PROTECTED
DATABANK NAME=gprs START=0xC END=0x4F
SECTION NAME=STARTUP ROM=vectors // Reset and interrupt vectors
SECTION NAME=PROG ROM=page // ROM code space
SECTION NAME=IDLOCS ROM=.idlocs // ID locations
SECTION NAME=CONFIG ROM=.config // Configuration bits location
SECTION NAME=DEEPROM ROM=eedata // Data EEPROM
SECTION NAME=Tabla ROM=vectors // Reset and interrupt vectors
-
El código está bien pero ten cuidado que has ubicado la tabla en el principio del codigo!! ya que la ubicaste en la sección vectors que comienza en 0x00 hasta 0x28. Si usas interrupciones, ten mucho cuidado .
Las secciones te sirven como parámetro previo a poner CODE. Entonces siempre debes declarar un codepage que abarque la porción de memoria que quieres usar y luego la Sección que da un nombre de variable , por así decirlo, que es el que usarás en el código.
Saludos