Manualpic PDF
Manualpic PDF
Manualpic PDF
Contenido:
CAPITULO 1
CAPITULO 2
CAPITULO 3
CAPITULO 4
Experimentos Introductorios
CAPITULO 5
Experimentos avanzados
1.1 Arquitectura Harvard La arquitectura tradicional:
La arquitectura tradicional de computadoras y microprocesadores se basa en el esquema
propuesto por John Von Neumann, en el cual la unidad central de proceso, o CPU, esta
conectada a una memoria única que contiene las instrucciones del programa y los datos
(figura 1.1.1). El tamaño de la unidad de datos o instrucciones esta fijado por el ancho del
bus de la memoria. Es decir que un microprocesador de 8 bits, que tiene además un bus
de 8 bits que lo conecta con la memoria, deberá manejar datos e instrucciones de una o
más unidades de 8 bits (bytes) de longitud. Cuando deba acceder a una instrucción o dato
de más de un byte de longitud, deberá realizar más de un acceso a la memoria. Por otro
lado este bus único limita la velocidad de operación del microprocesador, ya que no se
puede buscar de memoria una nueva instrucción, antes de que finalicen las transferencias
de datos que pudieran resultar de la instrucción anterior. Es decir que las dos principales
limitaciones de esta arquitectura tradicional son :
a) que la longitud de las instrucciones esta limitada por la unidad de longitud de los datos,
por lo tanto el microprocesador debe hacer varios accesos a memoria para buscar
instrucciones complejas,
a) que el tamaño de las instrucciones no esta relacionado con el de los datos, y por lo
tanto puede ser optimizado para que cualquier instrucción ocupe una sola posición de
memoria de programa, logrando así mayor velocidad y menor longitud de programa,
b) que el tiempo de acceso a las instrucciones puede superponerse con el de los datos,
logrando una mayor velocidad de operación.
Una pequeña desventaja de los procesadores con arquitectura Harvard, es que deben
poseer instrucciones especiales para acceder a tablas de valores constantes que pueda ser
necesario incluir en los programas, ya que estas tablas se encontraran físicamente en la
memoria de programa (por ejemplo en la EPROM de un microprocesador).
Los microcontroladores PIC 16C5X, 16CXX y 17CXX poseen arquitectura Harvard, con una
memoria de datos de 8 bits, y una memoria de programa que, según el modelo, puede ser
de 12 bits para los 16C5X, 14 bits para los 16CXX y 16 bits para los 17CXX.
Los registros de propósito general se dividen en dos grupos : los registros de posición fija
y los bancos de registros. Los primeros ocupan las 8 posiciones que van de la 08 a la 0F.
los bancos de registros consisten en hasta cuatro grupos o bancos de 16 registros cada
uno, que se encuentran superpuestos en las direcciones que van de la 10 a la 1F. Se
puede operar con un solo banco a la vez, el cual se selecciona mediante los bits 5 y 6 del
File Select Register (FSR)
FIG. 1.3.1 Organización de la memoria Interna (RAM) en la familia PIC16C5X
Memoria de Programa
Organización
La memoria de programa, que en los PIC16C5X puede ser de 512 a 2K instrucciones, debe
ser considerada a los efectos de la programación, como compuesta por secciones o
páginas de 512 posiciones. A su vez cada página debe considerarse dividida en dos
mitades de 128 posiciones cada una. Esto se debe, como se verá, a las limitaciones de
direccionamiento de las instrucciones de salto
FIG. 1.3.2 Organización de la memoria de programa en la familia PIC16C5X
En la memoria de datos de los PIC’s se encuentran ubicados casi todos los registros de
control del microprocesador y sus periféricos autocontenidos, y también las posiciones de
memoria de usos generales. En el caso de los 16C5X, algunos registros especiales de solo
escritura (TRIS y OPTION) no están accesibles dentro del bloque de memoria de datos,
sino que solo se pueden cargar desde el registro W por medio de instrucciones especiales.
Contador de Programa
Este registro, normalmente denominado PC, es totalmente equivalente al de todos los
microprocesadores y contiene la dirección de la próxima instrucción a ejecutar. Se
incrementa automáticamente al ejecutar cada instrucción, de manera que la secuencia
natural de ejecución del programa es lineal, una instrucción después de la otra. Algunas
instrucciones que llamaremos de control, cambian el contenido del PC alterando la
secuencia lineal de ejecución. Dentro de estas instrucciones se encuentran el GOTO y el
CALL que permiten cargar en forma directa un valor constante en el PC haciendo que el
programa salte a cualquier posición de la memoria. Otras instrucciones de control son los
SKIP o “salteos” condicionales, que producen un incremento adicional del PC si se cumple
una condición especifica, haciendo que el programa saltee, sin ejecutar, la instrucción
siguiente.
Al resetearse el microprocesador, todos los bits del PC toman valor 1, de manera que la
dirección de arranque del programa es siempre la ultima posición de memoria de
programa. En esta posición se deberá poner una instrucción de salto al punto donde
verdaderamente se inicia el programa.
Stack
En los microcontroladores PIC el stack es una memoria interna dedicada, de tamaño
limitado, separada de las memorias de datos y de programa, inaccesible al programador, y
organizada en forma de pila, que es utilizada solamente, y en forma automática, para
guardar las direcciones de retorno de subrrutinas e interrupciones. Cada posición es de 11
bits y permite guardar una copia completa del PC. Como en toda memoria tipo pila, los
datos son accedidos de manera tal que el primero que entra es el ultimo que sale.
En los 16C5X el stack es de solo dos posiciones, mientras que en los 16CXX es de 8
posiciones y en los 17CXX es de 16 posiciones. Esto representa, en cierta medida, una
limitación de estos microcontroladores, ya que no permite hacer uso intensivo del
anidamiento de subrutinas. En los 16C5X, solo se pueden anidar dos niveles de subrutinas,
es decir que una subrutina que es llamada desde el programa principal, puede a su vez
llamar a otra subrutina, pero esta ultima no puede llamar a una tercera, porque se
desborda la capacidad del stack, que solo puede almacenar dos direcciones de retorno.
Esto de hecho representa una traba para el programador y además parece impedir o
dificultar la programación estructurada, sin embargo es una buena solución de
compromiso ya que estos microcontroladores están diseñados para aplicaciones de alta
velocidad en tiempo real, en las que el overhead (demoras adicionales) que ocasiona un
excesivo anidamiento de subrutinas es inaceptable. Por otra parte existen técnicas de
organización del programa que permiten mantener la claridad de la programación
estructurada, sin necesidad de utilizar tantas subrutinas anidadas.
7 6 5 4 3 2 1 0 Registro
STATUS
El bit Z indica que el resultado de la ultima operación fue CERO. El bit C indica acarreo del
bit más significativo (bit 7) del resultado de la ultima operación de suma. En el caso de la
resta se comporta a la inversa, C resulta 1 si no hubo pedido de préstamo. El bit DC (digit
carry) indica acarreo del cuarto bit (bit 3) del resultado de la ultima operación de suma o
resta, con un comportamiento análogo al del bit C, y es útil para operar en BCD (para
sumar o restar números en código BCD empaquetado). El bit C es usado además en las
operaciones de rotación derecha o izquierda como un paso intermedio entre el bit 0 y el
bit 7.
El bit PD (POWER DOWN) sirve para detectar si la alimentación fue apagada y encendida
nuevamente, tiene que ver con la secuencia de inicialización, el watch dog timer y la
instrucción sleep, y su uso se detallara en la sección referida al modo POWER DOWN. El
bit TO (TIME-OUT) sirve para detectar si una condición de reset fue producida por el
watch dog timer, esta relacionado con los mismos elementos que el bit anterior y su uso
se detallara en la sección referida al WATCH DOG TIMER. Los bits de selección de pagina
PA0/PA1/PA2 se utilizan en las instrucciones de salto GOTO y CALL, y se explicaran con
detalle en la sección referida a las instrucciones de control, y a la organización de la
memoria de programa. En realidad en el 16C54 estos bits no se usan y sirven para
propósitos generales. En el 16C57 el PA0 si se usa pero los otros dos no. En el 16C55 se
utilizan PA0 y PA1. PA2 esta reservado para uso futuro y en cualquiera de los PIC 16C5X
sirve para propósitos generales.
Las ocho primeras posiciones del área de datos están reservadas para alojar registros de
propósito especial, quedando las restantes libres para contener los datos u operandos que
se desee (registros de propósito general).
El PC ocupa la posición 2 del área de datos en donde se halla el registro PCL al que se
añaden 3 bits auxiliares y se conectan con los dos niveles de la Pila en las instrucciones
CALL y RETLW.
El registro de Estado ocupa la posición 3 y entre sus bits se encuentran los señalizadores
C, DC y Z y los bits PA1 y PA0 que seleccionan la página en la memoria de programa. El
bit 7 (PA2) no está implementando en los PIC de la gama baja.
FRS se ubica en la dirección 4 y puede usarse para contener las dirección del dato en las
instrucciones con direccionamiento indirecto y también para guardar operandos en sus 5
bits de menos peso.
Los registros que ocupan las posiciones 5 ,6 y 7 soportan los Puertos A, B y C de E/S.
Pueden ser leídos y escritos como cualquier otro registro y manejan los valores de los bits
que entran y salen por los pines de E/S del microcontrolador.
1.5 Puertos de entrada / salida Los microprocesadores PIC16C5X tienen dos o tres
puertos de entrada/salida paralelo de usos generales llamados Puerto A, Puerto B y Puerto
C. El Puerto A es de cuatro bits y los demás son de 8 bits cada uno. El Puerto C solamente
esta disponible en el 16C55 y el 16C57.
Circuito equivalente
El circuito equivalente de un bit cualquiera de un puerto de entrada salida es el siguiente
El latch L1 corresponde a un bit del registro de datos del puerto, mientras que L2 es un bit
del registro de control de tristate del mismo. B1 es el buffer tristate de salida que tiene
capacidad de entregar 20 mA y drenar 25 mA. B1 es controlado por L2. Si L2 tiene
cargado un “1”, B1 se encuentra en tri-state, es decir con la salida desconectada (en alta
impedancia), y el puerto puede ser usado como entrada. Si L2 tiene cargado un “0”, la
salida de B1 esta conectada (baja impedancia) y el puerto esta en modo de salida. B2 es
el buffer de entrada, es decir el que pone los datos en el bus interno del microcontrolador
cuando se lee el registro de datos del puerto. Puede verse que el dato leído es
directamente el estado del pin de entrada
En el esquema se puede observar claramente como operan los bits de configuración T0SE,
T0CS y PSA, en cualquiera de sus combinaciones. Se observa además que en la entrada
del contador RTCC hay un circuito de sincronización que introduce una demora de dos
ciclos del clock de instrucciones (Fosc. / 4). Al escribir sobre el RTCC automáticamente se
resetea este circuito, por lo tanto solo se incrementara dos ciclos después.
Existen de tres a doce eventos que pueden generar interrupciones en los PIC16CXX
existentes hasta el momento, pero nada impide que puedan agregarse más en versiones
futuras.
Funcionamiento
En los 16CXX las interrupciones se comportan casi exactamente igual que las subrutinas.
Desde el punto de vista del control del programa, al producirse una interrupción se
produce el mismo efecto que ocurriría si el programa tuviese un CALL 0004h en el punto
en que se produjo la interrupción. En uno de los registros de control del sistema de
interrupciones existe un bit de habilitación general de interrupciones GIE, que debe ser
programado en 1 para que las interrupciones puedan actuar. Al producirse una
interrupción, este bit se borra automáticamente para evitar nuevas interrupciones. La
instrucción RETFIE que se utiliza al final de la rutina de interrupción, es idéntica a un
retorno de subrutina, salvo que además coloca en uno automáticamente el bit GIE
volviendo a habilitar las interrupciones. Dentro de la rutina de interrupción, el programa
deberá probar el estado de los flags de interrupción de cada una de las fuentes
habilitadas, para detectar cual fue la que causo la interrupción y así decidir que acción
tomar.
Fuentes
La señal que produce la interrupción es en realidad una sola, que resulta de la
combinación de todas las fuentes posibles y de los bits de habilitación. Existen dos grupos
de fuentes, unas que se habilitan con solo colocar en uno el bit GIE, y otras que además
necesitan que este puesto a uno el bit PEIE. En algunas versiones de los 16CXX solo existe
el primer grupo. Además, cada fuente de interrupciones tiene su respectivo bit de
habilitación individual.
Las fuentes de interrupción varían con cada versión, y pueden ser por ejemplo:
· Interrupción externa por pin RB0/INT
· Desborde del Timer 0 o RTCC
· Cambio en el estado de los bits 4 a 7 del puerto B
· Desborde del timer 1
· Desborde del timer 2
· Interrupción del capture/compare 1
· Interrupción del capture/compare 2
· transmisión o recepción de un caracter por la interface serie sincrónica
· transmisión o recepción de un caracter por la interface serie asincrónica
· Fin de conversión A/D
· Lectura/escritura del puerto paralelo de comunicación con otros microprocesadores
· Escritura de EEPROM finalizada
Programa fuente:
El programa fuente esta compuesto por una sucesión de líneas de programa. Cada línea
de programa esta compuesta por 4 campos separados por uno o más espacios o
tabulaciones. Estos campos son:
El campo de parámetros puede contener uno o más parámetros separados por comas. Los
parámetros dependen de la instrucción o directiva. Pueden ser números o literales que
representen constantes o direcciones.
El campo de comentario debe comenzar con un caracter punto y coma. No necesita tener
espacios o tabulaciones separándolo del campo anterior, e incluso puede empezar en la
primer posición de la línea. El compilador ignora todo el texto que contenga la línea
después de un caracter punto y coma. De esta manera pueden incluirse líneas que
contengan solo comentarios, y es muy buena práctica hacer uso y abuso de esta
posibilidad para que los programas resulten autodocumentados.
0 1 2 3 4 5 6 7 8 9 10 11
d f f f f f
Las instrucciones siguientes son las tres operaciones lógicas de doble operando :
A continuación siguen las dos instrucciones de rotación de bits a través del CARRY :
En estas operaciones (Rotate Left File y Rotate Right File) los bits son desplazados de
cada posición a la siguiente, en sentido derecho o izquierdo. El desplazamiento es cerrado,
formando un anillo, con el bit C (CARRY) de la palabra de estado.
En estas dos instrucciones, el único bit afectado de la palabra de estado del procesador es
el bit C, que tomará el valor que tenia el bit 7 o el bit 0, según sea el sentido del
desplazamiento.
Estas instrucciones son muy útiles para la manipulación de bits, y además para realizar
operaciones aritméticas, ya que en numeración binaria, desplazar un número a la
izquierda es equivalente a multiplicarlo por 2, y hacia la derecha, a dividirlo por 2.
La instrucción siguiente realiza el intercambio de posiciones entre los cuatro bits menos
significativos y los cuatro más significativos (nibble bajo y nibble alto).
Esta instrucción (SWAP File) no afecta ninguno de los bits de la palabra de estado del
procesador.
Esta instrucción es muy útil para el manipuleo de números BCD empaquetados, en los que
en un solo byte se guardan dos dígitos BCD (uno en cada nibble).
Ejemplos :
1010 0010 1101 0000
+ 0100 1111 C DC Z + 0110 1111 C DC Z
1111 0001 0 1 0 0011 1111 1 0 0
La resta se realiza sumando, en binario puro sin signo, el registro f más el complemento a
dos de W (el complemento a 1, o complemento lógico, más 1)
Ejemplos :
f 0100 0100 0010 1000
W - 0010 1000 C DC Z - 0100 0100 C DC Z
0001 1100 1 0 0 1110 0100 0 1 0
equivalente a :
f 0100 0100 0010 1000
cmp.2 W + 1101 1000 C DC Z + 1011 1100 C DC Z
0001 1100 1 0 0 1110 0100 0 1 0
Las instrucciones que siguen son de simple operando, pero son casos especiales ya que el
destino es siempre el registro seleccionado :
La instrucción CLRF (CLeaR File) afecta solo al bit Z que resulta siempre 0.
La instrucción MOVWF (MOVe W a F) no afecta ningún bit de la palabra de estado.
0 1 2 3 4 5 6 7 8 9 10 11
k k k k k k k k
Las tres instrucciones que siguen son las operaciones lógicas tradicionales, similares a las
que ya vimos anteriormente, pero realizadas entre una constante de programa y el
registro W :
La instrucción que sigue sirve para cargar una constante de programa en el registro W :
Esta (MOVe Literal W) instrucción no afecta ninguno de los bits de estado del procesador.
Al igual que en la instrucción CLRF, el único bit de estado afectado es el Z que resulta 1.
Instrucciones de Bit
El formato genérico de estas instrucciones es el siguiente :
0 1 2 3 4 5 6 7 8 9 10 11
b b b f f f f f
Estas instrucciones (Bit Clear File y Bit Set File) no afectan ningún bit de la palabra de
estado del procesador.
Instrucciones de Control
Esta (RETurn con Literal in W) instrucción produce el retorno de subrutina con una
constante literal k en el registro W. La operación que realiza consiste simplemente en
sacar del stack un valor y cargarlo en el PC. Ese valor es el PC incrementado antes de
realizar el salto, de la ultima instrucción CALL ejecutada, por lo tanto es la dirección de la
instrucción siguiente a dicho CALL.. Dado que el stack es de 11 bits, el valor cargado en el
PC es una dirección completa, y por lo tanto se puede retornar a cualquier posición de la
memoria de programa, sin importar como estén los bits de selección de pagina. Esta
instrucción además carga siempre una constante literal en el registro W. Ya que esta es la
única instrucción de retorno de subrutina de los PIC16C5X, no hay en estos
microprocesadores forma de retornar de una subrutina sin alterar el registro W. Por otro
lado, y con una metodología especial de programación, un conjunto de sucesivas
instrucciones RETLW puede ser usado como una tabla de valores constantes incluida en el
programa (Ej. : tablas BCD/7 seg., hexa/ASCII, etc.).
BTFSC (Bit Test File and Skip if Clear) saltea la próxima instrucción si el bit b del registro f
es cero. La instrucción BTFSS (Bit Test File and Skip if Set) saltea si el bit es 1. Estas
instrucciones pueden usarse para realizar o no una acción según sea el estado de un bit,
o, en combinación con GOTO, para realizar una bifurcación condicional.
Ejemplo 1 :
-------------
-------------
btfsc flags,run ;sí ha arrancado el reloj
incf tiempo ;incremento contador de tiempo
-------------
-------------
Ejemplo 2 :
-------------
-------------
movf tiempo,w ;testeo por tiempo = 60
xorlw 60
btfss STATUS,Z
goto acc_2 ;salto si tiempo <> 60
- - - - - - - - - - - - - ;acción 1
-------------
-------------
goto acc_fin
acc_2
- - - - - - - - - - - - - ;acción 2
-------------
-------------
acc_fin ;acá se unen los caminos
Las instrucciones que siguen son casos especiales de las de incremento y decremento
vistas anteriormente. Estas instrucciones podrían categorizarse dentro del grupo de
instrucciones orientadas a byte sobre registros (primer grupo), ya que efectivamente
operan sobre los mismos, y el formato del código de la instrucción responde al de ese
grupo, pero, a diferencia de las otras, pueden además alterar el flujo lineal del programa y
por eso se les incluyó en este grupo.
Estas dos instrucciones (DECrement File and Skip if Zero, e INCrement File and Skip if
Zero) se comportan de manera similar a DECF e INCF, salvo que no afectan a ningún bit
de la palabra de estado. Una vez realizado el incremento o decremento, si el resultado es
00000000, el microprocesador salteara la próxima instrucción del programa. Estas
instrucciones se utilizan generalmente en combinación con una instrucción de salto
(GOTO), para el diseño de ciclos o lazos (loops) de instrucciones que deben repetirse una
cantidad determinada de veces.
Ejemplo:
clrf 10 ;pongo cero en la posición 10 de la memoria interna
loop ;lo que sigue se ejecutará 256 veces
.....................................
.....................................
.....................................
Esta instrucción solo sirve para introducir una demora en el programa, equivalente al
tiempo de ejecución de una instrucción. No afecta ningún bit de la palabra de estado.
Esta instrucción (TRIState) carga el registro de control de los buffers tristate de un puerto
de entrada salida (data dirección register), con el valor contenido en W. El parámetro f
debe ser la dirección de memoria interna del puerto, aunque el valor W no será cargado
en el puerto sino en el registro de tristate del mismo. Los valores validos para f son 4 y 5
en los 16C54/56 y 4, 5 y 6 en los 16C55/57. Esta instrucción no afecta ningún bit de la
palabra de estado.
La siguiente instrucción sirve para programar el registro OPTION que controla el RTCC y
prescaler
La instrucción que sigue borra el contador del watch dog timer. Este registro tampoco esta
accesible como memoria, y esta es la única instrucción que lo modifica.
Esta instrucción, además, coloca en uno los bits PD (power down) y TO (time-out) de la
palabra de estado.
Ejemplo :
Deberá tenerse en cuenta además que es posible avanzar de una página a otra en forma
automática cuando el PC se incrementa. Esto ocurre si el programa empieza en una
página y sigue en la siguiente. Sin embargo, al incrementarse el PC desde la última
posición de una página a la primera de la siguiente, los bits PA0 y PA1 no se
modifican, y por lo tanto sí se ejecuta una instrucción GOTO, CALL o alguna que actúe
sobre el PC, esta producirá un salto a la página anterior, a menos que el programador
tenga la precaución de actualizar el valor de dichos bits. Por este motivo es conveniente
dividir el programa en módulos o rutinas que estén confinados a una página.
Qué es el MPLAB ?
EL MPLAB es un “Entorno de Desarrollo Integrado “ (Integrated Development
Environment,
IDE) que corre en “Windows “, mediante el cual Usted puede desarrollar aplicaciones para
los microcontroladores de las familias PIC 16/17.
EL MPLAB le permite a Usted escribir, depurar y optimizar los programas (firmware) de
sus diseños con PIC 16/17. EL MPLAB incluye un editor de texto, un simulador y un
organizador de proyectos. Además, el MPLAB soporta el emulador PICMASTER y a otras
herramientas de desarrollo de Microchip como el PICSTART - Plus.
• Crear un proyecto.
• Agregar un archivo de programa fuente de proyecto.
• Ensamblar o compilar programas fuente.
• Editar programas fuente.
• Reconstruir todos los archivos fuente, o compilar un solo archivo.
• Depurar su programa fuente.
Software ensamblador:
El software ensamblador que presenta Microchip viene en dos presentaciones, una, para
entorno DOS llamado MPASM.EXE y la otra, para entorno Windows llamado
MPASMWIN.EXE
Las dos presentaciones soportan a TODOS los microcontroladores de la familia PIC de
Microchip.
#DEFINE
ej. #define <nombre> [<valor a remplazar>]
explicación: declara una cadena de texto como substituto de otra
END
ej. end
explicación: indica fin de programa
EQU
ej. status equ 05
explicación: define una constante de ensamble
INCLUDE
ej. include <PIC16F84.h>
explicación: incluye en el programa un archivo con código fuente
ORG
ej. org 0x100
explicación: ensambla a partir de la dirección especificada
;ejemplo:
status equ 0x03 ;hace equivalencia entre el símbolo status indicándolo como 3 en
hexadecimal
Cont equ 0x20
F equ 1
org 0 ;indica posición de memoria desde donde se ensambla
Inicio
movlw 0x0F ;carga de w con el valor constante 15 (literal)
movwf Cont ;el contenido de w se pasa al reg. CONT
Loop
decfsz Cont,F ;decremento de Cont y elude siguiente si=0
goto Loop ;salto incondicional a Loop
goto $ ;Salto incondicional aqui mismo
end ;Fin del código
Lista de pasos:
Simulación:
2. Crear una nueva ventana donde se incluyan las variables que queremos tener en
cuenta (Window...New Watch Window)
El empleo de subrutinas aporta muchas ventajas entre las que se destacan las
siguientes:
1. Se pueden escribir como subrutinas secciones de código y ser empleadas en muchos
programas ( por ejemplo, la subrutina de exploración de un teclado ).
4. El código es más fácil de interpretar, dado que las instrucciones de las subrutinas no
aparecen en el programa principal. Solo figuran las llamadas CALLs.
En la familia PIC de gama media la pila tiene ocho niveles de memoria del tipo FIFO
(primero en entrar, último en salir). Si se produce la llamada a una subrutina durante la
ejecución de otra subrutina, la dirección de retorno de esta segunda es colocada en la
cima de la pila sobre la dirección anterior. Esta segunda dirección es la primera en salir de
la pila mediante la instrucción RETURN.
Con la pila de ocho niveles, una subrutina puede llamar a otra y ésta, a su vez, llamar a
otra hasta un máximo de ocho. La gama baja sólo puede realizar dos llamadas de este
tipo al poseer una pila de sólo dos niveles.
Las subrutinas deben colocarse al comienzo de las páginas debido a que el bit 8 del
contador del programa es puesto a 0 por la instrucción CALL (o por cualquier instrucción
que modifica el PC). Las subrutinas deben colocarse en la mitad inicial de las páginas (las
256 palabras).
* Tomado de: Microcontroladores PIC, la solución en un chip, Angulo y otros, Sección 5.1
Programa ejemplo:
Ejemplo:
Se quiere representar el número hexadecimal 70h cuya representación en binario es
01110000b como los dos carácteres ASCII "7" y "0", gráficamente:
7 0 en hexadecimal (8 bits)
Se debe tener en cuenta que el ejemplo anterior funciona en forma correcta siempre y
cuando lo nibbles del número hxadecimal a convertir, estén en el rango de 0 a 9, debe
realizarse un tratamiento adicional a estos si se encuentran en el rango de Ah a Fh.
Realice en un programa esta condición.
opción1 equ 0
opción2 equ 1
opción3 equ 2
Uno de estos posibles valores llevarlos a W y en una parte del programa tratarlos así:
Solución #2
Otra forma posible es comparando una por una los valores de las diferentes opciones
almacenadas en memoria RAM en una variable llamada OPCION
movlw Opción1
xorwf OPCION,0 ;se realiza la verificación del contenido de OPCION con respecto
aW
btfsc STATUS,Z ;Verificando la bandera Z
goto Acción1
movlw Opción2
xorwf OPCION,0 ;se realiza la verificación del contenido de OPCION con respecto
aW
btfsc STATUS,Z ;Verificando la bandera Z
goto Acción2
movlw Opción3
xorwf OPCION,0 ;se realiza la verificación del contenido de OPCION con respecto
aW
btfsc STATUS,Z ;Verificando la bandera Z
goto Acción3
Acción1:
............................... ;instrucciones correspondientes a la Acción 1
...............................
...............................
goto encuentro
Acción2:
............................... ;instrucciones correspondientes a la Acción 2
...............................
...............................
goto encuentro
Acción3:
............................... ;instrucciones correspondientes a la Acción 3
...............................
...............................
encuentro: ;sitio de encuentro luego de una de las acciones
............................... ;continuación del programa
...............................
Aunque este último método es más largo que el anterior, permite que los valores de las
diferentes opciones no sean consecutivos entre si.
3.5 Aritmética
Dentro de los microcontroladores PIC se cuenta con instrucciones aritméticas tales como
ADDWF y ADDLW, SUBWF y SUBWF, para efectuar operaciones de suma y resta
respectivamente e instrucciones tales como RLF y RRF para realizar operaciones de
rotación a traves del carry con las cuales se pueden realizar divisiones entre 2 y
multiplicaciones por 2 respectivamente, hasta este punto podríamos ver el conjunto de
instrucciones un poco limitado, sin embargo, utilizando técnicas avanzadas de
programación podemos obtener operaciones más complejas. Una buena cantidad de ellas
la obtenemos de dos notas de aplicación de Microchip en formato PDF.
Los siguientes archivos pueden observarse con el Acrobat Reader®
Rutinas matemáticas para PIC16C5X/16CXX: PIC16C5X / 16CXX Math Utility Routines
Rutinas matemáticas generales Math Utility Routines
El hecho de generar ciclos repetitivos por medio del programa y calcular el tiempo total de
ejecución nos puede ayudar a generar tiempos precisos.
Operación # de ciclos
la carga de k en W 1
la carga de W en el contador 1
el decremento del contador mientras no llegue a cero k-1
el decremento del contador cuando llegue a cero 2
el salto a Loop 2 * (k-1)
Total: 3*k+1
Por cada instrucción agregada debe incluirse en la cuenta total el número de ciclos
correspondiente a dicha instrucción.
Trabajando a 4 Mhz y asumiendo que k se remplaza por el valor 15d en el ejemplo
tendríamos un tiempo igual a:
Número de ciclos = (3*15) +1 = 46 ciclos de máquina,
Tciclo máq.= 4 / 4 Mhz = 1 µ segundo, el tiempo total del ejemplo entonces será 46
µsegundos.
En el hardware de la figura 4.1.1 se observa que se han colocado 4 dip switch al puerto B
y estos
no poseen resistencia de pull up lo cual nos obliga a habilitar las resistencias internas con
las que
cuenta el microcontrolador PIC16F84, el programa debe entonces en un repetitivo infinito
leer el
nivel lógico que colocan los switch y pasar este resultado al puerto A complementando el
estado de
la información puesto que de acuerdo a la disposición de los LEDs un estado bajo en el
puerto
enciende el LED correspondiente y por ende un estado alto en el puerto, apaga el LED.
Programa:
Dependiendo de la calidad del interruptor el tiempo del retardo puede estar al rededor de
50 mS. En el caso de este ejercicio en particular no es requerido puesto que un cambio en
el interruptor debe reflejarse inmediatamente en el puerto de salida. Se debe tener en
cuenta que nunca una entrada debe quedar al aire puesto que los microcontroladores PIC
son hechos con tecnología CMOS. Es por este motivo que en el programa se programó la
parte alta del puerto B como salida.
Procedimiento:
El hecho de visualizar datos en display de 7 segmentos de la forma en que se muestra en
la figura 4.2.1 obliga a interconectar entre si los pines correspondientes a los segmentos
del dígito 1 (d1) con los pines de los segmentos del dígito 2 (d2), de esta manera se
ahorran líneas de conexión.
Diagrama electrónico:
Procedimiento:
Para realizar la observación práctica mencionada en los objetivos, se realiza el montaje de
un voltimetro digital AC el cual utiliza el canal análogo 0 como entrada de la muestra DC
tomada de un divisor de voltaje. De acuerdo a la relación del divisor de tensión
conformado con el reostato Ajuste y de las resistencias, debe obtenerse un voltaje
máximo de 5 voltios en el pin RA0, correspondiente a la máxima entrada de voltaje alterno
colocado en VAC in .
Diagrama eléctrico:
El programa presentado hace uso de los recursos que posee el PIC16C71 el cual posee 4
canales análogos y un conversor A/D de 8 bits; para mayor información ver las
especificaciones técnicas de este dispositivo.
Objetivos:
I2C
El bus I2C es un bus diseñado para que sobre éste puedan colocarse varios dispositivos
dentro de la misma tarjeta electrónica (comunicación multipunto), cada dispositivo tendrá
una dirección lógica asignada físicamente mediante los pines A0, A1 y A2 de acuerdo al
nivel lógico al que estos sean alambrados. ver estos pines en la figura 4.7.1 a.
En las figuras 4.7.2 y punto se observa la forma en que las señales SCL y SDA deben ser
manejadas. Para iniciar la comunicación sobre un dispositivo I2C debe realizarse la
secuencia denominada bit de START que consiste en pasar la línea de datos SDA de nivel
alto a bajo mientras que la línea SCL permanece en alto. Para la culminar la comunicación
con el dispositivo I2C debe ejecutarse la secuencia denominada bit de STOP la cual
consiste en pasar la línea de datos SDA de nivel bajo a alto mientras que la línea de reloj
SCL permanece en alto. Un bit de datos es aceptado por el dispositivo mientras que sobre
la línea de datos SDA permanece el nivel adecuado al bit en cuestión, y sobre la línea de
reloj SCL se lleva a cabo un pulso, es decir, el paso de nivel de bajo a alto y luego de alto
a bajo. Los tiempos implicados en esta secuencia dependen básicamente del fabricante del
dispositivo.
FIG. 4.7.3 Temporización en el bus I2C
SPI
El bus SPI es un bus diseñado para que sobre éste se coloque un dispositivo maestro y un
dispositivo esclavo (comunicación punto a punto) ver figura 4.7.1 b. Con relación al bus
I2C podemos notar que éste soporta mayor velocidad de comunicación.
El dispositivo SPI posee como observamos el figura 4.7.1, una línea de selección CS la cual
debe pasar al nivel lógico activo (en este caso bajo) para poder realizar la comunicación
con el dispositivo. Desde este punto de vista podríamos colocar sobre un bus de este tipo
varios dispositivos, pero utilizando un dispositivo decodificador adicional.
Otra línea podemos observar es la línea HOLD la cual permite al procesador detener
momentáneamente la comunicación, ver figura 4.7.6
Para saber algunas generalidades del puerto serial asíncrono: The serial port,
Este artículo ha sido tomado de: http://www.lvr.com en donde pueden encontrarse
temas muy interesantes acerca del mundo de la computación y las diferentes conexiones
paralelas, serie, etc.
Aplicación de Escritura y Lectura sobre dispositivo I2C simulando el puerto serial síncrono:
Para la lectura del teclado debemos tener en cuenta la disposición de las filas y las
columnas como se observa en la FIGURA 5.1.2 con la cual realizando la operación allí
descrita se debe obtener un número consecutivo de las teclas en la organización aquí
mostrada. Luego, mediante el acceso a una tabla se decodifica la tecla leída para obtener
el patrón final observado en el diagrama del hardware FIG. 5.1.1.
Ej. Sí se oprimiése la tecla C del teclado ( FIG. 5.1.1), el código de exploración
correspondiente a esta es el 13d (FIG. 5.1.2) que debe ser representado como el 1100b
en las salidas DCBA ( FIG. 5.1.1).
list p=16f84
#include <p16f84.inc> ;archivo de encabezado por Microchip®
;
;ESTE PROGRAMA EMULA UN 74C922 DECODIFICADOR DE TECLADO
;
CONTFIL EQU 0x12 ;Contador de Filas
CONTCOL EQU 0x13 ;Contador de Columnas
COLKBD EQU 0x14 ;DATO EN COLUMNAS
Temp EQU 0x15
R1 EQU 0x16 ;Variable para Retardo
R2 EQU 0x17 ;Variable para Retardo
R3 EQU 0x18 ;Variable para Retardo
R4 EQU 0x19 ;Variable para Retardo
COUNT EQU 0x1A
CHAR EQU 0x1B ;Almacenamiento temporal SCAN
AUX EQU 0x1C ;Variable Auxiliar
#define _z STATUS,2
#define _c STATUS,0
#define OE PORTA,4
#define BANK0 bcf STATUS,RP0
#define BANK1 bsf STATUS,RP0
;
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
ORG 0x00
MAIN
BANK1
CLRF TRISA
BANK0
CLRF PORTA
NOP
NOP
Muestre
BCF OE
RUSCAN
CALL SCAN
XORLW 0x00 ;espera una Tecla
BTFSC _z
GOTO Muestre
MOVWF PORTA
MOVLW .50
MOVWF COUNT
LOOPSCAN
CALL DEL5MS
DECFSZ COUNT,1
GOTO LOOPSCAN
GOTO RUSCAN
;************************************************************************
***
DEL5MS
MOVLW .12
MOVWF R1
MOVLW 7
MOVWF R2
MOVLW 1
MOVWF R3
MOVLW 1
MOVWF R4
LOOPDEL5
DECFSZ R1,F
GOTO LOOPDEL5
DECFSZ R2,F
GOTO LOOPDEL5
DECFSZ R3,F
GOTO LOOPDEL5
DECFSZ R4,F
GOTO LOOPDEL5
NOP
RETURN
;***************************************************************
;RETORNA W=00 NO HAY TECLA OPRIMIDA,
;RETORNA W=COD SI TECLA OPRIMIDA.
;**************************************************************
SCAN
BANK1
MOVLW 0x0F ;el puerto que lee teclado <0:3> filas (in)
MOVWF TRISB
BANK0
MOVLW 0x01
MOVWF CONTCOL
MOVLW 0x7F
MOVWF COLKBD
RSTFIL
CLRF CONTFIL ;RESET CONT FILAS
MOVF COLKBD,W
MOVWF PORTB ;COLOCAR UN CERO EN COLUMNAS
nop
nop
nop
MOVF PORTB,W ;LEER FILAS DE TECLADO
MOVWF AUX
RLF AUX,F
RLF AUX,F
RLF AUX,F
RLF AUX,F
TESTFIL
RLF AUX,F
BTFSS _c
GOTO ACERTADO
INCF CONTFIL,F
MOVF CONTFIL,W
XORLW 0x04
BTFSS _z
GOTO TESTFIL
BSF _c
RRF COLKBD,F ;rotacion del cero a colocar
INCF CONTCOL,F
MOVF CONTCOL,W
XORLW 0x05
BTFSS _z
GOTO RSTFIL
RETLW 0x00
ACERTADO
MOVF CONTFIL,W
XORLW 0x00
BTFSC _z
GOTO ESCERO
MOVLW 0x00
MUL
ADDLW 0x04
DECFSZ CONTFIL
GOTO MUL
SUMACOL
ADDWF CONTCOL,W
CALL TABKBD
RETURN
TABKBD
addwf PCL,F
retlw 0 ;inválido
retlw 0x10
retlw 0x11
retlw 0x12
retlw 0x13
retlw 0x14
retlw 0x15
retlw 0x16
retlw 0x17
retlw 0x18
retlw 0x19
retlw 0x1A
retlw 0x1B
retlw 0x1C
retlw 0x1D
retlw 0x1E
retlw 0x1F
ESCERO
MOVLW 0x00
GOTO SUMACOL
end
Se puede concluir a partir de esta simple ecuación que sí hacemos variar el ciclo útil de la
onda rectangular obtendremos una variación en el voltaje promedio y sí este es aplicado
como alimentación del motor DC, el efecto será el de la variación de la velocidad.
LIST P= 16F84
#INCLUDE<P16F84.INC>
X EQU .250
Y EQU .12
;**************************************************************
***********
INICIO
CLRF TRISB
MOVLW B'11100001'
MOVWF TRISA
BCF STATUS,RP0
MOVLW 00H
MOVWF DIG
BCF PORTA,4
DIS_LOOP:
GOTO RMOTOR
CALL RETAR
CALL RETAR
CALL RETAR
CALL RETAR
CALL RETAR
CALL RETAR
CALL RETAR
CALL RETAR
CALL RETAR
CALL RETAR
INCF DIG,1
MOVLW .11
XORWF DIG,0
BNZ RMOTOR
CLRF DIG
RMOTOR
CALL MOTOR
GOTO DIS_LOOP
;**************************************************************
***********
DISPLAY
MOVF DIG,0
CALL TABLA
MOVWF PORTB
RETURN
;**************************************************************
***********
ADDWF PCL,1
RETLW 0x3F
RETLW 0x06
RETLW 0x5B
RETLW 0x4F
RETLW 0x66
RETLW 0x6D
RETLW 0x7D
RETLW 0x07
RETLW 0x7F
RETLW 0x6F
RETLW 0x77
;**************************************************************
************
MOVF DIG,0
SUBLW .10
MOVWF VROFF
CLRW
XORWF DIG,0
BZ OFFMOTOR
MOVF DIG,0
MOVWF VRON
MOTOR1:
CALL RETAR
DECFSZ VRON,1
GOTO MOTOR1
OFFMOTOR
MOVF DIG,0
XORLW .10
BZ MOTOR3
MOTOR2
CALL RETAR
DECFSZ VROFF,1
GOTO MOTOR2
MOTOR3
RETURN
;**************************************************************
*************
RETAR
MOVLW X
MOVWF CONT1
CICLO1
MOVLW Y
MOVWF CONT2
CICLO2
DECFSZ CONT2,1
GOTO CICLO2
DECFSZ CONT1,1
GOTO CICLO1
RETURN
;**************************************************************
**************
END
Los módulos LCD están compuestos básicamente por una pantalla de cristal líquido y un
circuito microcontrolador especializado el cual posee los circuitos y memorias de control
necesarias para desplegar el conjunto de caracteres ASCII, un conjunto básico de
caracteres japoneses, griegos y algunos símbolos matemáticos por medio de un circuito
denominado generador de caracteres. La lógica de control se encarga de mantener la
información en la pantalla hasta que ella sea sobreescrita o borrada en la memoria RAM
de datos..
La pantalla de cristal líquido está conformada por una ó dos líneas de 8, 16, 20, 24 ó 40
caracteres de 5x7 pixels c/u.
El microcontrolador especializado puede ser el modelo HITACHI 44780, ó el modelo
HITACHI 44100. También existen módulos LCD con IC's implantados directamente
sobre el PCB (POWERTIP®).
Estos módulos poseen a través de estos CI's una interfese paralela para ser comandada
desde un microcontrolador, microprocesador ó inclusive se puede realizar el control de
este desde el puerto paralelo de un PC.
Bibliografia