1. Empezando con el programa
Primero debemos tomar algunas clases generales acerca del
código.
¿Que es el código? El código será la lista de ordenes que seguirá
el micro. En el pondremos todos los pasos que efectuará el
mismo. El PIC es microcontrolador, capaz de seguir nuestras
indicaciones. Otros componentes, son fijos, tales como
compuertas, memorias, etc. Los microcontroladores son
integrados capaces de seguir una secuencia programada. Esto
quiere decir que se programa. ¿Como lo programamos? Nuestra
Pc será la interfase Hombre-Microcontrolador. Todos los
microcontroladores poseen una memoria de programa, en la cual
contendrá todos los pasos a seguir. El código como en cualquier
lista se empezará a leer la primera línea, luego la segunda y así
sucesivamente, salvo que se especifique lo contrario.
El código se escribirá en la ventana en blanco que aparece para
en el MPlab.
Ahora pasaremos a conocer las partes del programa.
En la siguiente sección pondremos en vista un código fuente de
parte de un programa, no vale la pena copiarlo y ejecutarlo ya que
su fin es solo de mostrar las partes de los programas.
Echemos un vistazo al siguiente código:
Listado del PIC
LIST p=16F84
que se utilizará
2. status equ 03h
portb equ 06h
trisb equ 86h
rp0 equ 5
rbie equ 3
Encabezado o
rbif equ 0
header, son las
intcon equ 0bh
equivalencias
loop equ 0dh
loop2 equ 0eh
loop3 equ 0fh
loop4 equ 10h
w equ 00h
goto inicio Código
dormir
bcf intcon,rbif
bsf intcon,rbie
SLEEP
bcf intcon,rbie
bcf intcon,rbif
return
retardo100mS
movlw d'100' Funciones (Ya
movwf loop2 es parte del
finretardo1 código)
nop
nop
nop
nop
nop
call retardo1mS
movlw d'100'
decfsz loop2
goto finretardo1
3. return
Rems: No es
parte del
;****************************************** código son
;* Principal * anotaciones
;****************************************** nuestras. El
compilador las
pasará de largo
inicio
bsf status,rp0
bsf trisb,2
bcf status,rp0 Programa
principal
(Código)
reinicia
call dormir
bsf portb,2
4. call retardo100mS
bcf portb,2
goto reinicia
Sentencia de
end Fin del
programa
No explicaremos instantáneamente todas las partes del programa
pero me parece un buen momento para explicar las header, ya
que estas las tendremos que tener en claro desde el principio.
En el código cuando aparecía:
status equ 03h
portb equ 06h
trisb equ 86h
rp0 equ 5
Lo que queríamos decirle al programa es que cada vez que
escribamos la palabra status, cuando compile el programa lo
cambie por lo que le sigue a equ. Es decir que Status equivaldrá a
03h. Es decir que cada vez que queremos escribir 03
hexadecimal en el código, sera lo mismo poner status. Depende
de donde pondramos la palabra status, esta correspondera a un
numero o correspondera a la direccion 03 de memoria Veamos los
siguientes ejemplos para redondear el tema.
bsf 03h,3
bsf 03h,status
bsf status, 3
(sintaxis: Bsf xxx,b)
Para los que no conocen las instrucciones del asembler, BSF pone
un 1 en el bit b del registro de direccion xxx (si deseas ver mas
acerca de esta instruccion, visita la lista de instrucciones )
5. Volviendo, en los tres ejemplos se realiza lo mismo. En la primera,
el código es confuso, en el segundo tambien pues ese status no
significa mucho que lleve el valor 3 pero aqui se ve que se usa
como constate. en la tercera linea el codigo toma color pues se
pone un 1 en el bit 3 del registro ubicado en la direccion status
(03h).
Por otro lado debemos tener en cuenta que pueden existir varias
header con el mismo valor pero no pueden existir una header con
dos valores.
Volveremos a las partes del programa luego.
¿Como se programa?.
Debemos ser prolijos al programar. En un primer momento solo
nos debe preocupar que es lo que queremos hacer. Organizarnos
en papel y lapiz marcando las partes importantes del codigo
ayudara mucho. Es conveniente el uso de rems pues estos nos
ayudarán en todo momento. Estos no ocupan memoria en el pic
pues no se escriben en él. El uso adecuado de los nombres de
funciones como así también el de las equivalencias nos ayudarán
muchísimo, pues tendremos bien etiquetados todas las partes del
código según el uso que les demos . Escribir un código fuente es
muy fácil, escribir el primer código fuente es muy difícil.
Planeemos un proyecto simple con el 16F84
Que tal si queremos simplemente encender un led ubicado en la
pata uno del integrado (Ra2).
Bien siempre en todo programa de PIC hecho en el MPlab deberá
llevar las siguientes dos líneas:
LIST p=16F84
End
Ok. La primera línea le esta indicando al Mplab que listado de
Microcontrolador se utilizará. Como utilizaremos el Pic 16F84 el
listado deberá ser el mismo.
6. La segunda línea le dirá donde termina el programa.
En el medio de estas dos irá todo el código.
Para encender el led nos basta solo con cuatro líneas más de
código:
LIST p=16F84
bsf 3,5
bcf 85,2
bcf 3,5
bsf 5,2
end
Ja los pesque sin entender nada.
Es fácil. La primera y ultima línea ya la hemos analizado. La
segunda y la quinta son muy parecidas y la tercera y cuarta
también.
Veamos que significa las sentencias bcf y bsf
Bcf: Bit Clear Flag
Bsf: Bit Set Flag.
Esto quiere decir que pondrá una bandera (Flag) o no en algún Bit.
Vemos que cada línea de bxf contiene además dos números. Estos
serán el primero para el registro y el segundo para el numero de
bit.
Es decir que la segunda línea pondrá un uno (una bandera) en el
bit cinco del registro tres.
De la misma manera en la tercera línea de código tendremos que
pondrá en cero el bit dos del registro ochenta y cinco.
Bueno pero que significado tienen los registros 3 y 85 antes
nombrados. Son los registros de "estado" y "Tris A"
7. Es decir que este programa lo que hace es acceder primero al
registro de estado y modificar la paginación de este (Rp0 es el
bit 5 del registro status), de este modo podremos acceder a la
segunda columna de registros. Recordemos que el registro Tris a
esta en el banco uno de los bancos de registro. Luego de eso,
modificamos la entrada-salida Ra2 (Bit 2 del registro tris),
colocando a esta como salida de datos. Ahora debemos volver al
banco cero para poder acceder al registro PortA. Entonces
modificamos la paginación del registro status volviendo el bit 5
(Rp0) a cero. Ahora si estamos preparados para escribir
directamente en el puerto.
Recuerden que por defecto el PIC tendrá a todas la entradas-
salidas (tanto los puertos Ra y Rb), colocadas como entrada de
datos, por eso es que las debemos setear antes de usar (Si uno
intenta escribir una entrada el MPlab no genera ningún error,
simplemente no hace nada).
Esto si lo compilamos y lo simulamos, funciona, pero que pasa si
venimos dentro de unos días y vemos el código nuevamente. Nos
resultará difícil recordar que 03 equivale a status y que 85
equivale a Tris A.
Para ello ordenemos un poco el código y llamemos a las cosas por
su nombre:
LIST p=16F84
Status equ 03h
Rp0 equ 5
TrisA equ 85h
PortA equ 05h
bsf Status,Rp0
bcf TrisA,2
bcf Status,Rp0
8. bsf PortA ,2
end
No es verdad que esta mejor. Y que tal si les ponemos algunas
anotaciones nuestras. Estas llevarán al principio el punto y coma,
entonces de esta manera, el compilador no tomará en cuenta el
resto de la línea:
LIST p=16F84
* Header *
Status equ 03h
Rp0 equ 5
TrisA equ 85h
PortA equ 05h
* Programa Principal *
bsf Status,Rp0
bcf TrisA,2
bcf Status,Rp0
bsf PortA ,2
end ;Este es el fin
Fíjense como se estiro nuestro programa.
En esta parte hemos explicado las sentencias "bsf", "bcf", y
parte de algunos registros como el "TrisA", "PortA" y "Status".
Si queres, Aqui tenes todas las instrucciones del ascembler de
pic bien explicadas.
Que les parece si lo simulamos para ver que es lo que pasaría en
el PIC.