Configuración de los Puertos del PIC
Llegó el momento de ver como configurar los puertos del PIC. Para poder hacerlo es necesario conocer la tabla de registros de la memoria de datos, la cual como dijimos, está dividida en el BANCO 0 y BANCO 1.
Los registros importantes en la configuración de los puertos son:
STATUS dirección 0x3
PORTA dirección 0x5
PORTB dirección 0x6
TRISA dirección 0x5
TRISB dirección 0x6
Por defecto el PIC tendrá todos los I/O port's (es decir los puertos RA y RB), colocados como entrada de datos, y si queremos cambiarlos habrá que configurarlos.
Al configurar los puertos deberás tener en cuenta que:
Si asignas un CERO (0) a un pin, éste quedará como salida y...
Si le asignas un UNO (1), quedará como entrada
Esta asignación se hace en:
TRISA para los pines del PUERTO A (5 bits)
TRISB para los pines del PUERTO B (8 bits)
Por Ejemplo:
Si TRISA es igual a 11110 todos sus pines serán entradas salvo RA0 que esta como salida
Si TRISB es igual a 00000001 todos sus pines serán salidas salvo RB0 que esta como entrada
Cuando el PIC arranca se encuentra en el BANCO 0, como TRISA y TRISB están en el BANCO 1 no queda otra, deberemos cambiar de banco. Esto se logra a través del Registro STATUS
STATUS es un Registro de 8 bits u 8 casillas, en el cual la Nº 5 (RP0) define la posición del banco en donde nos encontramos
Si pones un CERO (0) a RP0 estaremos en el BANCO 0
Si le pones un UNO (1) ya ves, estaremos en el BANCO 1
REGISTRO STATUS | |||||||
---|---|---|---|---|---|---|---|
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
IRP | RP1 | RP0 | TO | PD | Z | DC | C |
Listo, ahora ya sabemos como configurar los puertos, pero lo aclararemos con un ejemplo completo.
Vamos a escribir un código que configure todos los pines del puerto A como entrada y todos los del puerto B como salida.
;---------------Encabezado-------------
list p=16f84 ; usaremos el PIC 16f84
radix hex ; y la numeración hexadecimal
;------------mapa de memoria---------
estado equ 0x03 ; Aquí le asignamos nombres a los
trisa equ 0x05 ; registros indicando la posición
trisb equ 0x06 ; en la que se encuentran
;-------Configuración de puertos-------
reset org 0x00 ; origen del programa, aquí comenzaré
; siempre que ocurra un reset
goto inicio ; salto a "inicio"
org 0x05 ; origen del código de programa
inicio bsf estado,5 ; pongo rp0 a 1 y paso al banco1
movlw b'11111' ; cargo W con 11111
movwf trisa ; y paso el valor a trisa
movlw b'00000000' ; cargo W con 00000000
movwf trisb ; y paso el valor a trisb
bcf estado,5 ; pongo rp0 a 0 y regreso al banco0
;------------------------------------------
end ; se acabó
;------------------------------------------
Descripción del código:
Todo lo que escribas luego de un ";" (punto y coma) será ignorado por el ensamblador, estos son los famosos comentarios, y sirve para saber que hace cada línea de código.
Dicho esto no queda más que describir el código, así que vamos por partes.
;---------------Encabezado-------------
list p=16f84 ; usaremos el PIC 16f84
radix hex ; y la numeración hexadecimal
Aquí le indicas al ensamblador para que microcontrolador estas codificando (PIC16F84). y cual será el sistema de numeración que utilizarás (hexadecimal).
Nota que hay tres columnas, en este caso la primera está vacía. Respeta las tabulaciones para no confundir al ensamblador.
;------------mapa de memoria---------
estado equ 0x03 ; Aquí le asignamos nombres a los
trisa equ 0x05 ; registros indicando la posición
trisb equ 0x06 ; en la que se encuentran
Recuerdas lo de la memoria de datos...? Bien, al registro STATUS, que está en la posición 0x03 de la memoria de datos le puse la etiqueta "estado". equ es algo así comoooo...igual . (Es decir, le estoy asignando el nombre estado al registro que está en la posición 0x03 de la memoria de datos).
Luego hice lo mismo con trisa y trisb. Ahora sigamos...
;-------Configuración de puertos-------
reset org 0x00 ; origen del programa, aquí comenzaré
; siempre que ocurra un reset
goto inicio ; salto a "inicio"
org 0x05 ; origen del código de programa
inicio bsf estado,5 ; pongo rp0 a 1 y paso al banco1
movlw b'11111' ; cargo W con 11111
movwf trisa ; y paso el valor a trisa
movlw b'00000000' ; cargo W con 00000000
movwf trisb ; y paso el valor a trisb
bcf estado,5 ; pongo rp0 a 0 y regreso al banco0
La directiva org indica el sitio de la memoria en donde se escribe una parte del programa. En este caso el contador de programa apuntará a la dirección 0x00 (reset) entonces ejecutará la instrucción que sigue a continuación, (saltar a la etiqueta inicio) y nuestro código de programa comienza en la dirección de memoria 0x05 (aquí salto por encima de la interrupción 0x04)
BSF (SET FILE REGISTER), es la instrucción que pone un uno en el bit del registro especificado, en este caso pone a uno el bit 5 del registro STATUS (el rp0), para pasar al banco 1.
movlw es algo así como... mueve el siguiente literal al Registro W.
W es el Registro de Trabajo, y lo usamos para almacenar momentáneamente los datos que queremos mover. una vez hecho esto pasamos el dato a trisa, o a trisb, según el caso.
movwf es algo así como... mueve el contenido del registro W al registro f, en este caso f sería trisa o trisb.
BCF (BIT CLEAR FILE REGISTER), ésta instrucción limpia el bit del registro especificado, o lo pone a cero, en este caso pone a cero el bit 5 del registro STATUS para regresar al banco 0.
;------------------------------------------
end ; se acabó
;------------------------------------------
Fue suficiente por hoy...
R-Luis...