Macro con el 16f628 para cambiar de BANCO

He visto un programa para el 16f628 que incorpora estas macro para acceder al BANCO 0 y al BANCO 1
Código:
Banco0 macro       ;Macro para el cambio al banco 0
         bcf STATUS,RP0
         bcf STATUS,RP1
         ENDm


Banco1 macro       ;Macro para el cambio al banco 1
         bsf STATUS,RP0
         bcf STATUS,RP1
         ENDm

Lo que no entiendo es que para cambiar de banco se utiliza el RP0, porque motivo incorporan el RP1
 
Lo que pasa es que se usan esos dos bits para cambiar entre los 4 bancos:

RP1 = 0, RP0 = 0 ; Banco 0
RP1 = 0, RP0 = 1 ; Banco 1
RP1 = 1, RP0 = 0 ; Banco 2
RP1 = 1, RP0 = 1 ; Banco 3

Por eso aunque para cambiar entre los bancos 0 y 1 solo se utilice RP0 es mejor también declarar RP1, no vaya a ser que en cualquier caso RP1 sea igual a 1, entonces estarías cambiando entre los bancos 2 y 3.
 
Pasé esa explicación a PDF, el autor es Leon_Elec.

Otra cosa:
¿Si está CALL, para qué una MACRO?

Lo único que veo que las macros no consume stack (pila).
 
Las macros se utilizan para reemplazar una o varias instrucciones que son repetidas a lo largo del todo el programa. Además ayudan a hacer más legible al mismo programa.

En el ejemplo anterior de pepechip, cuando escribe el programa y necesita de cambiar de banco, no tiene que poner las dos instrucciones para lograrlo, solo bastará con que ponga Banco0 o Banco1 y a la hora de compilar el programa el MPASIM reemplazará las macro por las instrucciones equivalentes.
 
Como dice Leon Elec los macros sirven para reemplazar instrucciones que se repiten mucho a lo largo del programa. Para eso también se pueden usar subrutinas utilizando CALL, pero hay veces en las que es mejor usar subrutinas y en otras macros.

La ventaja que yo le veo a los macros es que estos aceptan parámetros de entrada. Eso es algo que con una subrutina no se puede hacer. La desventaja es que cada vez que aparezca un macro en realidad se insertan todas esas líneas de código al programa, asi que hay que tener cuidado con la memoria de programa cuando se usen macros.

Aquí hay una breve explicación sobre los macros.
http://micropic.wordpress.com/2008/03/18/usando-macros/
 
Alguien podria explicarme porque microchip ha implementado 4 bancos si resulta que los 2 primeros contienen ya todos los registros y los 2 ultimos son unas copias de los anteriores pero con menos registros.
Actualmente el banco 2 y 3 parece ser que no sirve para nada.
¿talvez los hayan dejado preparados para una ampliación en un futuro?
 
pepechip dijo:
Alguien podria explicarme porque microchip ha implementado 4 bancos si resulta que los 2 primeros contienen ya todos los registros y los 2 ultimos son unas copias de los anteriores pero con menos registros.
Actualmente el banco 2 y 3 parece ser que no sirve para nada.
¿talvez los hayan dejado preparados para una ampliación en un futuro?

Mirándo bien la página 18, la verdad que tienes razón. Por alguna razón lo hacen.
16F628A

Este otro anda casi igual. Me gusta más el 16F88. Hace más cosas y en C al menos no está limitado no en Flash, EEPROM y RAM.
16F88
 
Hay pics, como el 16F88 que mencionó Meta en el que los bancos 3 y 4 no son copias de los anteriores, en esos bancos hay registros distintos, es por eso que desde el 16f628 (y no se si desde alguno anterior) Microchip está manejando 4 bancos de memoria.

Además si te das cuenta, aunque los bancos 3 y 4 del 16f628 no tengan SFR nuevos si tienen más espacio de registros de propósito general, es decir más espacio de RAM
 
No se compliquen, si usan el assembler del mplab utilicen la macro banksel que genera las instrucciones apropiadas ya sea para un pic10f, pic12, pic16, pic18.
Fíjense en la ayuda del MPASM, pongan en la pestaña índice banksel.

Pagesel también es útil para cuandose tiene que hacer un call a una subrutina o un goto que está en otra página distinta a la instrucción actual.

Con esas dos macros se olvidan de los bancos ram y de las páginas rom.

Si van a usar direccionamiento indirecto (FSR, INDF) use la macro bankisel, para etiquetas en rom pageselw (para GOTO's calculados, o una tabla hecha con RETLW)

Saludos
 
El que parece puesto de gusto es el banco 3.
El banco 2 al menos tiene algunos registros diferentes (48 en el 627(8)A y 80 en el 648A) .
Tal vez se deba a la implementación física, por "simetrías" en el direccionamiento binario.
Como casi todo va de a pares ...

Nota (obvia):
Que un registro esté repetido en todos los bancos sirve para comodidad de acceso, ya que así
no se necesita setear el banco. Ej: el registro INTCON.
 
Simple Example
banksel Var1 ;Select the correct bank for Var1
movwf Var1 ;Write to Var1
Application Example - banksel
This program demonstrates the banksel directive. This directive generates the appropriate code to set/clear the RP0 and RP1 bits of the STATUS register.

#include p16f877a.inc ;Include standard header file
;for the selected device.
group1 udata 0x20 ;group1 data stored at locations
;starting at 0x20 (bank 0).
group1_var1 res 1 ;group1_var1 located at 0x20.
group1_var2 res 1 ;group1_var2 located at 0x21.
group2 udata 0xA0 ;group2 data stored at locations
;starting at 0xA0 (bank 1)
group2_var1 res 1
group2_var2 res 1
RST CODE 0x0 ;The code section named RST
;is placed at program memory
;location 0x0. The next two
;instructions are placed in
;code section RST.
pagesel start ;Jumps to the location labelled
goto start ;'start'.
PGM CODE ;This is the begining of the
;code section named PGM. It is
;a relocatable code section
;since no absolute address is
;given along with directive CODE.
start
banksel group1_var1 ;This directive generates code
;to set/clear bank select bits
;RP0 & RP1 of STATUS register
;depending upon the address of
;group1_var1.
clrf group1_var1
clrf group1_var2
banksel group2_var1 ;This directive generates code
;to set/clear bank select bits
;RP0 & RP1 of STATUS register
;depending upon the address of
;group2_var1.
clrf group2_var1
clrf group2_var2
goto $ ;Go to current line (loop here)
end
Application Example 2 - banksel
#include p16f877a.inc ;Include standard header file
;for the selected device.
banksel TRISB ;Since this register is in bank 1,
;not default bank 0, banksel is
;used to ensure bank bits are correct.
clrf TRISB ;Clear TRISB. Sets PORTB to outputs.
banksel PORTB ;banksel used to return to bank 0,
;where PORTB is located.
movlw 0x55 ;Set PORTB value.
movwf PORTB
goto $
end ;All programs must have an end.

Syntax
pagesel label
Description
An instruction to the linker to generate page selecting code to set the page bits to the page containing the designated label. Only one label should be specified. No operations can be performed on label. label must have been previously defined.

The linker will generate the appropriate page selecting code. For 12-bit instruction width (PIC10F, some PIC12/PIC16) devices, the appropriate bit set/clear instructions on the STATUS register will be generated. For 14-bit instruction width (most PIC12/PIC16) devices, a combination of BSF and BCF commands will be used to adjust bits 3 and 4 of the PCLATH register. If the device contains only one page of program memory, no code will be generated.

For PIC18 devices, this command will do nothing as these devices do not use paging.

Usage
This directive is used in the following types of code: relocatable. For informaciónrmation on types of code, see Assembler Operation.

This directive saves you from having to manually code page bit changes. Also, since it automatically generates code, the code is much more portable.

If you are using relocatable code and your device has more than 2k program memory (or 0.5K for 12-bit instruction width devices), it is recommended that you use this directive, especially when code must jump between two or more code sections.

If you wish to indicate the start address of a RETLW table or a jump table for computed GOTOs, you must use the pageselw directive.

See Also
bankisel banksel
Simple Example
pagesel GotoDest
goto GotoDest
:
pagesel CallDest
call CallDest
Application Example - pagesel
This program demonstrates the pagesel directive, which generates the appropriate code to set/clear PCLATH bits. This allows easier use of paged memory such as found on PIC16 devices.

#include p16f877a.inc ;Include standard header file
;for the selected device.
RST CODE 0x0 ;The code section named RST
;is placed at program memory
;location 0x0. The next two
;instructions are placed in
;code section RST.
pagesel start ;Jumps to the location labelled
goto start ;'start'.
PGM0 CODE 0x500 ;The code section named PGM1 is
;placed at 0x500.
start
pagesel page1_pgm ;address bits 12 & 11 of
;page1_pgm are copied to PCLATH
;4 & 3 respectively.
goto page1_pgm
PGM1 CODE 0x900 ;The code section named PGM1 is
;placed at 0x900. Label
;page1_pgm is located in this
page1_pgm ;code section.
goto $ ;Go to current line (loop here)
end
 
Ojo con las "macro".
Si uno se entusiasma haciendo macros demasiado extensas, y luego se sigue entusiasmando en usarlas en varias partes del programa, el largo del código puede crecer en forma peligrosa.
Eso lleva a tener que usar "pagesel", y otra vez se tiene el mismo problema.
Las macros son prácticas porque permiten pasar argumentos, pero si se deben usar mucho conviene hacer
una macro que acomode los argumentos, y luego llame a una función con "call", donde se realiza la operación extensa.
Ejemplo:
Código:
; ---------------------------------------
... (defines, includes de *.h)
; ---------------------------------------
F_XYZ macro L_literal, x_file, y_file, z_file
  movlw L_literal ; Se copia la constante
  movwf L_VAR
  movfw x_file  ; Se copia el contenido
  movwf X_VAR
  movfw y_file  ; Se copia el contenido
  movwf Y_VAR
  movfw z_file  ; Se copia el contenido
  movwf Z_VAR
  call funcion_xyz  ; Se llama a la función
  endm
; ---------------------------------------
...
; ---------------------------------------
   ORG 0
   goto INICIO
; ---------------------------------------
   ORG 4
... (vector de interrupciones)
; ---------------------------------------
   ORG 5
INICIO
  ... (seteos del arranque)
; ---------------------------------------
LAZO ; Cuerpo que se repite
  ... (otras tareas)
  ...
  ; Acá se usa la macro para llamar a la funcion con argumentos
  ; El primero es una constante y los 3 restantes son direcciones de variables
  F_XYZ 0x03, CAUDAL, PRESION, TEMPERATURA  
  ...
  ... (otras tareas)
  goto LAZO
; ---------------------------------------
funcion_xyz
  ...
  (aquí se usan las variables L_VAR, X_VAR, Y_VAR, Z_VAR)
  ...
  return
  ... (otras funciones)
  ... (includes de *.inc)
; ---------------------------------------
  END
; ---------------------------------------
Editado: Corregí y comenté para remarcar el cuidado al usar argumentos de tipo "literal" o "file"
 
Coincido con Alejandro Sherar.
Una macro es para un lenguaje propio que a uno le quede cómodo/familiar, y agrupar unas pocas instrucciones que hacen una operación sencilla.
 
pic-man dijo:
La ventaja que yo le veo a los macros es que estos aceptan parámetros de entrada. Eso es algo que con una subrutina no se puede hacer. La desventaja es que cada vez que aparezca un macro en realidad se insertan todas esas líneas de código al programa, asi que hay que tener cuidado con la memoria de programa cuando se usen macros.

Aquí hay una breve explicación sobre los macros.
http://micropic.wordpress.com/2008/03/18/usando-macros/

Estube leyendo esta explicación, pero no logro entender a que se refiere con parámetros de entrada. ¿Alguien me lo puede explicar por favor?
 
Alejandro Sherar dijo:
...(Editado)
Las macros son prácticas porque permiten pasar argumentos (en línea), pero si se deben usar mucho conviene hacer que la macro acomode los argumentos, y luego llame a una función con "call", donde se realiza la operación extensa.
Ejemplo: AQUÍ
 
Atrás
Arriba