Beruflich Dokumente
Kultur Dokumente
Pin 4 (MCLR / Vpp): Es una pin de múltiples aplicaciones, es la entrada de Reset (master clear) si
está a nivel bajo y también es la habilitación de la tensión de programación cuando se está
programando el dispositivo. Cuando su tensión es la de VDD el PIC funciona normalmente.
Pines 5 y 14 (VSS y VDD): Son respectivamente las pines de masa y
alimentación. La tensión de alimentación de un PIC está comprendida entre
2V y 6V aunque se recomienda no sobrepasar los 5.5V.
Los registros que vamos a usar mas comunes en el Banco 1 son STATUS,
TRISA y TRISB. El primero permite volver al Banco 0, TRISA nos permite
establecer los pines que serán entradas y los que serán salidas del
Puerto A, TRISB nos permite establecer los pines que serán entradas y
los que serán salidas del puerto B.
STATUS
Para cambiar del Banco 0 al Banco 1 utilizamos el
registro STATUS. Hacemos esto poniendo el bit 5 del
registro STATUS a 1. Para cambiar de nuevo al Banco
0, ponemos el bit 5 del registro STATUS a 0. El
registro STATUS se localiza en la dirección 03h (la 'h'
significa que el número es hexadecimal).
Entonces en el puerto A tenemos 5 pines, por tanto 5 bits. Si deseamos poner uno de
los pines como entrada, enviamos un 1 al bit en cuestión. Si deseamos poner uno de
los pines como salida, ponemos un 0 en ese bit. Los bits están definidos de manera
correspondiente con los pines, en otras palabras el bit 0 es el RA0, el bit 1 es el RA1, el
bit 2 es el RA2, y así sucesivamente. Vamos a tomar un ejemplo. Si queremos poner
RA0, RA3 y RA4 como salidas, y RA1 y RA2 como entradas, enviamos esto: 00110
(06h). Date cuenta de que el bit cero está a la derecha, como se muestra aquí:
PORTA y PORTB
Para poner uno de nuestros pines de salida a nivel alto, simplemente
ponemos un 1 el bit correspondiente en nuestro registro PORTA o
PORTB.
El formato es el mismo que para los registros TRISA y TRISB. Para leer
si un pin está a nivel alto o nivel bajo en los pines de nuestro puerto,
podemos ejecutar un chequeo para ver si el bit en particular
correspondiente esta puesto a nivel alto (1) o está puesto a nivel bajo
(0).
W
El registro W es un registro de propósito general al cual le
puedes asignar cualquier valor que desees. Una vez que has
asignado un valor a ese registro, puedes sumarle cualquier
otro valor, o moverlo. Si le asignas otro valor a W, su
contenido es sobrescrito.
Estamos poniendo el valor binario 00110 (la letra 'b' significa que el número
está en binario) en nuestro registro de propósito general W.
Podríamos haber hecho esto en hexadecimal, en cuyo caso nuestra
instrucción hubiese sido:
.
Nota:
De momento ya hemos visto 4 instrucciones.
¡Solo nos quedan 31 para terminar!
Cómo escribir en los puertos
.
Para apagarlo
.
Bucles de Retardo
Pregunta
.
Esta instrucción dice "resta 1 al registro (en esta
caso CONTADOR). Si llegamos a cero, salta 2 lugares
hacia delante"[Nota de la traducción: El valor que le
sigue a la coma, indica donde debe almacenarse el
resultado de la operación. Si es 1, como en el
ejemplo anterior, el resultado se almacena en el
mismo registro indicado en la instrucción, y si es 0 el
resultado se almacena en el registro w.]
Lo que hemos hecho es primero poner nuestra constante
CONTADOR a 255. La siguiente linea pone una etiqueta,
llamada ETIQUETA seguida de nuestra instrucción decfsz. La
instrucción decfsz CONTADOR,1 disminuye el valor de
CONTADOR en 1, y almacena el resultado de vuelta en
CONTADOR. También comprueba si CONTADOR tiene un valor
de 0. Si no lo tiene, hace que el programa salte a la siguiente
linea. Aquí tenemos una instrucción de 'goto' que nos envía
de vuelta a nuestra instrucción decfsz. Si el valor de
CONTADOR es igual a cero, entonces la instrucción decfsz hace
que el programa salte dos lugares hacia adelante, y se sitúe
donde hemos escrito "Continua por aquí". Así que, como
puedes ver, hemos hecho que el programa permanezca en un
lugar durante un tiempo predeterminado antes de seguir
adelante. Esto se llama bucle de retardo.
Subrutinas
Vamos a ver esto con algo más de detalle. Cuando alcanzamos la parte
de nuestro programa que dice CALL xxx, donde xxx es el nombre de
nuestra subrutina, el programa salta a donde quiera que resida la
subrutina xxx. Las instrucciones dentro de la subrutina se ejecutan.
Cuando se alcanza la instrucción RETURN, el programa salta de vuelta
a nuestro programa principal, justo a la instrucción que va
inmediatamente después de nuestra instrucción CALL xxx.
Se puedes llamar a la misma subrutina tantas veces como quieras, esa
es la razón por la que utilizar subrutinas reduce el tamaño total de
nuestro programa. Sin embargo, hay dos cosas que debes tener en
cuenta. La primera, igual que en tu programa principal, cualquier
constante debe ser declarada antes de utilizarla. Pueden ser
declaradas dentro de la subrutina misma, o justo al comienzo del
programa principal. Recomendaríamos que declarases todo al
comienzo del programa principal, para que así sepas que todo se
encuentra en el mismo sitio. Lo segundo, te debes asegurar de que el
programa principal pasa por alto la subrutina. Lo que queremos decir
con esto es que si pones la subrutina justo al final del programa
principal, a menos que uses una instrucción 'goto' para saltar la
subrutina, el programa seguirá y ejecutará la subrutina tanto si quieres
como si no. El PIC no diferencia entre una subrutina y el programa
principal.
Importante:
Mediante el uso de la subrutina, hemos
reducido el uso de memoria del PIC
Cómo leer de los puertos E/S
.
Conmutador en ingles el término original es "switch"
Ahora hemos puesto el bit 0 del puerto A como entrada. Lo que necesitamos hacer
ahora es comprobar si el pin está a nivel alto o a nivel bajo. Para ello, podemos usar
una de estas dos instrucciones: BTFSC y BTFSS.
La instrucción BTFSC significa "Haz una comprobación de bit en el registro y bit que
especificamos. Si es un 0, entonces sáltate la siguiente instrucción".
La instrucción BTFSS significa "Haz una comprobación de bit en el registro y bit que
especificamos. Si es un 1, entonces sáltate la siguiente instrucción".
El programa solo se moverá hacia 'Continua por aquí' si el bit 0 del puerto A se pone a
1.
Lo que hemos hecho aquí es encender el LED.
Después comprobar si el conmutador está
cerrado. Si está cerrado, entonces hacemos una
llamada a nuestra subrutina de retardo. Esto nos
da el mismo retardo que anteriormente, pero
ahora la estamos llamando dos veces. Lo mismo
pasa cuando el LED está apagado. Si el
conmutador no está cerrado, entonces tenemos
nuestros tiempos de encendido y apagado como
antes.
Nota:
A B Salida
0 0 0
0 1 1
1 0 1
1 1 0
Si mantenemos el valor de A igual a 1, y hacemos OR
exclusiva entre él y el valor de la salida anterior, la salida
resultante conmuta. Para los que no lo vean de este
modo en la tabla de verdad, aquí está utilizando binario:
Valor de salida actual => 0
OR-Ex con él y con 1 => 1 ; 1 es el nuevo valor de salida.
OR-EX con él y con 1 => 0 ; 0 es el nuevo valor de salida.
OR-Ex con él y con 1 => 1 ; 1 es el nuevo valor de salida.
.... así sucesivamente.
Lo que estamos haciendo aquí es cargar nuestro registro
w con 02h. Después le hacemos una OR exclusiva a este
número que hay en w con lo que quiera que esté en
nuestro registro del puerto A. Si el bit 1 es 1, cambiará a
0. Si el bit 1 es 0, cambiará a 1. [Nota de la traducción: El
número que va después del registro especificado en la
instrucción XORWF, indica donde debe de ser almacenado
el resultado de dicha operación OR exclusiva. Si, como
ocurre en este ejemplo anterior, ponemos un 1, el
resultado se almacenará de vuelta en el registro de
memoria especificado. Si ponemos un 0, el resultado de la
operación OR exclusiva se almacenaría en el registro w]
PORTA w
00010 00010
xorwf 00000
xorwf 00010
xorwf 00000
xorwf 00010
Operadores Lógicos y Aritméticos
AND
La función AND simplemente compara dos bits y produce un 1
si son iguales, y 0 si son diferentes. Por ejemplo, si decimos 1
AND 1, el resultado es 1, mientras que si decimos 1 AND 0 el
resultado será 0. Por supuesto, podemos comparar palabras
(o bytes) también, y la función AND hace esta comparación de
ambas bit a bit. El ejemplo de más abajo muestra dos palabras
de 8 bits a las que se aplica AND con el siguiente resultado:
11001011
AND 10110011
Igual a 10000011
tabla de verdad de esta función
A B Resultado de AND
0 0 0
0 1 0
1 0 0
1 1 1
.
ANDWF nos permite hacer una función AND con los
contenidos del registro W y otro registro, como por
ejemplo un puerto. Las sintaxis es: ANDWF
<registro>,d ; donde <registro> es el registro en el
que estamos interesados, por ejemplo PORTA, y d
dice al PIC donde almacenar el resultado. Si d=0, el
resultado se almacena en el registro W, y si d=1 el
resultado se almacena en ese registro especificado.
.
OR
Ya vimos una función OR, llamada XOR. Esta produce un 1
si dos bits son diferentes, pero no si son iguales. Hay una
segunda función OR llamada IOR, la cual es OR inclusiva.
La función produce un 1 si cualquiera de los dos bits es 1,
pero también si ambos bits son 1.
tabla de verdad
A B Resultado de OR
0 0 0
0 1 1
1 0 1
1 1 1
ADD
ADD
Esta función exactamente lo que dice [Nota de la traducción: "Add" en
ingles significa sumar] ¡Suma dos números! Si el resultado de sumar
dos números excede de 8 bits [Nota de la traducción: 8 bits pueden
contener un valor máximo de 255 en decimal], entonces se activará un
flag llamado CARRY [Nota de la traducción: "flag" en castellano se
podría traducir por banderín, y normalmente se trata de 1 bit que se
ubica en un registro en concreto de la memoria del PIC. "CARRY" en
castellano puede traducirse como "llevar", podría ser como cuando
hacemos una cuenta a mano y utilizamos la expresión "me llevo una".].
El flag de CARRY está localizado en el bit 0 de la dirección de memoria
03h. Si este bit se activa, quiere decir que la suma de esos 2 números
excedió de 8 bits. Si es 0, entonces el resultado queda dentro de los 8
bits.
De nuevo, el PIC nos da dos modalidades de ADD, que son ADDLW y
ADDWF. Como puedes suponer, es muy similar a la función anterior.
ADDLW añade los contenidos del registro W con un
número que le especifiquemos. La sintaxis es:
ADDLW <número>
SUBLW <número>
BCF
BCF <registro>,<bit>
BSF
BSF <registro>,<bit>
BTFSC
BTFSC <registro>,<bit>
BTFSS
BTFSS <registro>,<bit>
CLRF
Esta instrucción pondrá todos los bits del
contenido de un registro a 0. La sintaxis es:
CLRF <registro>
CLRW
Es similar a la instrucción CLRF, excepto en que
solo pone a 0 el registro W. La sintaxis es
bastante sencilla: CLRW
RLF y RRF