A continuación vamos a desarrollar nuestro primer
programa.
Éste activará un LED conectado a RB0 siempre que el interruptor conectado a RA0
este cerrado.
Para ello vamos a montar el siguiente circuito:

En el circuito podemos ver como lo
único que hemos añadido al circuito base es un pulsador conectado al pin
17 (RA0), de forma que cuando lo pulsemos se introduzca un cero lógico
en el pin y cuando no lo pulsemos se introduzca un uno lógico. Hemos
añadido además un LED con su correspondiente resistencia limitadora de
corriente en el pin 6 (RB0).
De lo que hemos comentado en esta
práctica, caben destacar dos cosas:
- La elección de los pines ha sido arbitraria: se han
escogido éstos, pero podíamos haber escogido otros. No obstante,
mientras sea posible es mejor organizar el esquema y el programa, y
una forma de hacerlo es agrupando por un lado las entrada (Puerta A) y
por otro las salidas (Puerta B). Por la misma razón, hemos escogido el
pin 0 de cada puerta, en vez de escoger en un sitio el 3 y en otro el
7, por ejemplo.
- En el caso de las entradas, es trivial que cuando
se pulse o deje de activar el pulsador se envíe un cero o un uno, pues
lo único que queremos es que el PIC pueda detectar un cambio. Así,
igual nos da comprobar cuando se envía un cero que cuando se envía un
uno, ya que en ambos casos podremos verificarlo. En este caso se ha
elegido el cero como activado porque es lo más común. En el caso de
las salidas no ocurre lo mismo, ya que en este caso no se trata de
detectar un cambio, sino de activar un dispositivo, por lo que se hace
necesaria que el PIC "genere" una diferencia de potencial. Así, la
forma de indicar al PIC que lo haga es poniendo a uno la salida.
Hechas estas aclaraciones, veamos el
programa:
ESTADO EQU 0x03
PORTA EQU 0x05
PORTB EQU 0x06
org 0
bsf ESTADO,5
clrf PORTA
comf PORTA,1
clrf PORTB
bcf ESTADO,5
INICIO btfsc PORTA,0
goto APAGAR
goto ENCENDER
APAGAR bcf PORTB,0
goto INICIO
ENCENDER bsf PORTB,0
goto INICIO
end
Comentemos el código:
- Las tres primeras líneas, cuyo núcleo es EQU,
permiten que el compilador interprete a partir de ese momento los
nombres de la primera columna con las dirección de memoria de la
derecha. El objetivo de estas instrucciones es obvio: facilitar la
comprensión del código, ya que es más fácil recordar un nombre que nos
sugiere algo que dirección en hexadecimal.
- La siguiente instrucción, org 0, no la analizaremos
de momento. Simplemente decir que es necesaria para el correcto
funcionamiento del programa, ya que indica el comienzo del código.
- bsf ESTADO,5 nos permite poner a 1 el bit 5 de
ESTADO, con lo que conseguimos acceder al banco 1, donde se encuentran
los registros de configuración de las puertas.
- clrf PORTA: pone a cero todos los bits del registro
porta, con lo que se consigue que dicha puerta se configure al
completo como salida. En este caso lo usamos conjuntamente con comf,
que transforma los 0 en 1 y viceversa. Así, se consigue configurar la
puerta a como entrada. Podríamos usar otros métodos, como movlw 0xFF
junto con movwf PUERTAA, pero el primero lo considero más elegante.
- clrf PORTB: pone a cero todos los bits del registro
PORTB, configurando éste como salida.
- bcf ESTADO,5 pone a 0 el bit 5 de ESTADO, volviendo
así al banco 0.
- Inicio, apagar y encender son etiquetas, cuya
utilidad es marcar un punto del programa; así, si queremos volver a
ese punto sólo tendremos que hacer referencia a su nombre.
- btfsc PORTA,0 sirve para saltar si el bit 0 de
PORTA vale 0, es decir, cuando se activó el pulsador. En ese caso,
vamos a ENCENDER mediante goto ENCENDER, se pone a 1 el bit 0 de PORTB,
que es donde está conectado el led y volvemos a INICIO.
Si no está pulsado el interruptor vamos a APAGAR, y
hacemos la operación contraria a la anterior. Finalmente volvemos a
INICIO.
Enlaces relacionados
-
Programador de PICs y Memorias
-
Niveles lógicos
-
Tutoriales de computadoras / ordenadores
- Sección de
PICs en nuestros Foros
- Microcontroladores PSOC
< Anterior Siguiente >
Recomendar este Tutorial a un amigo