Sie sind auf Seite 1von 217

Circuitos Integrados Programables

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

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

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

ETIQUETAS A DIRECCIONES DE PROGRAMA:


Explicacin: son muy tiles para usar con instrucciones CALL
(llamada a subrutina) GOTO (salto)
PIC

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.

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

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

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

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

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

21

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

22

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

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

;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

25

Aprendiendo a Programar
3.

Se emplean signos para


consideraciones. Por ejemplo:

efectuar

determinadas

; 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.
PIC

Un Programa siempre deber comenzar con la directiva


ORG y terminar con la directiva END.
Prof. Nelson An

26

Instrucciones para
Ensamblar Programas
MOVF

LECTURA

movf

f,d

instruccin operandos

0=< f=< 127

d={0,1}
M(f)
d=1
flagZ=1

d=0

M=memoria
M(f)=posicin de memoria

M(f)
M(f)=0

Cd. OP:001000dfff ffff


movf d=0
d=1

PIC

Prof. Nelson An

27

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

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

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
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

guardar en cualquier carpeta ej: example

dar OK
PIC

Prof. Nelson An

33

Instrucciones para
Ensamblar Programas
2. Edit Project

Tools

Development Mode: Change

16F628A

Processor
Tools
MPLAB SIM SIMULATOROK
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

34

Instrucciones para
Ensamblar Programas
4. Project Edit Project

Add Node Ej001.asm Aceptar

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

Build Completed sucessfully OK


Build Failed
7. Windows

Mal
Program Memory

apretar botn ROM Memoria de Programa


cada posicin 14 bits

PIC

movf

[formato instruccin]

0000

0820

0001

00B0 movwf 0x30

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

0=< k =< 255


k

w Cd. OP: 11 111x kkkk kkkk

Instruccin Suma:
addlw k

flags C, DC, Z

0=< k =< 255


w+k

afectados

Resultado=0
Z=1

Resultado>255
C=1

PIC

Prof. Nelson An

39

Instruccin de Suma
Uso del C y DC:

DC=1 para valores > 15, sea 5 bit


C=1 para valores > 255, sea 9 bit

PIC

Prof. Nelson An

40

Instruccin Suma
addwf

f,d

instruccin operandos
d={0,1}

0=< f=< 127

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

Cd. OP:00 0111dfff ffff

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}

0=< f=< 127

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

Cd. OP:00 0010dfff ffff

PIC

Prof. Nelson An

44

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

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

0000 0011-0000 0010 = mtodo

Ejemplo: w=0000 0010

complemento A1 = 1111 1101

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 0011-0000 0010 = mtodo


0000 0011
1111 1110

0000 0001

PIC

Prof. Nelson An

47

Binario Codificado en Decimal (BCD)


Formato BDC

PIC

23

22

21

20

Prof. Nelson An

48

Binario Codificado en Decimal (BCD)


Formato BDC
BCD

23 22 21 20

29 0 0 1 0

23 22 21 20
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

49

Binario Codificado en Decimal (BCD)


Formato BDC
Consecuentemente
complicadas.

las

operaciones

aritmticas

resultan

Ejemplo de cmo se suman 2 nmeros en BCD:


0001 + 0011 = 0100
1

4 resultado correcto

1000 + 1000 = 1 0000


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

50

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

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

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

54

Sntesis de los 16 pines del 16F628A


PORTA RA0 RA7
PORTB RB0 RB7

16 PINES Posibles ENTRADAS/SALIDAS

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
PIC

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

0=< f=< 127

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

0=< f=< 127

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

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

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: TABLA para Eleccin de BANCOS

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

Configuracin de los pines en


Entradas / Salidas
Programar todas las lneas del PORTA como entrada y todas las
lneas del PORTB como salida
Inicio

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

Aplicacin 1: Diagrama de Flujo


Inicio

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

Aplicacin 1: Diagrama de Flujo


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.
PIC

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

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
RUTINA

Status,5; selecciono Banco 0


movf

movwf
goto
end

PORTA, 0; PORTA
PORTB; W
RUTINA

W
PORTB

REGISTROS PCL Y PCLATH


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.
PIC

Prof. Nelson An

73

REGISTROS PCL Y PCLATH


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).

PIC

Prof. Nelson An

74

REGISTROS PCL Y PCLATH


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.
PIC

Prof. Nelson An

75

REGISTROS PCL Y PCLATH


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.
PIC

Prof. Nelson An

76

REGISTROS PCL Y PCLATH


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 (fig33).
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.
PIC

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

Cd. OP:00 0111dfff ffff

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

Cd. OP:00 0001 1fff ffff

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

Cd. OP:00 0001 0000 0011

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

apunto con FSR


borrado 0 x 20

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

f,d incremento y salto


d={0,1}
d=0
W
d=1
M(f)
flags
afectados
Z
Cd. OP:00 1111 dfff ffff
decfsz
M(f) - 1

f,d decremento y salto


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
PIC

Prof. Nelson An

92

Instrucciones para
Ensamblar Programas
Andlw K

0=<K=< 255
WK
flags

W
afectados Z

Realiza funcin AND, operacin bit a bit


K constante operacional
Cd. OP:11 1001 kkkk kkkk

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

Realiza funcin AND, operacin bit a bit


Cd. OP:00 0101 dfff ffff

PIC

Prof. Nelson An

94

Instrucciones para
Ensamblar Programas
IORlw K

0=<K=< 255
W+K
flags

W
afectados Z

Realiza funcin OR, operacin bit a bit


K constante operacional
Cd. OP:11 1000 kkkk kkkk

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

Realiza funcin OR, operacin bit a bit


Cd. OP:00 0100 dfff ffff

PIC

Prof. Nelson An

96

Instrucciones para
Ensamblar Programas
XORlw

0=<K=< 255
W + K
flags

afectados Z

Realiza funcin OR exclusiva, operacin bit a bit


K constante operacional
Cd. OP:11 1010 kkkk kkkk

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)

Realiza funcin OR exclusiva, operacin bit a bit


Cd. OP:00 0110 dfff ffff

PIC

Prof. Nelson An

98

Instrucciones para
Ensamblar Programas
swapf

f,d intercambio de f

instruccin operandos
d={0,1}

0=< f=< 127

M(f)

W d=0

M(f)

M(f)

flags

ninguno afectado

M=memoria
M(f)=posicin de memoria

d=1

Intercambia el nibble ms significativo y el menos significativo


de M(f)
Cd. OP:00 1110 dfff ffff
PIC

Prof. Nelson An

99

Instrucciones para
Ensamblar Programas
RLF

f,d rota a la izquierda

instruccin operandos
d={0,1}

0=< f=< 127

M(f)

W d=0

M(f)

M(f)

flags

afectado

M=memoria
M(f)=posicin de memoria

d=1
C

Cd. OP:00 1101 dfff ffff

PIC

Prof. Nelson An

100

Instrucciones para
Ensamblar Programas
RRF

f,d rota a la derecha

instruccin operandos
d={0,1}

0=< f=< 127

M(f)

W d=0

M(f)

M(f)

flags

afectado

M=memoria
M(f)=posicin de memoria

d=1
C

Cd. OP:00 1100 dfff ffff

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

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

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

p=16F628A ; demora 0,5 seg


EQU
0x21
EQU
0x22
EQU
0x23
ORG
0x00
movlw
02 h

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:

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.

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

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.
PIC

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

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.

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

CLOCK INTERNO DE CICLO DE INSTRUCCIN

Prof. Nelson An

156

TEMPORIZADOR TMR0
BITS DEL REGISTER OPTION:
TOCS

TOSE

OPTION (0 x 81)

BIT = TOSE
TOSE: TMR0

PIC

SOURCE EDGE SELECT BIT

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

INTERRUPT FLAG BIT

1 =
TMR0 se ha desbordado (overflow), hay que
ponerlo a cero por programa
0 =

PIC

TMR0 no hay desborde

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

T= 4/1 MHz = 4 us ciclo de

RB0

N pulsos = 500 us / 4us = 125

Valor a cargar = 256 125 + 2 = 133 pulsos


PIC

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

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
PIC

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

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

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

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.

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

1) Identificar la causa de la 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

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.
Prof. Nelson An
201

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)
GOTOINICIALIZA_MC
; SALTA A LA ETIQUETA "INICIALIZA_MC"
ORG 0x0004
; VECTOR INTERRUPCION (DIR. DE LA MEMORIA FLASH)
GOTOPUSH
; 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
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

Das könnte Ihnen auch gefallen