Está en la página 1de 217

PIC Prof.

Nelson An 1
P I C
EL OBJETIVO DE ESTE CURSO ES APRENDER A
PROGRAMAR EN LENGUAJE ASSEMBLER
Circuitos Integrados Programables
PIC Prof. Nelson An 2
PIC 16F628A
PIC Prof. Nelson An 3
PIC 16F628A
PIC Prof. Nelson An 4
Introduccin a la Programacin
en Lenguaje Assembler
Qu son las Instrucciones?: El set de instrucciones de un
microcontrolador es el set de entradas binarias que producen
acciones definidas durante un ciclo de instruccin. Un set de
instrucciones es para el microcontrolador lo mismo que una
tabla de verdad es para una compuerta lgica, etc.
Instrucciones Binarias: Una instruccin es un patrn de
dgitos binarios el cual debe estar a disposicin del
microcontrolador en el tiempo y forma que ste lo requiera.
Por ejemplo: cuando un microcontrolador PIC 16F628A
recibe el patrn binario de 14 bits 001011 0 0000100
el cual corresponde al formato de la instruccin
decfsz 0x04,0: 001011 0 0000100
PIC Prof. Nelson An 5
Introduccin a la Programacin
en Lenguaje Assembler
Programa: un Programa es una serie de instrucciones que
causan que el microcontrolador realice una tarea en
particular.
Programa en Assembler:
Cmo introducimos un Programa en Assembler en un
microcontrolador? Tenemos que traducirlo, compilarlo a
hexadecimal a binario. Se puede hacer instruccin a
instruccin a mano a travs de un programa en una PC
llamado Cdigo Fuente.
PIC Prof. Nelson An 6
Introduccin a la Programacin
en Lenguaje Assembler
Convenciones en la escritura del cdigo fuente: Para
hacer la tarea ms sencilla del programador, se usan algunas
convenciones. En general las convenciones son cualquier
accin que facilitan la revisin y comprensin de un
programa. Comentaremos algunas convenciones que
usaremos:
PIC Prof. Nelson An 7
Introduccin a la Programacin
en Lenguaje Assembler
Los ficheros de cdigo fuente llevarn la extensin *.ASM
Los ficheros de listado llevarn la extensin *.LST
Los ficheros de cdigo objeto llevarn la extensin *.OBJ
Los ficheros de errores llevarn la extensin *.ERR
Los ficheros ejecutables llevarn la extensin *.HEX
Los mnemnicos escritos en mayscula hacen que el cdigo
escrito sea ms visible.
Comentarios explicando cada lnea de cdigo
PIC Prof. Nelson An 8
Introduccin a la Programacin
en Lenguaje Assembler
Caractersticas del Assembler: Campos del Lenguaje
Assembler. Las instrucciones estn divididas en un nmero
de campos, como se muestra debajo.
ETIQUETAS OPERACIN OPERANDO COMENTARIO
Lectura movf portA,0 ;lee el puerto A
movwf reg1 ;escribe en reg1
El campo del cdigo de operacin es el nico que nunca
puede estar vaco; ste siempre contiene una instruccin
una directiva del Assembler.
El campo del operando direccin puede contener una
direccin un dato, puede estar en blanco.
PIC Prof. Nelson An 9
Introduccin a la Programacin
en Lenguaje Assembler
El campo del comentario de etiquetas es opcional. El
programador asignar una etiqueta a una lnea de instruccin
agregar un comentario segn su conveniencia.
Delimitadores: Los campos van separados slo con
espacios y/o tabulaciones. No agregar nunca otros
caracteres.
No utilice espacios extra, particularmente despus de comas
que separan operandos. Ej. movlw 35,0.
No use caracteres delimitadores (espacios y tabulaciones) en
nombres etiquetas.
PIC Prof. Nelson An 10
Introduccin a la Programacin
en Lenguaje Assembler
Etiquetas: La etiqueta es el primer campo en una lnea en
Lenguaje Assembler y puede no existir.
Si una etiqueta est presente, el Assembler la define como el
equivalente a la direccin del primer byte correspondiente a
esa instruccin.
Esta etiqueta puede volver a usarse en otro lugar pero como
operando de una instruccin.
El Assembler reemplazar sta etiqueta por el valor de
cuando fue creada.
Se usan frecuentemente en las instrucciones de salto.
PIC Prof. Nelson An 11
Introduccin a la Programacin
en Lenguaje Assembler
No pueden usarse como nombres de etiquetas las palabras
ya reservadas por el Assembler (ORG, EQU) nombres de
instrucciones (movf, incf, nop). Por ej.:
Leer movf portA,0
:
:
goto leer
PIC Prof. Nelson An 12
Introduccin a la Programacin
en Lenguaje Assembler
Mnemnicos (cdigos de operacin): La tarea principal del
Assembler es la traduccin de los cdigos de operacin
(mnemnicos) en sus equivalentes binarios.
El Assembler realiza esta tarea usando una tabla como si lo
haramos a mano.
El Assembler debe hacer algo ms que traducir los cdigos
de operacin. Tambin debe determinar cuntos operandos
requiere la instruccin y de qu tipo.
PIC Prof. Nelson An 13
Introduccin a la Programacin
en Lenguaje Assembler
Directivas: Algunas instrucciones del Lenguaje Asssembler no
se traducen directamente a instrucciones del lenguaje mquina.
stas instrucciones son directivas para el Assembler; stas
asignan al programa ciertas reas de memoria, definen
smbolos, designan reas de RAM para el almacenamiento de
datos temporales, colocan tablas datos constantes en
memoria y permiten referencias a otros programas.
Las directivas se utilizan como comandos escritos en el cdigo
fuente para realizar un control directo ahorrar tiempo a la hora
de ensamblar.
Para usar estas directivas seudo-operandos, el programador
las coloca en el campo de cdigo de operaciones, y si lo
requiere la directiva, una direccin dato en el campo de
direccin.
PIC Prof. Nelson An 14
Introduccin a la Programacin
en Lenguaje Assembler
Las directivas de uso frecuente son instrucciones para el compilador.
#DEFINE
#define<nombre> [<valor a reemplazar>]
Explicacin: declara una cadena de texto como subttulo de otra.
END
End
Explicacin: indica fin de programa
ETIQUETAS A DIRECCIONES DE PROGRAMA:
Explicacin: son muy tiles para usar con instrucciones CALL
(llamada a subrutina) GOTO (salto)
PIC Prof. Nelson An 15
Introduccin a la Programacin
en Lenguaje Assembler
EQU
portA equ 0x05
Explicacin: define una constante de ensamble
INCLUDE
Include<PIC16F628A.inc>
Explicacin: incluye en el programa un archivo con cdigo
fuente
ORG
org 0x00
Explicacin: ensambla a partir de la direccin especificada
PIC Prof. Nelson An 16
Introduccin a la Programacin
en Lenguaje Assembler
EQU (Equate Equivalente):
La directiva EQU permite al programador igualar nombres a
datos direcciones. Los nombres utilizados se refieren
generalmente a direcciones de dispositivos, datos numricos,
direcciones de comienzo, direcciones fijas, posiciones de byte.
ORG (Origin Origen):
La directiva Origen permite al programador especificar la
posicin de memoria donde programas, subrutinas datos
residirn. Los programas y los datos pueden estar alojados en
diferentes reas de memoria dependiendo de la configuracin
de memoria, rutinas de comienzo, subrutinas de interrupcin y
otros programas deben comenzar en locaciones de memoria
fijados por la estructura del microcontrolador.
PIC Prof. Nelson An 17
Introduccin a la Programacin
en Lenguaje Assembler
La directiva ORG hace al compilador colocar el cdigo que le
sigue en una nueva direccin de memoria (la salida del
compilador no slo coloca los cdigos de operacin, sino
tambin las direcciones de cada instruccin y datos del
programa).
Usualmente se la utiliza para: reset, programa de servicio de
interrupcin. Por ej.:
Reset org 0x00
goto inicio
org 0x04; vector de interrupcin
goto interrupcin
org 0x05
Inicio movf portA,0; aqu comienza el programa (lee portA)
PIC Prof. Nelson An 18
Introduccin a la Programacin
en Lenguaje Assembler
Operandos y Direcciones: Los ensambladores permiten
elegir con libertad el tipo de elemento a colocar en el campo
de operando direccin.
Nmeros decimales: La mayora de los ensambladores
asumen el punto como nmeros decimales a no ser que se
indiquen de otra manera. Por ej.:
movlw .120
Significa: mover el nmero literal 120 (decimal) al registro de
trabajo w
PIC Prof. Nelson An 19
Introduccin a la Programacin
en Lenguaje Assembler
Otros sistemas de numeracin: Los ensambladores
tambin aceptan nmeros hexadecimales, binarios.
Por ej.: 05h
0x05 hexadecimal
b00000101 binario
Inclusin de cdigo: Algunos ensambladores permiten
incluir cdigo fuente (partes de programa) desde otros
archivos. Por ej.: include lectura.asm
Esta lnea de programa le indica al compilador que incluya el
cdigo que se encuentra en el archivo lectura.asm como si
fuese parte del propio programa.
PIC Prof. Nelson An 20
Instrucciones para
Ensamblar Programas
Podemos usar para escribir los programas el block de notas
de windows el MPLAB.
Una vez escrito el Programa, se guarda con extensin .asm
y se lo convierte (ensambla) con un programa ensamblador a
formato .hex (archivo hexadecimal); el programa compilador
sugerido es el MPASM (assembler de microsoft) que usa la
empresa Microchip. Al archivo con extensin .hex resultante
lo podemos transferir usando la tarjeta electrnica cargador
de PIC a la memoria del PIC16F628A.
Existen una serie de directivas que son para el ensamblador
y nos hacen la tarea de programacin ms sencilla.
PIC Prof. Nelson An 21
Instrucciones para
Ensamblar Programas
Con estas directivas haremos los siguientes ejemplos:
#DEFINE BANCO1 BSF STATUS,5
#DEFINE BANCO0 BCF STATUS,6
A partir de ahora, cuando escribamos BANCO1 se pondr a
1 el bit de seleccin de banco y cuando escribamos
BANCO0 se pondr a 0 el bit de seleccin de banco y
pasaremos al banco1, recordemos que rp0 y rp1 son los bits
que seleccionan en el registro de Status y empiezan en 00.
PIC Prof. Nelson An 22
Programacin en Lenguaje Assembler
Cmo se ordena un Programa? Cuando desarrollamos un
Programa, nos ayudarn las siguientes pautas:
1. Al principio van los EQU y los #DEFINE, despus
comenzamos con el Programa.
2. El Programa se escribe en cuatro columnas separadas
por tabuladores.
3. La primera columna se ponen las etiquetas las
direcciones de programa.
4. En la segunda columna se ponen las instrucciones (bcf,
clrw, btfss).
PIC Prof. Nelson An 23
Programacin en Lenguaje Assembler
Cmo se ordena un Programa? Cuando desarrollamos un
Programa, nos ayudarn las siguientes pautas:
5. En la tercera columna se ponen los registros a los que
afecta la instruccin.
6. En la cuarta columna se ponen los comentarios que crea
pertinente seguidos de un punto y coma.
PIC Prof. Nelson An 24
Aprendiendo a Programar
1. En todo Programa se debe decir cul es el tipo de PIC
que se emplear, hay que incluir sus libreras y
configurarlo.
2. Al escribir un Programa se realizan las sentencias en
columnas.
La primera columna se utiliza para nombrar variables
colocar etiquetas. La segunda columna se utiliza para
aplicar la instruccin. La tercera columna contiene los
datos necesarios para que pueda ejecutarse dicha
instruccin. La cuarta columna contiene datos tiles para
el programador pero que no son tenidos en cuanta por el
microcontrolador.
PIC Prof. Nelson An 25
Aprendiendo a Programar
Ejemplo:
Vamos a definir a la variable AZUL en la posicin de memoria
expresada en nmero hexadecimal 20.
1 Col. 2 Col. 3 Col. 4 Col.
AZUL EQU 0x20 ;defin a la variable AZUL
en la posicin 20
AZUL es la variable que defin.
EQU es la directiva que significa asignar definir.
0x20 es la posicin de la memoria de datos expresado en
hexadecimal.
PIC Prof. Nelson An 26
Aprendiendo a Programar
3. Se emplean signos para efectuar determinadas
consideraciones. Por ejemplo:
; se emplea para colocar observaciones. El Programa no
toma en cuenta todo lo que est en una lnea luego de
dicho signo.
: se utiliza normalmente para definir etiquetas, que son
lugares a donde va el programa cuando as lo requiere.
se utilizan para decir que lo que est entre ellas es el
nmero y puede estar expresado en sistemas de
numeracin decimal, binario hexadecimal.
. se emplea para definir un nmero en decimal.
4. Un Programa siempre deber comenzar con la directiva
ORG y terminar con la directiva END.
PIC Prof. Nelson An 27
Instrucciones para
Ensamblar Programas
MOVF LECTURA
movf f,d
instruccin operandos
d={0,1} 0=< f=< 127 M=memoria
M(f) d=0 W M(f)=posicin de memoria
d=1 M(f)
flagZ=1 M(f)=0 Cd. OP:001000dfff ffff
movf d=0
d=1
PIC Prof. Nelson An 28
Instrucciones para
Ensamblar Programas
MOVWF mover a f ESCRITURA
movwf
0=< f=< 127 M=memoria
M(f)=posicin de memoria
W M(f)
Cd. OP:0000001fff ffff
PIC Prof. Nelson An 29
Instrucciones para
Ensamblar Programas
Inicio
M (0x20) W
W M(0x30)
Fin
movf 0x20,0
movwf 0x30
cdigo fuente
Escribir un programa que copie el contenido del registro 0x20 al 0x30
PIC Prof. Nelson An 30
Instrucciones para
Ensamblar Programas
Escribir un programa que copie el contenido del registro 0x20
al 0x30
List p=16F628A
org 0x00
movf 0x20,0
movwf 0x30
end
PIC Prof. Nelson An 31
Instrucciones para
Ensamblar Programas
Pasar del Cdigo fuente al cdigo mquina objeto, se llama
compilacin o ensamblado, denominacin usada porque
programamos en assembler.
Programa a usar MPLAB
Funciones:
1) editor de Fuente (ingresar cdigo fuente)
2) compilador (pasar cdigo fuente a cdigo mquina)
3) simulador
4) programar PIC
PIC Prof. Nelson An 32
Instrucciones para
Ensamblar Programas
1) Crear un nuevo proyecto en men Project New Project
2) Crear un archivo que contenga el cdigo fuente
File New
Proyecto NOMBRE.pjt
Fuente NOMBRE.asm
Ejemplo: Ej001.pjt
Ej001.asm
3) Asignar al archivo de cdigo el proyecto
Project Edit Project
PIC Prof. Nelson An 33
Instrucciones para
Ensamblar Programas
MPLAB
Editor de texto
Ensamblador
Simulador
Creacin de Proyecto
1. Project New Proyect Ventana
File Name
nombre.pjt
Ej001.pjt guardar en cualquier carpeta ej: example
dar OK
PIC Prof. Nelson An 34
Instrucciones para
Ensamblar Programas
2. Edit Project Tools
Development Mode: Change 16F628A
Processor
Tools
MPLAB SIM SIMULATOR OK
3. Creacin Archivo Fuente
File New Untilted 1
File Save As File Name Ej001.asm
Salvar en la misma carpeta llamada example
OK
PIC Prof. Nelson An 35
Instrucciones para
Ensamblar Programas
4. Project Edit Project Add Node Ej001.asm Aceptar
Project Files
Ej001 [.hex]
Ej001 [.asm]
OK
end
0x30 movwf
0x20,0 movf
0x00 org
p=16F628A 1 Tabulacin List 1 Tabulacin
PIC Prof. Nelson An 36
Instrucciones para
Ensamblar Programas
5. File Save
6. Project Build All
Build Completed sucessfully OK
Build Failed Mal
7. Windows Program Memory
apretar botn ROM Memoria de Programa
cada posicin 14 bits [formato instruccin]
0000 0820 movf 0x20,w [00100000100000]
0001 00B0 movwf 0x30 [00000010110000]
PIC Prof. Nelson An 37
Instrucciones para
Ensamblar Programas
7. Windows File Registers ( apretar RAM)
Windows Modify
ADRESS: 0x20
Data/OPCODE: 0x75 WRITE
8. PIES (correr el programa) Program Counter
PC: 0x00
W: 0x20
PC: 0x01
W: 0x75
PC: 0x02
W: 0x75
9. DEBUG SYSTEM RESET
PIC Prof. Nelson An 38
Instrucciones para
Ensamblar Programas
Escribir un programa que copie el contenido del registro 0x20
al 0x30
List p=16F628A
org 0x00
movf 0x20,0
movwf 0x30
end
PIC Prof. Nelson An 39
Instruccin Movimiento:
movlw k
0=< k =< 255
k w Cd. OP: 11 111x kkkk kkkk
Instruccin de Movimiento
Instruccin de Suma
Instruccin Suma:
addlw k flags C, DC, Z Resultado=0
0=< k =< 255 afectados Z = 1
w + k w Resultado>255
C = 1
PIC Prof. Nelson An 40
Instruccin de Suma
Uso del C y DC:
7 4 3 0
C=1 para valores > 255, sea 9 bit
8
DC=1 para valores > 15, sea 5 bit
PIC Prof. Nelson An 41
Instruccin Suma
addwf f,d
instruccin operandos
d={0,1} 0=< f=< 127 M=memoria
W +M(f) W d=0 M(f)=posicin de memoria
W +M(f) M(f) d=1
flags afectados C, DC y Z
Cd. OP:00 0111dfff ffff
PIC Prof. Nelson An 42
Instrucciones para
Ensamblar Programas
Inicio
M (0x2C W)
W M(0x2E)
Fin
movf 0x2C,0
movwf 0x2E
cdigo fuente
Sumar el contenido de 2 posiciones de memoria 0x2C + 0x2D y poner
el resultado en 0x2E
W+M (0x2D) W addwf 0x2D,0
PIC Prof. Nelson An 43
Instrucciones para
Ensamblar Programas
Sumar el contenido de 2 posiciones de memoria 0x2C + 0x2D y
poner el resultado en 0x2E
List p=16F628A
Reset ORG 0x00
movf 0x2C,0
addwf 0x2D,0
movwf 0x2E
end
PIC Prof. Nelson An 44
Instruccin Resta
subwf f,d
instruccin operandos
d={0,1} 0=< f=< 127 M=memoria
M(f) - W W d=0 M(f)=posicin de memoria
M(f) - W M(f) d=1
flags afectados C, DC y Z
Cd. OP:00 0010dfff ffff
PIC Prof. Nelson An 45
Instruccin Resta
sublw K
0=<K=< 255
K - W W flags afectados C, DC y Z
C=1 Resultado >= 0 (+)
C=0 Resultado < 0 (-)
Cd. OP:11 110xkkkk kkkk
PIC Prof. Nelson An 46
Instruccin Resta
Los nmeros en el microcontrolador no pueden tener signos
diferentes, por lo tanto vamos a utilizar el complemento A1 y el
complemento A2.
K-W=W 0000 0011-0000 0010 = mtodo
Ejemplo: w=0000 0010 complemento A1 = 1111 1101
complemento A2
1111 1101
1
1111 1110
+
PIC Prof. Nelson An 47
Instruccin Resta
Los nmeros en el microcontrolador no pueden tener signos
diferentes, por lo tanto vamos a utilizar el complemento A1 y el
complemento A2.
K-W=W 0000 0011-0000 0010 = mtodo
0000 0011
1111 1110
0000 0001
+
PIC Prof. Nelson An 48
Binario Codificado en Decimal (BCD)
Formato BDC
1 0 0 1 9
0 0 0 1 8
1 1 1 0 7
0 1 1 0 6
1 0 1 0 5
0 0 1 0 4
1 1 0 0 3
0 1 0 0 2
1 0 0 0 1
0 0 0 0 0
2
0
2
1
2
2
2
3
PIC Prof. Nelson An 49
Binario Codificado en Decimal (BCD)
Formato BDC
BCD 2
3
2
2
2
1
2
0
2
3
2
2
2
1
2
0
29 0 0 1 0 1 0 0 1
El principio en que se basa el BCD es sencillo.
Para poder codificar los dgitos de 0 a 9 se usan 4 bits (con 3,
slo se habra podido codificar 8 dgitos) que en principio
serviran para codificar hasta 16 dgitos.
El dgito 1 por ejemplo se representa mediante el cdigo 0001 y
el 9 mediante el cdigo 1001.
Desafortunadamente con 4 bits se alcanzan 16 combinaciones
distintas, por lo que las 1010 a 1111 no tiene aplicacin, y por lo
tanto no se utilizan, es decir son ilegales en un cdigo BCD.
PIC Prof. Nelson An 50
Binario Codificado en Decimal (BCD)
Formato BDC
Consecuentemente las operaciones aritmticas resultan
complicadas.
Ejemplo de cmo se suman 2 nmeros en BCD:
0001 + 0011 = 0100
1 + 3 = 4 resultado correcto
1000 + 1000 = 1 0000
8 + 8 = 16
En BCD esto es un 1 seguido de un 0, es decir un 10
El resultado es incorrecto. La razn es obvia, al usar las reglas
de adicin binaria normal habr que saltar los 6 dgitos ilegales
en BCD, del 1010 al 1111.
PIC Prof. Nelson An 51
Binario Codificado en Decimal (BCD)
Formato BDC
Dicho de otra manera hay que sumar 6 al resultado siempre que
caiga dentro de la zona de cdigos ilegales.
Veamos un Ejemplo:
1000 + 0110 = 10110
sea en BCD tenemos entonces un 1 seguido de un 6, es
decir 16, que es el resultado correcto.
Al usar la notacin BCD, tendremos pues que sumar 6 al
resultado de la adicin, cuando sta se realice a travs de la
zona de cdigos ilegales.
PIC Prof. Nelson An 52
Instrucciones para
Ensamblar Programas
Inicio
M (0x0A W)
W M(0x2A)
Fin
movf 0x0A,0
movwf 0x2A
cdigo fuente
Restar el contenido de 2 posiciones de memoria 0x1A y 0x0A y poner
el resultado en 0x2A
M(0x1A)-W W subwf 0x1A,0
PIC Prof. Nelson An 53
Instrucciones para
Ensamblar Programas
Restar el contenido de 2 posiciones de memoria 0x1A y 0x0A y
poner el resultado en 0x2A
List p=16F628A
Reset ORG 0x00
movf 0x0A,0
subwf 0x1A,0
movwf 0x2A
end
PIC Prof. Nelson An 54
Configuracin de los pines en
Entradas / Salidas
En esta parte del curso nos vamos a familiarizar con la
configuracin de los pines, y los registros PORTA, PORTB, TRISA
y TRISB.
Recordemos que estos registros especficos pertenecen a la
memoria de datos y estn ubicados en los llamados bancos de la
misma.
En las siguientes diapositivas se muestra nuevamente la
informacin que suministra el fabricante. El objetivo de esto es
comunicarnos con el mundo exterior a travs de los pines de
entrada, y activar a travs de los pines de salida, dispositivos que
nos permitan la visualizacin sonorizacin de las actividades que
son controladas a travs de un programa que se ejecuta en el
microcontrolador 16F628A.
PIC Prof. Nelson An 55
Sntesis de los 16 pines del 16F628A
PORTA RA0 RA7
PORTB RB0 RB7
RA2 / VA2 / Vrfe = sirve como in-out como comparador
RA4 entrada Schmitt Trigger
RA4 salida Open drain = salida colector abierto
RA5 entrada Schmitt Trigger, sin driver de salida, es un pin
que se configura como entrada
RA0 RA2 pueden usarse como entradas de los
comparadores analgicos
RA3 puede usarse como entrada de comparadores
analgicos
16 PINES Posibles ENTRADAS/SALIDAS
PIC Prof. Nelson An 56
MEMORIA DE DATOS
TRIS TRANSFORMER INPUT SOURCE
TRANSFORMAR ENTRADA FUENTE
TRISA Programa el PORT A M(f)=0x85
TRISB Programa el PORT B M(f)=0x86
BIT=0 salida
BIT=1 entrada
PIC Prof. Nelson An 57
PIC Prof. Nelson An 58
ORGANIZACIN DE LA MEMORIA
La tabla anterior indica como acceder a los cuatros
bancos de registros:
Direcciones F0h-FFh, 170h-17Fh y 1F0h-1FFh se
implementan como una RAM comn, y mapeada desde
la direccin 70h-7Fh.
REGISTRO DE PROPSITOS GENERALES:
El registro de Archivos esta organizado como 224x8 en
el PIC 16F62X.
Se accede tambin directamente e indirectamente a
travs del Registro de Seleccin de Archivo (FSR).
PIC Prof. Nelson An 59
PIC Prof. Nelson An 60
Instrucciones para
Ensamblar Programas
bsf f,b
set (pone a 1) el bit b de la posicin f de la memoria
0=< f=< 127 M=memoria
M(f)=posicin de memoria
0 =< b =< 7
Cd. OP:01 01bb bfff ffff
PIC Prof. Nelson An 61
Instrucciones para
Ensamblar Programas
bcf f,b
reset (pone a 0) el bit b de la posicin f de la memoria
0=< f=< 127 M=memoria
M(f)=posicin de memoria
0 =< b =< 7
Cd. OP:01 00bb bff ffff
PIC Prof. Nelson An 62
Status Register:
El Registro de Estado, mostrado en el registro 3-1, contiene: el
estado aritmtico de la ALU, el estado reset y los bits que se
seleccionan para ingresar al banco de la memoria de datos.
El registro de Estado puede ser destino para cualquier
instruccin, y de cualquier otro registro. Si el registro de Estado
es destino de una instruccin, sta afecta el Z (Cero) y los bits de
medio acarreo y acarreo (DC C), entonces l escribe en estos
tres bits que estn deshabilitados. Los bits son uno (set), o Cero
(cleared) de acuerdo a la lgica del dispositivo.Adems los bits
TO y PD no se pueden escribir. Por consiguiente, el resultado de
una instruccin con el registro de Estado como destino puede ser
diferente al intentado.
REGISTRO DE STATUS
PIC Prof. Nelson An 63
REGISTRO de Estado:
Por ejemplo, CLRF STATUS borrara los tres bits altos
y pondr a uno el bit de Cero (Z). Esto lo vemos como
000uu1uu (donde u = unchanged).
Se recomienda el uso solamente de BCF, BSF,
SWAPF and MOVWF, instrucciones usadas para
alterar el Registro de Estado porque estas
instrucciones no afectan ningn bit de estado. Para
otras instrucciones, que no afecten ningn bits de
estado, ver el set de instrucciones.
REGISTRO DE STATUS
PIC Prof. Nelson An 64
PIC Prof. Nelson An 65
PIC Prof. Nelson An 66
MTODO PARA ELEGIR BANCOS
Los bits RP1 y RP0 del registro de Status y las
instrucciones bsf y bcf, son quienes nos posibilitan
cambiar de bancos en la memoria de datos.
Ejemplo:
Para elegir el banco 1:
RP1=0 bcf Status, RP1
RP0=0 bsf Status, RP0
Status, RP1=bit6 bcf 0x03,6
Status, RP0=bit5 bsf 0x03,5
M(f)=Status=0x03
PIC Prof. Nelson An 67
MTODO PARA ELEGIR BANCOS
Los bits RP1 y RP0 del registro de Status y las
instrucciones bsf y bcf, son quienes nos posibilitan
cambiar de bancos en la memoria de datos.
Ejemplo: TABLA para Eleccin de BANCOS
bsf 0x03,6
bsf 0x03,5
bsf 0x03,6
bcf 0x03,5
bcf 0x03,6
bsf 0x03,5
bcf 0x03,6
bcf 0x03,5
BANCO 3 BANCO 2 BANCO 1 BANCO 0
PIC Prof. Nelson An 68
Inicio
Selecciono Banco1
0x00 TRISB
Fin
movlw 0xFF
movwf 0x85
movlw 0x00
movwf 0x86
cdigo fuente
Programar todas las lneas del PORTA como entrada y todas las
lneas del PORTB como salida
0xFF TRISA
Configuracin de los pines en
Entradas / Salidas
bcf 0x03,6
bcf 0x03,5
PIC Prof. Nelson An 69
Programar todas las lneas del PORTA como entrada y todas las lneas
del PORTB como salida.
List p=16F628A
Status EQU 0x03
TRISA EQU 0x85
TRISB EQU 0x86
Reset ORG 0x00
bcf Status,6; selecciono Banco 1
bsf Status,5; selecciono Banco 1
movlw 0xFF
movwf TRISA; programo PuertaA
movlw 0x00
movwf TRISB; programo PuertaB
bcf Status,5; selecciono Banco 0
end
Instrucciones para
Ensamblar Programas
PIC Prof. Nelson An 70
Inicio
Programar PORTA
y PORTB
Instruccin
GOTO
Salto incondicional
a la direccin que
vaya precedida
como (etiqueta)
GOTO K
0<= K <=2047
Pepe btfss portA, 1
btfcs portA, 1
GOTO Pepe
Aplicacin 1: Diagrama de Flujo
Leer PORTA
Escribir en
PORTB
GOTO
RUTINA
PIC Prof. Nelson An 71
Inicio
Programar PORTA
y PORTB
Programar todas
las lneas del
PORTA como
entrada y todas
las lneas del
PORTB como
salida.
A continuacin
leer
contnuamente la
PuertaA y copiar
su contenido en la
PuertaB.
Aplicacin 1: Diagrama de Flujo
Leer PORTA
Escribir en
PORTB
List p=16F628A
STATUS EQU 0x03
PORTA EQU 0x05
PORTB EQU 0x06
TRISA EQU 0x85
TRISB EQU 0x86
CMCON EQU 0x1F
RESET ORG 0x00; posicin inicial del programa
movlw 0x07; deshabilito comparadores
movwf CMCON; deshabilito comparadores
bcf Status,6; selecciono Banco 1
bsf Status,5; selecciono Banco 1
movlw 0xFF
movwf TRISA; programo PuertaA
movlw 0x00
movwf TRISB; programo PuertaB
bcf Status,5; selecciono Banco 0
RUTINA movf PORTA, 0; PORTA W
movwf PORTB; W PORTB
goto RUTINA
end
Aplicacin 1:
Cdigo
Fuente
PIC Prof. Nelson An 73
REGISTROS PCL y PCLATH :
GOTO COMPUTADO: El PC est formado por dos
registros: PCLATH + PCL = PC
Siendo PCLATH = PC<12:8>
Y PCL = PC<7:0>
Por lo tanto, cuando se suma este registro PC con uno
de los 8 bits, slo se estar modificando los bits menos
significativos de PC. Esto es lo que produce que al hacer
una tabla se pueda direccionarcomo mximo 255
posiciones aproximadamente.
Solucin: el PCLATH es un registro modificable.
REGISTROS PCL Y PCLATH
PIC Prof. Nelson An 74
REGISTROS PCL y PCLATH:
Existen 2 formas de modificar el PC:
1. Mediante un goto computado, que se refiere a
operaciones aritmticas ( lgicas) que modifiquen
al PCL.
2. Mediante las instrucciones de salto(goto y call).
REGISTROS PCL Y PCLATH
PIC Prof. Nelson An 75
REGISTROS PCL y PCLATH :
GOTO COMPUTADO: Estas instrucciones ponen el
resultado de la operacin llevada a cabo en los bits
menos significativos (8)del registro PC, pero tambin
copian el contenido de PCLATH a la parte alta del
registro PC.
INSTRUCCIONES DE SALTO: A estas instrucciones, se
les pasa como parmetro un nmero de 11 bits (que uno
generalmente reemplaza por un label, por ejemplo goto
loop), y cuando se ejecuta esta instruccin se copian del
PCLATH al PC los bits 12 y 11 del PC. En estas
instrucciones es donde est el problema del salto,
cuando la memoria de programa tiene ms de 2K.
REGISTROS PCL Y PCLATH
PIC Prof. Nelson An 76
REGISTROS PCL y PCLATH :
Al igual que todos los registros especficos que controlan la
actividad del procesador, el Contador de Programa est
implementado sobre un par de posiciones de la memoria de
datos (RAM).
Cuando se escribe el Contador de Programa como
resultado de una operacin de la ALU, los 8 bits de menos
peso del PC residen en el registro PCL, que ocupa,
repetido, la posicin 2 de los dos bancos de la memoria de
datos.
Los bits de mas peso, PC<12:8>, residen en los 5 bits de
menos peso del registro PCLATH, que ocupa la posicin
0A H de los bancos de la memoria de datos.
REGISTROS PCL Y PCLATH
PIC Prof. Nelson An 77
En las instrucciones GOTO y CALL los 11 bits de menos peso
del PC provienen del cdigo de la instruccin y los otros dos de
los bits PCLATH<4:3> ver hoja del manual del fabricante (fig3-
3).
Como los 11 bits que se cargan en el PC desde el cdigo de las
instrucciones GOTO y CALL, se puede direccionar una pgina
de 2K de la memoria.
Los bits restantes PC<12:11> tienen la misin de apuntar una
de las cuatro pginas del mapa de memoria, y en los modelos
de PIC que alcanzan ese tamao, dichos bits proceden de
PCLATH<4:3>.
La Pila es una zona aislada de las memorias de programa y
datos.
REGISTROS PCL Y PCLATH
PIC Prof. Nelson An 78
Tiene una estructura LIFO, en la que el ultimo valor guardado
es el primero que sale.
Tiene 8 niveles de profundidad, cada uno con 13 bits.
Funciona como un <buffer> circular, de manera que el valor
que se obtiene al realizar el noveno <desempilado> (pop) es
igual al que se obtuvo en el primero.
La instruccin CALL y las interrupciones originan la carga del
contenido del PC en el nivel superior o <cima> de la Pila. El
contenido del nivel superior se saca de la Pila al ejecutar las
instrucciones RETURN, RETLW y RETFIE.
El contenido del registro PCLATH no es afectado por la
entrada o salida de la informacin de la Pila.
STACK O PILA
PIC Prof. Nelson An 79
PIC Prof. Nelson An 80
En la figura superior se muestra como se carga el PC
cuando una instruccin deposita en l, el resultado que
se obtiene de la ALU. Abajo se indica la carga del PC
en las instrucciones GOTO Y CALL. En la diapositiva
donde el fabricante muestra al PCH y PCL como
ambos formando el registro PC sumando bit a bit
hablamos 0 a 12, o sea 13 bits, encontramos que de
estos 13 bits, 11 bits son del cdigo de Operacin de
la instruccin.
Goto k :101 kkk kkkk kkkk
STACK O PILA
PIC Prof. Nelson An 81
comf f,d complemento
complemento M(f) d={0,1} d=0 W
d=1 M(f)
(intercambia 1 y 0)
M(f)=posicin de memoria
flags afectados Z
Cd. OP:00 0111dfff ffff
Instrucciones para
Ensamblar Programas
PIC Prof. Nelson An 82
clrf
0x00 M(f) borra cualquier posicin de memoria
M(f)=posicin de memoria
flags afectados Z=1
Z=1 si el resultado es = 0
Z=0 si el resultado es = 0
Cd. OP:00 0001 1fff ffff
Instrucciones para
Ensamblar Programas
PIC Prof. Nelson An 83
clrw borra el registro W
flags afectados Z=1
Z=1 si el resultado es = 0
Z=0 si el resultado es = 0
Cd. OP:00 0001 0000 0011
Instrucciones para
Ensamblar Programas
PIC Prof. Nelson An 84
incf f,d incrementa f
M(f) + 1 d={0,1} d=0 W
d=1 M(f)
flags afectados Z
Cd. OP:00 1010 dfff ffff
decf f,d decrementa f
M(f) - 1 d={0,1} d=0 W
d=1 M(f)
flags afectados Z
Cd. OP:00 0011 dfff ffff
Instrucciones para
Ensamblar Programas
PIC Prof. Nelson An 85
btfsc f,d test de bit y salto
Salta una instruccin si f(b) es = 0
0 =< b =< 7
Cd. OP:01 10bb bfff ffff
btfss f,d test de bit y salto
Salta una instruccin si f(b) es = 1
0 =< b =< 7
Cd. OP:01 11bb bfff ffff
Las instrucciones que saltan una sola instruccin, son saltos
condicionados.
Instrucciones para
Ensamblar Programas
PIC Prof. Nelson An 86
En los PIC de la gama media la memoria de datos est
organizada para alojar un mximo de 4 bancos de 128
bytes cada uno. En los mismos se destinan 2 bits del
registro de status (RP0 y RP1) para determinar el
banco y otros 7 para elegir una de las 128 posiciones
del banco seleccionado.
DIRECCIONAMIENTO DIRECTO: El operando que
utiliza la instruccin en curso se referencia mediante
su direccin, que viene includa en el cdigo OP de la
misma, concretamente en los 7 bits de menos peso. El
banco a acceder lo determinan los bits RP0 y RP1 del
registro de status.
Direccionamiento de la
Memoria de Datos
PIC Prof. Nelson An 87
DIRECCIONAMIENTO INDIRECTO: Este modo de
direccionamiento se usa cuando en una instruccin se
utiliza como operando el registro INDF (direccin 0x00
en todos los bancos). El registro INDF no est
implementado fsicamente y cuando se le hace
referencia, se accede a la direccin de un banco
especificada con los 7 bits de menos peso del registro
FSR (posicin 0x04 en todos los bancos). El bit de
ms peso del FSR junto al bit IRP del registro de
status se encargan de seleccionar el banco a acceder,
mientras que los 7 bits de menos peso del FSR
apuntan a la posicin. INDF = contenido del FSR
Direccionamiento de la
Memoria de Datos
PIC Prof. Nelson An 88
Direccionamiento de la
Memoria de Datos
INDICE
clrf M (indice)
8 7 0
Seleccin
del banco
Localizacin seleccin
direccin de memoria
PIC Prof. Nelson An 89
Direccionamiento de la
Memoria de Datos
M (0x00) W
IRP = Punto Registro Indirecto
0 x 20 FSR
0 x 1E M (0x00)
carga FSR
0 W
1E 0x 20
PIC Prof. Nelson An 90
Direccionamiento Indirecto
M (0x00) INDF
0 x 20 FSR
FSR + 1 FSR
apunto con FSR
borrado 0 x 20
Poner a
0x00 las
posiciones
0x20 a
0x2F del
banco 0
Start
End
bit 4 de
FSR=1
Si
No
List p=16F628A
INDF EQU 0x00
STATUS EQU 0x03
FSR EQU 0x04
RESET ORG 0x00
bcf Status,7; 0 IRP
movlw 0 x 20;
movwf FSR; FSR apunta a posicin 0x20
NEXT clrf INDF; borra posicin de memoria
incf FSR; FSR + 1 FSR,incremento puntero
btfss FSR,4; todo borrado
goto NEXT; no borra la siguiente
end ; si contina el programa
Direccionamiento Indirecto
PIC Prof. Nelson An 92
incfsz f,d incremento y salto
M(f) + 1 d={0,1} d=0 W
d=1 M(f)
flags afectados Z
Cd. OP:00 1111 dfff ffff
decfsz f,d decremento y salto
M(f) - 1 d={0,1} d=0 W
d=1 M(f)
flags afectados Z
Si el resultado es 0 salta por encima de la siguiente instruccin
Cd. OP:00 1011 dfff ffff
Instrucciones para
Ensamblar Programas
PIC Prof. Nelson An 93
Andlw K
0=<K=< 255
W K W
flags afectados Z
Realiza funcin AND, operacin bit a bit
K constante operacional
Cd. OP:11 1001 kkkk kkkk
Instrucciones para
Ensamblar Programas
PIC Prof. Nelson An 94
Andwf f,d
WM(f) d={0,1} d=0 W
d=1 M(f)
flags afectados Z
Realiza funcin AND, operacin bit a bit
Cd. OP:00 0101 dfff ffff
Instrucciones para
Ensamblar Programas
PIC Prof. Nelson An 95
IORlw K
0=<K=< 255
W + K W
flags afectados Z
Realiza funcin OR, operacin bit a bit
K constante operacional
Cd. OP:11 1000 kkkk kkkk
Instrucciones para
Ensamblar Programas
PIC Prof. Nelson An 96
IORwf f,d
W+M(f) d={0,1} d=0 W
d=1 M(f)
flags afectados Z
Realiza funcin OR, operacin bit a bit
Cd. OP:00 0100 dfff ffff
Instrucciones para
Ensamblar Programas
PIC Prof. Nelson An 97
XORlw K
0=<K=< 255
W + K W
flags afectados Z
Realiza funcin OR exclusiva, operacin bit a bit
K constante operacional
Cd. OP:11 1010 kkkk kkkk
Instrucciones para
Ensamblar Programas
PIC Prof. Nelson An 98
XORwf f,d
W + M(f) d={0,1} d=0 W
d=1 M(f)
flags afectados Z
Realiza funcin OR exclusiva, operacin bit a bit
Cd. OP:00 0110 dfff ffff
Instrucciones para
Ensamblar Programas
PIC Prof. Nelson An 99
Instrucciones para
Ensamblar Programas
swapf f,d intercambio de f
instruccin operandos
d={0,1} 0=< f=< 127 M=memoria
M(f) W d=0 M(f)=posicin de memoria
M(f) M(f) d=1
flags ninguno afectado
Intercambia el nibble ms significativo y el menos significativo
de M(f)
Cd. OP:00 1110 dfff ffff
PIC Prof. Nelson An 100
Instrucciones para
Ensamblar Programas
RLF f,d rota a la izquierda
instruccin operandos
d={0,1} 0=< f=< 127 M=memoria
M(f) W d=0 M(f)=posicin de memoria
M(f) M(f) d=1
flags afectado C
Cd. OP:00 1101 dfff ffff
PIC Prof. Nelson An 101
Instrucciones para
Ensamblar Programas
RRF f,d rota a la derecha
instruccin operandos
d={0,1} 0=< f=< 127 M=memoria
M(f) W d=0 M(f)=posicin de memoria
M(f) M(f) d=1
flags afectado C
Cd. OP:00 1100 dfff ffff
PIC Prof. Nelson An 102
Instrucciones de Control y
Especiales
En este grupo se incluyen las instrucciones que desvan la
secuencia normal del programa, porque alteran el contenido
del PC, y tambin las instrucciones especiales.
La instruccin de salto incondicional goto carga en el PC la
direccin de la nueva instruccin. La instruccin call de llamada
a subrutina, antes de cargar el PC con la direccin de la
instruccin a saltar, salva la direccin de partida guardando en
la cima de la pila el valor actual del PC. De esta manera, al
retornar de la subrutina se saca de la pila la direccin de
regreso en el programa principal.
Para realizar un retorno de una subrutina se pueden emplear
dos instrucciones la ms habitual es return, que se limita a
extraer de la cima de la pila el valor que carga en el PC.
PIC Prof. Nelson An 103
Instrucciones de Control y
Especiales
Otra ms compleja es retlw k, que, adems de hacer lo mismo
que return, carga en w el valor inmediato k que contiene. Es
decir, devuelve un parmetro desde la subrutina.
Para el final de las interrupciones hay otra instruccin cuyo
nemnico es retfie. La operatividad de esta instruccin consiste
en cargar en el PC el contenido de la cima de la pila y poner el
bit GIE=1, pues al comenzar la interrupcin este bit se pone
automticamente a cero para evitar que cuando se atienda una
interrupcin se produzca otra. GIE es el bit de permiso de
todas las interrupciones.
En cuanto a las instrucciones especiales se han includo dos
en este grupo: clrwdt y sleep.
PIC Prof. Nelson An 104
Instrucciones de Control y
Especiales
La primera pone a cero el contenido del perro guardin, es
decir, lo refresca lo reinicializa. El perro guardin si se
desborda (pasa de 0xff a 0x00) provoca un Reset. La
instruccin clrwdt hay que colocarla estratgicamente en
ciertos puntos del programa para evitar la reinicializacin.
Ejemplo: explicar las diferencias entres las tres instrucciones de
retorno.
Solucin: Return: retorna de una subrutina al programa principal.
Carga al PC con el contenido de la cima de la pila.
Retlw k: hace los mismo que Return y, adems, carga en w el
literal k.
Retfie: carga al PC con el contenido de la cima de la pila y pone
GIE=1.
PIC Prof. Nelson An 105
En ocasiones es necesario realizar un mismo
procedimiento en distintos lugares de un programa, por
ejemplo desplegar valores en un display. En este caso es
ms cmodo y ahorra memoria incluir una sola vez ese
trozo de cdigo y utilizarlo (invocarlo) desde distintos
puntos del programa, a ese cdigo se le llama
SUBRUTINA.
Las llamadas a subrutina mediante la instruccin CALL son
desviaciones del flujo de control del programa originadas
por instrucciones, por lo que se consideran sncronas. Se
producen cada vez que se ejecuta dicha instruccin.
SUBRUTINAS
PIC Prof. Nelson An 106
Se puede, a lo sumo, usar 8 subrutinas anidadas (stack 8
level de 13 bits)
Instruccin CALL K (salto a Subrutina)
K=posicin de memoria de programa 0<= K<=2047
1)La direccin de retorno (PC+1) es guardada en el Stack.
2)Los 11 bits de la direccion K, son cargados en el PC
(PCL y PCLATH)
SUBRUTINAS
PIC Prof. Nelson An 107
Carga en el Program Counters (PC) el contenido
de la cima de Pila, dejando adems la cima libre
Representacin de Subrutina
En Diagrama de Flujo
Nombre de
la Subrutina
SUBRUTINAS
PIC Prof. Nelson An 108
RETURN: retorna a subrutina
RETLW K (RETORNO, CARGA W)
0<=K<=255
1)Carga en el PC la direccin guardada en la cima del
STACK (dejando la cima libre)
2) Carga K------W
RETLW K va en lugar del RETURN
SUBRUTINAS
PIC Prof. Nelson An 109
SUBRUTINAS DE TEMPORIZACIN
Ejemplo: Realizar un temporizador delay de 0,5 segundos con
un PIC 16F628A a una frecuencia de 1 MHz.
Datos: 1 ciclo instruccin = 4T
1 MHz = 1 x 10
6
Hz
1 ciclo = 1 MHz x 4= 4 x 10
6
Hz
1 MHz
CLK = 1 us
PIC Prof. Nelson An 110
SUBRUTINAS DE TEMPORIZACIN
Ejemplo: Realizar un temporizador delay de 0,5 segundos con
un PIC 16F628A a una frecuencia de 1 MHz.
Datos: 1 ciclo instruccin = 4T
1 MHz = 1 x 10
6
Hz
1 ciclo = 1 MHz x 4= 4 x 10
6
Hz
T = 1/f = 1 us
1 clock = 1 us
0.5 seg/ 4 x 10
6
Hz = 125.000 ciclos de instruccin
que equivalen a 0,5 seg
PIC Prof. Nelson An 111
SUBRUTINAS DE TEMPORIZACIN
Para lograr este tiempo lo que debo hacer es decrementar
(el decremento se puede hacer hasta 256). Es decir
necesito decrementar de 248 a 0 para que los nmeros
sean exactos. De 248 a 0 hay 249 nmeros contando el 0 y
dicha instruccin al llegar al nmero deseado salta un ciclo
ms, es decir decrementa 250. Esto es lo que tenemos que
obtener: 125.000/ 250 = 500, son las veces que tengo que
repetir el decremento para obtener 0,5 segundos 500
miliseg
inicio
A = 2
B = 248
C = 248
DECRE C
C = 0
NO
SI
1 B
A
end
DECRE B
A = 0
DECRE A
NO
SI
1
B
A
B = 0
NO
SI
List p=16F628A ; demora 0,5 seg
VAR1 EQU 0x21
VAR2 EQU 0x22
VAR3 EQU 0x23
RESET ORG 0x00
INICIO movlw 02 h
movwf VAR1
movlw 248 h
movwf VAR2
movlw 248 h
movwf VAR3
DECO decfsz VAR3,1 ; (VAR1,1)
goto deco
DOS decfsz VAR2,1
goto dos
UNO decfsz VAR1,1 ; (VAR3,1)
goto inicio
nop
end
PIC Prof. Nelson An 115
SUBRUTINAS DE TEMPORIZACIN
Para poder ver el tiempo que demora el programa se debe fijar un
comienzo y un fin. El comienzo donde el programa dice inicio, y el
fin lugar donde vamos a escribir la instruccin NOP antes de la
directiva END.
Usando el MPLAB para verificar el tiempo que logro obtener
vamos a DEBUG.....RUN.....RESET.
Luego voy a OPTION DEVELOPMENT MODE elijo el PIC
16F628A clock de 1 MHz y acepto.
En ese momento se modifica la configuracin en el MPLAB,
indicando que qued pronto para funcionar a esa frecuencia.
Luego voy a WINDOWS STOP WATCH (donde se indican los
milisegundos) y en el programa indico los puntos de BREAK
POINT que corresponden a donde empieza el programa (goto
inicio) hasta NOP (lo tenemos que poner para que detenga el
conteo).
PIC Prof. Nelson An 116
SUBRUTINAS DE TEMPORIZACIN
PIC Prof. Nelson An 117
SUBRUTINAS DE TEMPORIZACIN
PIC Prof. Nelson An 118
PIC Prof. Nelson An 119
PIC Prof. Nelson An 120
PIC Prof. Nelson An 121
PIC Prof. Nelson An 122
PIC Prof. Nelson An 123
PIC Prof. Nelson An 124
PIC Prof. Nelson An 125
PIC Prof. Nelson An 126
PIC Prof. Nelson An 127
SUBRUTINAS DE TEMPORIZACIN
;PIC Time Delay = 0,5000020 s with Osc = 1.000000 MHz
movlw D'3'
movwf CounterC
movlw D'140'
movwf CounterB
movlw D'83'
movwf CounterA
loop decfsz CounterA,1
goto loop
decfsz CounterB,1
goto loop
decfsz CounterC,1
goto loop
return
PIC Prof. Nelson An 128
SUBRUTINAS DE TEMPORIZACIN
PIC Prof. Nelson An 129
TEMPORIZADORES
PIC Prof. Nelson An 130
TEMPORIZADORES
La frecuencia de trabajo del microcontrolador es un
parmetro fundamental a la hora de establecer la
velocidad en la ejecucin de instrucciones y el consumo
de energa.
Los pulsos de reloj externos entran por la patita
OSC1/CLKIN y se dividen por cuatro internamente
dando lugar a las seales Q1, Q2, Q3 y Q4, que
configuran un ciclo de instruccin. Durante un ciclo de
instruccin, que comprende las cuatro seales
mencionadas, se desarrollan las siguientes
operaciones:
PIC Prof. Nelson An 131
TEMPORIZADORES
Q1: Durante este impulso se incrementa el contador de
programa.
Q4: Durante este impulso se busca el cdigo de la
operacin en la memoria de programa y se carga en el
registro de instrucciones.
Q2-Q3: Durante la actividad de estas dos seales se
produce la decodificacin y la ejecucin de la instruccin.
Para conseguir ejecutar cada instruccin en un ciclo de
instruccin, se aplica la tcnica de segmentacin, que
consiste en realizar en paralelo las dos fases que
comprenden cada instruccin.
PIC Prof. Nelson An 132
TEMPORIZADORES
Cada instruccin se ejecuta en 2 ciclos: en el primero se
lleva a cabo la fase de bsqueda del cdigo de la
instruccin en la memoria del programa, y en el segunda
se decodifica y se ejecuta (fase de ejecucin). La
estructura segmentada del procesador permite realizar al
mismo tiempo la fase de ejecucin de una instruccin y la
bsqueda de la siguiente instruccin. Cuando la
instruccin ejecutada corresponde a un salto no se conoce
cul ser la siguiente hasta que se complete, por eso en
esta situacin se sustituye la fase de bsqueda de la
siguiente instruccin por un ciclo vaco, originando que
las instrucciones de salto tarden en realizarse dos ciclos
de instruccin. Ver figura 2-1 del fabricante.
PIC Prof. Nelson An 133
TEMPORIZADORES
PIC Prof. Nelson An 134
PIC Prof. Nelson An 135
PIC Prof. Nelson An 136
PIC Prof. Nelson An 137
PIC Prof. Nelson An 138
PIC Prof. Nelson An 139
PIC Prof. Nelson An 140
PIC Prof. Nelson An 141
PIC Prof. Nelson An 142
PIC Prof. Nelson An 143
PIC Prof. Nelson An 144
PIC Prof. Nelson An 145
REGISTRO OPCION:
OPTION Register es un registro de lectura y
escritura, el cual contiene varios bits de control para
configurar el TMRO/WDT prescaler, la interrupcin
externa RBO/INT, el TMRO y las resistencias de
pull-up del puerto B.
TEMPORIZADOR TMR0
PIC Prof. Nelson An 146
PIC Prof. Nelson An 147
TEMPORIZADOR TMR0
PIC Prof. Nelson An 148
La programacin del temporizador depende de la
frecuencia de trabajo del PIC.
Frecuencia de oscilacin: 4 MHz T= 250ns
ciclo de instruccin = 1us
En los programas de control es necesario determinar
intervalos concretos de tiempos.
Hacer esto por medio de loop (bucle) de programa
desperdiciara capacidad de proceso y no siempre fcil de
calcular con exactitud. Tambin es necesario contar la
cantidad de veces que ocurre un evento externo, el PIC
16F628A dispone de un Timer y Contador de 8 bits
llamado TMR0.
TEMPORIZADOR TMR0
PIC Prof. Nelson An 149
MODOS DE FUNCIONAMIENTO:
1) CONTADOR DE SUCESO: El contador TMR0 cuenta los
impulsos que se aplican al Pin RA4/TOCK1/CMP2.
Al llegar al valor FF se desborda el contador y con el siguiente
impulso pasa a 00, activando un flag (y provocando una
interrupcin ,si estn habilitados).
Este flag debe ser luego puesto a 0 por el programa.
2) TIMER: El TMRO se incrementa con cada ciclo de instruccin
(Frec.oscil/4), hasta que d overflod, pasando de FF a 00,
activando un flags (provocando una interrupcin si estn
habilitadas). Si el registro TMR0 est escrito, el incremento es
inhibido durante los 2 prximos ciclos de instruccin.
TEMPORIZADOR TMR0
PIC Prof. Nelson An 150
Tiempo = Frec.oscil/4
Timer
Cristal
4 MHz T = 250 ns
Ciclo instruccin T x 4 = 1 us
1 MHz T = 1 us
Ciclo instruccin T x 4 = 4 us T (perodo de instruccin)
TEMPORIZADOR TMR0
PIC Prof. Nelson An 151
REGISTRO TMR0:
El dispositivo 16F628A dispone de un TMR0.
El TMR0 es un contador ascendente de 8 bits,
que puede funcionar como reloj interno externo
y ser sensible al flanco ascendente
descendente. Se le puede asignar el divisor de
frecuencia. Una novedad importante en el TMR0
es la posibilidad de generar una interrupcin
cuando se desborda.
TEMPORIZADOR TMR0
PIC Prof. Nelson An 152
REGISTRO TMR0: Funcionamiento en 10 puntos:
1. El bit T0CS (OPCION<5>) determina si est a 1
que el TMR0 funciona en modo contador y si est a
0 en modo de temporizador, con seal externa de
reloj por T0CKI.
2. En el modo contador, el bit TOSE (OPCION<4>)
selecciona el tipo de flanco activo en T0CKI. (1:
descendente y 0: ascendente).
3. En modo contador el perodo de la seal externa
debe ser como mnimo de 4 T
osc
.
En el modo
temporizador la frecuencia de trabajo es F
osc
/4.
TEMPORIZADOR TMR0
PIC Prof. Nelson An 153
4. El bit PSA (OPTION<3>) asigna el divisor de
frecuencia al TMR0 si est a 0 y al WDT si est a 1.
5. El ratio al que funciona el divisor de frecuencia se
elige con los bits PS2, PS1 y PS0 (OPTION<2:0>).
6. El TMR0 se puede leer en cualquier momento para
conocer el estado de la cuenta.
7. Cuando se escribe un nuevo valor en TMR0 para
establecer una nueva temporizacin, los incrementos
del mismo se inhiben durante los dos ciclos de reloj
posteriores.
TEMPORIZADOR TMR0
PIC Prof. Nelson An 154
8. Como es un contador ascendente, conviene cargarle
con el complemento a 2 del valor deseado para la
temporizacin. Se utilizan las mismas frmulas
indicadas en la descripcin del TMR0.
9. Cuando se desborda el TMR0, es decir, cuando pasa
del valor FF h a 00 h, se activa el bit <2> de INTCON
(T0IF). Acta como una bandera de sealizacin del
desbordamiento. Si adems, el bit <7> de dicho
registro est a 1 (Permiso de interrupcin), se genera
una interrupcin. El bit T0IF se debe borrar por
software una vez atendida la interrupcin.
10. En el modo de reposo (Sleep) el TMR0 se detiene,
por lo que no puede originar interrupcin.
TEMPORIZADOR TMR0
PIC Prof. Nelson An 155
INTCON
TMR0
INTCON
OPTION
0 x 01
0 x 0B
0 x 81
0 x 8B
TMR0
BANCO 0 BANCO 1
TEMPORIZADOR TMR0
PIC Prof. Nelson An 156
BITS DEL REGISTER OPTION:
TOCS TOSE OPTION (0 x 81)
5 4
BIT = TOCS
TOCS: TMR0 CLOCK SOURCE
1 = TRANSICIN EN
RA4/TOCK1(contador)
0 = CLOCK INTERNO DE CICLO DE INSTRUCCIN
TEMPORIZADOR TMR0
PIC Prof. Nelson An 157
BITS DEL REGISTER OPTION:
TOCS TOSE OPTION (0 x 81)
5 4
BIT = TOSE
TOSE: TMR0 SOURCE EDGE SELECT BIT
1 = INCREMENTA EN (1 0) RA4/TOCK1
0 = INCREMENTA EN (0 1) RA4/TOCK1
TEMPORIZADOR TMR0
PIC Prof. Nelson An 158
REGISTRO INTCON:
El INTCON es un registro de lectura y escritura, el cual contiene
habilitadas varias banderas de bits, todas fuentes de interrupcin,
excepto el mdulo de comparacin.
Mire la Seccin 3.2.2.4 PIE1 Register y la Seccin 3.2.2.5 PIR1
Register para una descripcin de la habilitacin del comparador y
sus bits.
3.2.2.4 PIE1 Register: Este registro contiene bits que habilitan
interrupciones
3.2.2.5 PIR1 Register: Este registro contiene bits de interrupcin.
Nota: Los bits de interrupcin se ponen a uno 1 cuando ocurre
una condicin de interrupcin, guardndose el estado del
correspondiente bit de habilitacin habilitacin global bit, GIE
(INTCON<7>)
TEMPORIZADOR TMR0
PIC Prof. Nelson An 159
TEMPORIZADOR TMR0
PIC Prof. Nelson An 160
PIC Prof. Nelson An 161
PIC Prof. Nelson An 162
BIT DEL REGISTER INTCON:
TOIF INTCON (0 x 0B)
2 (0 x 8B)
BIT = TOIF
TOIF: TMR0 INTERRUPT FLAG BIT
1 = TMR0 se ha desbordado (overflow), hay que
ponerlo a cero por programa
0 = TMR0 no hay desborde
TEMPORIZADOR TMR0
PIC Prof. Nelson An 163
Clculo para TMR0:
1)Determinar el periodo del ciclo de instruccin, el
cual coincide con el periodo de incremento de TMR0
T= 4/F.OSCILADOR.
2)Calcular el nmero de veces que T cabe en el tiempo
que debemos temporizar.
N pulsos a contar =tiempo/T
3)Calcular el valor a cargar en TMR0, recordar que Toif
se pone a 1 al pasar de FF a 00 y que los primeros
pulsos luego de cargar TMR0 se pierden.
VALOR A CARGAR = 256-N pulsos +2
TEMPORIZADOR TMR0
PIC Prof. Nelson An 164
Clculo para TMR0:
1)Determinar el periodo del ciclo de instruccin, el cual
coincide con el periodo de incremento de TMR0
T= 4/F.OSCILADOR.
2)Calcular el nmero de veces que T cabe en el tiempo que
debemos temporizar.
N pulsos a contar =tiempo/T
3)Calcular el valor a cargar en TMR0, recordar que Toif se
pone a 1 al pasar de FF a 00 y que los primeros pulsos
luego de cargar TMR0 se pierden.
VALOR A CARGAR = 256-N pulsos +2
TEMPORIZADOR TMR0
PIC Prof. Nelson An 165
Clculo para TMR0:
Ejemplo:
Cristal = 4 MHz
tiempo: 100 us
T = 4/4 MHz = 1 us
N pulsos = tiempo/T = 100 us / 1 us = 100 pulsos
Valor a agregar = 256 100 + 2 = 158
10
TEMPORIZADOR TMR0
PIC Prof. Nelson An 166
START
INICIALIZACION
D 158............TMR0
0.................TOIF
TOIF = 1
END
SI
NO
TEMPORIZADOR TMR0
List p=16F628A
TMR0 EQU 0x01
INTCON EQU 0x0B
OPTION_REG EQU 0x81
STATUS EQU 0x03
RESET ORG 0x00
bsf Status,5; selecciono Banco 1
bcf Option,5; selecciona clock interno TOCS=0
bcf STATUS,5; selecciono Banco0
movlw D158; cargar valor decimal 158
movwf TMR0; cargo TMR0 para 100 us
bcf INTCON,2; pongo a 0 TOIF
ESPERA btfss INTCON,2; flag de overflow Toif=1
goto ESPERA
nop ; NO
end ; SI
TEMPORIZADOR TMR0
PIC Prof. Nelson An 168
Ejemplo: Utilizando un PIC 16F628A con un reloj de 1 MHz, realizar
un oscilador que entregue una seal de onda cuadrada en RB0, con
un frecuencia de 1 KHz.
Datos: 1 ciclo instruccin = 4T
T= 1/1000 = 1 ms T= 4/1 MHz = 4 us ciclo de
instruccin
1 ms
TEMPORIZADOR TMR0
500 us
RB0
N pulsos = 500 us / 4us = 125
Valor a cargar = 256 125 + 2 = 133 pulsos
PIC Prof. Nelson An 169
TEMPORIZADORES
START
INICIALIZACION
D 133............TMR0
0.................TOIF
TOIF = 1
END
SI
NO
List p=16F628A
TMR0 EQU 0x01
INTCON EQU 0x0B
OPTION_REG EQU 0x81
STATUS EQU 0x03
CMCON EQU 0X1F
TRISA EQU 0X85
TRISB EQU 0X86
PORTA EQU 0X05
PORTB EQU 0X06
RESET ORG 0x00
inicio movlw 0x07
goto inicio
movwf CMCON
bsf Status,5; selecciono Banco 1
bcf Status,6
TEMPORIZADORES
movlw b11111110
movwf TrisB
bcf Option,5; selecciona clock interno TOCS=0
bcf Status,5
goto TIMER
INVERSION movlw 0x01
xorwf PortB,1
TIMER movlw D133
movwf TMR0
bcf INTCON,2
ESPERA btfss INTCON,2
goto ESPERA
goto INVERSION
end
TEMPORIZADORES
PIC Prof. Nelson An 172
Es un timer de perodo fijo 18 miliseg
aproximadamente, funciona en base a un oscilador
RC interno del PIC totalmente independiente del clock.
Durante la operacin manual el watchdog genera
Device Reset al dar time out (terminar el tiempo del
timer).
El WDT tiene un perodo nominal de 18 miliseg, el cual
vara con la temperatura, la tensin de alimentacin
VDD y de un chip a otro.
La instruccin CLRWDT pone a cero el WDT y a 1 los
bits To y PD del STATUS.
WATCHDOG
PIC Prof. Nelson An 173
El bit To del STATUS es puesto a cero cuando el WDT
da un time out.
El WDT puede ser habilitado slo en la programacin
del PIC.
WATCHDOG
PIC Prof. Nelson An 174
Ejemplo: Se est utilizando un PIC con un oscilador de 4 MHz.
Programar una subrutina que al ser invocada, produzca una demora
de aproximadamente 1 seg.
Datos: 1 ciclo instruccin = 4T
4 MHz = 4 x 10
6
Hz
T = 4 / 4 MHz = 1 us ciclo de instruccin
TMR0 cuenta mximo 0xff 256 us
256 x 256 = 65,54 ms, aqu aplicamos el prescaler
mximo que es 256
si tomo 50 ms 20 veces llego a 1 seg de demora
256 pulsos 65 ms
195 pulsos 50 ms aproximadamente
TEMPORIZADOR TMR0
PIC Prof. Nelson An 175
START
0 .............CONTADOR
TIMER
CONTADOR+1...CONTADOR
CONTAD
FINAL
VOLVER
SI
NO
TEMPORIZADOR TMR0
PIC Prof. Nelson An 176
Ejemplo: Se est utilizando un PIC con un oscilador de 4 MHz.
Programar una subrutina que al ser invocada, produzca una demora
de aproximadamente 1 seg.
4 MHz 1 us sin prescaler Tmxima = 256 us
con prescaler T mxima = 256 us x 256 us = 65,536 us
Utilizo 50 ms 20 veces
El perodo de TMR0 = tiempo / prescaler = 50 / 256 = 195 us
Valor a cargar en TMR0 = 256 195 + 2 = 63
Factor divisor = 256
Valor del TMR0 = 63
TEMPORIZADOR TMR0
List p=16F628A
TMR0 EQU 0x01
INTCON EQU 0x0B
OPTION_REG EQU 0x81
STATUS EQU 0x03
CONT EQU 0x020
RESET ORG 0x00
GOTO INICIO
INICIO CLRWDT; CLEAR WDT
BSF STATUS, 5; SELECCIONO BANCO 1
BCF STATUS, 6; SELECCIONO BANCO 1
MOVLW b10000111; PROG TMR0 Y PRESCALER
MOVWF OPTION
BCF STATUS, 5; SELECT BANCO 0
TEMPORIZADOR TMR0
DEMORA MOVLW D20
MOVWF CONT; 20.......... CONTADOR
TIMER MOVLW D63
MOVWF TMRO; CARGO TMR0
BCF INTCON, 2; 0.......TOIF
POLLING BTFSS INTCON, 2; TOIF=1?
GOTO POLLING; NO
DECF CONT; SI
GOTO TIMER; NO
RETURN ; SI
END
TEMPORIZADOR TMR0
PIC Prof. Nelson An 179
Hemos visto que el mtodo de POLLING interrupcin
nos permite saber qu est pasando en una puerta (I/0).
Para ello debemos interrogar peridicamente a una
puerta de estados asociada a la puerta de datos.
Existen algunos procesos que no pueden esperar a que
el programa lo interrogue, la propia puerta I/0 debe
tomar la iniciativa y llamar la atencin a la CPU, a esto
le llamamos interrupcin.
La CPU suspender el programa que est ejecutando y
saltar a una subrutina, de tratamiento de
interrupciones.
INTERRUPCIONES
PIC Prof. Nelson An 180
Los llamados a subrutina mediante la instruccin CALL
son desviaciones del flujo de control del programa
asignado por instruccin, se los considera sincrnicos.
Las interrupciones son desviaciones del flujo de control
del programa originadas asincrnicamente por diversos
sucesos que no se hallan bajo la supervisin de las
instrucciones. Dichos sucesos pueden ser externos al
sistema, como la generacin de un flanco nivel activo
en una patita del microcontrolador, bien internos,
como el desbordamiento de un contador.
INTERRUPCIONES
PIC Prof. Nelson An 181
El comportamiento del microcontrolador ante la
interrupcin es similar al de la instruccin CALL de
llamada a subrutina. En ambos casos se detiene la
ejecucin del programa en curso, se salva la direccin
actual del PC en la pila y se carga el PC con una
direccin, que en el caso de CALL viene acompaando
a la propia instruccin, y en el caso de una interrupcin
es una direccin reservada de la memoria de
programa, llamada vector de interrupcin.
En el PIC 16F628A el vector de interrupcin se halla
situado en la direccin 0004h, en donde comienza la
rutina de servicio a la interrupcin (RSI).
INTERRUPCIONES
PIC Prof. Nelson An 182
En general, en dicho vector se suele colocar una instruccin
de salto incondicional (GOTO), que traslada el flujo de control
a la zona de la memoria de programa ( cdigo) destinada a
contener la rutina de atencin a la interrupcin.
La RSI suele comenzar guardando en la memoria de datos
algunos registros especficos del procesador (CPU).
Concretamente aquellos que la RSI va a emplear y va a alterar
su contenido. Antes del retorno al programa principal se
recuperan los valores guardados y se restaura completamente
el estado del procesador. Algunos procesadores salvan estos
registros en la Pila, pero el PIC 16F628A como toda su familia
no disponen de instrucciones para meter (push) y sacar (pop)
informacin de la Pila, utilizando para este fin registros de
propsito general de la memoria de datos.
INTERRUPCIONES
PIC Prof. Nelson An 183
La familia de los PIC 16F628A pueden ser interrumpidos
por 10 causas diferentes, pero todas desvan el flujo de
control a la direccin 0004h, por lo que otra de las
operaciones iniciales de la RSI es averiguar cual de las
posibles causas ha sido la responsable de la interrupcin
en curso.
Para ello se exploran los sealizadores (banderines) de las
fuentes de interrupcin.
Otro detalle importante en la RSI de los PIC es que estos
microcontroladores poseen un bit GIE (Global Interrupt
Enable) que cuando vale 0 prohbe todas las
interrupciones.
INTERRUPCIONES
PIC Prof. Nelson An 184
Pues bien, al comenzar la RSI dicho bit GIE se pone
automticamente a 0, con objeto de no atender nuevas
interrupciones hasta que se termine la que ha comenzado.
En el retorno final de la interrupcin, GIE pasa a valer
automticamente 1 para volver a tener en cuenta las
interrupciones. Dicho retorno de interrupcin se realiza
mediante la instruccin RETFIE.
Antes del retorno conviene borrar el sealizador bandera
de la causa de interrupcin que ha atendido, porque si bien
los sealizadores se ponen a 1 automticamente en
cuanto se produce la causa que indican, la puesta a 0 se
hace por programa.
INTERRUPCIONES
PIC Prof. Nelson An 185
Causas de Interrupcin:
EXTERNOS: un pulso de una lnea I/0 RB0/INT, cambio
de estado de los pines RB4 a RB7.
INTERNO: desborde de un contador TMR0.
INTERRUPCIONES
PIC Prof. Nelson An 186
Antes de este evento el PIC:
1) Deshabilita las instrucciones 0 GIE
2) Guarda el Program Counter en el STACK
3) 0004h pasa al Program Counter
La direccin de memoria 0004h es entonces el punto
donde comienza la rutina que atiende las interrupciones.
Esa direccin llamada vector de interrupcin de la rutina
de interrupcin se retorna con la instruccin RTFIE.
INTERRUPCIONES
PIC Prof. Nelson An 187
1) Externa interrupcin RBO/INT
2) Desborde TMR0
3) Cambia algunas de las lneas RB4 a RB7 (cambio
de estados)
Las interrupciones se utilizan a partir de la posicin de
Programa.
INTERRUPCIONES
PIC Prof. Nelson An 188
Modelo de Programa
Reset ORG 0000
goto inicio
ORG 0004
goto interrup
Inicio 0005
----------------------- Programa
----------------------- Principal
-----------------------
INTERRUPCIONES
PIC Prof. Nelson An 189
Interrupcin 1) Identificar la causa de la interrupcin
2) Atenderla
3) Finaliza con la instruccin RETFIE
INTERRUPCIONES
PIC Prof. Nelson An 190
Ejercicio:
Hacer un oscilador de 1 KHz con un PIC 16F628A en la
salida RB0, simultneamente, leer la puerta B y copiarla
a la posicin a M (0x20)
INTERRUPCIONES
PIC Prof. Nelson An 191
INTERRUPCIONES
Inicio
Inicializar
Leer PORTB
W----M(0x20)
GOTO
RUTINA
Interrupcin
INVERTIR RB0
PROGRAMAR TIMER
PARA 500 US
Volver
List p=16F628A
TMR0 EQU 0x01
INTCON EQU 0x0B
OPTION_REG EQU 0x81
STATUS EQU 0x03
PORTB EQU 0x06
TRISB EQU 0x86
ORG 0x000
GOTO INICIO
ORG 0x0004
GOTO INTER
INICIO BSF STATUS, 5; SELECCIONO BANCO 1
BCF STATUS, 6; SELECT BANCO 1
TEMPORIZADOR TMR0
MOVLW 0XFE
BCF OPTION, 5; 0..... TOCS (habilita clock interno)
BCF STATUS, 5; SELECCIONO BANCO 0
MOVLW D133
MOVWF TMR0; CARGO TMR0
MOVLW 0xA0; 1=GIE 1=TOIE 0....TOIF
MOVWF INTCON
RUTINA MOVF PORTB, 0
MOVWF 0x20
GOTO RUTINA
INTER MOVWF 0x21; SALVO W
MOVLW 0x01
XORWF PORTB, 1; INVIERTO RB0
MOVLW D133
MOVWF TMR0; CARGO TM0
BCF INTCON, 2; 0.....TOIF
MOVF 0x21, 0; RECUPERO W
RETFIE ; REGRESA A LA RUTINA
PIC Prof. Nelson An 194
Interrupciones
PIC Prof. Nelson An 195
Interrupciones
PIC Prof. Nelson An 196
PIC Prof. Nelson An 197
REGISTRO TMR1:
El TMR1 es un temporizador/contador ascendente
de 16 bits, por lo que est implementado mediante
dos registros especficos TMR1H y TMR1L, que
contienen el valor del conteo en cada momento.
Estos registros pueden leerse y escribirse. El valor
del registro (TMR1H:TMR1L) evoluciona desde
0000h hasta FFFFh, en cuyo instante activa <<1>>
la bandera TMR1IF (PIR1<0>) y vuelve a 0000h. Se
puede provocar una peticin de interrupcin
mediante la programacin del bit TMR1IE
(PIE1<0>).
ORGANIZACIN DE LA MEMORIA
PIC Prof. Nelson An 198
REGISTRO TMR1:
El funcionamiento de TMR1 depende de la
programacin del registro T1CON (10h). TMR1
puede funcionar como temporizador y como
contador sncrono asncrono. El modo de
funcionamiento viene determinado por el bit 1,
TMR1CS (T1CON<1>). En modo temporizador,
TMR1 se incrementa con cada ciclo de instruccin
(F
osc
/4), mientras en modo contador, se incrementa
con cada flanco de subida de la seal del reloj
externa, que se aplica a los pines RB6 y RB7, por
impulsos aplicados al pin RB6.
ORGANIZACIN DE LA MEMORIA
PIC Prof. Nelson An 199
REGISTRO TMR1:
Como fuente de los impulsos de reloj existen tres
alternativas:
1. Generacin interna (F
osc
/4).
2. Generacin mediante un oscilador externo
controlado por cristal que se conecta a los
pines RB6/T1OSO/T1CKI y RB7/T1OSI/CCP2. El
oscilador se activa poniendo a 1 el bit
T1OSCEN del registro T1CON. El bit TMR1CS
del registro T1CON selecciona entre reloj
interno externo. En los PIC16F62X los pines
son RB6 y RB7.
ORGANIZACIN DE LA MEMORIA
PIC Prof. Nelson An 200
REGISTRO TMR1:
3. Trabaja en modo contador de eventos cuando
los impulsos externos a contar se aplican a la
patita RB6/T1OSO/T1CKI. En los PIC16F62X el
pin es RB6.
ORGANIZACIN DE LA MEMORIA
PIC Prof. Nelson An 201
REGISTRO TMR1:
El funcionamiento de TMR1 depende de la
programacin del registro T1CON (10h), Registro 7-1.
El bit 0 TMR1ON gobierna su funcionamiento,
desactivando TMR1 cuando vale 0. El bit 1 TMR1CS
elige la fuente de pulsos; cuando su valor es 1, stos
proceden de una seal externa. En este caso, si el bit
3 T1OSCEN vale 1, actan los pines RB6 y RB7 como
entradas del reloj externo. Es posible colocar entre
estos pines un cristal de cuarzo de hasta 200 KHz
que permite que el oscilador siga en funcionamiento
incluso en modo de bajo consumo SLEEP. Si el bit
T1OSCEN vale 0, los pulsos se introducirn por el
pin RB6.
ORGANIZACIN DE LA MEMORIA
PIC Prof. Nelson An 202
PIC Prof. Nelson An 203
PIC Prof. Nelson An 204
PIC Prof. Nelson An 205
PIC Prof. Nelson An 206
PIC Prof. Nelson An 207
PIC Prof. Nelson An 208
PIC Prof. Nelson An 209
PIC Prof. Nelson An 210
PIC Prof. Nelson An 211
PIC Prof. Nelson An 212
PIC Prof. Nelson An 213
PIC Prof. Nelson An 214
PIC Prof. Nelson An 215
TITULO: Timer de 10 segundos con TMR1
PIC16F628A - 4MHz intRC - MCLR
MODIFICACIONES
CONT_POSTSC_SEG EQU 0X20 ; DEFINE DIRECCIN DE MEMORIA RAM
CONT_TIME_01 EQU 0X21 ; DEFINE DIRECCIN DE MEMORIA RAM
W_TEMP EQU 0X30
STATUS_TEMP EQU 0X31
#DEFINE PA0 PORTA,2 ; DEFINE ENTRADA DEL PULSADOR
#DEFINE PA1 PORTA,3 ; DEFINE ENTRADA DEL PULSADOR
#DEFINE PB0 PORTB,7 ; DEFINE SALIDA DEL LED A ENCENDER
#DEFINE PB1 PORTB,6 ; DEFINE SALIDA DEL LED A ENCENDER
LIST p=16F628A ; PROCESADOR UTILIZADO
INCLUDE "P16F628A.INC ; LIBRERIA DE DIRECCIONES CORRESPONDIENTES AL PIC
ORG 0x0000 ;VECTOR RESET (DIR. DE LA MEMORIA FLASH)
GOTO INICIALIZA_MC ; SALTA A LA ETIQUETA "INICIALIZA_MC"
ORG 0x0004 ; VECTOR INTERRUPCION (DIR. DE LA MEMORIA FLASH)
GOTO PUSH ; SALTA A LA ETIQUETA "PUSH" (INTERRUPCIN)
INICIALIZA_MC MOVLW B'00000111' ; CONFIGURA PINES DEL COMP. ANLOGO COMO I/O DIG.
MOVWF CMCON ; EN EL REGISTRO CMCON
BSF STATUS,RP0 ; CAMBIO AL BANCO 1
MOVLW B'11111111' ; ESCRIBE ESTE VALOR EN EL ACUMULADOR
MOVWF TRISA ; MUEVE ESTE VALOR AL REGISTRO TRISA (ENT 1 - SAL 0)
MOVLW B'00111111' ; ESCRIBE ESTE VALOR EN EL ACUMULADOR
MOVWF TRISB ; MUEVE ESTE VALOR AL REGISTRO TRISB (ENT 1 - SAL 0)
BCF STATUS,RP0 ; CAMBIO AL BANCO 0
CLRF PORTB ; LIMPIA EL REGITRO PORTB
PROGRAMA PRINCIPAL
PROG_PRINCIPAL BTFSC PA0
BSF PB0
GOTO PROG_PRINCIPAL ; SALTA A LA ETIQUETA "LOOP_SINFIN"
RUTINA DE SERVICIO DE INTERRUPCIN ;
PUSH MOVWF W_TEMP ; GUARDA EL VALOR DE W EN W_TEMP
SWAPF STATUS,W ; (RUTINA DE SERVICIO DE INTERRUPCIN)
MOVWF STATUS_TEMP ; GUARDA EL VALOR DE STATUS EN STATUS_TEMP
RSI DECFSZ CONT_POSTSC_SEG ,F ; RESTA 1 AL REGISTRO Y SALTA CUANDO ES CERO
GOTO FIN_RSI
MOVLW D'20' ; VALOR INICIAL DEL REGISTRO "CONT_POSTSCALA"
MOVWF CONT_POSTSC_SEG ;
DECFSZ CONT_TIME_01,F ; RESTA 1 AL REGISTRO Y SALTA CUANDO ES CERO
GOTO FIN_RSI
MOVLW D'10' ; VALOR INICIAL DEL REGISTRO "CONT_POSTSCALA"
MOVWF CONT_TIME_01 ;
BCF PB0
FIN_RSI MOVLW H'B0' ; VALOR INICIAL DEL REGISTRO "TMR1L"
MOVWF TMR1L ;
MOVLW H'3C' ; VALOR INICIAL DEL REGISTRO "TMR1H"
MOVWF TMR1H ;
BCF PIR1,TMR1IF ; COLOCA EN 0 EL FLAG DE LA INTERRUPCION CORRESP.
POP SWAPF STATUS_TEMP,W ; RECUPERA VALORES DE STATUS
MOVWF STATUS ; MUEVE EL VALOR DE W AL REGISTRO "STATUS"
MOVF W_TEMP,W ; RECUPERA VALORES DE W
RETFIE ; RETORNA DE LA INTERRUPCION HABILITANDO EL BIT GIE"
ORG 0x2007 ; DIR. DE MEM. ROM DE LA PALABRA DE CONFIGURACION
DATA H'3F30' ; VALOR PARA LA PALABRA DE CONFIGURACION
END ; FIN DEL PROGRAMA