Beruflich Dokumente
Kultur Dokumente
PIC
EL OBJETIVO DE ESTE CURSO ES APRENDER A
PROGRAMAR EN LENGUAJE ASSEMBLER
PIC
Prof. Nelson An
PIC 16F628A
PIC
Prof. Nelson An
PIC 16F628A
PIC
Prof. Nelson An
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
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
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
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
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
movwf
portA,0
reg1
;lee el puerto A
;escribe en reg1
Prof. Nelson An
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
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
10
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
PIC
leer
Prof. Nelson An
11
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
12
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
13
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
Prof. Nelson An
14
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
15
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.
Prof. Nelson An
16
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
17
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
18
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
Prof. Nelson An
19
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
20
Instrucciones para
Ensamblar Programas
Con estas directivas haremos los siguientes ejemplos:
#DEFINE BANCO1 BSF
#DEFINE BANCO0 BCF
STATUS,5
STATUS,6
PIC
Prof. Nelson An
21
PIC
Prof. Nelson An
22
PIC
Prof. Nelson An
23
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
24
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
en la posicin 20
Prof. Nelson An
25
Aprendiendo a Programar
3.
efectuar
determinadas
26
Instrucciones para
Ensamblar Programas
MOVF
LECTURA
movf
f,d
instruccin operandos
d={0,1}
M(f)
d=1
flagZ=1
d=0
M=memoria
M(f)=posicin de memoria
M(f)
M(f)=0
PIC
Prof. Nelson An
27
Instrucciones para
Ensamblar Programas
MOVWF
mover a f
ESCRITURA
movwf
M=memoria
M(f)=posicin de memoria
W
M(f)
Cd. OP:0000001fff ffff
PIC
Prof. Nelson An
28
Instrucciones para
Ensamblar Programas
Escribir un programa que copie el contenido del registro 0x20 al 0x30
Inicio
M (0x20)
M(0x30)
Fin
PIC
Prof. Nelson An
movf 0x20,0
movwf 0x30
cdigo fuente
29
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
30
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
31
Instrucciones para
Ensamblar Programas
1) Crear un nuevo proyecto en men Project
New Project
New
Proyecto NOMBRE.pjt
Fuente
NOMBRE.asm
Ejemplo:
Ej001.pjt
Ej001.asm
3) Asignar al archivo de cdigo el proyecto
Project
PIC
Edit Project
Prof. Nelson An
32
Instrucciones para
Ensamblar Programas
MPLAB
Editor de texto
Ensamblador
Simulador
Creacin de Proyecto
1. Project New Proyect
Ventana
File Name
nombre.pjt
Ej001.pjt
dar OK
PIC
Prof. Nelson An
33
Instrucciones para
Ensamblar Programas
2. Edit Project
Tools
16F628A
Processor
Tools
MPLAB SIM SIMULATOROK
3. Creacin Archivo Fuente
File
New
Untilted 1
File
Save As
Prof. Nelson An
34
Instrucciones para
Ensamblar Programas
4. Project Edit Project
Project Files
Ej001 [.hex]
OK
Ej001 [.asm]
1 Tabulacin
List
1 Tabulacin
p=16F628A
org
0x00
movf
0x20,0
movwf
0x30
end
PIC
Prof. Nelson An
35
Instrucciones para
Ensamblar Programas
5. File
Save
6. Project
Build All
Mal
Program Memory
PIC
movf
[formato instruccin]
0000
0820
0001
Prof. Nelson An
0x20,w [00100000100000]
[00000010110000]
36
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
PIC
SYSTEM RESET
Prof. Nelson An
37
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
38
Instruccin de Movimiento
Instruccin de Suma
Instruccin Movimiento:
movlw k
Instruccin Suma:
addlw k
flags C, DC, Z
afectados
Resultado=0
Z=1
Resultado>255
C=1
PIC
Prof. Nelson An
39
Instruccin de Suma
Uso del C y DC:
PIC
Prof. Nelson An
40
Instruccin Suma
addwf
f,d
instruccin operandos
d={0,1}
W +M(f)
W d=0
W +M(f)
M(f)
flags
afectados
M=memoria
M(f)=posicin de memoria
d=1
C, DC y Z
PIC
Prof. Nelson An
41
Instrucciones para
Ensamblar Programas
Sumar el contenido de 2 posiciones de memoria 0x2C + 0x2D y poner
el resultado en 0x2E
Inicio
M (0x2C
W+M (0x2D)
W
M(0x2E)
Fin
PIC
W)
Prof. Nelson An
movf 0x2C,0
addwf 0x2D,0
movwf 0x2E
cdigo fuente
42
Instrucciones para
Ensamblar Programas
Sumar el contenido de 2 posiciones de memoria 0x2C + 0x2D y
poner el resultado en 0x2E
List
Reset
p=16F628A
ORG
0x00
movf
0x2C,0
addwf
0x2D,0
movwf
0x2E
end
PIC
Prof. Nelson An
43
Instruccin Resta
subwf
f,d
instruccin operandos
d={0,1}
M(f) - W
W d=0
M(f) - W
M(f)
flags
afectados
M=memoria
M(f)=posicin de memoria
d=1
C, DC y Z
PIC
Prof. Nelson An
44
Instruccin Resta
sublw K
0=<K=< 255
K-W
W flags
afectados C, DC y Z
C=1
C=0
PIC
Prof. Nelson An
45
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
complemento A2
1111 1101
1111 1110 +
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 0001
PIC
Prof. Nelson An
47
PIC
23
22
21
20
Prof. Nelson An
48
23 22 21 20
29 0 0 1 0
23 22 21 20
1 0 0 1
Prof. Nelson An
49
las
operaciones
aritmticas
resultan
4 resultado correcto
= 16
Prof. Nelson An
50
PIC
Prof. Nelson An
51
Instrucciones para
Ensamblar Programas
Restar el contenido de 2 posiciones de memoria 0x1A y 0x0A y poner
el resultado en 0x2A
Inicio
M (0x0A
W)
movf 0x0A,0
M(0x1A)-W
subwf 0x1A,0
M(0x2A)
Fin
PIC
Prof. Nelson An
movwf 0x2A
cdigo fuente
52
Instrucciones para
Ensamblar Programas
Restar el contenido de 2 posiciones de memoria 0x1A y 0x0A y
poner el resultado en 0x2A
List
Reset
p=16F628A
ORG
0x00
movf
0x0A,0
subwf
0x1A,0
movwf
0x2A
end
PIC
Prof. Nelson An
53
PIC
Prof. Nelson An
54
Prof. Nelson An
55
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
PIC
BIT=0
salida
BIT=1
entrada
Prof. Nelson An
56
PIC
Prof. Nelson An
57
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
58
PIC
Prof. Nelson An
59
Instrucciones para
Ensamblar Programas
bsf f,b
set (pone a 1) el bit b de la posicin f de la memoria
M=memoria
M(f)=posicin de memoria
0 =< b =< 7
Cd. OP:01 01bb bfff ffff
PIC
Prof. Nelson An
60
Instrucciones para
Ensamblar Programas
bcf f,b
reset (pone a 0) el bit b de la posicin f de la memoria
M=memoria
M(f)=posicin de memoria
0 =< b =< 7
Cd. OP:01 00bb bff ffff
PIC
Prof. Nelson An
61
REGISTRO DE STATUS
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.
PIC
Prof. Nelson An
62
REGISTRO DE STATUS
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.
PIC
Prof. Nelson An
63
PIC
Prof. Nelson An
64
PIC
Prof. Nelson An
65
RP0=0
Status, RP1=bit6
bcf 0x03,6
Status, RP0=bit5
bsf 0x03,5
M(f)=Status=0x03
PIC
Prof. Nelson An
66
PIC
BANCO 0
BANCO 1
BANCO 2
BANCO 3
bcf 0x03,6
bcf 0x03,5
bcf 0x03,6
bsf 0x03,5
bsf 0x03,6
bcf 0x03,5
bsf 0x03,6
bsf 0x03,5
Prof. Nelson An
67
Selecciono Banco1
bcf 0x03,6
bcf 0x03,5
0xFF
TRISA
movlw 0xFF
movwf 0x85
TRISB
movlw 0x00
movwf 0x86
0x00
Fin
PIC
Prof. Nelson An
cdigo fuente
68
Instrucciones para
Ensamblar Programas
Programar todas las lneas del PORTA como entrada y todas las lneas
del PORTB como salida.
Status
TRISA
TRISB
Reset
PIC
List
p=16F628A
EQU
0x03
EQU
0x85
EQU
0x86
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
Prof. Nelson An
69
Instruccin
GOTO
Salto incondicional a
la direccin que
vaya precedida
como (etiqueta)
GOTO K
GOTO
RUTINA
Programar PORTA
y PORTB
Leer PORTA
0<= K <=2047
Pepe btfss portA, 1
btfcs portA, 1
Escribir en
PORTB
GOTO Pepe
PIC
Prof. Nelson An
70
Inicio
Programar PORTA
y PORTB
Leer PORTA
Escribir en
PORTB
Prof. Nelson An
71
Aplicacin 1:
Cdigo
Fuente
List
STATUS
PORTA
PORTB
TRISA
TRISB
CMCON
EQU
EQU
EQU
EQU
EQU
EQU
RESET
ORG
p=16F628A
0x03
0x05
0x06
0x85
0x86
0x1F
0x00; posicin inicial del programa
movlw
movwf
bcf
bsf
movlw
0xFF
movwf
movlw
0x00
movwf
bcf
RUTINA
movwf
goto
end
PORTA, 0; PORTA
PORTB; W
RUTINA
W
PORTB
Prof. Nelson An
73
PIC
Prof. Nelson An
74
Prof. Nelson An
75
Prof. Nelson An
76
Prof. Nelson An
77
STACK O PILA
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.
PIC
Prof. Nelson An
78
PIC
Prof. Nelson An
79
STACK O PILA
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
PIC
Prof. Nelson An
80
Instrucciones para
Ensamblar Programas
comf
f,d
complemento
complemento M(f)
d={0,1}
d=1
d=0
M(f)
(intercambia 1 y 0)
M(f)=posicin de memoria
flags
afectados
PIC
Prof. Nelson An
81
Instrucciones para
Ensamblar Programas
clrf
0x00
flags
M(f)
borra cualquier posicin de memoria
M(f)=posicin de memoria
afectados
Z=1
Z=1
si el resultado es = 0
Z=0
si el resultado es = 0
PIC
Prof. Nelson An
82
Instrucciones para
Ensamblar Programas
clrw
flags
borra el registro W
afectados
Z=1
Z=1
si el resultado es = 0
Z=0
si el resultado es = 0
PIC
Prof. Nelson An
83
Instrucciones para
Ensamblar Programas
incff,d incrementa f
M(f) + 1 d={0,1}
d=0
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
d=1
M(f)
flags
afectados
Z
Cd. OP:00 0011 dfff ffff
PIC
Prof. Nelson An
84
Instrucciones para
Ensamblar Programas
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.
PIC
Prof. Nelson An
85
Direccionamiento de la
Memoria de Datos
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.
PIC
Prof. Nelson An
86
Direccionamiento de la
Memoria de Datos
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
PIC
Prof. Nelson An
87
Direccionamiento de la
Memoria de Datos
INDICE
clrf M (indice)
8
Seleccin
del banco
PIC
0
Localizacin seleccin
direccin de memoria
Prof. Nelson An
88
Direccionamiento de la
Memoria de Datos
IRP = Punto Registro Indirecto
0 x 20
M (0x00)
0 x 1E
PIC
FSR
M (0x00)
Prof. Nelson An
carga FSR
1E 0x 20
89
Direccionamiento Indirecto
Poner a
0x00 las
posiciones
0x20 a
0x2F del
banco 0
Start
0 x 20
FSR
M (0x00)
INDF
FSR + 1
FSR
No
bit 4 de
FSR=1
Si
End
PIC
Prof. Nelson An
90
Direccionamiento Indirecto
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
Instrucciones para
Ensamblar Programas
incfsz
M(f) + 1
Prof. Nelson An
92
Instrucciones para
Ensamblar Programas
Andlw K
0=<K=< 255
WK
flags
W
afectados Z
PIC
Prof. Nelson An
93
Instrucciones para
Ensamblar Programas
Andwf
f,d
WM(f)
d={0,1}
d=1
flags
d=0
M(f)
afectados Z
PIC
Prof. Nelson An
94
Instrucciones para
Ensamblar Programas
IORlw K
0=<K=< 255
W+K
flags
W
afectados Z
PIC
Prof. Nelson An
95
Instrucciones para
Ensamblar Programas
IORwf
W+M(f)
flags
f,d
d={0,1}
d=1
d=0
M(f)
afectados Z
PIC
Prof. Nelson An
96
Instrucciones para
Ensamblar Programas
XORlw
0=<K=< 255
W + K
flags
afectados Z
PIC
Prof. Nelson An
97
Instrucciones para
Ensamblar Programas
XORwf
f,d
W + M(f) d={0,1}
d=1
flags afectados Z
d=0
M(f)
PIC
Prof. Nelson An
98
Instrucciones para
Ensamblar Programas
swapf
f,d intercambio de f
instruccin operandos
d={0,1}
M(f)
W d=0
M(f)
M(f)
flags
ninguno afectado
M=memoria
M(f)=posicin de memoria
d=1
Prof. Nelson An
99
Instrucciones para
Ensamblar Programas
RLF
instruccin operandos
d={0,1}
M(f)
W d=0
M(f)
M(f)
flags
afectado
M=memoria
M(f)=posicin de memoria
d=1
C
PIC
Prof. Nelson An
100
Instrucciones para
Ensamblar Programas
RRF
instruccin operandos
d={0,1}
M(f)
W d=0
M(f)
M(f)
flags
afectado
M=memoria
M(f)=posicin de memoria
d=1
C
PIC
Prof. Nelson An
101
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
102
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
103
Instrucciones de Control y
Especiales
La primera pone a cero el contenido del perro guardin,
decir, lo refresca lo reinicializa. El perro guardin si
desborda (pasa de 0xff a 0x00) provoca un Reset.
instruccin clrwdt hay que colocarla estratgicamente
ciertos puntos del programa para evitar la reinicializacin.
es
se
La
en
Prof. Nelson An
104
SUBRUTINAS
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.
PIC
Prof. Nelson An
105
SUBRUTINAS
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)
PIC
Prof. Nelson An
106
SUBRUTINAS
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
PIC
Prof. Nelson An
107
SUBRUTINAS
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
PIC
Prof. Nelson An
108
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
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
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
110
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
PIC
Prof. Nelson An
111
inicio
A=2
B = 248
C = 248
DECRE C
NO
C=0
SI
1
A
DECRE B
NO
B=0
SI
DECRE A
NO
A=0
SI
end
List
VAR1
VAR2
VAR3
RESET
INICIO
movwf
VAR1
movlw
248 h
movwf
VAR2
movlw
248 h
movwf
VAR3
DECO
decfsz
goto
DOS
UNO
decfsz
goto
nop
end
; (VAR1,1)
deco
decfsz
goto
VAR3,1
VAR2,1
dos
VAR1,1
inicio
; (VAR3,1)
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
115
SUBRUTINAS DE TEMPORIZACIN
PIC
Prof. Nelson An
116
SUBRUTINAS DE TEMPORIZACIN
PIC
Prof. Nelson An
117
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
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
127
SUBRUTINAS DE TEMPORIZACIN
PIC
Prof. Nelson An
128
TEMPORIZADORES
PIC
Prof. Nelson An
129
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
130
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
131
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
132
TEMPORIZADORES
PIC
Prof. Nelson An
133
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
TEMPORIZADOR TMR0
REGISTRO OPCION:
PIC
Prof. Nelson An
145
PIC
Prof. Nelson An
146
TEMPORIZADOR TMR0
PIC
Prof. Nelson An
147
TEMPORIZADOR TMR0
La programacin del temporizador
frecuencia de trabajo del PIC.
Frecuencia de oscilacin: 4 MHz
depende de la
T= 250ns
Prof. Nelson An
148
TEMPORIZADOR TMR0
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.
PIC
Prof. Nelson An
149
TEMPORIZADOR TMR0
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
PIC
Prof. Nelson An
T (perodo de instruccin)
150
TEMPORIZADOR TMR0
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.
PIC
Prof. Nelson An
151
TEMPORIZADOR TMR0
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 Tosc. En el modo
temporizador la frecuencia de trabajo es Fosc/4.
PIC
Prof. Nelson An
152
TEMPORIZADOR TMR0
PIC
Prof. Nelson An
153
TEMPORIZADOR TMR0
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.
PIC
Prof. Nelson An
154
TEMPORIZADOR TMR0
TMR0
0 x 01
0 x 0B
PIC
BANCO 0
TMR0
BANCO 1
0 x 81
OPTION
INTCON 0 x 8B
INTCON
Prof. Nelson An
155
TEMPORIZADOR TMR0
BITS DEL REGISTER OPTION:
TOCS
TOSE
OPTION (0 x 81)
BIT = TOCS
TOCS: TMR0 CLOCK SOURCE
1 =
TRANSICIN EN
RA4/TOCK1(contador)
0 =
PIC
Prof. Nelson An
156
TEMPORIZADOR TMR0
BITS DEL REGISTER OPTION:
TOCS
TOSE
OPTION (0 x 81)
BIT = TOSE
TOSE: TMR0
PIC
1 =
INCREMENTA EN
(1 0) RA4/TOCK1
0 =
INCREMENTA EN
(0 1) RA4/TOCK1
Prof. Nelson An
157
TEMPORIZADOR TMR0
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>)
PIC
Prof. Nelson An
158
TEMPORIZADOR TMR0
PIC
Prof. Nelson An
159
PIC
Prof. Nelson An
160
PIC
Prof. Nelson An
161
TEMPORIZADOR TMR0
BIT DEL REGISTER INTCON:
TOIF
INTCON (0 x 0B)
(0 x 8B)
BIT = TOIF
TOIF: TMR0
1 =
TMR0 se ha desbordado (overflow), hay que
ponerlo a cero por programa
0 =
PIC
Prof. Nelson An
162
TEMPORIZADOR TMR0
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
PIC
Prof. Nelson An
163
TEMPORIZADOR TMR0
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
PIC
Prof. Nelson An
164
TEMPORIZADOR TMR0
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 = 15810
PIC
Prof. Nelson An
165
TEMPORIZADOR TMR0
START
INICIALIZACION
D 158............TMR0
0.................TOIF
NO
TOIF = 1
SI
END
PIC
Prof. Nelson An
166
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
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
instruccin
500 us
1 ms
RB0
Prof. Nelson An
168
TEMPORIZADORES
START
INICIALIZACION
D 133............TMR0
0.................TOIF
NO
TOIF = 1
SI
END
PIC
Prof. Nelson An
169
TEMPORIZADORES
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
WATCHDOG
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.
PIC
Prof. Nelson An
172
WATCHDOG
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.
PIC
Prof. Nelson An
173
TEMPORIZADOR TMR0
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
Prof. Nelson An
174
TEMPORIZADOR TMR0
START
0 .............CONTADOR
TIMER
CONTADOR+1...CONTADOR
NO
CONTAD
FINAL
SI
VOLVER
PIC
Prof. Nelson An
175
TEMPORIZADOR TMR0
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
PIC
Prof. Nelson An
176
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
INTERRUPCIONES
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.
PIC
Prof. Nelson An
179
INTERRUPCIONES
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.
PIC
Prof. Nelson An
180
INTERRUPCIONES
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).
PIC
Prof. Nelson An
181
INTERRUPCIONES
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.
PIC
Prof. Nelson An
182
INTERRUPCIONES
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.
PIC
Prof. Nelson An
183
INTERRUPCIONES
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.
PIC
Prof. Nelson An
184
INTERRUPCIONES
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.
PIC
Prof. Nelson An
185
INTERRUPCIONES
Antes de este evento el PIC:
1) Deshabilita las instrucciones 0
GIE
PIC
Prof. Nelson An
186
INTERRUPCIONES
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.
PIC
Prof. Nelson An
187
INTERRUPCIONES
Modelo de Programa
Reset
ORG
0000
goto
ORG
0004
goto
Inicio
inicio
interrup
0005
-----------------------
Programa
-----------------------
Principal
-----------------------
PIC
Prof. Nelson An
188
INTERRUPCIONES
Interrupcin
2) Atenderla
3) Finaliza con la instruccin RETFIE
PIC
Prof. Nelson An
189
INTERRUPCIONES
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)
PIC
Prof. Nelson An
190
INTERRUPCIONES
Inicio
Interrupcin
Inicializar
GOTO
RUTINA
Leer PORTB
INVERTIR RB0
PROGRAMAR TIMER
PARA 500 US
Volver
W----M(0x20)
PIC
Prof. Nelson An
191
TEMPORIZADOR TMR0
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
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
Interrupciones
PIC
Prof. Nelson An
194
Interrupciones
PIC
Prof. Nelson An
195
PIC
Prof. Nelson An
196
ORGANIZACIN DE LA MEMORIA
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>).
PIC
Prof. Nelson An
197
ORGANIZACIN DE LA MEMORIA
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
(Fosc/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.
PIC
Prof. Nelson An
198
ORGANIZACIN DE LA MEMORIA
REGISTRO TMR1:
Como fuente de los impulsos de reloj existen tres
alternativas:
1. Generacin interna (Fosc/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.
PIC
Prof. Nelson An
199
ORGANIZACIN DE LA MEMORIA
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.
PIC
Prof. Nelson An
200
ORGANIZACIN DE LA MEMORIA
REGISTRO TMR1:
PIC
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
PROGRAMA PRINCIPAL
PROG_PRINCIPAL BTFSC
PA0
BSF PB0
GOTOPROG_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
GOTOFIN_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
GOTOFIN_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