Está en la página 1de 90

INTRODUCCIN A LOS MICROCONTROLADORES

Y LABORATORIO
Bolilla I INTRODUCCIN
Sistemas de Numeracin
Caractersticas.
Nomenclatura de cada sistema de numeracin.
Conversin entre sistemas.
Binario a Decimal. Binario a Octal. Binario a Hexadecimal.
Octal a Binario. Octal a Decimal. Octal a Hexadecimal.
a Binario. Hexadecimal a Octal. Hexadecimal a Decimal.
Decimal a Binario. Decimal a Octal. Decimal a Hexadecimal.
Operaciones Lgico-Aritmticas.
Operaciones Aritmticas Bsicas.
Suma. Resta. Multiplicacin. Divisin. Mtodo de restas y sumas sucesivas.
Operaciones Lgicas Bsicas.
AND. OR. EXOR.
Sistemas de Numeracin limitados en cifras.
Binario limitado en 8, decimal y hexadecimal limitados en 2.
Suma en sistemas limitados en cifras.
Resta en sistemas limitados en cifras.
Complemento al MVR. Ca2. Ca1.
Comparacin.
Representacin o Codificacin.
Nmeros Naturales. Nmeros Enteros.
Cdigo ASCII. Cdigos BCD. Cdigo Grey. Cdigo Johnson.
Codificacin BCD.
Suma. Resta.
Nmeros Enteros.
Suma de nmeros enteros.
Definiciones y trminos
Nociones de Memorias
Caractersticas
Clasificacin.
Por uso de la memoria
Por forma de acceso al registro deseado
Por la forma de almacenamiento.
Bolilla II MICROCONTROLADORES
Descripcin y Caractersticas
Bloques Principales
Caractersticas Generales.
Funcionamiento bsico
Clasificacin
PIC16F628A
Caractersticas y patillaje (Hoja de Datos)
Caractersticas principales. Caractersticas Especiales. Patillaje.
Diagrama interno.
Tipos de fuente
Clases de oscilador.
Circuitos de Entrada o Salida. Circuitos de Entrada. Circuitos de Salida.
Memoria interna.
Mapa de Memoria
Memoria de Programa
Memoria de Datos. Memoria EEPROM
Registros Internos.
SFR del ncleo. SFR de perifricos
Set de instrucciones del PIC16F628A
Nomenclatura. Instrucciones orientadas a registros.
Instrucciones orientadas a bit.
3

Operacin con literales.


Instrucciones de Control. SALTOS. Formas de cargarse el PC
Bolilla III PROGRAMACIN
Diagrama de los Mdulo de prueba
Banco de Led y de Swicht.
Matriz de Led y de Swicht.
Probador.
Herramientas a utilizar
Entorno de desarrollo MPLAB-IDE
Conceptos y elementos bsicos de programacin.
Diagrama de flujo
Smbolos Grficos.
Diseo de Diagrama de Flujo.
Diagrama Alineado
Diagrama Sabana o Extendido
Variable, Etiqueta, Puntero y Vector.
Formas de Direccionar posiciones de memoria, registros o datos.
Programa Fuente para el PIC16F628A
Programacin de Bajo Nivel.
Formas de Direccionamiento del PIC16F628A.
Sintaxis del Compilador.
Comandos para el Compilador.
Bits de Configuracin.
Estructura del programa fuente.
Asociacin Diagrama de Flujo Programa Fuente
Movimientos y Asignaciones.
Movimientos y asignaciones.
Direccionamiento Indirecto por Registro.
Operaciones.
Saltos y Decisiones.
Decisiones y manejo bit a bit.
Lazos, bucle, loop o iteraciones.
Matrices y series.
Subrutinas.
Direccionamiento Indexado.
Contadores y temporizadores
Bolilla IV USO BSICO DEL PIC
Perifricos.
Puertos I/O. Deteccin de Pulso.
TIMER0. Estructura. Funcionamiento y programacin.
Interrupciones.
Funcionamiento y Configuracin.
Practicas con TMR0 como temporizado y contador, RB0 y RB4-RB7
Modo Bajo Consumo
Control de mecanismos
Motor paso a paso de 4 o 3 hilos.
Decodificador de posicin (Shift decoder o encoder)
Control de Elementos Mediante Multiplexin en el Tiempo.
Matriz de Elementos. Multiplexin de Matrices.
Manejo de Matrices por Multiplexin en el Tiempo
Matriz de Salida. Display de Segmentos.
Matriz de Entrada. Matriz de Swicht. Teclado Matricial.
Bolilla V Otros Perifricos
WachtDog Timer (Vigilante).
Bloques Principales.
Uso y Operacin.
WDT y el modo SLEEP. Banderas TO, PD, POR y BOR. SLEEP y las interrupciones.
4

Memoria EEPROM.
Descripcin. Funcionamiento.
Lectura-escritura desde software
Lectura-escritura desde el quemador.
Bolilla VI
COMUNICACIONES
Introduccin a comunicacin de microprocesadores.
Tipos de comunicacin
Comunicacin Paralela. Caractersticas
Unidireccional.
Practica de envo y recepcin
Unidireccional con aviso de dato valido (STB y ACK).
Practica de envi y recepcin
Bi-direccional con Handshaking (Entrega en mano propia).
Practica de envi y recepcin
Comunicacin Serie. Caractersticas
Elementos (paridad, stop y arranque)
Mtodos RZ, NRZ, Ancho de pulso
Comunicacin maestro-esclavo y sin jerarqua
Protocolos I2C, RS232 y RS485
Memorias seriales.
Bolilla VII
CONVERSION A/D y D/A
Principios. Mtodos. Practicas

BOLILLA I: INTRODUCCIN
Sistemas de Numeracin
Se llama Sistema Numrico al conjunto ordenado de smbolos y a las reglas con que se combinan para
representar las cantidades numericas.Cada sistema de numeracin se identifica segn la cantidad de
simbolos diferentes que utiliza para su representacin. Este valorse llama base o raiz.
Se usan en este texto varios sistemas de numeracin distintos. Los sistemas digitales usan el sistema
binario, pero los operadores, programadores y usuarios estn acostumbrados a usar el sistema decimal. Por
lo tanto se buscan sistemas numricos que sirvan de nexo entre el binario y el decimal.

Caractersticas
La cantidad de smbolos diferentes en cada sistema define la base del mismo.
Sistema decimal: base 10 (10 smbolos) : 0,1,2,3,4,5,6,7,8,9
Sistema binario: base 2 (2 smbolos): 0,1
Sistema octal: base 8 (8 smbolos) : 0,1,2,3,4,5,6,7,8
Sistema hexadecimal: base 16 (16 smbolos) : 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F
Todos son ponderados, o sea que para cada smbolo su valor depende de su posicin relativa dentro del
nmero. Por ejemplo 5271 en sistema decimal: el uno de ms a la derecha tiene orden cero, y el 5 de ms a
la izquierda tiene orden 3. En este caso el smbolo de orden 0 representa una unidad, el smbolo de orden 1
representa 70 unidades, el smbolo de orden 2 representa 200 unidades y el smbolo de orden 3 representa
5000 unidades.
Los sistemas con procesador usan el sistema de numeracin binario, pero se utilizan representaciones y
conversiones a otros sistemas de numeracin. Para indicar en que sistema de numeracin se expresa cada
nmero, se le coloca un subndice al final dependiendo del sistema al que pertenece: B binario, O octal, D
decimal y H hexadecimal.
La representacin ms comn es con el sistema hexadecimal, pues se necesitan menos smbolos para
representar cantidades y adems de muy fcil conversin binario-hexadecimal y viceversa.

Nomenclatura de cada sistema de numeracin


En los sistemas de numeracin ponderados cada cifra, segn su posicin relativa, tiene un orden, peso
significativo o ponderacin dentro del nmero.
En el sistema decimal se denomina:
Unidades
orden 0
Decenas
orden 1
Centenas
orden 2
Millares
orden 3
Decimos
orden -1
Centsimos
orden -2
Milsimos
orden -3
En el sistema hexadecimal, octal y binario no tienen una denominacin particular solo se le menciona el
numero de orden de la posicin de cada cifra.
En el sistema binario cada cifra se llama bit o binit y tiene su nombre segn el orden
Bit 0
orden 0
Bit 1
orden 1
Bit 2
orden 2
Bit 3
orden 3
Bit 4
orden 4
Bit 5
orden 5
Bit 6
orden 6
Bit 7
orden 7
Bit 8
orden 8
Bit 9
orden 9
Un grupo de 4 bit ordenados se llama nible y de 8 bit se le llama byte. En un byte se le denomina nible alto
al conjunto formado por Bit 4, Bit 5, Bit 6 y Bit 7 , y nible bajo al formado por Bit 0, Bit 1, Bit 2 y Bit 3.
Al bit de menor orden se le llama LSB o bit menos significativo.
Al bit de mayor orden se le llama MSB o bit ms significativo
6

Conversiones entre sistemas


Equivalencias entre los sistemas de numeracin
Decim
Binario
Hexa
Octal Decimal
al
00
0000
0
00
08
01
0001
1
01
09
02
0010
2
02
10
03
0011
3
03
11
04
0100
4
04
12
05
0101
5
05
13
06
0110
6
06
14
07
0111
7
07
15

Binario

Hexa

Octal

1000
1001
1010
1011
1100
1101
1110
1111

8
9
A
B
C
D
E
F

10
11
12
13
14
15
16
17

Nmeros Binarios y su equivalencia decimal


11010,1101B = 1 x 24 +1 x23 +0 x22 +1 x21 +0x20 +1x2-1 +1x2-2 +0x2-3 +1x2-4
11010,1101B = 26,8125D
Este mtodo es llamado de cambio de base. Multiplicamos cada cifra del nmero del sistema origen
(convertido a su equivalente en el sistema destino), por la base del sistema origen (expresada en el sistema
destino) elevada a la potencia de su orden.

Nmeros Binarios y su equivalente Octal


Mediante el cambio de base:
110010,1101B 1x25 +1x24 +0x23 +0x22 +1x21 +0x20 +1x2-1 +1x2-2 +0x2-3 +1x2-4
110010,1101B = 62,64O
Un mtodo ms practico es:
110 010 , 110 101B = 62,65O
Se toman grupos de 3 smbolos binarios a partir de la coma hacia la derecha y la izquierda, y se sustituye
por el smbolo octal correspondiente.
Nmeros Binarios y su equivalencia Hexadecimal
Mediante el cambio de base es
110010,1101B = 1x25 +1x24 +0x23 +0x22 +1x21 +0x20 +1x2-1 +1x2-2 +0x2-3 +1x2-4
110010,1101B = 32,DH
Un mtodo prctico parecido al sistema octal es:
1101 1011 , 0110 1010B = DB,6AH
Se toman grupos de cuatro smbolos binarios a partir de la coma hacia la derecha y la izquierda, y se
sustituye por el smbolo hexadecimal correspondiente.
Nmero Octal y su equivalencia Binaria
365,72O = 011x100010 +110x100001 +101x100000 +111x1000-01 +010x1000-10
365,72O = 11110101,111011B
Un mtodo prctico para esta conversin es:
365,724O = 011 110 101 , 111 010 100B
Se sustituye cada smbolo octal por los 3 smbolos binarios equivalentes.
Nmero Octal y su equivalencia Decimal
365,724O = 3x82 +6x81 +5x80 +7x8-1 +2x8-2 +4x8-3 = 245,9140625D
Numero Octal y su equivalencia Hexadecimal
1257O = 1x83 +2x82 +5x81 +7x80 = 2AFH
Numero Hexadecimal y su equivalencia Binaria
7

F5,7CH = 1111x1000001 +0101x1000000 + 0111x10000-01 +1100x10000-10


F5,7CH = 11110101,011111B
Un mtodo practico es el siguiente:
D9,E6H = 1101 1001 , 1110 0110B
Se sustituye cada smbolo hexadecimal por los 4 smbolos binarios equivalentes
Nmeros Hexadecimales y su equivalencia Octal
F36H = 17x202 +3x201 +6x200 = 7466O
Nmeros Hexadecimales y su equivalencia Decimal
3AB,E5H = 3x162 +10x161 +11x160 +14x16-1 +5x16-2 = 939,894531D
Conversin decimal-hexadecimal
286,43D = 2xA2 +8xA1 +6xA0 +4xA-1 +3xA-2
286,43D = 11E,6E14H
Un mtodo ms prctico es:
La parte entera
286
286 / 16 =
17 y resto 14 >>
E
Smbolo de menor ponderacin
17 / 16 =
1 y resto 1
>>
1
1 / 16 =
0 y resto 1
>>
1
Smbolo de mayor ponderacin
286D =
11EH
La parte fraccionaria
0,43
0,43 x 16 =
6
+ 0,88 >>
6
Smbolo de mayor ponderacin
0,88 x 16 =
14
+ 0,08 >>
E
0,08 x 16 =
1
+ 0,28 >>
1
0,28 x 16 =
4
+ 0,48 >>
4
Smbolo de menor ponderacin
0,43D =
0, 6 E 1 4 H
Conversin decimal-octal
519,283D = 5x122 +1x121 +11x120 +2x12-1 +10x12-2 +3x12-3
519,283D = 1007,2204O
Un mtodo ms prctico es:
La parte entera
519
519 / 8 =
64 y resto 7
>>
7
Smbolo de menor peso significativo
64 / 8 =
8 y resto 0
>>
0
8/8=
1 y resto 0
>>
0
1/8=
0 y resto 1
>>
1
Smbolo de mayor peso significativo
519D = 1 0 0 7 O
La parte fraccionaria
0,283
0,283 x 8 =
2
+ 0,264 >>
2
Smbolo de mayor peso significativo
0,264 x 8 =
2
+ 0,112 >>
2
0,112 x 8 =
0
+ 0,896 >>
0
0,896 x 8 =
7
+ 0,168 >>
4
Smbolo de menor peso significativo
0,253D = 0, 2 2 0 4 O
Conversin decimal-binario
69,687D = 110x101001 +1001x101000 +110x1010-01 +1000x1010-10 +111x1010-11
69,687D = 100010,1011B
Un mtodo ms prctico es:
Parte entera
69
69 / 2 =
34 y resto 1
>>
1
Smbolo de orden 0
34 / 2 =
17 y resto 0
>>
0
17 / 2 =
8 y resto 1
>>
1
8/2=
4 y resto 0
>>
0
4/2 =
2 y resto 0
>>
0
2/2=
1 y resto 0
>>
0
1/2=
0 y resto 1
>>
1
Smbolo de orden 6
69D
= 1 0 0 0 1 0 1B
Parte fraccionaria
0.6875
0,6875 x 2 =
1 + 0,375
>>
1
Smbolo de orden -1
0,375 x 2 =
0 + 0,75
>>
0
0,75 x 2 =
1 + 0,5
>>
1
0,5 x 2 =
1 + 0,0
>>
1
Smbolo de orden -4
0,6875D = 0, 1 0 1 1B

Operaciones Lgico-Aritmticas
Operaciones Aritmticas Bsicas
Suma
Decimal
Hexadecimal
Binario

32 + 84 = 116
FB + A1 = 19C
0110 + 1100 = 10010
0+0=0
1+0=1
0+1=1
1 + 1 = 0 y hay Acarreo o Carry

Resta
Decimal
Hexadecimal
Binario

54 32 = 22
835 647 = 188
AC 7B = 31
D9E AF4 = 2AA
10011 01100 = 00111
0-0=0
1-1=0
1-0=1
0 - 1 = 1 y pido 1 o Borrow

Multiplicacin
Decimal
25 x 7 = 175
La multiplicacin se puede descomponer en sucesivas sumas del multiplicando. Tantas como indique el
multiplicador.
25 + 25 = 50
(2 veces)
50 + 25 = 75
(3 veces)
75 + 25 = 100
(4 veces)
100 + 25 = 125 (5 veces)
125 + 25 = 150 (6 veces)
150 + 25 = 175 (7 veces)
Hexadecimal
17
xBC
114
FD
10E4

7 x C =54
7 x B = 4D

Binario
110110
x 110
000000
110110
110110
101000100

0x0=0
0x1=0
1x0=0
1x1=1

Aplicando sucesivas sumas


110110
(001 vez)
+ 110110
(010 veces)
1101100
1101100
+ 110110
(011 veces)
10100010
+ 110110
(100 veces)
11011000
+ 110110
(101 veces)
100001110
+ 110110
(110 veces)
101000100
En todo sistema de numeracin multiplicar por la base significa agregar un cero a la derecha del numero.
9

Divisin
La divisin permite averiguar cuantas veces cabe el divisor en el dividendo. Calcula la proporcin entre el
divisor y el dividendo.
Se puede hacer la divisin clsica, sumar en divisor a si mismo hasta que llegue al valor del dividendo, o
restar el divisor del dividendo hasta que el resto sea menor al dividendo.
Decimal

245
/37
222
6
023
&
Por el mtodo de sumas sucesivas
37
(1 vez)
+37
(2 veces)
74
Resultado menor que el dividendo
+37
(3 veces)
111
Resultado menor que el dividendo
+37
(4 veces)
148
Resultado menor que el dividendo
+37
(5 veces)
185
Resultado menor que el dividendo
+37
(6 veces)
222
Resultado menor que el dividendo
+37
(7 veces)
259
Resultado mayor que el dividendo.
El mayor nmero de sumas que su resultado no supere al dividendo es el cociente. La diferencia entre ese
valor y el dividendo es el resto.
Resto = 245 222 = 23
Por el mtodo de sucesivas restas del divisor al dividendo.
245
-37
(1 vez)
208
-37
(2 veces)
171
-37
(3 veces)
134
-37
(4 veces)
097
-37
(5 veces)
060
-37
(6 veces)
023
Se debe detener cuando el resultado es menor que el divisor
Este resultado es el resto, y el nmero de veces que se realizo la resta el cociente.
Hexadecimal

4F5
475
080
&

F2B9
D4
1EB
1A8
439
424
015
&

/D4
125

/A3
7

10

Por el mtodo de sumas sucesivas


0A3
(1 vez)
+A3
(2 veces)
146
Resultado menor que el dividendo
+A3
(3 veces)
1E9
Resultado menor que el dividendo
+A3
(4 veces)
28C
Resultado menor que el dividendo
+A3
(5 veces)
32F
Resultado menor que el dividendo
+A3
(6 veces)
3D2
Resultado menor que el dividendo
+A3
(7 veces)
475
Resultado menor que el dividendo
+A3
(8 veces)
518
Se super el dividendo
El nmero de veces que se suma el divisor sin superar el dividendo es el cociente.
La diferencia de ese resultado con el dividendo da el resto
Resto = 4F5 475 = 80
Por el mtodo de restas sucesivas
4F5
-A3
(1 vez)
452
-A3
(2 veces)
3AF
-A3
(3 veces)
30C
-A3
(4 veces)
269
-A3
(5 veces)
1C6
-A3
(6 veces)
123
-A3
(7 veces)
080
El cociente es el nmero de veces que se resto el divisor del dividendo antes que el resultado de la resta
sea menor que el divisor. Este ltimo resultado es el resto.
Binario

11011 / 110 = 100 y de resto 11


Mtodo Clsico
11011 /110
110
100
0001
000
0011
000
11
&
Mtodo de Sumas sucesivas
110
01
+110
10
1100
Resultado menor que el dividendo
+110
11
10010
Resultado menor que el dividendo
+110
100
11000
Resultado menor que el dividendo
+ 110
101
11110
me pase
11

El nmero de veces que se suma el divisor sin superar el dividendo es el cociente.


La diferencia entre 11011 y 11000 es el resto.
11011
-11000
resto =
11
Mtodo de Restas Sucesivas
11011
- 110
1
10101
Resultado mayor que el divisor
- 110
10
1111
Resultado mayor que el divisor
- 110
11
1001
Resultado mayor que el divisor
- 110
100
11
Resultado menor que el divisor es el resto
El cociente es el nmero de veces que se resto el divisor del dividendo antes que el resultado de la
resta sea menor que el divisor.

Operaciones Lgicas Bsicas


Solo son aplicables en el sistema binario. El smbolo => en una ecuacin indica operacin lgica.
Operacin AND (&) o (*) o (.)
0 & 0 => 0
0 & 1 => 0
1 & 0 => 0
1 & 1 => 1
Para nmeros de varias cifras se realizan operaciones individuales entre bit de igual peso, sin generar
ninguna clase de acarreo entre posiciones de diferente ponderacin.
1110 1110 * 0110 0011 => 0110 0010
Operacin OR

(+)

0 + 0 => 0
0 + 1 => 1
1 + 0 => 1
1 + 1 => 1
Para nmeros de varias cifras se realizan operaciones individuales entre bit de igual peso, sin generar
ninguna clase de acarreo entre posiciones de diferente ponderacin.
1011 0110 + 0110 0111 => 1111 0111
Operacin Exor (#)
0 # 0 => 0
0 # 1 => 1
1 # 0 => 1
1 # 1 => 0
1001 0111 # 0100 1011 => 1101 1100
Para nmeros de varias cifras se realizan operaciones individuales entre bit de igual peso.

12

Sistemas de numeracin limitados en cifras


Por ser dispositivos fsicos los procesadores trabajan con un nmero finito de cifras. Lo que significa usar un
sistema numrico limitado en cifras. Usan el sistema binario limitado a 4, 8, 12, 16, 32 bit o ms. En este
texto se estudiara el sistema binario limitado a 8 cifras, el decimal y el hexa limitados en 2 cifras.
Para operar con otros conjuntos numricos (enteros, reales, etc) se debe acordar una representacin con
los 256 posibles valores disponibles.
Adems del resultado, los procesadores, generan indicadores (banderas o flag) que nos dicen que clase de
resultado dio. No dependen del valor en si, sino de las caractersticas del resultado. Se generan elegidos
por convencin.
En las operaciones aritmticas puede suceder que el sistema sea excedido por el resultado, por lo tanto es
necesario avisar si sucede tal caso
Si hubo desborde en la suma binaria CY=1
Si no hubo desborde en la suma binaria CY=0
Si pido uno prestado en la resta binaria BW=1
Si no pido prestado uno en la resta binaria BW=0
Si el resultado de la operacin lgico-matemtica es cero Z=1
Si el resultado de la operacin lgico-matemtica no es cero Z=0
Si el bit 7 del resultado de la operacin lgico-matemtica es igual a uno S=1
Si el bit 7 del resultado de la operacin lgico-matemtica es igual a cero S=0
Si hubo acarreo entre el bit 3 y el bit 4 AC=1 o DC=1
Si no hubo acarreo entre el bit 3 y el bit 4 AC=0 o DC=0
Se llama semiacarreo o acarreo digital.
Si la sumatoria de los bit del resultado es cero P=0 (paridad par)
Si la sumatoria de los bit del resultado es uno P=1 (paridad impar)
Se define el mximo representable (MVR) como el valor mximo que se puede representar en un sistema
limitado en cifras. Es el nmero donde cada cifra es el smbolo de mayor valor.
Decimal de dos cifras
99
Hexadecimal de dos cifras
FF
Binario de ocho cifras
1111 1111
Las sumas cuyo resultado es mayor al MVR ponen a 1 la bandera (indicador o flag) CY.
Como condicin de funcionamiento si al mximo representable le sumamos 1, dar como resultado 0 y el
indicador CY valdr 1.
Decimal
99 + 01 = 00 y CY=1
Hexadecimal
FF + 01 = 00 y CY=1
Binario
1111 1111 + 0000 0001 = 0000 0000 y CY=1
En estos casos decimos que hubo desborde o acarreo.
Se observa tambin un semiacarreo AC, entre:
las unidades y decenas en el sistema decimal
la cifra de orden 0 ( x 160 )y la cifra de orden 1( x 161).
el nible bajo y el alto en el sistema binario, o del bit 3 al bit 4

Suma en Sistemas Limitados en Cifras


Decimal
23 + 45 = 68 y CY=0 AC=0
84 + 53 = 37 y CY=1 AC=0
38 + 25 = 63 y CY=0 AC=1
84 + 47 = 31 y CY=1 AC=1
Suma de mximos
99 + 99 = 98 y CY=1
Hexadecimal
C5 + 2A = EF y CY=0 AC=0
B8 + 19 = D1 y CY=0 AC=1
72 + D8 = 4A y CY=1 AC=0
13

4F + B9 = 08
Suma de mximos

y CY=1 AC=1
FF + FF = FE y CY=1

Binario
1101 1001
+0010 0001
1111 1010

y CY=0 AC=0

1101 1011
+0110 0001
0011 1100

CY=1 AC=0

1010 0111
+0100 1010
1111 0001

CY=0 AC=1

1001 0111
+1010 1001
0100 0000

CY=1 AC=1

Suma de mximo

1111 1111
+1111 1111
1111 1110

CY=1

Resta en Sistemas Limitados en Cifras


Se estudia el sistema decimal limitado a dos cifras y se extender el razonamiento al binario y al
hexadecimal.
Cuando el minuendo es menor que el sustraendo al final de la resta es necesario pedir una unidad a la cifra
de la izquierda o un acarreo negativo, al cual llamamos borrow. El borrow se representa con BW. En la
prctica activa la bandera CY.
Decimal
43 - 25 = 18

y no hubo Borrow

La resta es una operacin compleja de implementar. Lo importante es que la resta siempre reporte la
diferencia entre los operandos.
La resta se define:
a-b=c a=b+c
Se plantea desde otra forma equivalente
a + (-b) = c
Se debe buscar como representar el valor (-b)
b - b = 00
Entonces
b + (-b) = 00
Observacin:
En sistemas limitados en cifras sumar el valor 100 en forma terica es lo mismo que
sumar 00 en forma practica. No podemos sumar 100, pero si podemos sumar 99 + 01.
Considerando la observacin anterior
b + (-b) = 99 + 1
Se deduce
-b = 99 + 1 - b
lo cual es
-b = 99 - b + 1
Se define el complemento a 10 de un valor x como la diferencia de x con el mximo representable ms
uno.
Ca10(x) = 99 - x + 1
Tambin se define Ca10(x) como el valor que sumado a x da como resultado 0.
Con el Ca10 podemos transformar la resta en una suma.
a - b = a + Ca10(b)= c
Ejemplo:
14

43 - 25 = 18 y no hubo Borrow
Se convierte en suma
Ca10(25) = 99 25 + 01 = 75
Queda
43 + 75 = 18 y CY=1
Se observa que en esta suma hay un acarreo, indicando que en la resta original no hubo borrow. El borrow
y el acarreo son de diferente valor. Ambos se representan con CY
Se estudiara un caso donde el minuendo es menor que el sustraendo.
43 - 57 = ?
Y como
Ca10(57) = 99 57 + 01 = 43
Queda
43 + 43 = 86 y CY=0
Este resultado seria el mismo que ejecutar la resta.
43 53 = 86 y hubo borrow
El borrow significa que se pidi prestado uno. Por lo tanto el sustraendo es mayor que el minuendo.
El carry = 0 indica que en la resta original hay borrow. Y nos indica que el minuendo es menor que el
sustraendo.
El valor del resultado a primera vista no representa la diferencia entre los dos valores. Pero se estudia como
se relaciona con la diferencia.
Ca10(-86) = 99 86 + 01 = 14
Se comprueba
57 43 = 14
Se deduce que cuando la resta tiene borrow el resultado representa el Ca10 de la diferencia entre los
operandos.
Binario
El mximo representable es en este caso 1111 1111.
Ejemplo
Calculo Ca10(1001 1011)
El Ca10 del sistema binario corresponde al Ca2 del sistema decimal
En la practica no se puede representar 1 0000 0000, as que se hace la resta con 1111 1111 y despus le
sumamos 1. Cualquier valor ser menor que el MVR.
1111 1111
- 1001 1011
0110 0100

0110 0100
+0000 0001
0110 0101

Entonces
Ca10(1001 1011) = 0110 0101
Ejemplo de resta
1011 0010 -1001 0110 = ?
Se hace el complemento del sustraendo
Ca10(1001 0110) = 1111 1111 - 1001 0110 + 0000 0001 = 0110 1010
Se suman ambos valores
1011 0010
+0110 1010
0001 1100
y CY=1
La resta no tiene borrow y su resultado es 00011100
Otro ejemplo de resta
0111 0101 -1001 1000 = ?
Se convierte en suma
Ca10(1001 1000) = 1111 1111 1001 1000 + 0000 0001
Ca10(1001 1000) = 0110 1000

15

0111 0101
+0110 1000
1101 1101 y CY=0
La resta tiene borrow y su resultado es 11011101
Al tener borrow se debe complementar el resultado para saber la diferencia.
Ca10(1101 1101) = 1111 1111 1101 1101 + 0000 0001
Ca10(1101 1101) = 0010 0011 Siendo esta la diferencia entre los operandos.
Hexadecimal
Mximo representable FF
Por lo tanto el Ca10 del hexadecimal corresponde al Ca16 del decimal.
Ejemplo
Calculo Ca10(A2)
FF
5D
-A2
y
+01
5D
5E
Ejemplo de resta:
E4 3F = ?
Ca10(3F) = FF - 3F + 01 = C1
E4
+C1
A5
y CY=1
La resta no tiene borrow y su resultado es A5
Definicin de Complemento al MVR (Ca[MVR]) o (Ca[10-1])
En un sistema con limite de cifras se define el complemento al MVR de x (diferente a
opuesto y a inverso) como el valor que sumado a x da el mximo representable.
x + Ca[10-1](x) = mximo representable
Ejemplos:
Decimal
En este sistema seria Ca9
Ca9(12) = 99 - 12 = 87
Ca9(83) = 99 - 83 = 16
Hexadecimal
En este sistema seria CaF
CaF(A4) = FF - A4 = 5B
CaF(15) = FF - 15 = EA
Binario
En este sistema seria Ca1
Ca1(0111 0101) = 1111 1111 - 0111 0101 = 1000 1010
Ca1(1001 1100) = 1111 1111 - 1001 1100 = 0110 0011
Notas
# Se deduce que
Ca10(x) = Ca[10-1](x) + 1
# Se observa que
Ca10[ Ca10(x) ]= x
Ejemplo decimal limitado a 2 cifras
Ca10(73) = 99 73 + 1
Ca10[Ca10(73)] = 99 ( 99 73 + 1 ) + 1
Ca10[Ca10(73)] = 99 99 + 73 1 + 1
Ca10[Ca10(73)] = 73
# Se observa que
Ca[10-1]{Ca[10-1](x)} = x

16

Ejemplo decimal limitado a 2 cifras


Ca9(38) = 99 38
Ca9[Ca9(38)] = 99 ( 99 38 )
Ca9[Ca9(38)] = 99 99 + 38
Ca9[Ca9(38)] = 38

Comparacin
Esta operacin lgica en si es una resta en la cual no interesa el resultado. Se recaban datos respecto al
resultado y la relacin entre los operandos.
Se puede saber cual de los operandos es mayor o si son iguales.
La operacin de resta activa estos indicadores:
BW
Si no se pidio prestado uno en la resta vale 0
Z
Si el resultado es cero vale 1
AC
Si no hubo borrow entre los nibles bajos y los altos vale 1
P
Segn la paridad del resultado es su valor
S
Indicador de signo, copia el valor del MSB
El anlisis de estos indicadores permite deducir como es la relacin de x con y o sea (x y )
Si
BW=0
entonces x >= y
Si
BW=1
entonces x < y
Si
Z=1
entonces x = y
Si
Z=0
entonces x y
Si
BW=1 o Z=1 entonces x <= y
Si
BW=0 y Z=0
entonces x > y

17

Representacin o Codificacin
En un sistema binario limitado a 8 cifras u 8 bit, o sea un byte, se pueden tener 256 valores diferentes.
Se puede asociar cada valor a un nmero, letra o smbolo. Al intercambiar informacin con otros dispositivos
es necesario que usen el mismo sistema de codificacin.
Nmeros naturales (N):
Si se asocia a los nmeros naturales podemos representar desde el 0 (0000 0000) hasta el
255 (1111 1111) inclusive en una correspondencia biunvoca
Nmeros enteros (Z):
Al representar nmeros enteros se debe prever como diferenciar a los negativos y los
positivos, o sea como indicar el mdulo y el signo.
Hay dos tcnicas posibles.
I) Se usa el MSB como indicador del signo y los 7 bit restantes como el mdulo.
bit 7 = 0 signo positivo y bit 7 = 1 signo negativo.
1 111 1111 = -127
FF
1 000 0001 = -1
81
0 000 0001 = 1
01
0 111 1111 = 127
7F
0 000 0000 = 0
00
1 000 0000 = 0
80
No hay relacin biunvoca por que el cero tiene dos representaciones posibles. Aunque es un cdigo viable
no es 100% ptimo.
II) Se usa del bit 0 al bit 6 para representar el modulo, pero a los nmeros negativos se le aplica el
complemento a 2. As se representa
0000 0000 = 0 00
0111 1111 = 127
7F
Para hallar la representacin de -127:
Ca2(0111 1111) = 1111 1111 0111 1111 + 0000 0001
-127 = 1000 0001
81
Se hace lo mismo para hallar la representacin de -1:
Ca2(0000 0001) = 1111 1111 0000 0001 + 0000 0001
-1 = 1111 1111
FF
Para averiguar a cual valor representa el byte 1000 0000 se le aplica el Ca2
Ca2(1000 0000) = 1111 1111 1000 0000 + 0000 0001 = 1000 0000
1000 0000 = -128
80
Permite representar 256 nmeros diferentes, desde -128 hasta 127 inclusive.
Se pueden idear otras codificaciones multi-byte para nmeros fuera del rango [-128 , 127] o fraccionarios.
Pero depende de cada usuario y sistema.
Cdigo ASCII
Estndar Americano derivado del Cdigo ISO que permite la transmisin de informacin entre
maquinas. Con 256 combinaciones permite representar smbolos ortogrficos, gramaticales, especiales,
dgitos y comandos de control del texto.
Este sistema usa los 7 bit mas bajos para representar los smbolos, y el MSB ajusta la paridad del byte, as
la misma es siempre par. Lo cual sirve para detector de errores.
Hoy en da se le han realizado modificaciones generando as varias versiones de uso limitado.
Codifica:
Las letras del alfabeto ingles
Los signos de la escritura inglesa ( ! ? ( ) . : , ; { } [ ] )
Caracteres especiales ( \ / @ # $ % & = + - _ * < > ^ ~ | )
Dgitos (0 1 2 3 4 5 6 7 8 9)
Comandos especiales para control de texto
Combinaciones sin usar para que cada usuario pueda agregar sus propios signos
Cdigos BCD
Es un sistema que representa cada smbolo decimal con un grupo de 4 bit. Hay varias formas de
codificacin en BCD. El ms comn es donde cada dgito se convierte a su equivalente binario. Entonces
cada numero decimal se convierte a una serie binaria donde cada 4 bit se representa un dgito.
18

BCD 8421 es el ms comn


0
0000
5
0101
1
0001
6
0110
2
0010
7
0111
3
0011
8
1000
4
0100
9
1001
Se usan solo estas ttradas, lo cual facilita detectar errores de transmisin
En los sistemas de 8 bit el nible bajo representa las unidades y el nible alto las decenas.
BCD 2421
0
0000
5
1011
1
0001
6
1100
2
0010
7
1101
3
0011
8
1110
4
0100
9
1111
BCD exceso 3
0
0011
5
1000
1
0100
6
1001
2
0101
7
1010
3
0110
8
1011
4
0111
9
1100
El que ningn nmero sea compuesto solo por ceros permite usar esa ttrada (0000) como smbolo de no
informacin. Es un cdigo no ponderado, en el que por tanto no existe ninguna relacin de pesos. Su
nombre proviene del mtodo de formacin del propio cdigo. Para obtener este nuevo cdigo, no tenemos
ms que sumar 3 (11B) a la cifra equivalente en BCD natural.
Cdigo Gray
Este cdigo posee como caracterstica que el paso de un nmero al siguiente se efecta cambiando un
solo bit de cada vez. Tambin se le llama Cdigo espejo.
0
0000
8
1100
1
0001
9
1101
2
0011
10
1111
3
0010
11
1110
4
0110
12
1010
5
0111
13
1011
6
0101
14
1001
7
0100
15
1000
Cada bit en el Cdigo grey tiene su ponderacin segn su posicin y el numero a representar.
La ponderacin de cada bit es

. . . 255 127 63 31 15 7 3 1
En binario natural la ponderacin es
. . . 11111111 1111111 111111 11111 1111 111 11 1
Se consideran los bits de valor 1 desde el MSB al LSB. El primero que vale uno tendr ponderacin
positiva. El siguiente que valga 1 tendr ponderacin negativa, el siguiente ponderacin positiva, el siguiente
ponderacin negativa y as sucesivamente con todos los bit que valen 1. Los bit de valor cero se ignoran.
Por ejemplo:
Cdigo grey 01101011 corresponde
al decimal +0 +127 -63 +0 +15 +0 -3 +1 = 77
al binario +0 +1111111 -111111 +0 +1111 +0 -11 +1 =1010011
Para obtener la representacin de un nmero se procede del modo siguiente:
1.- Se convierte el nmero a binario.
2.- Al valor as obtenido, se hace una EX-OR con el mismo valor una vez movido un bit a la derecha
(bit que se desprecia).
Veamos un ejemplo: Obtener el cdigo Gray del decimal 14.
1.
14D = 1110B
2.
1110 EX_OR 0111 = 1001
Luego el nmero 14 en cdigo Gray ser 1001
Hay varias versiones del cdigo Gray.

19

Cdigo Johnson
Es una secuencia donde se cambia un bit por vez y permite corregir errores de secuencia. Es muy usado
en decodificadores de posicin. No representan ni se asocian a ningn valor, solo que despus de recibir un
nmero ya sabemos cual recibiremos despus. Adems puede empezar con cualquier valor.
Para el caso de 5 bit seria:
11100
11000
10000
00000
00001
00011
00111
01111
11111
11110
Esta rotacin de los bits se puede realizar hacia la derecha o la izquierda.

Codificacin BCD
Los sistemas que hacen de interfase entre los humanos y el micro son ms simples si el sistema de
numeracin es en base 10. Se diseo un cdigo que representa con un byte nmeros en base 10 desde el
00 al 99. Se llama BCD, binario codificado decimal. Se puede representar un sistema decimal limitado a 2
cifras.
El BCD 8421 permite realizar sumas y restas con menor dificultad. Por lo estndar que es hay gran cantidad
de circuitos digitales diseados para manejar este sistema y los micros prevn su uso.
Ejemplo
56D <=> 0101 0110B
10D <=> 0001 0000B
Suma
22D + 57D = 79D
CY=0 y AC=0
0010 0010B
+ 0101 0111B = 0111 1001B
CY=0 y AC=0
En este ejemplo ni las unidades ni las decenas superan el mayor smbolo.
Otro caso
58D + 27D = 85D
CY=0 AC=1
0101 1000B + 0010 0111B = 0111 1111B

CY=0 y AC=0

Aqu el nible bajo tiene un valor ilegal. Es necesario ajustar el resultado binario para que sea acorde con el
BCD.
Se estudia el ajuste necesario llamado Ajuste Decimal
Si se suma 09 y 01 el resultado debe se 10.
09D
0000 1001B
+01D
+0000 0001B
10D
0000 1010B
Se esperaba 0001 0000 como resultado pero dio 0000 1010. Se analiza la diferencia.
0001 0000B
-0000 1010B
0000 0110B
Esta diferencia es constante para cualquier valor ilegal. Es el nmero de ttradas no usadas. Se usa para
corregir los resultados incorrectos. Con solo sumar 0110 al nible bajo se ajusta el resultado
Aplicamos la correccin a la operacin realizada.
0111 1111B
+0000 0110B
1000 0101B = 85D
CY=0
AC=1

Resultado esperado

20

Otro caso
29D + 38D = 67D
CY=0 y AC=1
0010 1001B + 0011 1000B = 0110 0001B
CY=0 y AC=1
Aqu ambos nibles son valores permitidos, pero hubo acarreo en el nible bajo. Esto indica que los nibles
bajos suman ms de 15 entre si.
Se espera 67 y resulto 61, la diferencia sigue siendo 6.
0110 0001B
+0000 0110B
0110 0111B = 67D
Resultado esperado
CY=0
AC=0
Otro caso
62D + 53D = 15D CY=1 y AC=0
0110 0010B + 0101 0011B = 1011 0101B

CY=0 y AC=0

Se observa que el nible alto es una ttrada no valida. Tiene un valor mayor de 9. Se realiza un estudio
similar al del nible bajo.
Ajuste Decimal
90D
1001 0000B
+10D
+0001 0000B
00D
1010 0000B
Lo esperado es 0000 0000B y resulto 1010 0000B. Se analiza la diferencia.
0000 0000B
-1010 0000B
0110 0000B
Al sumar 0110 0000B se corrige la diferencia en el resultado
1011 0101B
+0110 0000B
0001 0101B = 15D Resultado esperado
CY=1
AC=1
Otro caso
94D + 73D = 67D CY=1 y AC=0
1001 0100B + 0111 0011B = 0000 0111B

CY=1 y AC=0

Aqu ambos nibles son valores permitidos, pero hubo acarreo en el nible alto. Esto indica que los nibles altos
suman ms de 15 entre si.
Ajustamos el nible alto
0000 0111B
+0110 0000B
0110 0111B = 67D Resultado esperado
CY=0
AC=0
Otro caso
53D + 89D = 42D
CY=1 y AC=1
0101 0011B + 1000 1001B = 1101 1100B

CY=0 y AC=0

Se observa que tanto el nible bajo como el alto tienen valores no permitidos. Se ajustan ambos nibles al
mismo tiempo.
1101 1100B
+0110 0110B
0100 0010B
= 42D Resultado esperado.
CY=1
AC=1

21

Otro caso
98D + 89D = 87D
CY=1 AC=1
1001 1000B + 1000 1001B = 0010 0001B

CY=1 AC=1

Ambos nibles tienen valores permitidos pero la existencia de acarreo y semi-acarreo indica la necesidad de
ajustar ambos. Se ajustan ambos al mismo tiempo.
0010 0001B
+0110 0110B
1000 0111B = 87D Resultado esperado.
CY=0
AC=0
La mayora de los micros tienen una instruccin de ajuste decimal, que ejecutada despus de realizar una
suma con nmeros binarios verifica el resultado y ajusta si es necesario.
Resta
Ejemplo de resta
75D - 34D = 41D BW=0 y AC=0
0111 0101B - 0011 0100B = ?
Se convierte la resta en suma mediante el complemento a 10 del sustraendo. Se hace Ca10 por que el
nmero binario representa un nmero decimal.
Ca10(34) = 99 - 34 + 1 = 66D
Ca10(0011 0100) = 1001 1001 - 0011 0100 + 0000 0001 = 0110 0110 B
01110101B
+ 01100110B
11011011B
CY=1
AC=0
Como todo resultado de suma BCD es necesario realizar el ajuste decimal.
1101 1011B
+0110 0110B
0100 0001B

= 41D Resultado esperado


CY=1
AC=1

El CY indica que no hubo borrow.


Otro caso
84D - 36D = 48D
BW=0 y AC=1
1000 0100B - 0011 0110B = ?
Se convierte la resta en suma con el Ca9
Ca10(0011 0110) = 1001 1001 - 0011 0110 + 0000 0001 = 0110 0100 B
1000 0100B
+0110 0100B
1110 1000B
CY=0
AC=0
Se realiza el ajuste decimal al resultado.
1110 1000B
+0110 0000B
0100 1000B
El valor del CY indica que no hubo borrow.
Otro caso
28D - 43D = 85D
BW=1 y AC=0
0010 1000B - 0100 0011B = ?
Se convierte la resta en suma con el Ca9
22

= 48D Resultado esperado.


CY=1
AC=0

Ca10(0100 0011) = 1001 1001 - 0100 0011 + 0000 0001 = 0101 0111 B
0010 1000B
+0101 0111B
0111 1111B
CY=0
AC=0
Se realiza el ajuste decimal del resultado.
0111 1111B
+0000 0110B
1000 0101B =85D Resultado esperado
CY=0
AC=1
El valor del CY indica que hubo borrow. La diferencia se calcula al hacer el complemento a 10 del resultado.
Ca10(1000 0101) = 1001 1001 - 1000 0101 + 0000 0001 = 0001 0101
La diferencia es 0001 0101B o 15D.
Otro caso
34D - 58D = 76D
BW=1 y AC=1
0011 0100B - 0101 1000B = ?
Se convierte la resta en suma con el Ca10.
Ca10(0101 1000) = 1001 1001 - 0101 1000 + 0000 0001 = 0100 0010 B
0011 0100B
+0100 0010B
0111 0110B
CY=0
AC=0
No es necesario realizar el ajuste decimal.
0111 0110B = 76D Resultado esperado.
El CY indica que hubo borrow. Se calcula la diferencia mediante el complemento a 10 del resultado.
Ca10(0111 0110) = 1001 1001 0111 0110 + 0000 0001 = 0010 0100
La diferencia es 0010 0100B o 24D.
Se deducen una serie de pasos para realizar la resta entre nmeros binarios con codificacin
decimal o sea BCD 8421.
1) Realizar el Complemento a 10 del sustraendo.
99D - sustraendo + 01D
1001 1001B - sustraendo + 0000 0001B
2) Sumar el minuendo y el Ca10 del sustraendo.
3) Realizar ajuste decimal del resultado.
4) Interpretar el resultado.
Si el CY=1 el resultado es la diferencia entre el minuendo y el sustraendo, siendo el ltimo menor
que el primero
Si el CY=0 el resultado es el Ca10 de la diferencia entre el minuendo y el sustraendo, siendo el
ltimo mayor que el primero.

Nmeros Enteros
Para representar nmeros enteros se debe prever como diferenciar a los negativos de los positivos, o sea
como indicar el modulo y el signo. La mejor forma es mediante el Ca2
Su usa del bit 0 al bit 6 para representar el mdulo, pero a los nmeros negativos se le aplica el
complemento a 2.
As se representan:
0000 0000B = 0D
0111 1111B = 127D
1000 0000B = -128D
1111 1111B = -1D
23

Se representan 256 nmeros diferentes, desde -128 hasta 127 inclusive.


Se pueden idear otras codificaciones multibyte para nmeros fuera del rango [-128 , 127] o fraccionarios.
Pero depende de cada usuario y sistema.
Suma de nmeros enteros
El acarreo en la suma se ve en el bit 7, o sea detectarse en el bit de signo o en la bandera S.
a) Los dos positivos.
+22D
0001 0110B
+53D
0011 0101B
+75D
0100 1011B
S=0 CY=0 AC=0
En este ejemplo el resultado es menor a +127 por lo tanto es correcto
+89D
+45D
+134D

0101 1001B
0010 1101B
1000 0110B

S=1 CY=0 AC=1


El resultado es superior a +127 por lo tanto se puso a uno el bit7 y parece que el resultado es negativo. El
acarreo se muestra en el bit 7.

b) Los dos negativos


-12D
-57D
-69D

Ca2(0000 1100B)
Ca2(0011 1001B)

=
=

1111 0100B
1100 0111B
1011 1011B
S=1 CY=1 AC=0

Ca2(1011 1011B) = 0100 0101B = 69D Resultado esperado


El resultado es igual o mayor que -128 por lo que es correcto
-112D
- 54D
-166D

Ca2(0111 0000B)
Ca2(0011 0110B)

=
1001 0000B
=
1100 1010B
0101 1010B
S=0 CY=1 AC=0

El resultado es menor a -128 por eso S=0 aunque sea negativo.


c) Sumandos de diferente signo
Positivo de modulo mayor
111D
-77D
Ca2(0100 1101B)
34D

0110 1111B
=
1011 0011B
0010 0010B
S=0 CY=1 AC=0

El resultado coincide con lo esperado


Negativo de modulo mayor
54D
-93D
Ca2(0101 1101B)
-39D

0011 0110B
=
1010 0011B
1101 1001B

S=1 CY=0 AC=0


Ca2(1101 1001B) = 0010 0111B = 39D Resultado esperado.
Se debe ser cuidadoso al estudiar el resultado de la suma de enteros. Se debe considerar el signo de los
operandos y del resultado.

24

Definiciones Y Trminos
BIT- Unidad de informacin.
BINIT- Abreviacin de Dgito Binario, pero por deformacin se llama BIT. Cada uno de los smbolos del
sistema de numeracin binario.
PALABRA- Conjunto de bits ordenados. Tambin se le identifica con grupo de 8 bits.
BYTE- Conjunto ordenados de 8bit. (Cada bit tiene su ponderacin)
MSB- Most Significative Bit - bit ms significativo, de mayor peso o ponderacin.
NIBLE- Conjunto ordenado de 4 bit. Dos nibles forman un byte.
DATO- Es una porcin de informacin, se usa como sinnimo de palabra. Tambin se le llama a los bytes
no usados para comandar al micro.
PROCESADOR- Dispositivo fsico. Conjunto de elementos capaz de ejecutar un programa.
PROCESO- Secuencia de eventos para obtener un resultado o cumplir un objetivo.
P MICROPROCESADOR- Procesador implementado en un solo chip o circuito integrado.
MICROCONTROLADOR- Conjunto de los elementos de un sistema (procesador, RAM, ROM y perifricos)
integrados en un solo chip.
UCP, CPU- Unidad de Proceso Central o Unidad de Control de Proceso
OPERACIN MATEMTICA- Son operaciones que cada bit afecta al bit de orden superior. Son la suma, la
resta, la multiplicacin y la divisin. Solo los micros ms potentes y dedicados a clculos tienen la
multiplicacin. La divisin solo algunos muy escasos.
OPERACIN LGICA- Son operaciones donde cada bit no afecta a otro de mayor peso, como EX-OR,
NAND, SET, RESET, AND, NOT, OR, etc.
ROTACION A
LA IZQUIERDA

B7 B6 B5 B4 B3 B2 B1 B0

ROTACION A
LA DERECHA
INTERCAMBIO
DE NIBLES
SWAP

B7 B6 B5 B4 B3 B2 B1 B0

B7 B6 B5 B4 B3 B2 B1 B0

DECISIN- Es optar entre dos acciones a realizar dependiendo del resultado de alguna operacin lgicamatemtica.
BUS- Conjunto de lneas fsicas que transportan bits asociados entre s.
BUS DE DATOS- Conjunto de lneas fsicas que llevan datos. Cada una de ellas se encarga de transportar
un bit de la palabra.
BUS DE DIRECCIONES- Similar al anterior pero cada lnea transporta un bit de la direccin a utilizar.
BUS DE CONTROL- Grupo de lneas fsicas que transportan a las seales para coordinar acciones dentro y
fuera del micro. Es mas difcil distinguirlas por que no siempre corren paralelas entre si.
REGISTRO- Dispositivo fsico para almacenar un dato, palabra o byte.
MEMORIA- Dispositivo fsico para almacenar informacin, conformada por registros.
BUFFER- Dispositivo fsico que acopla dispositivos entre si. Permite amplificar en corriente las seales
entre elementos.
POSICIN DE MEMORIA- Los registros dentro de la memoria estn ordenados, por lo cual cada registro
tiene su posicin de memoria y esta se identifica con una direccin de memoria.
DIRECCIN DE MEMORIA- Dato numrico que permite definir un registro o posicin de memoria dentro de
la misma.

RAM- Porcin de la memoria del sistema que puede ser escrita o leda. Generalmente alberga datos.
ROM- Porcin de la memoria del sistema que solo puede ser leda. En general alberga comandos.
25

MAPA DE MEMORIA- Esquema o representacin de todas las posiciones de memoria que visualiza las
clases de datos y su uso en el sistema.

BLOQUE- Representacin grfica de cualquier dispositivo o secuencia


como un rectngulo con una entrada y una salida, identificado con la
ecuacin que relaciona estas entre si.
INSTRUCCIONES- Palabras que al ser ledas por el P desde la memoria le indican acciones a realizar.
Cada P tiene su propio paquete de instrucciones.
MNEMNICOS- Nombre de las instrucciones usadas por el programador en la escritura el programa fuente
CDIGO OPERATIVO- Valor numrico de la instruccin. A este valor numrico se le llama tambin Cdigo
Mquina.
PROGRAMA- Secuencia de instrucciones u rdenes para conseguir un objetivo o llegar a un resultado.
SUBPROGRAMA- Pequeo programa, parte de otro ms extenso o principal.
RUTINA- Similar al programa pero donde se acenta la idea de ser cclico o repetitivo.
SUBRUTINA- Rutina o subprograma parte de otro, el cual puede ser invocado a ejecutarse varias veces.
Simplifica el programa principal y puede ser representado como un bloque.
SALTO O JUMP- El micro ejecuta las instrucciones una tras otra, buscndola en posiciones de memoria
consecutivas. El salto se produce cuando se busca la siguiente instruccin en una posicin de memoria no
consecutiva con la ejecutada anteriormente.
BIFURCACIN- Rama que se abre del camino principal, solo desde una decisin puede surgir.
LAZO, LOOP O BUCLE- Seccin de un programa que se ejecuta en forma ciclica.
ARRAY o MATRIZ- Conjunto de datos los cuales tienen al menos una caracterstica en comn. Conjunto de
datos ordenados en 1 o ms dimensiones:
1 dimensin Xa (a a los N)

Se ordenan en base a un parmetro

2 dimensiones Xa,b (a y b a los N)

Se ordenan en base a 2 parmetros.

3 dimensiones Xa,b,c (a, b y c a los N)


Se ordenan en base a 3 parmetros.

Permite tratar los datos como un objeto. Sin importar el agrupamiento que se haga de los
datos estos siempre estarn colocados en posiciones sucesivas de memoria.

26

SERIE- Grupo de datos almacenados en posiciones de memoria consecutivas. Es


una matriz unidimensional. Se necesita definir la direccin de memoria del inicio
de la serie y su extensin. Ejemplo inicio en nnmm y K elementos de longitud.
TABLA- Grupo de datos almacenados
consecutivamente. Se define indicando la posicin del
primer (Pi)y ultimo dato (Pf).

VARIABLE- Elemento de programacin que puede modificar su valor. Fsicamente


se debe asociar en una posicin de memoria RAM
ETIQUETA- Elemento de programacin que permite sustituir un valor numrico por
un texto o una cadena de caracteres, lo cual ayuda a ordenar el programa.
PUNTERO o VECTOR- Elemento de programacin (variable) que permite
direccionar un dato. Registro que almacena la direccin del inicio de una matriz, o
almacena la direccin del dato a ser tratado dentro de la matriz. Dentro de un lazo
con solo actualizar su valor se obtiene otro elemento de la serie.
VARIABLE DE LAZO- Variable utilizada en un lazo, la cual es chequeada para determinar si se continua
repitiendo o no. Cuando alcanza el valor predeterminado se sale del lazo.
PERIFRICO- Dispositivo fsico que se comunica con el uP, realiza acciones que liberan a este de hacerlas.
Permite que el uP tome o entregue datos al exterior.
PUERTOS- Datos de direccin para la seleccin de perifricos. Perifrico especifico para intercambiar datos
con el universo.
DIAGRAMA DE FLUJO- Representacin grfica de cmo la informacin se modifica en un programa.
Representacin grfica de un proceso, se muestran los pasos en bloques tales operaciones, decisiones,
bifurcaciones y saltos.
INTERRUPCIN- Seal del exterior que indica al procesador un evento
LSB- Low Significative Bit - bit menos significativo, de menor peso o ponderacin.
LIFO- (Last IN, First OUT). Estructura donde el ultimo dato en entrar es el ultimo en salir.
FIFO- (First IN, First OUT). Estructura donde el primer dato en entrar es el primero en salir.
PILA- Estructura de datos de organizacin LIFO. Caracterizada por ser de facil acceso, se utiliza para
almacenamiento temporal de los mismos. Puede implementarse en la memoria RAM o en un banco de
registros dedicados a ese fin.
COLA- structura de datos con organizacion FIFO. Caracterizada por ser de fcil acceso, se usa para
intercambio de datos entre dispositivos, estructuras, subrutinas, etc.
PIN, PATILLA, PATA o TERMINAL- Conexin fsica del dispositivo con el resto del circuito. Puede unirse
por soldadura o por contacto a presin.

27

Nociones de Memorias
Caractersticas
Son dispositivos electrnicos destinados a conservar
informacin. Estn formadas por elementos o clulas ordenadas
llamados registros y un bloque de control. En cada registro se
guarda un dato. Este dato puede se de uno o varios bit de
longitud. La memoria tiene lneas de entrada y/o salida de datos
(bus de datos) comunes a todos los registros y otras lneas
dedicadas a seleccionar el registro con cual trabajar (bus de
direcciones). Las lneas que controlan el proceso de lectura o escritura forman el bus de control.
El bus de control se compone por el indicador de operacin a realizar (lectura o escritura), el reloj maestro
para sincronizar la operacin y alguna seal extra para coordinar el intercambio de datos en el momento
que estos son estables y validos.
Los parmetros ms importantes de una memoria son la capacidad de almacenamiento de informacin, el
tiempo de acceso al dato seleccionado y el nmero de bit de cada dato.
El nmero de bit de cada dato es la longitud de la palabra que almacena la memoria. Este valor multiplicado
por el nmero de registros interna nos dice la capacidad de almacenamiento de la memoria
2048 registros de 8 bit cada uno, es una memoria de 16 Kbit o 2Kbyte.
16384 registros de 1 bit cada uno, es una memoria de 16Kbit.
El tiempo de acceso se mide desde que se presentan los valores en los pines de control y hasta el momento
en que el dato es valido y estable.
Se clasifican segn
Uso de la memoria
Mtodo de acceder al registro deseado
Mtodo fsico de almacenamiento de informacin

Clasificacin
Por el uso de la memoria
Memoria de Programa ROM: Se almacena en ella las instrucciones del programa a ejecutar.
Algunos micros tienen esta memoria de mayor nmero de registros y de bit que la memoria de datos. No
pierde su informacin aunque pierda alimentacin. Se graba antes de poner a funcionar el sistema
Memoria de Datos RAM: Se usan para almacenar informacin que varia a lo largo del programa.
Tiene igual nmero de bit que la ALU del micro. Tiene que tener suficiente velocidad de acceso como para
no entorpecer al procesador.

Por la forma de acceder al registro deseado


Acceso Aleatorio (RAM) o Paralelo: Permite seleccionar el registro con el cual trabajar escribiendo
el valor que identifica al registro en los pines del bus de direcciones. Si cada registro esta en un estante de
un armario, se trata solo de indicar la fila y la columna donde se ubica el cajn deseado. En este formato la
velocidad de acceso es la misma para todos los registros, y su control es muy sencillo. Al necesitar un pin
por cada linea de cada bus, cuanto mayor es la capacidad de la memoria mayor es el tamao del chip. El
procedimiento puede diferir un poco de un modelo a otro pero bsicamente es este.

En el bus de direcciones se selecciona la direccin de la posicin de memoria del registro a operar. Con el
bus de control se indica que operacin se va ejecutar y en que momento hacerlo. El dato pasa por el bus de
datos hacia o desde la memoria. Pueden ser tanto internas como externas al chip del microcontrolador.
El CB tiene seales bsicas como selector de lectura (RD) , selector de escritura (WR), habilitador de
salidas (OE) , selector de chip (CS), etc.
Acceso Serial: Para acceder a un registro se necesita acceder antes a los anteriores. O sea para
que se lea un dato es necesario leer todos los bits de los datos previos. La velocidad de acceso varia segn
la posicin del registro. Exteriormente tiene pocas lneas de control. En forma serial se indican los
comandos para indicarle a la memoria que operacin se le aplicada, el clock maestro (CK) marca el tiempo
28

de cada bit. Cada palabra entra o sale bit por bit por la misma lnea (D). Se cuentan los bits para saber
cuando comienza y termina cada palabra, y as saber en que nmero de registro se est leyendo. Depende
de la memoria en particular si se deben guarda los datos ledos en algn otro sitio. Las lineas S0 y S1
habilitan el funcionamiento del chip. Bsicamente tienen una memoria RAM interna y una interfase de
comunicacin serial. Su control es complejo y requieren de un procesador o similar para manejarlas.
Se usan como memorias externas al chip del microcontrolador, debido a que necesita dedicar pocos pines
del mismo para controlarla.

Mtodo fsico de almacenamiento


ROM Memorias que no pierden los datos por falta de alimentacin. Originalmente se grababan los datos
durante el proceso de fabricacin de la memoria.
PROM Se graban una vez y despus no se pueden alterar. En una matriz de fusibles, grabarla es
quemar los fusibles deseados.
UV-EPROM Se graban elctricamente los datos, se puede borrar con luz ultravioleta y volver a
grabar. Se borra toda la memoria junta a travs de una ventana en el chip.
EEPROM Se graban y borran elctricamente. Antes de re-escribirlas hay que borrarlas.
FLASH-EPROM Se graban elctricamente y se pueden re-escribir sin necesidad de borrarlas
previamente. Las tensiones de escritura y borrado de memoria han bajado con el avance de la tecnologa.
Las primeras necesitaban pulsos de 26 volts, hoy en da la tecnologa permite que se graben con 3,3 volts y
se sigue bajando. Consume menos y es ms pequea que las EPROM, adems de programable en el
circuito. Es ms rpida, de mayor densidad y tolera ms ciclos de escritura/borrado que la EEPROM.
Las memorias EEPROM y FLASH son muy tiles al permitir que los microcontroladores que las incorporan
puedan ser reprogramados "en circuito", es decir, sin tener que sacar el circuito integrado de la tarjeta. La
reprogramacin del microcontrolador puede convertirse en una labor rutinaria dentro de la puesta a punto.
OTP-ROM Son memorias que se pueden grabar una sola vez. Son PROM modernas, tiene su fuerte
en el bajo precio para la fabricacin en grandes cantidades.
RAM Memorias que pierden los datos almacenados si se pierde la alimentacin.
ESTATICAS Despus de escritas si no desaparece la alimentacin conservan el dato. Los registros
estn formados por FF o cerrojos.
DINAMICAS Es necesario ir re-escribiendo o refrescando los datos guardados para que no se le
borren. La informacin se guarda en condensadores, los cuales pierden carga con el tiempo. Algunos
modelos incluyen circuitera para refrescar los datos si no se le est utilizando. Su ventaja radica en el poco
espacio que ocupan, permitiendo grandes densidades.

29

BOLILLA II: MICROCONTROLADORES


Descripcin y Caractersticas
Son sistemas que contienen un procesador y demas dispositivos neceasarios para su funcionamiento. Los
procesadores son dispositivos electrnicos digitales sincrnicos programables que para funcionar necesitan,
adems de alimentacin y seales externas, un programa, el cual contiene las instrucciones o comandos a
seguir.

Bloques Principales
En su descripcin se observa que son una evolucin de los circuitos digitales combinacionales y
secuenciales. La gran ventaja de los procesadores frente a los automatas y maquinas de estado es que la
orden o seales de seleccion de secuencia se codifican en la memoria ROM del sistema. Lee el comando
desde la memoria y determina cual secuencia debe ejecutar.
El ncleo interno es el procesador. El externo delimita al controlador. Se lo define como micro cuando esta
integrado todo en un solo chip.
Sus partes principales son:

Bloque de control- Es la seccion mas importante del sistema. En la mayoria de los diagramas de bloques
de los procesadores no se dibuja. Pero cuanto ms complejo es, ms funciones tiene el dispositivo. El
bloque de control es un generador de secuencias, (automata programable), la misma es seleccionada segun
varias seales o bit. Las diferentes secuencias que puede generar son la microprogramacion del
procesador, determinadas durante el diseo del procesador. A todos los elementos del sistema les llegan
seales de control.
ALU- Unidad encargada de todas las operaciones lgicas-matemticas. Es un circuito combinacional sin
capacidad de almacenamiento. Consta de dos entradas de operandos, varias lineas de seleccion de funcion
y dos salida, una para el resultado y otra de indicadores de la clase de resultado. Para poder operar, a la
ALU se le asocia Acumulador, Banderines y lneas de control. Segn la cantidad de bit de las entradas se
clasifica al procesador.
Memoria de programa Dispositivo donde se almacenan ordenadas las instrucciones a seguir. Es una
memoria ROM
Memoria de trabajo Dispositivo donde se puede escribir y leer para guardar cualquier dato variable durante
la ejecucin del programa. Es una memoria RAM.
Registros internos Dispositivos para guardar informacin o datos importantes, de mayor frecuencia de uso
o configuracin de funcionamiento. Pueden formar parte o no del mapa de memoria RAM.
29

Acumulador Registro que acta en conjunto con la ALU. Le suministra uno de los operandos o es el
destino de su resultado. La mayora de las instrucciones lo usan como destino o fuente de datos.
Banderines son indicadores sobre la clase de resultado. Se almacenan en el registro de estado del
programa PSW. Tambin puede guardar informacin sobre el estado del programa.
Bus de Datos -DB. Lneas fsicas que interconectan todos los elementos que manejan datos en el sistema.
Es una forma optima de poder interconectar varios dispositivos que manejen datos. Se multiplexa en el
tiempo quien usa este bus (Registros Internos, ALU, Memoria, Perifericos, etc))
Bus de Direcciones -AB. Lneas fsicas que llevan la informacin para seleccionar el registro de la
memoria con que se va a trabajar o cual puerto perifrico activar
Bus de Control -CB. Lneas fsicas que llevan las seales que se encargan de comandar el funcionamiento
de cada elemento. Aunque cada bit del bus tiene diferente significado o destino, igual comparten la finalidad
de controlar.
Registro de Instrucciones En el se guarda la instruccin mientras se la interpreta e implementa la
secuencia de acciones a realizar.
Contador de Programa Registro que guarda la posicin de la prxima instruccin a ejecutar. Tiene la
capacidad de incrementar, decrementar o cargarse con un valor particular.
Registro de Direcciones Registro donde se guarda la informacin sobre la posicin de memoria o
periferico con la cual se esta trabajando. De l nace el AB.
Perifricos Dispositivos que comunican el sistema con el mundo exterior.

Caractersticas Generales
Los microcontroladores son dispositivos electrnicos digitales sincrnicos programables que para funcionar
adems de alimentacin y seales de entrada necesitan un programa para ejecutar..
Son electrnicos por la tecnologa de aplicacin.
Son digitales por que manejan seales discretas, es decir con niveles cuantificados o pre-establecidos. En
este caso solo dos posible (1 o 0). Por lo tanto, la escritura de una salida o lectura de una entrada es solo
para alguno de estos valores.
Son sincrnicos debido a que todas sus acciones estn acompasadas por una oscilacin de referencia o
seal de RELOJ (CK).
Son programables pues su estado depende de las seales de entrada y su estado previo.
La gran ventaja de los procesadores frente a los automatas y maquinas de estado es que la orden o seales
de seleccion de secuencia se codifican en la memoria ROM del sistema, a este conjunto de ordenes se les
llama programa.
Al programa lo ejecutan una instruccin por vez, pero algunos procesan ms de una al mismo tiempo. En
tal caso superponen la ejecucin de una instruccin, con la bsqueda y almacenaje en el Registro de
Instrucciones de la siguiente (pipeline).
Pueden verificar una condicin y determinar entre dos posibles respuestas. Ah es donde se presenta la
aparente inteligencia de un micro.
Trabajan con baja tensin y corriente, por eso la necesidad de perifricos y drivers para interactuar con el
universo.
Los micros manejan mltiples seales de las cuales las ms comunes son:
OSC. Seal de oscilacin generada dentro o fuera del sistema para funcionamiento del mismo.
CLK, CK o reloj. Sincroniza todas las acciones de los dispositivos internos o externos al chip.
Interrupcin. Seal externa al procesador que avisa de la ocurrencia de un evento. Solicita al micro
ejecutar una subrutina particular en respuesta. No todos los micros pueden manejar interrupciones.
DMA. Seal que le solicita al micro dejar en alta impedancia los buses, para ser utilizados por otro
elemento, modulo o chip.
RST o reset. Seal que indica al micro inicializarse. Reinicia sus contadores y comienza el programa desde
el principio nuevamente. Puede o no borrar el contenido de los registros internos.
TXD y RXD. Son seales de transmisin serial: TXD de envo y RXD de recepcin de datos.
Ejemplos de seales de OSC y CLK:
Para el 8080 se necesita dos seales de oscilador
de diferente en fase y ciclo de trabajo.

30

Para el 8088 se necesita una seal CLK con un ciclo de


trabajo del 33%

Para el 8085 se utiliza una seal del 50% de ciclo


de trabajo en OSC y entrega un CLK de la mitad
de frecuencia

Para el PIC16F628A se necesita una seal del


50% de ciclo de trabajo y entrega un CLK de un
cuarto de frecuencia.

La seal interna de reloj del procesador es siempre de mayor frecuencia que la suministrada al sistema.
Esto permite al procesador que en cada ciclo mquina (periodo de CLK) se lleve a cabo varias acciones,
mientras que el sistema realiza una sola. El micro puede ser considerado un complejo cmulo de flipflop y
puertas lgicas.

Funcionamiento Bsico
Cuando es energizado se debe mantener en estado de reset hasta que la tensin de funcionamiento sea
alcanzada. El reset puede ser generado con circuitos externos o internos al chip.
Cuando sale de reset el procesador lee la posicin de memoria ROM llamada Vector de Inicio. En esta
posicin se encuentra la primera instruccin a ejecutar. Para esto carga el PC con el valor del vector de
reset, copia el PC en el Registro de direcciones, que lo vuelca al AB. Habilita el DB entre la memoria ROM
y el registro de instrucciones (IR). Envia la seal de lectura a la ROM y de escritura en el IR. Esta accin
se llama FETCH. Una vez hecho esto incrementa en uno el PC, apuntando este a donde se encuentra la
siguiente instruccin a ejecutar.
El bloque de control la decodifica y ejecuta los pasos indicados por esa instruccin. Genera la secuencia
indicada. Esta accin se llama EJECUCION. La bsqueda (fetch) y ejecucin de una instruccin se llama
ciclo de instruccin. El ciclo de instruccion puede variar de una instruccion a otra, si la instruccion ocupa
ms de un aposicion de ROM se realizan todos los FETCH necesarios para cargarla completamente.
La seal de reloj CK se genera a partir de la seal OSC del oscilador del sistema. Algunos micros
necesitan dos seales de oscilador externas y otros las generan dentro del chip (oscilador interno). La
duracin de un ciclo de instruccin depende de la clase de instruccin a ejecutar y del micro en particular.
El bloque de control se une a todos los elementos del sistema mediante el bus de control. Dirige todas las
acciones de los componentes del micro. Tambin dirige las acciones de los dispositivos del sistema. Por
comodidad solo se dibuja la seccin ms relevante.
Mediante el contador de programa (PC) se sabe que instruccin ejecutara a continuacin.
La memoria es direccionada por el registro de direcciones, que se conecta por el bus de direcciones, e
intercambia datos mediante el bus de datos.
La conexin hacia el exterior ya sea para tomar o entregar datos se realiza a travs de los perifricos.
Estos sirven de acopladores entre el microsistema y el exterior.
Segn cuantas partes estn dentro de un solo chip se habla de procesador, microprocesador o
microcontrolador.

31

Clasificacin
Se clasifican:
Segn la cantidad de bit de los datos que maneja su ALU.
Pueden ser de micros 8, 10, 16, 32, 64, etc bits.
Segn la arquitectura u organizacin de la memoria del sistema:
-VON NEWMAN se usa un solo bus de datos y direcciones para la memoria de datos y programa.
-HARVARD cada rea de memoria tiene su bus de datos y de direcciones.

HARVARD

VON NEWMAN

Bus de Control - CB

Bus de Datos - DB

ROM
RAM

Bus de Direcciones - AB

RAM

ROM
CPU

CPU

Bus de Control - CB
ABrom
Bus de Dir. ROM
Bus de Instrucciones
DBrom

DBram
Bus de Datos RAM
Bus de Dir. RAM
ABram

Segn la estructura o arquitectura del sistema tambin pueden ser ARQUITECTURA CERRADA o
ARQUITECTURA ABIERTA. En los micros de arquitectura cerrada su sistema solo se puede tener los
elementos que el fabricante suministra. No es posible agregarle RAM, ROM, u otros perifricos. Los de
arquitectura abierta pueden formar sistemas de varias configuraciones de RAM, ROM o perifricos. La
diferencia est en si el micro tiene o no los buses accesible al usuario. Esto influye directamente en el
nmero de patillas del chip, por cada lnea del bus se necesita una patilla o pin.
Segn el set de instrucciones. Estas son determinadas por el fabricante para cada componente o su familia.
Aunque la denominacin se hace en referencia a las instrucciones, tambin implica la tecnologa de
fabricacin y la filosofa de diseo del chip.
CISC- Complex Instruction Set Computer. Conjunto de muchas instrucciones complejas, potentes y
hasta redundantes.
RISC- Reduced Instruction Set Computer. Conjunto de pocas instrucciones, generalmente bsicas.
Muchos parmetros estn definidos por defecto por ejemplo uno de los operandos y el destino de la
operacin.
SISC- Specific Instruction Set Computer. Conjunto de instrucciones que adems de ser reducido es
especifico al uso del procesador.
VLIW- Very Large Instruction Word. Conjunto de instrucciones muy complejas. Cada instruccin define
todos los parmetros de funcionamiento. Sustituye a muchas instrucciones de un sistema RISC.
Segn la cantidad de memoria del sistema. La cantidad de memoria ROM nos habla de lo complejo que
podr ser el programa y la cantidad de memoria RAM la capacidad de manejar variables.

El micro que estudiaremos ser el PIC16F628A.


Es un microcontrolador con CPU de 8 bit, arquitectura Harvard cerrada y un set de instrucciones
reducido (RISC).

32

PIC16F628A
Caractersticas y Patillaje
Microcontrolador fabricado por Microchip. Es un dispositivo de la gama media. Internamente tiene una CPU
con arquitectura HARVARD y tecnologa RISC de alto rendimiento.
Sus caractersticas principales son:
*Set de instrucciones reducidas a 35 grupos.
*Todas las instrucciones se ejecutan en un ciclo de maquina, excepto los saltos que se ejecutan en 2 ciclos.
*Velocidad de funcionamiento: DC a frecuencia mxima indicada por el fabricante.
*Memoria de Programa FLASH-ROM de 2048 palabras de 14 bits
*Memoria de Datos RAM de 224 bytes
*Memoria de Datos EEPROM de 128 bytes
*Todas las instrucciones son de una sola palabra de 14 bits
*Datos de 8 bit
*Registros internos mapeados en la RAM
*Pila por hardware de 8 niveles exclusivamente para el PC
*Modos de Direccionamiento Inherente Inmediato, Directo, Indirecto y Relativo
*10 Fuentes de Interrupcin:
- Externa pin RB0/INT
- Desborde del TMR0
- Cambio de nivel en PORTB<4:7>
- Terminacin del ciclo de escritura en EEPROM
- Cambios en los comparadores
- Recepcin de un dato en la USART
- Transmisin de un dato en la USART
- Modulo CCP
- Desborde del TMR1
- Recarga del TMR2
*16 patillas de entrada/salida con control de direccin individual
* Alta corriente de fuente/sumidero para manejo directo de LED
- Corriente de Sumidero 25 mA mx. por pin
- Corriente de Fuente 25 mA mx. por pin
*Perifricos
- 2 puertos de 8 bit
- TMR0 contador/temporizador de 8 bit
- TMR1 contador/temporizador de 16 bit
- TMR2 temporizador recargable de 8 bit
- Modulo de comparacin, captura y modulacin PWM
- 2 comparadores analgicos
- Modulo de voltaje de referencia
- Interfase de comunicacin serial
- Memoria EEPROM
Caractersticas Especiales del Microcontrolador:
* Memoria de Datos EEPROM con 1:000.000 de ciclos de borrado/escritura
* Retencin de Datos EEPROM mayor a 40 aos
* (ICSP) Circuito de Programacin Serial Interno - va 3 pin
* Reset al energizar (POR)
* Retardo al encender (PWRT)
* Retardo de arranque del Oscilador (OST)
* Reset de arranque en caliente (BOR)
* Vigilante (WDT) con su propio oscilador RC interno para un funcionamiento confiable
* Proteccin de Cdigo de ROM y EEPROM por separado
* Mdulo completo de oscilador con 8 modos de funcionamiento
*Oscilador interno de 4Mhz calibradoal 1%
*Oscilador interno de 48Khz de bajo consumo
* Tecnologa de bajo consumo, alta velocidad
* Modo de bajo consumo (SLEEP) economizador de energa
* Diseo totalmente esttico que permite detener el OSC
* Amplio rango de voltaje de operacin: 2.0V a 5.5V
33

Patillaje

PIN
17
18
1
2
3

Nombres
RA0
AN0
RA1
AN1
RA2
AN2
Vref
RA3
AN3
CMP1
RA4
T0CKI
CMP2
RA5
MCLR

4
Vpp
RA6
OSC2
15
CLKOUT
RA7
OSC1
16
CLKIN
6
7
8
9
10
11
12

RB0
INT
RB1
RX
DT
RB2
TX
CK
RB3
CCP1
RB4
PGM
RB5
RB6
T1OSO
T1CKI

DESCRIPCIN
Bit 0 del Puerto A
Entrada (-) del comparador 1
Bit 1 del Puerto A
Entrada (-) del comparador 2
Bit 2 del Puerto A
Entrada (+) del comparador 2
Salida analgica del modulo de referencia de voltaje.
Bit 3 del puerto A
Entrada (+) del comparador 1
Salida del comparador 1
Bit 4 del Puerto A. Salida de colector abierto
Entrada de reloj del Timer0
Salida del comparador 2 (colector abierto)
Bit 5 del Puerto A
Cuando esta configurado como Reset Maestro un cero en este
terminal fuerza el estado de RESET en el micro. Su nivel alto no
debe exceder a Vdd
Entrada de tensin de programacin
Bit 6 del Puerto A
Conexin para un cristal o resonador al oscilador en modo HS, XT
o LP
Salida de seal de Reloj CK para el oscilador en modo RC o
INTOSC a de la frecuencia de oscilacin en OSC1.
Bit 7 del Puerto A
Conexin para un cristal o resonador al oscilador en modo HS, XT
o LP.
Conexin del puente RC al oscilador en modo RC o entrada de
oscilacin externa en modo HS, XT o LP
Bit 0 del Puerto B
Entrada de interrupcin por flanco
Bit 1 del Puerto B
Pin de recepcin de datos asincrnicos de la SCI
Pin de entrada/salida de datos sincrnicos de la SCI
Bit 2 del Puerto B
Pin de transmisin de datos asincrnicos de SCI
Entrada o salida de seal de clock sincrnico de la SCI
Bit 3 del Puerto B
Entrada/Salida del modulo CCP1
Bit 4 del puerto B. Dispara interrupcin por cambio de estado
Entrada de voltaje de programacin.
Bit 5 del Puerto B
Bit 6 del Puerto B
Entrada al oscilador del TMR1
Entrada de reloj para el TMR1
34

I/O
Bidireccional
Entrada
Bidireccional
Entrada
Bidireccional
Entrada
Salida
Bidireccional
Entrada
Salida
Bidireccional
Entrada
Salida
Entrada
Entrada
Entrada
Bidireccional
Entrada
Salida
Bidireccional
Entrada
Entrada
Bidireccional
Entrada
Bidireccional
Entrada
Bidireccional
Bidireccional
Salida
Bidireccional
Bidireccional
Bidireccionall
Bidireccional
Entrada
Bidireccional
Bidireccional
Entrada
Entrada

13
5
14

PGC
RB7
T1OSI
PGD
GND
Vdd

Entrada de seal de CK para programarlo


Bit 7 del Puerto B
Entrada al oscilador del TMR1
Entrada / Salida de datos al quemar
Alimentacin negativa para la lgica y los pines de entrada
Alimentacin positiva del chip

Entrada
Bidireccional
Entrada
Bidireccional
Entrada
Entrada

Diagrama de Bloques Interno


El PIC16F628A es un microcontrolador de la empresa Microchip. Dispositivo de la gama media de la familia
PICmicro.

La memoria de programa ,interna al chip, contiene 2048 palabras de 14 bit, la misma longitud que cada una
de las instrucciones del micro. La memoria de datos RAM ,interna al chip, tiene 224 registros de un byte y la
memoria EEPROM de datos 128 registros de 8 bits.
El contador de programa (PC) es de 13 bit lo que permite direccionar 8 K o pginas, pero solo est
35

implementado los dos primeros K o pginas.


La ALU es de 8 bit al igual que el Bus de Datos.
Tiene dos buses de datos, uno de programa (14 bits) y otro de datos (8 bits).
Tambin contiene los dos buses de direcciones. El ABROM sale del contador de programa (PC) (13 bits).
El PC se comunica con la Pila que son 8 registros de 13 bits.
El ABRAM (9 bits) sale del multiplexor de direcciones el cual selecciona la fuente para la direccin de
memoria. Esta fuente puede ser el registro de instrucciones o el FSR, que es un registro usado como
puntero de RAM. Este multiplexor puede direccionar 512 posiciones pero no estn todas.
La memoria EEPROM es un mdulo aparte. Se usan 4 registros para operar con ella: el registro EEDATA
como buffer de datos, el registro EEADR para direccionar y los registros EECON1 y EECON2 para controlar
el funcionamiento.
La ALU tiene la capacidad de operar con dos nmeros de 8 bit cada uno. Obtiene sus operandos del reg W
y del multiplexor de datos. Este ltimo selecciona si el dato proviene de una instruccin o a travs del DB.
El W es el registro ms verstil y usado. El reg STATUS adems de los indicadores de la ALU guarda
indicadores del estado del micro y el programa.
Hay 16 pins de I/O configurables por el usuario uno a uno. Algunos pin estn multiplexados con otros
perifricos del dispositivo.
Los registros de Identificacin ID son 4 registros de 4 bits bit, solo accesibles durante el quemado del
micro para grabarle cualquier dato. Su uso puede ser guardar el nmero de serie del chip o la versin de
software.
La ICSP es el mdulo que se encarga de quemar la memoria. Se conecta al exterior a travs de los pines 4,
11 y 12. Es capaz de impedir la lectura del cdigo o programa grabado. En tal caso se lee toda la memoria
como 0000, excepto el valor de los ID.
La instruccin a ser ejecutada se lee de la ROM y se carga en el registro de instrucciones. De las
instrucciones se pueden extraer distintos datos: comandos para el bloque de control, dato para operar,
direccin de RAM, etc.
El Bloque de control tiene varios elementos a destacar:
Decodificador de Instrucciones y Control- Se encarga de interpretar la instruccin y generar la secuencia
a ejecutar, o sea controla todos los elementos del micro.
Power on Reset (POR)- Reset de Encendido. Circuito que mantiene un reset interno mientras la tensin de
funcionamiento no llegue al valor mnimo. Si vuelve a bajar no se activa a menos que desaparezca Vdd.
Power-Up Timer (PWRT)- Temporizador del Retardo de Encendido. Permite demorar la salida de reset
72 mili-segundos a partir que POR o BOR habiliten.
Brown-Out Reset (BOR) Reset de arranque en caliente. Si ocurre una falla en la alimentacin pero no
llega a desaparecer, este circuito genera un reset hasta que vuelve la tensin a su nivel de funcionamiento.
Oscillator Start-up Timer (OST)- Temporizacin de Arranque del Oscilador. Una vez terminado el retardo
del PWRT genera una demora en generar seales de sincronismo, asegurando que el oscilador se
estabilice.
Watch Dog Timer (WDT)- Temporizador Vigilante o Perro Guardin. Es un contador de 8 bit con su propio
oscilador independiente. Mediante software se le debe reiniciar o el WDT se desbordara. En caso de
desborde realiza un reset del micro.
Generador de Clock (CK) y Sincronismo. Es un modulo de oscilador completo. Puede funcionar sin
necesidad de componentes externos. Genera la seal de CK interno y externo.
Low Voltaje Programming Programador de baja tensin. Permite grabar la memoria ROM con solo 5
volt.

36

Clases de Oscilador
El PIC16F628A tiene un circuito oscilador interno completo. No necesita componentes para generar la seal
de reloj CK. Pero acepta varias configuraciones del oscilacin, como puede ser un circuito de resistenciacondensador en serie, un cristal piezoelctrico o una onda cuadrada desde el exterior.
La seleccin se realiza durante la quema del chip:
XT- Oscilador a cristal o resonador
HS- Oscilador a cristal o resonador de alta velocidad
LP- Oscilador a cristal o resonador de bajo consumo
RC- Oscilador a Condensador y Resistencia, con o sin salida de CK por pin 15
EC- Seal de oscilador desde fuente externa
INTOSC- Oscilador interno (4Mhz o 48Khz) con o sin salida de CK por pin 15
Modos HS, XT y LP aceptan un cristal o resonador cermico conectado a los terminales OSC1/CLKIN y
OSC2/CLKOUT.
El cristal necesita de un par de condensadores a masa. Estos elementos tienen
una frecuencia muy estable, excepto frente a la temperatura.
En la documentacin del micro esta la informacin sobre los valores de dichos
capacitares segn la frecuencia del cristal.
El resonador cermico no necesita de estos
condensadores. El pin central es la conexin a masa del
resonador.

El modo EC acepta que un generador de onda cuadrada externo sea


conectado al pin OSC1/CLKIN. Por el pin 15 funcionara como RA6

Si se selecciona el modo RC se debe conectar un circuito resistencia-capacitor


al terminal OSC1/CLKIN. Por el terminal 15 se puede seleccionar tener la seal
CK de de la frecuencia de oscilacin o funcionar como RA6.

El oscilador a cristal tiene como ventaja la robustez, exactitud y estabilidad en el tiempo. Los resonadores
tienen iguales prestaciones que los cristales y adems la simpleza de su instalacin. Como desventaja
ambos presentan mucha dependencia con la temperatura. En caso de ser necesario se le hace trabajar
caliente adosndoles una resistencia.
El oscilador RC en cambio es estable frente a la temperatura y muy econmico, pero presenta un gran
porcentaje de error y con el tiempo variaciones de valor en su capacitor.
El oscilador interno puede sacar la seal de CK por el terminal 15 o usarlo como RA6. Adems en
funcionamiento se puede setear el mismo entre 48Khz o 4Mhz.

37

Tipos de Fuente
El PIC16F628A es un integrado con un amplio rango de funcionamiento. Funciona desde 2,0 volt hasta 5,5
volt. Por su bajo consumo la fuente ms simple es con un regulador 78L05. Los capacitares son para filtrado
y estabilizacin de la fuente.
Los terminales de masa de los componentes de
la fuente deben estar lo mas cerca posible, as
se evitan ruidos.

Es importante evitar los ruidos a la entrada


del regulador, as su salida ser mas
confiable. Este circuito es el adecuado
cuando en la alimentacin se presentan
picos positivos o negativos de tensin.

En caso de existir ruidos electromagnticos es necesario blindar el sistema junto con la fuente. La lnea
punteada significa una jaula de Faraday o caja aterrada. La entrada de corriente al sistema se hace a travs
de choques, para evitar que la interferencia magntica captada pase por los cables.

Si se le alimenta con 4 pilas comunes es necesario bajar la


tensin con dos diodos. Cuatro pilas con el mximo de carga
seria 6,08 volt. Si se coloca un solo diodo estamos en el limite
fsico del chip, con dos en cambio, se esta cmodamente dentro
del rango de su funcionamiento. Se utilizan diodos y no
resistencias por que los primeros dan una cada de tensin
bastante independiente de la corriente. Si son pilas recargables
no es necesario bajar la tensin.
Para desacoplar los propios ruidos de consumo del chip es necesario que
se coloque, lo ms cerca posible, entre los terminales 5 y 14 un
condensador de 0,1uF. Son apropiados los componentes SMD. Estos
ruidos se deben a variaciones del consumo dentro del propio integrado.

38

Circuitos de Entrada o Salida


El microcontrolador es un chip que soporta pequeas tensiones y corrientes en sus entradas y salidas.

Circuitos de Entrada
Es necesario modificar los valores de las seales de entrada para que no daen al chip. Se logra tomando
una muestra dependiente al valor original. La tensin no puede ser mayor a 5,5 volt ni menor a 0 volt. Al
tener entradas de alta impedancia se considera que la corriente que absorbe es despreciable.
Entrada con puente divisor de tensin:
Este circuito es para seales activas a nivel alto, protege
contra tensiones excesivas positivas (el diodo zener) y
negativos (diodos 1n4007 y 1n4148)
Si las resistencias se calculan para que la tensin en el pin
no supere a Vdd, se puede prescindir de los diodos 1n4007
y del diodo zener. Si no hay ninguna tensin de entrada las
resistencias ponen a 0v el pin.

Entrada con puente divisor de tensin:


Este circuito es para seales activas a nivel bajo. El diodo
(1N4148) de entrada protege contra seales positivas, los
otros diodos (1N4007) protege contra las tensiones
negativas. Si no hay tensin de entrada las resistencias
ponen a Vdd el pin.
Es mas seguro trabajar con seales activas a nivel bajo
pues de cero no pasaria y el primer diodo anula los picos
positivos.

Funciona igual que el anterior solo cambia la configuracin de


las resistencias.

Entrada con transistor


inversor:
En este circuito es para seales activas a nivel alto, aceptando
tensiones muy grandes. El transistor puede ser cualquier NPN, la
tensin que maneja es muy baja al igual que la corriente. Otros
componentes que pueden servir son BC546 y BC237.

Entrada Opto-aclopada
Este circuito permite que la seal tenga una fuente diferente a
la del chip. Asla elctricamente el chip del resto del sistema.
Para tensiones con polaridad se usa el CNY17 o 4N25 , para
seal de alterna se usa el PC814 o LTV814. Ideal para aislar
al micro de la planta industrial.

39

Circuitos de salida:
La corriente de salida es muy pequea, mximo 25 mA por pin. Funciona como una fuente de tensin con
una gran resistencia interna. A corriente mxima, solo tendramos la mitad de la tensin de Vdd. Para
manejar la mayora de los dispositivos de salida se debe amplificar la salida en corriente y tensin.

Los pines del pic manejan muy poca corriente a pesar de ser mucho mayor que sus
antecesores. Un led es un dispositivo que pueden manejar directamente.
En este caso drena corriente a masa. El led enciende cuando hay un cero escrito

Salida con transistor inversor / Salida con relee:


Mediante el transistor amplificamos la corriente para activar el
relee. La ganancia del transistor no es importante pues se trabaja
con el mismo saturado.

Salida opto-acoplada
Si se precisa manejar dispositivos de
alterna es mejor aislar al micro de la etapa
de potencia. El opto-acoplador es el
MOC8031 (opto- triac) u otro de la familia.

Salida a transistor no inversor:


Este circuito permite tener una salida sin invertir la lgica y
amplificar en corriente y tensin. Ambos transistores trabajan
saturados o en corte. Cuando el pin este a 1 la salida estar a
Vcc y si esta a nivel 0 la salida ser 0v.

Salida con IC:


El chip ULN2003 u otro
similar permite amplificar
varias salidas con poco
espacio. Invierte la lgica
del pin y funciona a
colector abierto.

40

Memoria Interna
Mapa de Memoria
La memoria del PIC16F628A se divide en dos grandes bloques, Memoria de Programa y Memoria de Datos.
Cada bloque tiene su bus de datos, bus de direcciones y selector de direcciones.

Memoria de Programa (Flash ROM)


La memoria de programa tiene un contador (PC) de 13 bit, lo que le
permite direccionar 8 Kbyte. Solo tiene implementado los 2 primeros
Kbytes para las instrucciones del programa. Se extiende desde 0000h
hasta 07FFh.
Las posiciones de memoria 2000h a 2003h se llaman ID. Solo son
accesibles durante el proceso de programacin del micro, para guardar
datos. nicamente el nible bajo de cada posicin esta implementado.
Permite as por ejemplo guardar un nmero de serie del chip o la
versin de software grabada.
En la posicin 2007h se ubican los bits de configuracin, que permiten
setear el funcionamiento del micro.
La pila tiene 8 niveles solo para valores del PC.

41

Memoria de Datos (RAM Esttica)


La memoria de datos es la memoria RAM del sistema. Tiene dos partes, una es una RAM esttica (permite
escritura y lectura veloz y no pierde los datos aunque se detenga el clock) y la otra es una EEPROM (se
necesita un procedimiento especial de lectura/escritura pero no pierde los datos aunque se quite la
alimentacin).
00
01
10
11
La RAM esttica se distribuye en cuatro bancos,
00h
180h
BANCO0, BANCO1, BANCO2 y BANCO3 .
La seleccin de bancos se realiza mediante los bits RP1,
RP0 e IRP.
Cada uno contiene 128 posiciones de RAM. Los
primeros 32 registros (00h-1Fh, 80h-9Fh, 100h-11Fh y
180h-1AF) se llaman SFR, son registros de funcin
especial para el funcionamiento del micro. Los restantes
registros (20-7F y A0h-FF, 120h-17F y 1AFh-1FFh) son
registros GPR de propsito general.
7Fh
Bank 0 Bank 1 Bank 2 Bank 3

BANCO 00
No todas las posiciones de memoria tienen el
registro implementado.
En el banco 10 solo estn implementados desde la
posicin 20h(120h) a la 4Fh (14Fh).
En el banco 11 no tienen ninguna registro GPR
implementado
Las ultimas 16 direcciones de memoria de cada
banco estn implementadas sobre los registros 70h7Fh del banco 00. Si se direcciona al registro 1FFh,
se esta trabajando con el registro 7Fh. Si se
direcciona el registro 75h (175h) del banco 10 se
accede al registro 75h del banco 00

1FFh

BANCO 01 BANCO 10 BANCO 11

00

SFR

SFR

SFR

SFR

1F
20

20

GPR
GPR

GPR

2F

6F
70

GPR

7F

Memoria de Datos EEPROM


La memoria EEPROM esta mapeada aparte. Es un periferico ms y se necesita un proceso especial para
leerla o escribirla. Contiene 128 registros de 8 bit cada uno. Comparte con la RAM el bus de datos, pero
tiene su propio selector de direcciones.
Memoria:
Programa
-Instrucciones de Programa (000h -7FFh)
-Bloques de Identificacin ID (2000 - 2004)
-Bits de Configuracin (2007h)
Datos
-RAM esttica (00h 1FFh)
SFR (00h 1Fh) (80h 9Fh) (100h 11Fh) y (180h 19Fh)
GPR (20h - 7Fh) y (A0h - FFh)
EEPROM (00h - 7Fh)

42

Registros Internos SFR


Los registros internos en este micro comprenden toda la memoria del sistema. Pero en general se le
denomina as a los registros de uso particular, o sea los SFR. Se dividen en dos grupos, los que usa el
procesador para funcionar y los utilizados para controlar los perifericos.
Varios registros estn presentes en varios bancos de datos por lo tanto tienen dos o ms direcciones. Los
bits 7 y 8 de la direccin de cada registro RAM se toma del bit selector de banco.

BANCO 00
00
01
02
03
04
05
06
07
08
09
0A
0B
0C
0D
0E
0F
10
11
12
13
14
15
16
17
18
19
1A
1B
1C
1D
1E
1F
20

INDF
TMR0
PCL
STATUS
FSR
PORTA
PORTB
---------------------PCLATH
INTCON
PIR1
----------TMR1L
TMR1H
T1CON
TMR2
T2CON
--------------CCPR1L
CCPR1H
CCP1CON
RCSTA
TXREG
RCREG
----------------------------CMCON

BANCO 01
80
81
82
83
84
85
86
87
88
89
8A
8B
8C
8D
8E
8F
90
91
92
93
94
95
96
97
98
99
9A
9B
9C
9D
9E
9F
A0

80 Registros de
Propsito
General

6F
70

80 Registros de
Propsito General

BANCO 10
100
101
102
103
104
105
106
107
108
109
10A
10B
10C
10D
10E
10F
110
111
112
113
114
115
116
117
118
119
11A
11B
11C
11D
11E
11F
120
14F
150

48 Registros de
Propsito General

BANCO 11
180
181
182
183
184
185
186
187
188
189
18A
18B
18C
18D
18E
18F
190
191
192
193
194
195
196
197
198
199
19A
19B
19C
19D
19E
19F
1A0

INDF
OPTION
PCL
STATUS
FSR
-------TRISB
---------------------PCLATH
INTCON
-----------------------------------------------------------------------------------------------------------------------------------------

--------

16F
170
Accesibles a travs
de 70 a 7F

FF

INDF
TMR0
PCL
STATUS
FSR
-------PORTB
---------------------PCLATH
INTCON
-----------------------------------------------------------------------------------------------------------------------------------------

--------

EF
F0
16 Bytes

7F

INDF
OPTION
PCL
STATUS
FSR
TRISA
TRISB
---------------------PCLATH
INTCON
PIE1
-------PCON
---------------------PR2
-----------------------------------TXSTA
SPBRG
EEDATA
EEADR
EECON1
EECON2
-------VRCON

1EF
1F0

Accesibles a
travs de 70 a 7F

17F

Accesibles a
travs de 70 a 7F

1FF

SFR del Ncleo:


PC- Contador de programa (13 bit). Se le puede modificar durante la ejecucin del programa en forma
indirecta, pero solo se puede leer el byte bajo del mismo.
STACK o PILA- Son 8 registros de 13 bit, no accesibles por el programador. En ellos se guarda la direccin
de retorno de las subrutinas y las interrupciones. Se dice entonces que tiene 8 niveles de subrutinas, y si se
realiza un noveno llamado a subrutina se sobrescribe la primera posicin.
W- Acumulador o Registro de Trabajo (8 bit). Es siempre uno de los operandos de todas las operaciones y
destino de la mayora de las instrucciones. No tiene una direccin de memoria, se le nombra para usarlo.
43

STATUS- Posicin 03h, 83h, 103h y 183h. Contiene informacin sobre el estado del sistema, banco
seleccionado y banderines de la ltima operacin realizada. Como todo registro puede ser destino de
cualquier instruccin. Algunos bits no pueden ser escritos. Se forma por los bit: IRP, RP1, RP0, TO, PD, Z,
DC, C
IRP Selecciona el conjunto de bancos a utilizar con el direccionamiento indirecto. Si vale 0
direcciona los bancos 00 y 01, si vale 1 direcciona los bancos 10 y 11.
RP1:RP0 seleccionan el banco de memoria de datos a usar cuando se direcciona memoria en forma
directa.
TO indica salida del Watch Dog Timer. Despus de encender el chip, o de una instruccin SLEEP o
CLRWDT vale 1. Cuando termina el tiempo del WDT vale 0. No puede ser escrito por el programador.
PD Bit de bajo consumo. Despus de encender el chip, o de una instruccin CLRWDT vale 1.
Despus de una instruccin SLEEP vale 0. No puede ser escrito por el programador.
Z Bit de Cero. Si el resultado de una operacin lgica o matemtica es cero vale 1
DC Bit de Semiacarreo o Acarreo Digital. Si hay acarreo/borrow entre los bit 3 y bit 4 de una
suma/resta (instrucciones ADDLW, ADDWF, SUBLW o SUBWF) vale 1.
C Bit de Acarreo. Indica si hay acarreo o borrow de la suma o resta.
FSR- Posicin 04h, 84h, 104h y 184h. Puntero que se usa para el direccionamiento indirecto de la RAM.
Solo puede direccionar 256 registros, para cubrir todo el mapa de memoria se vale del valor del bit IRP.
INDF- Posicin 00h, 80h, 100h y 180h. Registro sin implementacin fsica. Se usa en conjunto con FSR
para el direccionamiento indirecto por registro. Toda instruccin que lo use en realidad usa el registro
direccionado por FSR. Para toda operacin o movimiento que est dirigida al INDF, en realidad se lleva a
cabo con el registro direccionado por el valor del FSR.
PCL- Posicin 02h, 82h, 102h y 182h. El byte bajo del PC es modificado y ledo a travs de este registro.
PCLATH- Posicin 0Ah, 8Ah0, 1Ah y 18Ah.. Los 5 bit MSB del PC solo pueden ser escritos pero no ledos.
Se vuelcan en el PC cuando el PCL es escrito u operado.
PCL

PCLATH
X

PC

Bit 4 Bit 3 Bit 2 Bit 1 Bit 0

Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0

Bit 12 Bit 11 Bit 10 Bit 9 Bit 8 Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0

En las instrucciones que usan PCL como destino se cargan los bit 0 a 4 de PCLATH en los bit 8 al 12 del
PC.
En las instrucciones call y goto los bit 4 y 5 de PCLATH se cargan en los bit 11 y 12 del PC.
INTCON- Posicin 0Bh, 8Bh, 10Bh y 18Bh. Controla el funcionamiento y la respuestas a las interrupciones.
El micro tiene 10 fuentes de peticin de interrupcin, las cuales puede habilitar o no en forma individual o
global. Solo 3 de estas fuentes se controlan desde este registro. Los bit son GIE, PIE, T0IE, INTE, RBIE,
T0IF, INTF, RBIF
GIE - Habilitacin Global de las interrupciones.
Valor 1 - Habilita todas interrupciones no enmascaradas.
Valor 0 - Deshabilita todas las interrupciones
PEIE - Habilitacin general de interrupcin de perifricos.
Valor 1 - Habilita la interrupcin.
Valor 0 - Bloquea la interrupcin
T0IE - Habilita la interrupcin por desborde del TIMER0
Valor 1 - Habilita la interrupcin.
Valor 0 - Bloquea la interrupcin
INTE - Habilitacin de interrupcin del pin RB0/INTE
Valor 1 - Habilita la interrupcin.
Valor 0 - Bloquea la interrupcin
RBIE - Habilita la interrupcin por cambio de nivel lgico de cualquier pin RB4-RB7
Valor 1 - Habilita la interrupcin.
Valor 0 - Bloquea la interrupcin
T0IF - Indicador de solicitud de interrupcin al pasar de FFh a 00h de TMR0
Valor 1 - El TIMER0 desbordo. Debe ser puesto a 0 por software.
INTF - Indicador de interrupcin solicitada por RB0/INT
Valor 1 - Ocurri un flanco valido en el pin 6. Debe ser puesto a 0 por software.
RBIF - Indicador de peticin de interrupcin por cambio en el puerto B.
44

Valor 1 - Al menos uno de los pines RB4-RB7 cambi de nivel lgico. Debe ser puesto a 0
por software.
PIE1- Posicin 8Ch. Registro de mascara de las interrupciones de los perifricos. Habilitacin de
interrupcin para 7 de los 10 perifricos. Sus bit son EEIE, CMIE, RCIE, TXIE, CCP1IE, TMR2IE y
TMR1IE.
EEIE Mascara de interrupcin por fin del ciclo de escritura en la EEPROM
1 Habilita
0 No habilita
CMIE Mascara de interrupcin por cambio en los comparadores
1 Habilita
0 No habilita
RCIE Mascara de interrupcin por recepcin en la USART
1 Habilita
0 No habilita
TXIE Mascara de interrupcin por transmisin de la USART
1 Habilita
0 No habilita
Bit 3 - No implementado. Se lee como cero
CCP1IE Mascara de interrupcin del modulo CCP1
1 Habilita
0 No habilita
TMR2IE Mascara de interrupcin por comparacin del TMR2 con PR2
1 Habilita
0 No habilita
TMR1IE Mascara de interrupcin por desborde del TMR1
1 Habilita
0 No habilita
PIR1- Posicin 0Ch. Registro de banderas de interrupcin. Todos sus bit son puestos a uno por hardware y
es necesario limpiarlos por software. Sus bits son EEIF, CMIF, RCIF, TXIF, CCP1IF, TMR2IF y TMR1I.
EEIF interrupcin por finalizacin de la escritura en la EEPROM
1 El ciclo de escritura finalizo correctamente.
0 No ha terminado el ciclo de escritura o no ha comenzado. Se pone a cero por software
CMIF Aviso de interrupcin por cambio en los comparadores
1 La salida de los comparadores ha cambiado
0 La salida de los comparadores no ha cambiado. Se pone a cero por software
RCIF Aviso de interrupcin por recepcin de la USART
1 El buffer de recepcin de la USART esta lleno
0 El buffer de recepcin de la USART esta vaco
TXIF Aviso de interrupcin por transmisin de la USART
1 El buffer de transmisin de la USART esta vaco
0 El buffer de transmisin de la USART esta lleno
Bit 3 - No implementado. Se lee como cero
CCP1IF Aviso de interrupcin del modulo CCP
Modo Captura
1 Ha ocurrido una captura del TMR1
0 No ha ocurrido una captura del TMR1. Se pone a cero por software
Modo Comparador
1 CCPR1 alcanzo el valor de TMR1.
0 CCPR1 es diferente a TMR1. Se pone a cero por software
Modo Modulador de Ancho de Pulso
X No se usa
TMR2IF Aviso de Interrupcin por TMR2
1 El TMR2 alcanzo el valor del PR2
0 El TMR2 no alcanzo el valor del PR2. Se pone a cero por software
TMR1IF Aviso de interrupcin por desborde del TMR1
1 Ocurri un desborde del TMR1.
0 No ha desbordado el TMR1. Se pone a 0 por software
PCON- Posicin 8Eh. Registro de control de oscilador y energa. Sus bit son OSCF, POR y BOR.
Bit 7 al 4 - No implementados. Se leen como ceros
OSCF - Frecuencia del oscilador en modo INTOSC
1 4 Mhz
45

0 48 Khz
Bit 2 No implementado. Se lee como cero
POR Reset por Encendido
1 No ha ocurrido un reset por encendido.
0 Ha salido de reset por encendido. Debe ser puesto a 1 por software.
BOR Reset por Arranque en Caliente (baja tensin)
1 No ha ocurrido un reset por baja tensin
0 Ha salido de reset por haber bajado Vdd . Debe ser puesto a uno por software
SFR de los perifricos:
Estn mapeados sobre la memoria RAM. Esto permite usar las mismas instrucciones para manejar los
puertos de los perifricos que los registros RAM. Inclusive varios perifricos comparten SFRs, usando
distintos bit del mismo registro. Se ubican en las primeras 32 posiciones de cada banco.
Inclusive varios perifricos comparten SFRs, usando distintos bit del mismo registro.
Puertos I/O: Se conectan a los pines para entregar o adquirir datos del exterior al chip. El puerto B se
configura con el registro TRISB (086h y 186h) y usa el registro PORTB (006h y 106h) como buffer. Tiene bit
de configuracin (INTEDG y RBPU) en el registro OPTION_REG (081h y 181h). Las interrupciones que
puede generar se controlan con algunos bits del registro INTCON (00Bh, 08Bh, 10Bh y 18Bh). El puerto A
se configura con el registro TRISA (083h) y usa el registro PORTA (005h) como buffer.
PORTA Posicin 05h. Registro que copia/fuerza el valor de los pines RA0-RA7. En el caso de efectuar una
lectura sobre un pin, que esta dispuesto como salida, se lee el bit correspondiente de este registro. Si el
circuito exterior vara la tensin del pin, se produce una lectura diferente a lo escrito y esto lo evita. Por
ejemplo: si se escribe un 1, y si la corriente a masa es muy grande en el pin, este puede bajar su tensin
hasta 1/5 Vdd y esto se vera como nivel lgico 0. Si se setea un terminal como entrada, el bit
correspondiente es inmune a las operaciones de escritura. El pin RA5 solo funciona como entrada
-PORTB Posicin 06h y 106h. Registro que copia/fuerza el valor de los pines de RB0-RB7. En el caso de
efectuar una lectura sobre un pin que est dispuesto como salida, se lee el bit correspondiente de este
registro. Esto evita que, si el circuito exterior vara la tensin del pin se produzca una lectura diferente a lo
escrito. Por ejemplo: si escribimos un 1, y si la corriente a masa es muy grande en el pin, este puede bajar
su tensin hasta 1/5 Vdd y esto se vera como nivel lgico 0. Si se setea un terminal como entrada, el bit
correspondiente ser inmune a las operaciones de escritura.
TRISA Posicin 85h. Selecciona si los pines del puerto A sern entradas o salidas.
Valor 1 el terminal ser Entrada
Valor 0 el terminal ser Salida
TRISB Posicin 86h y 186h. Selecciona si los pines del puerto B sern entradas o salidas.
1 - Entrada
0 - Salida
TIMER0: Es un contador/temporizador libre que se configura con algunos bit (T0CS, T0SE, PSA, PS2,
PS1 y PS0) del OPTION_REG y se usa el registro TMR0 (001h y 101h) como buffer. Puede usar como
entrada de clock al pin 3 (RA4/T0CKI), lo cual altera el bit TRISA,4. La interrupcin que puede generar se
controla con el INTCON.
TMR0 Posicin 01h y 101h. Registro que se usa para cargar o copiar el valor de TIMER0. Este contador se
incrementa mediante eventos en el pin 3 o con ciclos de mquina. Cada vez que es escrito TMR0, el
TIMER0 se detiene durante 2 ciclos de reloj.
OPTION Posicin 81h y 181h. Registro que regula parte del funcionamiento interno del micro. Sus bit son
los siguientes: RBPU, INTEDG, T0CS, T0SE, PSA, PS2, PS1, PS0
RBPU - Habilita resistencia pull-up internas a las entradas del puerto B. Estas resistencias son de
aproximadamente 10 K.
Valor 1 - Inhabilitadas.
Valor 0 - Habilitadas
INTEDG - Selecciona el flanco de activacin de interrupcin para el pin RB0/INT.
Valor 1 - Interrupcin por flanco de subida
Valor 0 - Interrupcin por flanco de bajada
T0CS - Selecciona el origen del reloj del TIMER0, si ser RA4/TOCKI o clock interno.
Valor 1 - Transicin del pin RA4/TOCKI
Valor 0 - Ciclo de reloj interno o ciclo maquina o ciclo de instruccin.
T0SE - Elige el flanco de activacin de RA4/TOCKI.
Valor 1 - Activacin por flanco de bajada
Valor 0 - Activacin por flanco de subida
PSA - Selecciona a cual contador se le aplica el pre-escalador, si a TIMER0 o WDT. Hay un solo
divisor, este se puede aplicar al TIMER0 o al Vigilante. Si se aplica el divisor al WDT, el TIMER0 se
46

incrementa con cada 2 ciclos de CK. Si se aplica el divisor al TIMER0, el Vigilante se incrementa con cada
ciclo de CK.
Vale 1 Divisor aplicado al WDT
Vale 0 Divisor aplicado al TMR0
PS2:PS1:PS0 Seleccionan la proporcin del pre-escalador. La escala segn su aplicacin es
diferente.
PS2:PS1:PS0
000
001
010
011
100
101
110
111

Timer0
1:2
1:4
1:8
1:16
1:32
1:64
1:128
1:256

WDT
1:1
1:2
1:4
1:8
1:16
1:32
1:64
1:128

TIMER1: Es un contador/temporizador de 16 bit cuyo buffers son TMR1L (00Eh) y TMR1H(00Fh). Se


configura y controla con el registro T1CON (010h). Puede usar a RB6 y RB7. La interrupcin que genera se
controla con algunos bit de los registros INTCON, PIE1 (08Ch) y PIR1(00Ch)
TIMER2: Es un temporizador de 8 bit con autocarga. Su buffer es el registro TMR2 (011h) y se configura
con los registros T2CON (012h) y PR2 (092h). Su interrupcin se controla con INTCON, PIR1 y PIE1
CCP1: Es un modulo que puede realizar 3 funciones diferentes:
Captura el valor del TMR1 frente a un evento
Genera un evento cuando el contenido de TMR1H:TMR1L es igual a CCPR1H:CCPR1L (016h y
015h respectivamente)
Genera un pulso modulado en ancho (PWM)
Su funcionamiento es controlado y ajustado con CCP1CON (017h), puede utilizar adems a TMR2, PR2 ,
T2CON, PORTB y TRISB. Su interrupcin es manejada por INTCON, PIE1 y PIR1.
Modulo de Voltaje de Referencia: Es un perifrico capaz de generar valor de tensin que es fraccin de
la tensin Vdd. No es fuente de interrupcin. Se controla con el registro VRCON (09Fh) y puede usar a
PORTA y TRISA.
COMPARADORES: Esta compuesto por 2 operacionales funcionando como comparadores. Se setea con
el registro CMCON (01Fh), usar al PORTA, TRISA y al Voltaje de Referencia. Su interrupcin se controla
con INTCON, PIE1 y PIR1.
USART: Es una interfase de comunicacin serial sincrnica o asincrnica completa. Esta formada por las
secciones de transmisin y recepcin. Se controla con los registros TXSTA (098h), RCSTA (018h), SPBRG
(099h), TXREG (019h) y RCREG (01Ah) y utiliza a PORTB y TRISB. Su interrupcin se maneja con
INTCON, PIE1 y PIR1.
EEPROM: Es una memoria EEPROM programable por software o con quemador, no esta mapeada junto
con la RAM. Se controla con los registros EEDATA (09Ah), EEADR (09Bh), EECON1 (09Ch) y EECON2
(09Dh). Genera interrupcin al terminar el ciclo de escritura y es manejada por INTCON, PIR1 y PIE1.

Set De Instrucciones Del Pic16f628a


Nomenclatura.
En los mnemnicos se representara con la letra <f> la direccin de 7 bit del registro.
Algunas instrucciones necesitan una opcin representada por la letra <d>. Esta indica si el destino del
resultado es el registro direccionado (d = 1) o el registro W (d = 0).
Las instrucciones que operan con bits utilizan un valor de 3 bit para indicar el orden del bit seleccionado y lo
representan con la letra <b>.
Las instrucciones con direccionamiento inmediato usan la letra <k> para indicar la posicin de 8 bit.
Las instrucciones que cargan el PC de forma inmediata con algn valor de 11 bit lo representan con <nnn>
En la hoja de datos del micro el fabricante suministra un resumen de las instrucciones. De cada instruccin
se indica los ciclos maquina que dura y los flag o bit de STATUS que afecta.
-Si se usa con un cristal o resonador cermico de 4 Mhz cada ciclo de maquina dura 1 microsegundo.
-Solo las instrucciones que alteran el PC duran 2 microsegundos. Por ejemplo la instruccin
btfsc STATUS,CY
47

Si CY vale 1 dura 1 microsegundo y si CY = 0 dura 2 microsegundos.


Instrucciones Orientadas a Registros
La sintaxis de estas instrucciones es
mnemnico
f,d
El smbolo f representa un valor numrico de 7 bit que corresponde a la direccin de memoria RAM a
utilizar en la instruccin, dentro del banco en uso. El smbolo d permite seleccionar el destino del resultado,
si vale 0 es el registro W y si vale 1 es el registro direccionado directamente.
Contienen:
-Informacin sobre la direccin de memoria donde esta el operando (7 bit). Usan RP0 y RP1
para completar los 9 bits de direccionamiento
- Clase de operacin a realizar
- Donde guardar el resultado (1 bit) -El propio registro usado o el acumulador W
Duracin de la instruccin 1 o 2 ciclos de CK
Banderas o Indicadores afectados C, DC y Z
ADDWF
ANDWF
COMF
DECF
DECFSZ
INCF
INCFSZ
IORWF
MOVF
RLF

f,d
f,d
f,d
f,d
f,d
f,d
f,d
f,d
f,d
f,d

RRF

f,d

SUBWF
SWAPF
XORWF

f,d
f,d
f,d

Sumar registros W y f.
W AND f
Complementar f
Decrementar f
Decrementar f y saltar si es cero
Incrementar f
Incrementar f y saltar si es cero
W OR f
Mueve f
Rotar a la Izquierda a travs de Carry
f,n f,n+1 y f,7 CY ; CY f,0
Rotar a la Derecha a travs de Carry
f,n f,n-1 y f,0 CY ; CY f,7
Resta W de f
Intercambia los nibles de f. f,0f,4 ; f,1 f,5
W OR-exclusiva f

Afecta C,DC,Z
Afecta Z
Afecta Z
Afecta Z
Afecta Z
Afecta Z
Afecta Z
Afecta C
Afecta C
Afecta C,DC,Z
; f,2-f,6 ; f,3f,7
Afecta Z

Estas instrucciones son la excepcin, por la clase de accin que realizan y sobre quien la realizan.
CLRW
Cargar 00 en W
Afecta Z
CLRF
f
Cargar 00 en f
Afecta Z
MOVWF
f
Cargar f con W
Operaciones Orientadas a Bits
Su sintaxis es:
mnemnico
f,b
El smbolo f representa un valor numrico de 7 bit que corresponde a la direccin de memoria RAM a
utilizar en la instruccin, dentro del banco en uso. El smbolo b representa un valor de 3 bit que
corresponde al orden del bit elegido. No es capaz de realizar lgebra booleana
Contiene:
-

Informacin sobre el registro a usar (7 bit) Usan RP0 y RP1


Informacin sobre el orden del bit a usar (3 bit)
Clase de operacin a realizar

Duracin 1 o 2 ciclos de CK
El resultado siempre es en el mismo bit seleccionado, pues no realiza lgebra entre dos bits
BCF
BSF
BTFSC
BTFSS

f,b
f,b
f,b
f,b

Poner a cero el bit b de f


Poner a uno el bit b de f
Saltar si el bit b de f es cero
Saltar si el bit d de f es uno
48

Operaciones con literales o valores inmediatos


Literal se llama al dato que viene en la propia instruccin
Contiene - El dato a operar ( 8 u 11 bit)
- Clase de operacin a realizar
Duracin 1 ciclo de CK
Banderas afectadas (C, DC y Z)
Su sintaxis es:
Mnemnico
k
El smbolo k representa un valor de 8 bit llamado literal.
ADDLW
k
W + k --> W
Afecta C,DC,Z
ANDLW
k
W AND k --> W
Afecta Z
IORLW
k
W OR k --> W
Afecta Z
MOVLW
k
Carga k en W
SUBLW
k
W - k --> W
Afecta C,DC,Z
XORLW
k
W OR-exclusiva k --> W
Afecta Z
RETLW
k
Retornar de una subrutina y cargar W con k. Pila --> PC y k --> W
Instruccin muy til para tener una tabla cargada en la memoria ROM
CALL
nnn
Llamar a la subrutina ubicada en nnn< 0FFh. PC --> Pila y PC <-- nnn
GOTO
nnn
Saltar a la instruccin en nnn. PC <-- nnn
Casos complejos de valores literales
retlw K
; La pila se carga en el PC y K se carga en W
goto nnn
; Pc se carga con nnn, donde nnn tiene 11 bits. Los bits 0 al 10 de PC se cargan con
nnn, los bit 11 y 12 se cargan con los bit 3 y 4 del PCLATH.
call nnn
; nnn es un nmero de 11 bit. El PC se vuelca en la pila, luego, PC<10:0> se carga
con el valor nnn, y PC<12:11> se carga con PCLATH<4:3>.
Para nuestro pic los llamados a subrutinas pueden realizarse a cualquier parte de la memoria ROM.
En este micro en particular no afecta el valor de PCLTAH pues no tiene memoria ROM por encima de de
7FFh, afectara si fuera un 16F648A.
Operaciones de Control
CLRWDT
Reiniciar el WDT.
Afecta TO, PD
NOP
No Operacin. Se incrementa el PC sin realizar ninguna accin.
RETURN
Pila PC
Retornar de Subrutina. Saca de la pila el ltimo valor guardado y lo pone en el PC.
RETFIE
Pila PC y INTCON,GIE 1
Retornar de una interrupcin. El ltimo valor de la pila se carga en el PC. Vuelve al programa principal en la
instruccin que estaba por ejecutar..
SLEEP
Afecta TO, PD
Entrar en modo de bajo consumo. Deja en suspensin el oscilador maestro, pero no el WDT. Mantiene fijo el
estado de las salidas.
SALTOS
Cuando no se ejecuta la instruccin siguiente inmediata se produce un salto.
goto nnn
; es un salto incondicional pues se va a buscar la instruccin en nnn sin
mediar ninguna condicin previa.
btfsc f,b
incfsz f,d
; son instrucciones con salto condicionado, pues para saltar depende de una
condicin a chequear.
Como no tiene espacio en la instruccin para indicar a donde saltar (hay solo 14 bit) el fabricante lo hace a
una direccin prefijada relativa.
-Si la condicin no se cumple no salta y ejecuta la instruccin siguiente
-Si la condicin se cumple hace PC=PC + 1 y no ejecuta la instruccin siguiente inmediata sino la siguiente
a esta.
Formas de cargarse el PC
En este micro cargar el PC es simpre con 2 fuentes de datos. Una de ellas siempre es el PCLATH.
call nnn
49

goto nnn
;Como PIC16F628A solo tiene 7FF posiciones fisicas de ROM el valor de los 2 MSB
del PC, que se cargan con PCLATH, no afecta el resulatdo del salto.
Cualquier operacin o movimiento que tenga como destino del resultado al registro PCL, afectara al PC. Los
8 bits que se cargan en el PCL inmediatamente se cargan en los 8LSB del PC, y los 5 bit existentes del
PCLTAH en los 5 MSB del PC.
Movwf PCL
; W --> PCL y PCLTAH:PCL -->PC
Addwl PCL, f ; W + PCL --> PCL y PCLTAH:PCL -->PC
Para cualquier modificacin del PC hay siempre que tener en cuenta el valor actual del PCLATH.

-En este micro la operacin de movimiento MOVF afecta el flag Z. Esto permite averiguar si el contenido de
un registro es cero.
movf

VAR1,f

btfss

STATUS,Z

goto

CERO

VAR1 --> VAR1


STATUS, Z
=1

NOCERO
.....

NO

50

SI

51

BOLILLA III: PROGRAMACIN


El programa ser la solucin a un problema donde se quiere aplicar el micro.
El diseo de un programa para un micro comienza con el diagrama de flujo. ste expresa la solucin a
aplicar.
A partir de este se extrae el programa fuente (*.asm), que es un listado de instrucciones y comandos. Si se
encuentran errores se vuelve al diagrama y se le modifica.
Del programa fuente se saca el programa objeto (*.hex), el cual ser el cargado en la memoria de programa.
PROBLEMA A
SOLUCIONAR

DIAGRAMA
DE FLUJO

PROGRAMA
FUENTE

ENSAMBLADOR
PROGRAMA
OBJETO

SIMULADOR

PROGRAMADOR
CHIP Y
SISTEMA REAL
El ensamblador (assembler) o compilador es un programa que se encarga de extraer el archivo objeto
(*.hex) del programa fuente (*.asm). Adems tambin genera el archivo de listado (*.lst) y el de errores
(*.err).
El programador es el software que se ocupa de manejar el hardware (quemador, grabador o programador)
que graba el chip.
El programa objeto antes de ser cargado en el chip, puede ser probado por el simulador. Este es un
programa de PC que virtualmente simula las entradas y salidas del PIC siguiendo el cdigo mquina del
programa objeto.
En cualquier punto del proceso se puede volver al diagrama de flujo o a editar el programa fuente.
El programa fuente se escribe como un archivo de texto sin formato con cualquier procesador de texto
(MPLAB editor, EDIT.COM, WORDPAD, BLOCK de NOTAS, WRITE, WORD, etc.).
El ensamblador que se usa ser el suministrado por Microchip. Para MS-DOS es el MPASM.EXE y para
Windows el MPASMWIN.EXE.
El simulador a usar es el MPLAB SIM. No permite simular algunas interrupciones ni la interfase serial.
Microchip suministra una herramienta llamada MPLAB IDE que rene todos estos elementos. Es un entorno
de desarrollo (IDE) con todos estos elementos (y otros ms) integrados. Este software permite manejar
hardware como el quemador de microchip o el emulador de pics.
Los PICmicro tienen incluida una interfase serial de programacin. Por lo tanto se puede leer y programar
con un circuito simple y un PC con puerto paralelo (LPT1), serial (COM) o USB.
El quemador a usar puede ser cualquiera, original de Microchip o de terceros.

50

Diagrama de los Mdulo de prueba

51

CONCEPTOS Y ELEMENTOS BSICOS DE PROGRAMACIN


El programa es, para el micro, el resultado de estudiar un problema para hallarle solucin.
Toda situacin en donde se aplica un procesador se debe resumir a elementos de entrada
y salida. Las salidas son las respuestas del sistema o acciones que desarrolle. Las
entradas son las variables que alteran o determinan las respuestas.
Para el procesador las entradas son valores digitales (estas entradas son datos del exterior convertidos por
los perifricos para que el procesador las pueda manejar), y las salidas son tambin valores digitales, para
que los perifricos adapten y el mundo exterior las interprete.
El programa gobierna las acciones del micro para que ste lea los datos de entrada, los procese y entregue
datos de salida.
Varios programas diferentes pueden relacionar de la misma manera los datos de entrada y salida. El
proceso se limita por las caractersticas fsicas del sistema.
El diagrama de flujo muestra en forma grfica y de fcil interpretacin el proceso desde la adquisicin
de los datos, pasando por el tratamiento de los mismos, hasta la entrega de del resultado. De este se
procede a escribir el programa fuente, l cual es un listado de mnemnicos o instrucciones para el micro,
adems de informacin sobre la posicin del programa en la memoria del sistema, comandos para el
compilador y el quemador, etc. En l se permite el uso de etiquetas y otros elementos que facilitan el trabajo
al programador humado.
El programa fuente es una forma que tiene el programador para indicar, en lenguaje entendible por las
personas, lo que tiene que hacer el microprocesador. Este es entregado al ensamblador (assembler) quien
extrae el archivo o programa objeto.
El archivo objeto es el listado del cdigo operativo o cdigo maquina de las instrucciones del programa
fuente. Este archivo es grabado o escrito en la memoria de programa (ROM) del sistema, para que no
desaparezca al apagar la fuente de energa.

52

Diagrama De Flujo
Son representaciones grficas de cualquier proceso (industrial, programacin, trmite burocrtico, deteccin
de fallas, etc.). Interesa a este curso solo el aplicado a los procesadores y su programacin.
Los diagramas de flujo se componen por elementos llamados bloques. A cada bloque llega y/o salen lneas
que indican la direccin por donde sigue el proceso.
Cada bloque puede tener varias salidas o ninguna, pero una entrada sola o ninguna.
En cada bloque se describe la funcin que realiza, con que parmetros y sobre que variable la aplica.
Por ejemplo en este bloque, se realiza una suma entre 2 variables.
El resultado se carga en una tercera variable. Las lneas de flujo
solo indican cual bloque se ejecutara a continuacin.
En los bloques no solo pueden ir funciones lgico-matemticas
sino tambin una
GUARDA EL MAYOR
descripcin del tratamiento
DE AMBOS
que se le hace a los datos.
Por ejemplo: Un bloque puede manejar ms de un dato de entrada pero solo tiene una lnea de llegada de
informacin.
Las lneas de flujo no indican cuantos o cuales datos hay en proceso o son procesados, sino de que bloque
salir y a cual entrar. Por eso indican el flujo de informacin y no el nmero de datos en proceso.
Todo proceso tiene ms de un diagrama de flujo que lo represente. Se elige y prioriza que aspectos del
mismo se desea mostrar.
Se realiza primero un diagrama general donde se muestra una idea del proceso a llevar a cabo. Este
diagrama debe ser de fcil entendimiento. Sus bloques representan funciones complejas o son el resumen
de varias acciones. De este primero se procede a realizar otro mas detallado donde se representen menos
acciones por cada elemento. O sea se convierte cada bloque de funciones complejas en varios elementos
con funciones simples, bsicas y especficas.
Se debe seguir desglosando hasta que solo queden bloques con funciones bsicas que son las que puede
realizar el micro.
Esto es personalizar el diagrama de flujo, se realiza para un procesador en particular y se limita por las
caractersticas fsicas del sistema.
Las respuestas, que esperamos nos entregue el sistemas, sern las salidas. El micro las entrega como
valores digitales que los perifricos convierten en seales entendibles para el exterior.
Es necesario discernir que elementos del problema son relevantes y alteran las salidas, es decir que se
deben considerar para seleccionar las entradas.
Los perifricos se encargan de convertir estos elementos de entrada en valores digitales que los
representen. A los datos de entrada el micro les aplica el proceso que le indica el programa.
Generar la respuesta es entregar datos a los perifricos o calcular un resultado, lo cual constituye el o los
elementos de salida.

Smbolos Grficos
Para realizar los diagramas de flujos se usan smbolos, los cuales tienen su forma segn la clase de funcin
que tengan.
Las las lineas de flujo son flechas o ramas del diagrama de flujo,
qu indican al salir de un bloque a cual entran. O sea el orden en
que deben recorrerse. Los codos indican saltos en el programa, al
salir de un bloque, no se va al inmediato siguiente sino que se
CORRECTO INCORRECTO
saltea al menos uno posterior o se vuelve a entrar en otro anterior.
Una rama puede confluir en otra pero una rama no puede bifurcarse o abrirse en dos.
Smbolo de inicio de programa o subrutina. En su
interior se coloca el nombre del programa,
subrutina o la palabra INICIO. Ntese solo tiene
una flecha de salida o partida del proceso.

INICIO

Smbolo de finalizacin de programa o subrutina. Indica que el


programa termin y se detiene el micro, en caso de ser una subrutina
indica volver al programa principal. Se le escribe FIN o RETORNO.
Ntese que solo tiene flecha de llegada de informacin.
53

SUBRUTINA

FIN

INTERRUPCIN

RETORNO

Bloque de ejecucin o proceso. Tiene una flecha de


entrada y una de salida. En su interior se escribe la
accin que realiza, ya sea la descripcin de dicha accin
o su representacin con smbolos y funciones. Tiene una
lnea de entrada y una de salida.

(x) + 2Y

INVERTIR ORDEN DE LOS NIBLES

Bloque de decisin, bifurcacin o


seleccin. En este elemento no se
modifica la informacin pero se decide
NO
TRUE
FALSO
VERDADERO
XX = YY
CY = 1
A<B
en base a un parmetro elegido que
trayectoria seguir. Tiene ms de una
SI
FALSE
NO SE USAR
salida, pero en el uso con
microprocesadores solo tienen dos
salidas segn si la condicin es cierta o falsa, o si se cumple o no. Tiene una entrada y dos salidas
representando los posibles resultados. (SI-NO, falso-verdadero, true-false). Siempre se asocia la condicin
a chequear con alguna operacin lgico-matemtica o el valor de algn bit. En la prctica se verifica algn
flag o bit. Es la nica manera de hacer una bifurcacin en el proceso e implica un salto en el programa.

SUBRUTINA

Bloque de llamado de subrutina. Indica que se saltar al comienzo de la subrutina, su


nombre se indica dentro del bloque. Al terminar dicha subrutina se contina con el
programa principal. Permite simplificar programas pues se sustituye una rutina de varios
elementos por un bloque que la invoca

Conectores dentro de pgina. Son etiquetas que se colocan para indicar que una rama
del diagrama de flujo contina en otro lado, o proviene de otro lugar, dentro de la misma
pgina. Siempre se dibujan de a pares. El conector de salida es al que llega la flecha y el de
entrada es del que sale la rama. Ambos deben tener el mismo smbolo en el interior para
saber que se corresponden. As se evitar dibujar lneas que atraviesen toda la hoja.

Conectores fuera de pgina. Son etiquetas que indican que la rama del diagrama de flujo
contina en, o proviene de, una pagina diferente. Se dibujan de a pares, uno en cada pgina.
El de partida es al que llega la lnea y el de llegada es del que sale la rama. Ambos deben
tener el mismo smbolo para saber que estn asociados.

Bloque de adquisicin o muestra de datos, IN/OUT de


datos. Aqu es donde el programa toma datos desde un
perifrico o los saca al mundo exterior. En general al trabajar
en un lenguaje de bajo nivel se sustituye este bloque por de
ejecucin donde se realiza asignaciones de valores o
movimientos de datos desde perifricos.
FOR x = 1 TO nn
D(x) + x^2 = P(x+1)
INVERTIR NIBLES

INGRESE EDAD

MOSTRAR TOTAL

Este smbolo FOR IT indica un lazo donde la variable se actualiza


automaticamente, hasta que se cumpla una condicin determinada. Es un
bloque complejo que solo se usa con lenguajes de alto nivel. No se usa al
programar microprocesadores con lenguajes de bajo nivel como el assembler.
Mientras la variable de lazo no alcance el valor prefijado no se sale del lazo.

Otros simbolos como estructuras de control de flujo como WHILE, IF THEN, CASE, etc no se utilizan en
assmbler por ser necesario realizarlas con varios bloques mas simples.

Diseo De Diagramas De Flujo


Los bloques se unen mediante las lneas de flujo permitiendo saber el camino a seguir en el programa. Se
comienza realizando un diagrama que muestre lo que deseamos hacer. Este es un diagrama con pocos
bloques y muy generales. A cada bloque se le va convirtiendo en varios, que ejecutan acciones ms
bsicas. Eso nos permite personalizar el diagrama para el micro donde se aplicara. No todos los micros
tienen iguales capacidades ni flexibilidad. Por eso las acciones que para un dispositivo son un solo bloque
para otros insumen varios.
Pueden tener varias estructuras, pero en programacin de microprocesadores se usan dos:
54

i) Diagrama Alineado
En esta estructura todos los bloques se dibujan sobre una lnea vertical. Demanda
mayor cantidad de pginas, no es tan fcil de entender su funcionamiento, pero en
cambio es ms fcil realizar el programa fuente y determinar cuando hay un salto.

INICIO
HORA --> W

S1=1

NO

SI

S2=0
ii) Diagrama Sbana o Extendido
Los bloques se distribuyen libremente dentro de la pgina. Se necesita menor nmero
de pginas y es ms fcil de entender. Se dificulta determinar el nmero correcto de
saltos y extraer el programa fuente.
INICIO

NO
ANTIHOR --> W

S2=0

HORA --> W

SI

NO

SI
ANTIHOR --> W

S1=1
En este curso se utiliza unicamente el
diagrama alineado, excepto que se le
explique el programa a un lego.

S2=0

S2=0

ANTIHOR --> W

ANTIHOR --> W

FIN

FIN

El programa se desarrolla sobre una lnea vertical de arriba hacia abajo, que comienza con el bloque de
inicio de programa y en caso de finalizar lo har con el bloque de fin de programa.
Si el diagrama corresponde al programa principal, el bloque de inicio corresponde a la salida de reset del
micro. Si es de una subrutina, dicho bloque marca el inicio de la misma.
Los bloques se ejecutan en orden descendente a medida que transcurre el tiempo. Se unen con lneas de
flujo. La lnea de flujo que avanza de un bloque al siguiente consecutivo se dibuja sobre la lnea vertical de
gua. Si se produce un salto hacia un bloque posterior la lnea de flujo baja por la derecha del eje, y, si el
salto es a un bloque anterior lo hace por la izquierda del eje.
Recordar: por la derecha se avanza y por la izquierda se retrocede.
Siempre a un bloque se llega por arriba y se sale por abajo o el costado.
Es muy til hacer aclaraciones al diagrama de flujo o comentarios al borde de cada elemento as se da una
idea ms clara de lo que hace. El comentario ms importante es indicar la etiqueta de posicin a cada
llegada de un salto.

Etiquetas, Variables, Punteros y Vectores


Adems de los bloques, se usan elementos de programacin que van escritos dentro de ellos.
Etiqueta es una cadena de caracteres (sin espacios en blancos ni signos ortogrficos) que
representa un valor numrico. Permite sustituir un valor numrico por un nombre que nos recuerde su
funcin. Hace al programa ms amigable y comprensible. Se restringe como nombre los mnemnicos de las
instrucciones y comandos.
Etiqueta de Posicin es la etiqueta que marca una posicin dentro del programa o direccin en la ROM. Por
ejemplo: la llegada de un salto.
Variable es un elemento lgico que puede ser actualizado a lo largo del programa. Esta compuesta
de dos partes:
VALOR: es el nmero que asume y el cual puede variar a lo largo del programa
NOMBRE: cadena de caracteres (sin espacios en blancos ni signos ortogrficos) que identifica la
variable y es invariable durante todo el programa. Se pueden definir con cualquier nombre pero con cuidado
de no repetirlo, ni usar mnemnicos del micro o palabras restringidas. Se buscan nombres que ayuden a
recordar su funcin. Por ejemplo si se usa como contador se le puede llamar
CONT. Puede actualizar su valor mediante una asignacin ya sea de un valor
K <-- 10
VAR <-- nn
numrico, un valor genrico o el resultado de una operacin. El uso de un valor
genrico nn nos permite decidir mas tarde que valor tendr.
55

Se asocia a la variable con un elemento fsico del micro que tenga idnticas propiedades. Primero debe ser
un elemento que pueda ser escrito y ledo, eso se aplica a la RAM esttica. Para que no altere el
funcionamiento del micro se descartan los SFR. Solo quedan los GPR.
Consideremos un registro GPR, este tiene dos partes:
CONTENIDO: valor numrico que almacena y puede variar en cualquier momento.
DIRECCIN: valor numrico que indica su posicin, esta prefijado por el fabricante y es inamovible.
La asociacin es:
VALOR
<=>
CONTENIDO
NOMBRE
<=>
DIRECCIN
Es aconsejable al principio del programa asignarle un valor, as no genera ninguna indeterminacin posible.
La variable en deben tener el mismo nmero de bit que el registro del micro con cual se asocia.
La variable tiene dos niveles. El lgico que es la capacidad de variar su valor pero no su nombre. El
fsico que es capaz de variar su contenido pero no su posicin.
El nombre se le asocia como etiqueta al valor numrico de la posicin de memoria del registro. El valor que
le asignamos a la variable es el contenido que se carga en el registro.
Consideremos la variable de nombre VAR1, la asociamos con el registro de RAM de la posicin 21h. Hacer
valer E7h a VAR1 es cargar el valor E7h en la posicin de memoria 21. No hay que confundir el valor que
se carga en la variable con el valor de posicin de memoria que se asocia a la variable.
Una variable particular es la Variable de Lazo, variable cuyo valor es verificado como condicin para salir de
un bucle condicionado.
Puntero o Vector es una variable que permite direccionar una posicin de memoria o una direccin
de puerto. Se usa para direccionar distintas posiciones de memoria
con la misma instruccin. O sea almacenar la direccin del
operando. Cambiar de operando representa solo modificar el
M(Pd) <-- VAR1 M(Pb) <-- M(20)
contenido de la variable, pero la instruccin siempre es la misma.
Su nombre puede ser cualquiera. Comnmente se le comienza con
la letra P o V.
Si tenemos un grupo de datos en posiciones continuas de memoria se les puede agrupar en un conjunto,
y llamar a ese grupo serie o matriz. Toda matriz implica un
registro que le sirve de puntero para direccionar los elementos
del mismo. As que en el programa se trabaja con la matriz, que
Pd + 1 --> Pd
Pb + VAR1 --> Pb
implica varios datos y se invocan con el puntero.
Por ejemplo: Pdest, Porig, Vmatriz, Vec1. Su nmero de bit
depende de la capacidad de direccionar posiciones diferentes. Si
direcciona 256 posiciones ser de 8 bit, si direcciona 1024 ser de 10 bit, si direcciona 65535 ser de 16 bit.
Se le debe asignar un valor antes de usarlo por primera vez, y puede ser actualizado por una asignacin, un
incremento, un decremento u otra operacin.
Vector es el puntero asociado a una dimension de una matriz.
Indice es un puntero que para seleccionar un dato no es necesario alterarlo, sino que al usarlo se le suma
un valor llamado corrimiento.

Formas de direccionar posiciones de memoria, datos o registros


Direccionar es la forma de indicar en el bloque o en la instruccin donde se halla el operando a tratar. Se
trata de la identificacin de la posicin en memoria donde la CPU debe buscar el dato a operar.
Si el dato es una constante se utiliza un nmero o una etiqueta.
Si el dato esta en una posicin de memoria sin direccin se escribe el nombre del registro para ubicarlo.
Si el dato esta en una posicin de memoria con direccin se escribe M(<direccin>)
Direccionamiento Inmediato. El dato es una constante. Se puede usar una etiqueta para representarlo. La
instruccin incluye el dato a operar. Algunos bits de la instruccin son datos. Por ejemplo: F4h , nn, MOTOR
Direccionamiento Inherente. La posicin del dato se invoca nombrndolo y no con una direccin de
memoria, que tal vez no tenga. Se usa solo para registros internos al ncleo especiales, con pocos bit de la
instruccin lo identifica. La instruccin indica el registro a utilizar sin incluir su direccin fsica. Por ejemplo
PC o W.
Direccionamiento Directo. Se tiene la direccin de la posicin de memoria donde esta el dato. En la
instruccin esta incluido el valor de la posicin de memoria requerida. Algunos bits de la instruccin son la
direccin del dato. Por ejemplo M(F4h) , M(constante), VAR1
Direccionamiento Indirecto. La direccin de memoria del dato esta en un puntero que se identifica
nombrndolo. En la instruccin se menciona el puntero que indica la posicin del dato deseado. Se identifica
el puntero sin dar su ubicacin. La direccin del operando esta contenido en el registro puntero, se usa para
punteros especiales. Con pocos bits de la instruccin se identifica al puntero. Por ejemplo M(puntero),
M(PC)
56

Direccionamiento Indirecto por Registro. Se tiene la direccin de memoria del puntero que contiene la
direccin del dato. La instruccin contiene la direccin de memoria del registro usado como puntero. El
puntero puede estar formado por uno o dos registros concatenados. Se usa indicando el valor de la
posicin de memoria o el nombre de la variable puntero.
Por ejemplo: M[M(F4h)] la direccin de memoria F4h es usada como puntero, M(Pdat) la direccion
del puntero es el valor la etiqueta Pdat , M[VAR1] la direccin del puntero es la etiqueta VAR1 para indicar
que se usa el contenido de la variable se escribe entre parentesis rectos.
Direccionamiento indexado. Se identifica el puntero nombrndolo y se indica el corrimiento a sumarle para
ubicar al dato. La instruccin incluye como parmetros el vector (por su posicin y no direccin de memoria)
a utilizar y el valor o la posicin del corrimiento que se le debe sumar al mismo para direccionar el dato a
operar. Si se utiliza con series de datos, al vector se le suma un valor para determinar cual elemento de la
serie se selecciona, despus de la operacin el vector ndice queda inalterado. A los punteros con esta
capacidad se les llama ndice. Por ejemplo M(vector + corrimiento), M(vector + VAR1), M(Pdat + k)
Direccionamiento Relativo. Idntico al indexado, pero el puntero a utilizar es el PC. M(PC + corrimiento)
Los puertos se identifican con la letra P y el sistema es igual que el de las memorias.
P(nn) o PA
-Direccionamiento directo, se selecciona el puerto de la direccin nn. Tambin se le
puede nombrar con una cadena de caracteres o etiqueta Ej.: PB, MOTORES, LEDS
P[(VAR1])o P(dat)
-Direccionamiento indirecto, la variable contiene la posicin del puerto

57

Programa Fuente para El PIC16F628A


El siguiente paso es escribir el programa o archivo fuente para el micro. Este se escribe en un lenguaje
inteligible para el operador humano, aunque no lo es para el microcontrolador.
Se deduce del diagrama de flujo, de esta manera solo es necesario ir convirtiendo cada bloque en las
instrucciones equivalentes. Si se observan posibles mejoras del programa se vuelve al diagrama de flujo y
se le altera. Se vuelve a deducir el programa fuente, y se verifica si es necesaria alguna otra mejora. De ser
as se vuelve a modificar el diagrama de flujo. A lo largo del diseo del programa, y aun cuando el sistema
este funcionando, se debe revisar todo para optimizarlo.
Cada bloque se sustituye por una o varias lneas de instrucciones
El programa fuente contiene:
Instrucciones en el orden a ser ejecutadas por el micro
Con reglas de sintaxis muy estrictas, para que sea comprensible para el compilador.
Comandos para el compilador: posicin de los datos en el sistema, concatenar con macros, etc.
Mensajes o comentarios del programador sobre el programa
El Assembler es un lenguaje de programacin de bajo nivel, es decir trabaja con las instrucciones
del micro propiamente dichas. Con los Mnemnicos del micro en particular se genera el archivo fuente, que
es un archivo de texto sin formato. Despus se convierte a cdigo maquina, llamado programa o archivo
objeto, donde cada instruccin corresponde a un nmero binario.
Los lenguajes de alto nivel usan sintaxis ms elaboradas, donde las lneas se decodifican no en una
instruccin en cdigo maquina sino en una subrutina en cdigo maquina, o sea cada instruccin es un
pequeo programa.
Todo programa esta diseado para solucionar un problema.
En el diseo de dicha solucin se usara el desarrollo Top-Down.
Primero se debe considerar las partes importantes o de peso del problema. La mayor cantidad de partes
consideradas permiten hacer un programa al cual hay que modificar y corregir menos veces.
Una vez considerados los puntos de peso, vemos cuantas variables son necesarias suministrar al sistema y
como darles el valor adecuado.
Despus se realiza un primer diagrama de flujo que describe el proceso en forma clara y concisa, que solo
muestre los pasos ms importantes.
Entonces se manipula desglosando cada bloque en varios ms simples. Se eliminan redundancias y si hay
procesos repetitivos se resumen en lazos. Estos lazos implican agregar ms variables.
Se verifica y se realiza el programa fuente.
A continuacin se optimiza o depura el programa fuente. En caso de ser necesario se vuelve al diagrama,
se le modifica y se re-escribe el archivo fuente.
Puede ser probado con un simulador virtual en un PC. Si se detectan errores se vuelve a modificar el
diagrama de flujo o el programa fuente.
Despus solo queda compilar el programa objeto para colocarlo en la memoria ROM del sistema fsico.

Programacin De Bajo Nivel


Todas las instrucciones contienen la informacin de que operacin realizar y donde encontrar los
operandos involucrados. En la mayora de las instrucciones del PIC16F628A uno de los operandos es el
registro W, o el resultado se guarda en l. El origen de los operandos puede ser un registro RAM (movf
0x22,W), un perifrico (movf PORTA,W) , el propio registro W (movwf TRISB) o un dato que viene en la
instruccin (movlw 0x23). El destino puede ser igual de variado que el origen.
Formas de Direccionamiento del PIC16F628A
Segn como se indique la posicin de los datos, en la instruccin, se reconocen las siguientes
formas de direccionamiento:
INHERENTE: La instruccin incluye el nombre del registro, no su direccin. Clrw
INMEDIATO: La instruccin incluye el valor de unos de los operando. Movlw
0x26
DIRECTO: La instruccin contiene la direccin donde se ubica el operando. Movwf
0x2F
INDIRECTO POR REGISTRO: La posicin del operando la da un puntero identificado por su direccin. Este
tiene solo al FSR como puntero en la RAM. Lo usa asociado con el registro INDF que no tiene
implementacin fsica. Todas las instrucciones con direccionamiento directo, si usan el INDF
son tratadas con direccionamiento indirecto. Movwf INDF ;corresponde a W M[FSR]
RELATIVO: La instruccin contiene un nmero el cual se suma al registro PC. Si la instruccin contiene 8
significa que el operando esta en PC+8 y si es -8 esta en PC-8. Son instrucciones de salto.En
este micro hay que realizar una pequea subrutina para tener realizar este direccionamiento.
58

Estas son las formas de direccionamiento que maneja el PIC16F628A. Una instruccin puede tener ms de
una forma de direccionar, una para cada operando y otra para el destino.
El PIC tiene solo las siguientes formas de direccionamiento:
Inherente, inmediato, directo, indirecto por registro y relativo.
Y tiene dos instrucciones que no usan operando, ni tienen un registro indicado aparentemente: NOP y
SLEEP.
Para direccionar distintas posiciones de memoria pero con la misma instruccin (en un lazo), se usa
una variable que almacena la direccin del operando. Para cambiar de operando se modifica el contenido
de la variable pero la instruccin siempre es la misma, a estas variables se les llama punteros.
Si tenemos un grupo de valores en posiciones continuas de memoria se les puede agrupar en un
conjunto, y llamar a ese grupo serie. Toda serie implica tambin un registro que le sirve de puntero (vector)
para direccionar los elementos de la misma. As en el programa se trabaja con el vector, que puede asumir
todos los valores posibles de las posiciones de memoria de los elementos del conjunto. Si tenemos la
posibilidad de hacer direccionamiento indexado, el puntero pasa a ser el ndice de la serie.
Si los datos se ordenan en grupos de 256, forman una pgina. Eso permite que con un byte se les pueda
direccionar a todos. Si el puntero fuera de 2 bytes, el byte bajo del puntero indica la posicin del registro, y
el byte alto del puntero selecciona de cual pgina es el registro. Es como que todos los datos se encuentran
en una grilla con su posicin vertical y horizontal particular. A esta forma de ver los datos se les llama
matriz, array o arreglo. Se indica el nmero de grupos por el nmero de registros por grupo. Por ejemplo si
se usan 10 pginas, se dice matriz de 10 x 256, o sea se consideran 10 grupos de 256 elementos cada
grupo.
Entorno de Desarrollo MPLAB-IDE
Este software nos permite dentro de un mismo espacio de trabajo tener utilidades tales como:
El editor para escribir el archivo fuente. Este es un archivo de texto sin formato guardado con
extensin .ASM, las ultimas versiones de MPLAB nos indican con colores que es cada palabra escrita
(comando, mnemnico, valor decimal, hexadecimal, binario, comentario, etc.)
El compilador para generar el archivo objeto , el archivo de errores y el listado del programa. Utiliza
el MPASMWIN.
El simulador para probar la lgica del programa y poderlo depurar (debugger). Utiliza el MPLAB-SIM
Las versiones a partir de la 5.7.4 permiten programar para el PIC16F628A.

Sintaxis Del Compilador


Para indicar el sistema de numeracin en que se escribe un nmero se usa esta notacin
Hexadecimal
0xnn , hnnn
Binario
bxxxxxxxx
Decimal
.d
, d

Comandos para el Compilador:


EQU
Declara las etiquetas a usar en el programa. Asocia una cadena de
caracteres (strings) con valores numricos.
Su sintaxis es
<nom_etiq>
EQU 0xnn ; Asigna a la etiqueta llamada nom_etiq el valor nn (hexa).
Ejemplos:
STATUS
EQU 0x03 ;Se asocia el valor 03h con la cadena Status. As en vez de
;escribir 0x03 y recordar que es, se usa una etiqueta relacionada con
;su funcin.
CY
EQU .0
;Esta etiqueta se utiliza para indicar la posicin del CARRY
; dentro de STATUS
VAR1
EQU 0x2F ;El nombre de esta variable VAR1 se asociada con la direccin de un GPR y
;se le asigna el valor correspondiente a la posicin de dicho registro
FSR
EQU 0x04 ;Se asocia esta cadena de caracteres al valor de la posicin
;de este registro.
Si se utiliza una variable en el Diagrama de Flujo, se debe asociar con un registro RAM para usarla en el
programa fuente. El nombre de la variable se declara (o asocia), mediante el comando EQU, con el valor de
la direccin de memoria del registro RAM, ya sea SFR o GPR. El nombre de la variable en el diagrama de
flujo es una etiqueta en el programa fuente.
No importa cuantos bit tenga la etiqueta declarada. Cada vez que es utilizada en una instruccin, el
59

compilador solo toma en cuenta los LSB que requiere el parmetro. Si necesita ms bit completa con '0' los
MSB que falten.
KAR EQU 0x31
;KAR = B'00110011'
movlw KAR
;Carga W con B'00110011' Usa los 8 bit de la etiqueta
movwf KAR
;Mueve W a la posicin M(RP1:RP0:'0110011') Usa los 7 LSB de la etiqueta
bsf
KAR, KAR
;Pone a 1 el bit de orden '011' del registro M(RP1:RP0:'0110011')
; Usa los 7 LSB de la etiqueta para identificar el registro y los 3 LSB
; para indicar el orden del bit.
Goto KAR
;Carga los 11 LSB del PC con '00000110011'
ORG
Sirve para ubicar las instrucciones que se escriban a continuacin de la
posicin indicada de memoria.
Su sintaxis es
ORG 0xnnnn
;El programa a partir de aqu se ubicara desde la posicin
;nnnn en adelante.
Su uso permite escribir el programa como quede ms cmodo y que el compilador lo ordene.
El PIC16F628A al ser reseteado pone el PC a cero. Por lo tanto se obtiene el vector de RESET en 000h.
Al atender una peticin de interrupcin, el programa principal, la busca en la posicin 004h. Por lo tanto se
tiene el vector de interrupcin en 004h.
Entre el vector de inicio y el vector de interrupcin hay pocas posiciones de memoria. Para poder desarrollar
un programa ms o menos completo es necesario saltar por arriba de la subrutina de interrupcin. O sea
colocar una instruccin goto hacia donde comienza el programa principal.
Las subrutinas en este micro deben comenzar en cualquier posicin ROM
ORG 0x000
VECTOR_de_RESET
goto
INICIO
ORG 0x004
VECTOR_de_INTERRUPCION
.
.
.
retfie

;Termina la subrutina y se vuelve al programa


; principal

SUBRUTINA

; Comienza de subrutina
;Al no indicar un valor determinado, el propio
;compilador le signa la posicin.
; Cuenta una posicin por cada instruccin
; desde el ltimo comando org.

.
.
.
return
ORG
INICIO
.
.
.

;Comienzo de la subrutina de atencin a una


; interrupcin

0x0100
; Inicio del Cuerpo del programa principal.
;

Si las etiquetas de posicin deben ir en una posicin determinada (por ejemplo vector_de_interrupcion)
primero colocamos el comando ORG y en la lnea siguiente la etiqueta de posicin.
END
;Indica el final del programa a compilar. Todo lo que se escriba a
continuacin no ser compilado por el ensamblador. Despus de este comando debe haber un carcter de
retorno de carro (enter) o rengln en blanco.
LIST
;Este comando ajusta varios parmetros de cmo se realizar la
compilacin. Uno de ellos es para que micro realizar el programa objeto. Antes de comenzar con el
60

programa fuente es necesario elegir para qu micro se har esta asociacin. Cada micro tiene su propio set
de instrucciones. Inclusive dentro de la misma familia debido a sus caractersticas personales puede variar.
En este curso se elige el PIC16F628A.
LIST p=16f628a
Ejemplo para compilar para el pic16f628a. Le dice al compilador para que micro esta diseado el programa.
Se debe colocar primero este comando sino no reconoce los dems.
__CONFIG
bxxxxxxxxxxxxx
; El dato se guarda en la posicin 2007 para el
pic16f628a y configura varios parmetros de funcionamiento del micro: proteccion de la ROM, proteccin de
la EEPROM, tensin baja de programacin, retardo de encendido, reset por baja tensin, reset externo,
WDT y modo del oscilador

Bits de Configuracin o Palabra de Configuracin


Al momento de quemar el micro se puede setear parmetros de funcionamiento
REGISTER 14-1: CONFIG CONFIGURATION WORD
REGISTER
CP

--

--

--

--

CPD

LVP

BOREN

MCLRE

FOSC2

PWRTE

WDTE

FOSC1

FOSC0

Bit
13

Bit 0

La palabra de configuracin tiene 14 bit al igual que las instrucciones.


bit 13 CP: bit de Proteccin de Cdigo
1 - No proteccin de cdigo, permite la lectura de la ROM y la EEPROM por el programador
0 - Proteccin de cdigo habilitado. Impide la lectura de la ROM por el programador. Solo se leen
los bits de IDLOCS y la ROM como todos ceros.
bit 12-9 No implementados , se leen como ceros.
bit 8 CPD: bit de Proteccin de Datos
1 Permite leer la EEPROM desde el programador.
0 Protege la EEPROM, la impide leer desde el programador.
bit 7 LVP: bit de habilitacin de programacin por bajo voltaje
1 Habilita la programacin con bajo voltaje, y el pin 10 funciona como PGM
0 No habilita la programacin con bajo voltaje, y el pin 10 funciona como RB4
bit 6 BOREN: bit de habilitacin del reset por arranque en caliente
1 Habilita el reset del modulo BOR
0 No habilita al modulo BOR
bit 5 MCLRE : bit selector de funcin para el pin 4
1 Pin 4 entrada de Reset Maestro
0 Pin 4 entrada RA5, Reset Maestro conectado a Vdd
bit 3 PWRTE: bit de habilitacin del Temporizacin de Encendido
1 = Temporizador de Encendido deshabilitado
0 = Temporizador de Encendido habilitado
bit 2 WDTE: bit de habilitacin del WDT
1 = WDT habilitado
0 = WDT inhabilitado
bit 4,1,0 FOSC2, FOSC1, FOSC0 :bits de seleccin de modo del oscilador
111 = Oscilador RC, con salida de CK por el pin 15
110 = Oscilador RC, pin 15 como RA6
101 = Oscilador INTOSC, pin 16 como RA7, pin 15 salida CK
100 = Oscilador INTOSC, pin 16 como RA7, pin 15 como RA6
011 = Oscilador EC, pin 16 entrada de Fosc, pin 15 como RA5
010 = Oscilador HS, cristal/resonado de alta velocidad
001 = Oscilador XT, cristal/resonador
000 = Oscilador LP, cristal/resonador de bajo consumo
__CONFIG 0x2150

;Configura No proteccin de cdigo, ni de datos


;PWRTE habilitado, LVP desactivado, BOREN activado,
; WDT no habilitado y oscilador interno

61

__IDLOCS
hxxxx
;Graba los nibles IDLOCS de las posiciones 2000 a 2003. El PIC
16F628A tiene la posibilidad de grabar los nibles bajos de las posiciones 2000 a 2003 con un valor que
puede ser usado como nmero de serie, identificador o cualquier otro uso.
Solo estos dos comandos pueden grabarse en las posiciones de memoria de configuracin.

INCLUDE <nom_file.inc>
;Inserta las lneas del archivo nom_file.inc en el programa fuente.
Este archivo debe encontrarse en la misma carpeta que el archivo fuente, o se debe incluir el path completo,
o estar en la carpeta de trabajo del MPLAB. En general se incluye un archivo con todos los nombres de los
SFR declarados.
Include <p16f628a.inc>
;Inserta el archivo p16f628a.inc ubicado en la
;carpeta del MPLAB. Este archivo contiene la declaracin de las
; etiquetas para todos los SFR y sus bit de este chip

Estructura del Programa Fuente


El programa fuente debe ser escrito dividido en 4 columnas llamadas campos:
La primera de ms a la izquierda se llama campo de etiquetas. Se escriben sin dejar espacio a la
izquierda. Puede tener una longitud de hasta 32 caracteres dependiendo del ensamblador a usar y no
contener espacios en blanco ni caracteres especiales.
Las etiquetas aparecen una sola vez esta columna, pero puede repetirse en cualquiera de las otras.
Pueden usarse para designar valores numricos o marcar posiciones de memoria en el programa. Si hay
que saltar, no se indica la posicin sino el nombre de la etiqueta que lo marca. Para cada llegada de una
rama a otra se debe colocar una etiqueta, excepto en el caso de saltos predefinidos por el fabricante.
La segunda es el campo de comandos. Ah van las instrucciones del micro y los comandos para el
ensamblador.
La tercera es el campo de operandos. Se colocan los operandos y/o parmetros de cada instruccin,
estos valores numricos pueden sustituirse por etiquetas declaradas previamente. El uso de una etiqueta
evita escribir el valor numrico que representa.
La cuarta columna (la de ms a la derecha), es el campo de los comentarios. Comienza con el smbolo
; , todo lo escrito a su derecha es ignorado por el compilador. Es solo para orientar al programador.
Cuantos ms comentarios incluya un programa ms fcil es entenderlo. Los siguientes comentarios son a
titulo de ejemplo pero irrelevantes. No aportan nada nuevo sobre la instruccin ni sobre su relacin con el
programa. El comentario til orienta sobre funcin de la instruccin respecto al proceso total o estado del
proceso en ese momento.
Etiquetas
INICIAR
PORTA
VAR1

INICIO
programa.

FINAL

Comandos
EQU
EQU
EQU

Operandos
0xnnn
0x05
0x2A

Comentarios
;Seleccionar principio de la subrutina.
;Indica posicin del buffer del puerto A
;Indica posicin de la variable VAR1

ORG

INICIAR

;Comando para indicar donde se colocaran


;las instrucciones siguientes
;Es una etiqueta de posicin. Una marca en el

movlw
movf

goto
END

0x35
VAR1

INICIO

;Cargar el valor 35h en el W


;Cargo este valor en la posicin 2A
;Saltar al principio del programa
;Finaliza el programa a compilar

Al escribir un programa fuente se debe encabezar con una descripcin del autor sobre el programa, versin
y fecha. Una explicacin de para que problema se aplica y como lo soluciona.
El primer comando que se escribe es LIST as se le indica al compilador como debe tratar al archivo fuente.
En particular para que micro se esta trabajando.
Los siguientes comandos son __CONFIG para cargar la palabra de configuracin, __IDLOCS para
identificar el software.
62

A continuacin se debe declarar todas las etiquetas de las posiciones de los SFR, esto se puede hacer con
el comando INCLUDE.
Se asocia cada variable con una posicin de memoria RAM o registro GPR. Se debe observar si al registro
elegido se le pueden aplicar las operaciones y movimientos que sufre la variable.
El registro ms verstil es el de trabajo (W). No se debe asociar ninguna variable a este registro en forma
permanente, sino siempre temporal. Esto se debe a que muchas veces al operar se necesita mover la
variable del registro elegido al W y despus nuevamente al registro.
Si la variable tiene ms bits que un registro, hay que asociarla a ms de una posicin de memoria RAM.
Solo hay dos punteros accesibles al operador, el de direccionamiento indirecto FSR para la RAM y el
contador de programa PC para la ROM.
Se puede direccionar un dato solo de estas formas:
Direccionamiento inmediato. El dato o literal esta incluido en la instruccin.
Direccionamiento inherente. La instruccin define el registro a usar sin incluir su direccin.
Direccionamiento directo. La instruccin incluye la direccin donde esta el operando o dato.
Direccionamiento indirecto por registro. El registro a usar como puntero es el FSR. La instruccin
direcciona al registro INDF (00h), pero busca el dato en la posicin direccionada por FSR.
Direccionamiento Relativo. Se utiliza el PC para direccionar ROM mediante una rutina.
A cada valor de posicin ROM (Vector de Interrupcin, Vector de Inicio, Subrutinas, etc.) se le asocia con
una etiqueta de posicin, la cual es calculada automticamente por el compilador.
El compilador asigna a cada instruccin una posicin de ROM y calcula para cada etiqueta de posicin su
valor. El compilador cuenta desde el ltimo comando ORG y sino lo hubiera por defecto comienza en 0000h.

63

Asociacin Diagrama De Flujo - Programa Fuente


Bloque de ejecucin:
Segn sea la accin desarrollada en l, se determina la instruccin equivalente.
Cada variable debe asociarse a una posicin de memoria RAM. Los nombres de las variables representan
posiciones de memoria de los registros de propsito general (GPR) o de los especiales (SFR). El nombre de
la variable se asocia como etiqueta a la direccion de memoria del registro y su valor correspondera al
contenido de dicha posicin de memoria.

Movimientos y asignaciones
La operacin ms simple es la asignacin de valores a una variable. Si es un valor genrico de 8 bit se
representa con dos letras en minscula (nn, xx, yy), si es de 12 bit con tres minsculas (nnn, mmm, qqq) y si
es de 16 bit se usan cuatro letras (nnmm, ppqq, yyyy, vvzz)
El destinatario de la asignacin es una variable o puntero.
Aunque en el diagrama se indique un valor genrico, en el
programa fuente solo se puede asignar un valor numrico
VAR <-- nn
K <-- 10
conocido. En lenguajes de alto nivel aceptan usar valores
genricos, en assembler no pueden haber ambigedades.
En el pic el nico registro que permite cargar un valor en
forma inmediata es W, as que primero cargamos el valor en W y despus lo movemos al registro K
Los nombres de las variables aqu sern usados como etiquetas para determinar su posicin
movlw
0x10
;Se carga W con 10h
movwf
K
;Mover W al registro de direccion K
Se hacen asignaciones para cargar valores en las posiciones de memoria, para el valor de los punteros, o
para a enviar datos por los puertos. Las asignaciones son movimientos de datos, desde la instruccin hacia
el registro destino. Implican un direccionamiento Inmediato.
Los movimientos de datos significan copiar el contenido de un elemento en otro. Solo se puede hacer entre
elementos de igual clase. Por ejemplo el valor de un puntero de 10 bit no puede ser copiado en una variable
de 8 bit. El elemento que suministra la informacin es llamado origen y el que la recibe destino. El dato
residente en el origen no se altera, solo se destruye el dato anterior al movimiento en el registro destino.
No hay instruccin que mueva los datos de un registro GPR o SFR a otro. El dato
debe ir primero al W y despus al registro destino.
VAR1 --> VAR2
movf
VAR1,W
;mover VAR1 al W
movwf
VAR2
;mover W al VAR2
El dato se copia en el registro destino y en el W.
El mover el contenido de un registro a otro, significa en realidad, copiar el valor que almacena un registro
llamado origen o fuente en el registro llamado destino.

VAR1 VAR1

Aunque no modifica al registro, el flag Z es activado si el valor de VAR1 es cero


movf VAR1,F
;Se verifica si VAR1 es cero

Cuando un dato es trado de memoria es necesario tener su posicin de alguna manera. Ya sea el valor de
su direccin en forma directa, almacenada en alguna variable o puntero o por el resultado de una operacin.
Una variable de muchos bits puede ser formada por la concatenacin de dos variables ms cortas.
Ejemplo Pdest = VAR1:VAR2
Los dos puntos en medio significa que se concatenan, aportando VAR1 los bit ms significativos y VAR2 los
bit menos significativos.
El direccionamiento es independiente de que un registro este mapeado sobre el otro banco o no este
implementado fisicamente. Por ejemplo los registros 70h, F0h, 170h y 1F0h estan todos mapeados sobre el
70h. Por lo tanto acceder a cualquiera de estas direcciones es trabajar sobre el registro 70h.
Otro ejemplo es el registro 0x18F no esta implementado fisicamente, el escribir o leer no genera error
ninguno, su contenido es considerado 00.

64

Direccionamiento indirecto por registro


RAM

ROM
NN0 --> W

XX1

M(VAR) --> W
Pdat = FSR

W
NN2

M(Pdat) --> W

0x04 FSR

NN1
NN2

XX1

movf INDF, W
movf 0x00, 0x0

-La instruccin indica, no la posicin donde se guarda el dato sino, donde se guarda el valor de la posicin
de memoria. Se invoca el uso de un puntero el cual almacena la posicin del dato a usar. Se llama
direccionamiento indirecto por registro.
Este micro tiene un solo puntero (FSR) para la memoria RAM, pero no tiene instrucciones especficas para
usarlo. Cualquier instruccin que direcciona en forma directa la posicin 0x00 de RAM o sea el registro
INDF, es interpretada como que utiliza al puntero FSR. El registro INDF no tiene implementacin fsica en el
hardware.
El bloque ser,
M(Pdat) W
M(FSR) W
Se debe asociar este puntero lgico Pdat al nico puntero
fsico FSR.
La instruccin o mnemnico es
movf 0x00,.0
movf INDF,W
Observar que en el mnemnico no se nombra al FSR y se usa la misma instruccin que en el
direccionamiento directo. La diferencia esta en el argumento, el cual es 00 o INDF. Estas instrucciones no
alteran el valor del FSR.
La existencia de ms de un banco implica una dificultad si se desea trabajar con registros en los cuatro
bancos. El FSR tiene la capacidad de con sus 8 bits selecccionar 256 posiciones RAM, se utiliza el bit IRP
(STATUS,7) para indicar el grupo de los bancos 00-01 o 10-11.
Cargar una posicin de memoria seleccionada por puntero. Solo se puede utilizar el FSR de 8 bit ubicado en
04h. Este basta para direccionar todos los registros RAM. Para utilizarlo se trabaja
con el registro INDF
;Se debe tener cargado el FSR con el valor deseado y seteado el bit IRP
45 --> M(Pdat)
movlw
0x45
;Cargar 45 en W
movwf
INDF
;Mover W a M(Pdat)
Cargar una posicin de memoria seleccionada por una variable llamada puntero lgico. Solo se puede
utilizar el FSR como puntero fsico de 8 bit ubicado en 04h. Para utilizarlo se trabaja
con el registro INDF. Se debe cargar el valor de la variable en FSR
45 --> M[VAR1]
movf
VAR1, W
;Se debe tener seteado el bit IRP
movwf
FSR
;Copio el valor de VAR1 en el FSR
movlw
0x45
;Cargar 45 en W
movwf
INDF
;Mover W a M[VAR1]
Cargar el valor de una variable en un registro direccionado por puntero.
;Se debe tener cargado el FSR con el valor deseado y seteado el bit IRP
movf
VAR2,W
;Colocar VAR2 en el registro de trabajo W
VAR2 M(Pdat)
movwf
INDF
;Cargar el registro M(Pdat) con el valor de
; VAR2
El registro INDF permite usar el direccionamiento a travs del puntero FSR.
Mover la informacin entre dos posiciones dadas ambas mediante direccionamiento indirecto. El dato debe
pasar por el W. Se indican dos punteros lgicos pero solo esta el FSR como
puntero fsico. Se deben usar registros auxiliares para almacenar el valor de los
M(Porig) M(Pdest)
punteros cuando no son usados.
65

Estos van a ser Porig y Pdest. Para guardar momentneamente el dato se usa AUX. Este es un bloque
complejo que es conveniente convertir en un conjunto de bloques simples.

Porig FSR
M(FSR) AUX
Pdest FSR
AUX M(FSR)

movf
Porig,W
;Traer valor actual de Porig
movwf
FSR
;Se coloca Porig en el registro FSR
movf
INDF,W
;M(Porig) W
movwf
AUX
;Se guarda el dato en un reg auxiliar
movf
Pdest,W
;Traer valor actual de Pdest
movwf
FSR
;Se coloca Pdest en el registro FSR
movf
AUX,W
;Traer el dato desde el reg auxiliar.
movwf
INDF
;Guardo dato en M(Pdest)
Ahora cada bloque se asocia a 2 instrucciones.

Ejercicio:
R3
R4
R2
R1
Cambie el contenido de los registros R1, R2, R3, R4
Mover R1 a R2, R2 a R3, R3 a R4 y R4 a R1
A partir del diagrama de flujo diseado como solucin se escribe el programa fuente correspondiente.
;------------Ejercicio Rotacin de Registros ----------------------;Es aconsejable llenar el programa de comentarios que guen
;en la comprensin del mismo
;Primero definir el micro a usar y las condiciones de uso
LIST
__CONFIG

p=16f628a
0x2150

;Configura el ensamblador
;Configura Oscilador XT ,
;No WDT, Si PWRT, No CP
;Se debe definir los valores de las variables a usar.
;No usa ningn modulo interno.
AUX
EQU
0x20
R1
EQU
0x21
R2
EQU
0x22
R3
EQU
0x23
R4
EQU
0x24

INICIO
R1 W
W AUX
R4 W
W R1
R3 W

W R4
R2 W
W R3
AUX W
W R2
FINAL

;------------- Definir los SFR a usar ------------F


EQU
.1
;Sirve para indicar registro como destino
W
EQU
.0
;Sirve para definir a W como destino
;No se necesitan ningn otro registro de funcin especial
ORG
0x0000
INICIO
;Se debe colocar los comandos org antes
movf
R1,W
; de la etiqueta de posicin
movwf
AUX
; R1 AUX
movf
R4,W
movwf
R1
; R4 R1
movf
R3,W
movwf
R4
; R3 R4
movf
R2,W
movwf
R3
; R2 R3
movf
AUX,W
movwf
R2
; R1 R2
END
;Fin del programa a compilar

66

El intercambio es un movimiento que no destruye ninguna de las dos informaciones. Pocos micros pueden
realizar esa accin en una sola instruccin
Este bloque complejo se debe desglosar en varios ms
VAR1 BAR2
simples. Tomando la experiencia del ejercicio anterior es
var2 M(Pxx)
necesario crear una variable auxiliar para realizar el
intercambio.
VAR1 W
W AUX
BAR2 W
W VAR1

Movf
movwf
movf
movwf
movf
movwf

VAR1, W
AUX
BAR2, W
VAR1
AUX, W
VAR1

AUX W
W VAR1
Operaciones
Las operaciones pueden ir en un solo bloque, en general los micros solo pueden operar con 2 variables y
una de ellas ser usada como destino del resultado si lo hay. Por lo tanto las operaciones complejas o multivariables solo van en los diagramas generales y no en los personalizados. Adems solo hacen operaciones
lgico-matemticas simples y bsicas.
2A + B + 15 --> C

Es necesario descomponer este bloque en varios simples.


AC
C+AC
C+BC
C + 15 C
Y aun personalizarlo, pues el micro solo opera de a un registro y el W.
A W
A + W W
B + W W
15 + W W

movf
addwf
addwf
addlw
movwf

A, W
A, W
B, W
0x15, W
C

W C
Otra forma de personalizarlo es la siguiente:
movf

movwf
A W
addwf
C + W C
movf
W C
addwf
15 W
C + W C
movlw
addwf
C + W C
B W

A, W
C
C, W
B, W
C, W
0x15
C, W

67

Cualquier bloque que opere con ms de 1 variable es complejo puede ser simplificado en varios bloques.
VAR1 W

VAR1 AND VAR2 --> VAR3

VAR2 and W W

movf
andwf
movwf

VAR1, W
VAR2, W
VAR3

W VAR3

Saltos y Decisiones
La llegada de una rama a otra implica colocar una etiqueta que marque esa posicin en el programa fuente.
Son nombres que van colocados sobre el margen izquierdo, sin espacios en blanco.

Los codos implican saltos hacia algn bloque del programa que no es el consecutivo. Se asocian con la
instruccin goto, y con un argumento que representa una posicin como una
etiqueta de posicin..
goto
ETIQUETA_DE_POSICION
Un salto implica no ejecutar el bloque siguiente inmediato. Se sale de un bloque y se ira a otro que no esta
inmediato siguiente.
La direccin del salto puede estar en un valor cargado en forma inmediata, estar almacenado en un registro
de memoria (interno o externo al procesador), o ser el resultado de una operacin o ser un valor inherente o
prefijado por el fabricante. En el diagrama de flujo se representan con un codo en la linea de flujo. El destino
del salto, que sera la entrada de algn bloque se identifica con una etiqueta de posicin.
LLEGADA1

LLEGADA1

VAR1 00
VAR2 VAR1

clrf
movf
movwf
goto

VAR1
VAR1, W
VAR2
LLEGADA1

incf

PD, F

LLEGADA2
LLEGADA2

PD + 1 PD

Si el salto es indicado sin mediar ninguna condicin es un salto incondicional.


Si para saltar debe cumplirse una condicin es un salto condicionado. Las decisiones
siempre estn asociadas a un salto por lo menos. Solo un bloque de decisin puede
tener o generar un salto condicionado.

A = 22?

SI

Decisiones y manejo bit a bit


En los bloques de decisin se consulta por alguna condicin. Dado que tienen 2 posibles respuestas se
refleja en que tienen 2 salidas posibles dependiendo de la condicin consultada. Esta condicin puede ser
algn indicador de la ALU o un bit determinado perteneciente a un registro, es decir si vale 0 o 1. Cuando se
personaliza el diagrama de flujo hay que expresar esa condicin de manera que se refleje en algn
indicador o en el valor de algn bit en particular. Este bloque con dos salidas implica que tiene una de las
salidas es un salto y como depende de una condicin es un salto condicionado.
Segn la capacidad del micro, este puede chequear todos los bits de la RAM, algunos bits dentro de un
grupo de registros o solo los bits especiales llamados indicadores, banderas (flag) o banderines (pennant).
[Estas banderas se representan con un bit de la palabra de estado del programa (PSW, PSR o STATUS).
Su valor depende siempre de la ltima operacin realizada y estn asociados a la ALU.]
Se verifica si determinada bandera tiene valor 0 o 1. Los indicadores imprescindibles son CY (indicando si
68

hubo acarreo en una suma o borrow en una resta) y Z (indica si el resultado de una instruccin es cero).
Para el PIC16F628A los indicadores son bit del registro STATUS (posicin 0x03) y puede chequear todos
los bit de la RAM. Maneja los indicadores de la ALU como a cualquier otro bit dentro de cualquier registro
GPR y SFR.
Los bits dentro de la variable se numeran segn su orden. La notacin es el nombre de la variable seguido
de una coma y del ordinal del bit elegido.

VAR nn

VAR1 + KAR VAR

VAR 1 VAR

CY= 1
SI

SI

Z=0

NO

K+1K

NO

K+1K

En el primero de estos ejemplos se verifica cuando no se activa el flag Z indicando que VAR alcanzo el valor
cero.
En el segundo ejemplo se detecta si hay un desborde de la suma.
La deteccin de bit en el PIC se hace sobre cualquier bit de los registros SFR y GPR, es decir sobre todo el
mapa de memoria RAM. La bifurcacin solo pueden saltar una instruccin, se ejecuta o no la siguiente
instruccin.
Al personalizar los diagramas de flujo se necesita considerar este punto para contar correctamente los
saltos de programa.
Considere el siguiente ejemplo:
K 5E

K 5E
LLEGADA

NO

K1K

K1K

K = 00

STATUS, Z = 1

SI

SI

NO

movlw
movwf
LLEGADA
decf
btfss
goto
..
...

0x5E
K
K,F
STATUS, Z
LLEGADA

En el diagrama de la derecha se observa el detalle de los saltos para un diagrama personalizado. Los
bloques de decisin incluyen siempre un salto, en los PIC sucede solo si se cumple la condicin. El otro
salto en el ejemplo no esta incluido en el bloque, es un smbolo aparte.
Los bloques de decisin saltan una instruccin cuando se cumple la condicin. Si no se cumple ejecutan la
instruccin siguiente. Se debe realizar la consulta de forma que la respuesta afirmativa genere el salto. La
forma de clarificar los diagramas es utilizar esta forma para los bloques de decisin:
SI
NO

La mayora de los bloques simples se puden representar con una o ms instrucciones. Siguiendo la filosofia
RISC, Microchip en los PIC incluyo las instrucciones decfsz reg, d y incf reg, d las cuales pueden
asociarse a una estructura de varios bloques simples. Estas instrucciones son potentes y complejas a
diferencias del resto de las instrucciones que son sencillas, inclusive se pueden con implementar con una

69

pequea rutina. Pero al permitir asociarse con una estructura muy usada facilita la confeccion de
programas.
Observar que ninguna de esta instrucciones alteran los indicadores CY y Z.
Al asociar diagrama de flujo con instrucciones se convierte de a un bloque por vez:
movlw 0x5E
movwf K

K 5E

LAZO

LAZO

K1K
NO

K = 00

;Cargar K con el valor 5Eh


; La llegada de una rama indica una
; etiqueta. Esta se escribe sin espacios en blanco.
decfsz K,F
; Decrementar K y si es cero
; entonces PC + 1 PC.
goto
LAZO ; Si no es cero salto a donde esta la etiqueta LAZO

; Si es cero sigo de largo con el programa

SI

K 5E
AUMENT

K+1K

movlw 0x5E
movwf K
AUMENT
incfsz K,F
goto

NO

;Cargo K con el valor 5E


;Etiqueta que marca la llegada de una rama
;Incrementar y si K desborda (pasa de FF a 00)
;saltar la prxima instruccin
;Mientras no sea cero ejecuta este goto

AUMENT

K = 00
SI

Considere el primer bloque de decisin. Si la repuesta es afirmativa se salta un


bloque compuesto de dos instrucciones y una instruccin goto. Saltar 3
instrucciones no se puede con una sola consulta. Es necesario incluir de un codo
en el diagrama.
Respecto al segundo bloque de decisin, no puede solo
saltar hacia atrs. Se debe utilizar un codo y preguntar de forma que la afirmativa
genere el salto de una instruccin. El diagrama se convierte en el siguiente.
El salto condicionado de la instruccion no necesita etiqueta ya que el fabricante
le asigna una direccion (relativa) de destino. Siempre es saltar la instruccin
inmediata siguiente.

SI

CY = 1
NO

VAR2 33

SI

VAR3, 3 = 0
NO

VAR3 + 02 VAR3
LLEGAR1

CY = 0

SI

LLEGAR1

NO

VAR2 33

btfsc STATUS,CY
goto
LLEGAR2
movlw
0x33
movwf
VAR2
goto
LLEGAR3

;Si CY es cero PC + 1 PC
;Si es uno saltar a LLEGAR2

btfsc
goto

;Chequear el bit 3 de VAR1


;Si es 1 salto a LLEGAR1

;Cargar 33h en VAR2 si CY = 0

LEGAR2

LLEGAR2

VAR3, 3 = 1

SI

NO
LLEGAR3

VAR3 + 02 VAR3

VAR1,.3
LLEGAR1

LLEGAR3
movlw
addwf

0x02
VAR3,F;

70

;Sumar 02h a VAR3

Para comparar dos variables primero debemos restarlas entre si. Y que el resultado no afecte a ninguna de
las dos. Despus se verifican los flag de CY (STATUS,0) y Z (STATUS,2). En la resta el CY representa el
negado del borrow. Por lo tanto si la resta lleva borrow entonces CY=0
VAR1 VAR2
VAR1 = VAR2
;
Z=1
CY=X
VAR1 VAR2
;
Z=0
CY=X
VAR1 < VAR2
;
Z=X
CY=0
VAR1 VAR2
;
Z=X
CY=1
VAR1 > VAR2
;
Z=0
CY=1
VAR1 VAR2
;
Z=1
CY=X o Z=0 CY=0
Observar que la repuesta que genera el salto es la afirmativa
VAR1 VAR2 --> w

VAR1 = VAR2

VAR1 VAR2 --> w

NO

Se transforma en
VAR1 VAR2

SI

NO

K + 1 --> K

K + 1 --> K

Se hacen por bloques


movf
subwf
btfsc
incf
.
VAR1 VAR2 --> w

VAR1 = VAR2

SI

NO

SI

K + 5 --> K

VAR2,W
VAR1,W
STATUS,Z
K,F

;Resto para comparar


;Si la bandera Z es cero salto una instruccin,
; Si Z=0 => PC+1 PC

La diferencia entre este diagrama y el anterior radica en el


bloque de suma. Si es solo un incremento se puede
representar por una sola instruccin, pero si es un valor
diferente a 1 se necesitan dos o ms.
Las instrucciones de decisin solo saltan una posicin de
memoria, se debe usar una instruccin de salto.
Se transforma en el diagrama de la derecha.

VAR1 VAR2 --> w

VAR1 = VAR2

SI

NO

K + 5 --> K
NOIGUAL

movf
subwf
btfss

VAR2,W
VAR1,W
STATUS,Z

goto
movlw
addwf
NOIGUAL

NOIGUAL
0x5E
K,F

VAR1 VAR2 --> W


NO

VAR1 VAR2
SI

K + 1 --> K

;Restar para comparar


;Si flag Z es uno saltar una instruccin
; Z=1 PC + 1 PC
;Sumo K + 5E y guardo en K

Se transforma en
movf VAR2,W
subwf VAR1,W
;Restar / comparar
btfss STATUS,Z
;Si la bandera Z es
;uno se salta la instruccin inmediata.
;Si Z=1 PC + 1 PC
incf
K,F
.

71

VAR1 VAR2 --> W


VAR1 = VAR2
NO

K + 1 --> K

SI

VAR1 VAR2 --> w

VAR1 VAR2

NO

SI

La diferencia entre este diagrama y el anterior radica en el


bloque de suma. Un incremento se puede representar por
una sola instruccin, pero si es un valor diferente a 1 se
necesitan ms instrucciones. Para avanzar ms de una
posicin se usa un salto. Lo que implica una instruccin
goto.

VAR1 VAR2 --> w

VAR1 VAR2

SI

NO

K + 5E --> K

K + 5E --> K

movf
subwf
btfsc
goto
movlw
addwf
IGUALES

VAR2,W
VAR1,W
STATUS,Z
IGUALES
0x5E
K,F

IGUALES

;Restar para comparar


;Si Z es cero saltar una instruccin Z=0 PC + 1 PC
;Sumar K + 5E y guardar en K

Se convierte en el siguiente, as el salto se produce


con la afirmativa

VAR1 VAR2 --> W


NO

VAR1 < VAR2

movf
subwf
btfss

SI

VAR2,W
VAR1,W
;Restar
STATUS,CY
;Si BW=0 PC+1 PC
K,F

K + 1 --> K
incf

VAR1 VAR2 --> W


VAR1 VAR2

SI

NO

K + 1 --> K

Se transforma en

VAR1 VAR2 --> W

movf
subwf
btfsc

NO

VAR1 VAR2
SI

incf
.

K + 1 --> K

VAR1 VAR2 --> W


NO

VAR1 > VAR2


SI

K + 1 --> K

VAR1 VAR2 --> W


VAR2,W
VAR1,W
;Restar
STATUS,CY
;Si BW=1 PC+1 PC
K,F

En este diagrama el bloque de decisin es complejo


por lo que se debe convertir en otros ms simples. Su
complejidad radica en que es necesario consultar dos
indicadores para determinar si es verdadero o falso.

VAR1 < VAR2


NO

K + 1 --> K

VAR1 VAR2 --> W


VAR1 VAR2

Estos dos bloques de decisin son ms simples y cada


uno verifica un bandern. Observar que la primera
decisin tiene que saltar ms de una instruccin.

VAR2,W
VAR1,W
STATUS,CY
NOMAYOR
STATUS,Z
K,F

;Restar para comparar


;Si es menor no suma
;Si es igual no suma
;Incrementar K

72

SI

NO

VAR1 = VAR2
movf
subwf
btfss
goto
btfss
incf
NOMAYOR

SI

NO

K + 1 --> K
NOMAYOR

SI

VAR1 VAR2 --> W


VAR1 VAR2 --> W
NO

VAR1 VAR2

En este diagrama el bloque de decisin es complejo


por depender de dos banderas, as que se debe
convertir en dos ms simples.

VAR1 = VAR2

SI

NO

SI

K + 1 --> K

VAR1 VAR2

SI

NO

movf
subwf
btfss
btfss
incf
.

VAR2,W
VAR1,W
STATUS,Z
STATUS,CY
K,F

K + 1 --> K

;Comparar
;Si son iguales altar e incrementar
;Si no es menor salto sin incrementar

Algunos micros pueden manejar lgebra booleana, setear (poner a 1) o resetar (poner a 0) un bit
determinado dentro de una variable. Resetear se le llama tambin limpiar (clear) el bit. Otra operacin es el
complemento a 1 del bit. Otras operaciones lgicas como OR o AND son ms escasas.

Ejemplos
VAR,1
identifica al bit 1 de VAR por el nmero de orden
PUERTA, SENSOR identifica al bit mediante la etiqueta SENSOR

PUERTA, 1 <-- 0

VAR1, 1 <-- 1

Los bloques de decisin chequean algn bit y se selecciona si se sigue o


se salta segn sean 1 o 0 el bit en cuestin.

Ca1(PUERTA, 2) --> PUERTA, 2


NO

PUERTA, SENSOR = 1

Hay micros que solo pueden chequear los bit de las banderas de
SI
resultado. Por lo tanto se utilizan tcnicas que permitan verificar cualquier bit de cualquier variable. Hay 2
formas principales y ambas son destructivos de la informacin de la variable.
Modo de enmascaramiento.
Se considera este ejemplo:
queremos verificar el bit 4 de una variable VYR.
Primero se copiar esta informacin en un lugar seguro.
Se hace una operacin AND con el valor 00010000B.
El resultado se resume a dos posibles: es 00H o es 10H.
Se detecta si el resultado es cero o no, verificando el flag Z.
Si Z=1 entonces VAR,4 = 0
Si Z=0 entonces VAR,4 = 1
Modo de desplazamiento.
Se considera el ejemplo anterior.
Primero copiar esta informacin en un lugar seguro.
Se giran los bits de la variable hacia la izquierda (o la
derecha) hasta que el bit deseado quede en el flag de CY.
Se detecta si el flag de CY vale cero o uno.
Si CY=1 entonces VAR,4 = 1
Si CY=0 entonces VAR,4 = 0

ENMASCARAMIENTO
VYR --> VAR
VAR AND 10
Z=1
PROCESAR

DESPLAZAMIENTO
VYR --> VAR
VAR,n --> VAR, n+1

VAR,n --> VAR, n+1

VAR,n --> VAR, n+1

CY = 1

VAR,n --> VAR, n+1

73

PROCESAR

Hay otros mtodos pero incluyen la combinacin de algunas de estas formas.


Si se trata del bit ms significativo de la variable se puede sumar 80 H y el valor de ese bit se copia en el CY.
El mtodo de enmascarar permite verificar varios bit al mismo tiempo.
Si se desea poner a 1 un determinado bit se hace una operacin OR con la mascara adecuada para solo
alterar el bit deseado. A OR 1 => 1 , A OR 0 => A
Si se desea poner a 0 un determinado bit se hace una operacin AND con la mascara adecuada para solo
alterar el bit deseado. A AND 1 => A , A AND 0 => 0
Lazos, bucle, loop o iteraciones
INICIO
La capacidad de repetir acciones del micro y su implementacin
con series y matrices hace de los lazos (loop) o iteraciones una
estructura lgica muy usada, permite con pocas instrucciones
LEER DATOS
procesar muchos datos. Si cada dato implica una rutina de
procesamiento, hay que corregir tantas rutinas como datos se
PROCESAR DATOS
tenga. Si a todos los datos se les puede aplicar el mismo
procesamiento, se corrige una vez y se tiene la certeza que
funcionar para todos los datos.
DESPLEGAR RESULTADO
Los lazos pueden tener asociados una variable de lazo. sta es
un elemento que modifica su valor, ya sea dependiendo del
nmero de veces de la repeticin o de la actualizacin de algn dato de entrada. Cuando la variable de lazo
alcanza un valor determinado o se cumple una condicin esperada se sale del lazo y se contina con el
programa. Cuando la iteracin no tiene variable de lazo, es un lazo sinfn, sin salida o infinito. Se repetir
constantemente mientras funcione el sistema. Hay programas que son un lazo infinito, se entra en la
iteracin pero como no hay variable de lazo no se sale de ella.
K <-- 37
Pd + K --> Ps
PROCESO
K 1 --> K
NO

K = 00
SI

Se necesita conocer el valor con que cada variable llega al lazo. Se debe asegurar
de no entrar en el lazo con alguna variable teniendo un valor que perjudique el
desarrollo del mismo.
Si su valor se asigna independiente del valor anterior no es tan importante, pero si
su valor depende de valores anteriores como en los incrementos o decrementos es
necesario tener certeza de su valor al comienzo de la primera vuelta de la iteracin.
Por lo tanto antes de entrar al lazo se le debe asignar un valor de inicio.
En este ejemplo la variable K es la variable de lazo. El puntero Pd no tiene valor
conocido al entrar en el lazo. Afecta el desempeo del programa pero no la salida
de la iteracin.
La variable de lazo se puede chequear en cualquier lugar del
lazo. Si se hace al final permite ahorrar un salto, de lo
contrario se necesitan al menos dos. Uno para salir y otro
para reiniciar el lazo

Para salir del lazo se puede chequear ms de una variable, la misma varias veces o
diferentes condiciones de la variable. Es decir tener ms de un bloque de decisin que
permite salir del mismo.

K <-- 00
PROCESO
K + 1 --> K
VAR = 2B
Pd + K --> Ps

K --> VAR2

Cuando se tratan datos, se deben toman de algn lado. Si es siempre de la misma posicin de memoria se
puede usar el direccionamiento directo del operando. Pero si los datos estn ordenados en posiciones de
memoria sucesivas se los considera como con una serie o matriz, facilita entonces usar un puntero, al
variarlo en cada vuelta cambia la posicin del dato seleccionado. En los lazos se hacen muy tiles los
punteros. Dentro del lazo se utiliza la misma instruccin, pero al variar el contenido del puntero cambia el
dato seleccionado. En los PIC se utiliza el direccionamiento indirecto por registro.
Los punteros se deben asociarse con el registro FSR de posicin 04h. Cuando el programa contiene ms
de un puntero lgico, se debe guardar cada puntero en un registro. Para usar cada puntero se coloca su
contenido en el FSR.
74

Ejercicio: Se tiene un conjunto de KANT datos almacenados a partir de la posicin ORIG. Aplicar el Ca1 a
cada uno de los elementos del conjunto.
INICIO
Primer mtodo es tratar cada dato en forma individual, se direcciona
cada dato en forma directa. Es necesario hacer esto para cada dato.
M(ORIG) <-- M(ORIG)
Por lo tanto las acciones se realizan KANT veces.
El primer valor se ubica en la posicin ORIG y el ltimo o sea el
M(ORIG + 1) <-- M(ORIG + 1)
kant-simo valor en la posicin ORIG + KANT 1.
En este ejemplo no se especifica el nmero de elementos a operar,
M(ORIG + 2) <-- M(ORIG + 2)
pero no afecta el tema a tratar.
En el diagrama anterior se nota lo repetido de la estructura operar el
dato. Esta repeticin se puede ejecutar con un lazo finito. Se
identifica lo que varia en cada iteracin, en este caso es la posicin M(ORIG + KANT - 1) <-- M(ORIG + KANT - 1)
de memoria usada para buscar el dato.
INICIO
En el programa anterior se usa direccionamiento directo. En el lazo
se debe usar direccionamiento indirecto. Se agregan 2 variables, un puntero y una variable de lazo. El
puntero que asumir el valor de cada una de las posiciones de memoria, se
INICIO
inicializa con el valor ORIG y se incrementa en 1 para cada vuelta del lazo. Todo
lazo finito necesita una variable de lazo, se utiliza la variable LAZO que comienza
Pdat <-- ORIG
con el valor KANT. Agregar un lazo finito implica agregar una variable de lazo.
El bloque M(Pdat) M(Pdat) toma el dato de una posicin diferente en cada
LAZO <-- KANT
vuelta del bucle. As no es necesario ir nombrando cada registro a usar en forma
BUCLE
directa.
M(Pdat) <-- M(Pdat)
Este lazo se repite KANT veces, desde que la variable de lazo LAZO vale KANT
hasta que vale 1. Al final del ltimo lazo asume el valor cero, por lo que el bloque
de decisin termina la iteracin.
Pdat + 1 --> Pdat
Se observa que el puntero y la variable de lazo adquieren un valor diferente al de
entrada en la iteracin. En particular el puntero termina con un valor
correspondiente al del ltimo elemento de la serie ms uno. Si se va a usar de
nuevo el puntero Pdat deberamos asignarle el valor de inicio (ORIG).
Personalizado para el PIC16F628A este programa queda:
El puntero se asocia al registro FSR, que es el nico puntero de la memoria RAM.

LAZO 1 --> LAZO


NO

LAZO = 00
SI

FINAL

Este programa es ms corto en cantidad de bloques a usar, pero demora ms tiempo en terminar que la
solucin anterior. Tambin utiliza ms variables que la primera solucin, por lo que consume ms recursos
del sistema.
INICIO
INICIO
movlw
ORIG
;Debe declararse el valor de esta etiqueta
movwf
Pdat
;Debe asociarse a una direccin de RAM
Pdat <-- ORIG
movlw
KANT
LAZO <-- KANT
movlw
LAZO
BUCLE
BUCLE
movf
Pdat, W
;Preparo el puntero a utilizar
Pdat --> FSR
movwf
FSR
comf
INDF, F
;Opero el dato
M(FSR) <-- M(FSR)
incf
Pdat, F
;Actualizo el puntero
Pdat + 1 --> Pdat
LAZO 1 --> LAZO
NO

decfsz
goto
FINAL

LAZO, F
BUCLE

LAZO = 00

;Verifico si quedan datos por procesar

Siempre al elegir un programa se debe sopesar en que aspecto se lo optimizar.


Cuando un programa es complejo y extenso, no siempre el primer diagrama es el
mejor. Se le debe revisar para mejorarlo u optimizarlo.
FINAL
Optimizar un programa es mejorarlo en alguno de estos aspectos:
*Bajar el nmero de instrucciones total.
*Disminuir posibilidades de error.
*Mayor rapidez del proceso total.
*Usar menos recursos del micro. (menor nmero de variables, registros internos, perifricos, etc)
SI

75

Matrices Y Series:
Las series permiten trabajar con grupos de valores tratndolos como un todo, en vez de pensar el proceso
para cada dato, se razona para toda la serie. Es muy util para estos casos realizar un lazo, se define el
puntero de inicio y despus se le actualiza o indexa para ir seleccionando cada uno de sus elementos. Se
usa el nmero de elementos para cargar la variable de lazo.
Las matrices sirven igual que las series, pero usan ms de un puntero. La utilidad de este elemento radica
en que permite organizar los datos dentro de la memoria.
Ambos elementos son formas lgicas de organizar los datos. Fsicamente en memoria se almacena un dato
a continuacin de otro.
En el manejo o representacin de matrices y series se usa un puntero por cada dimensin. La seleccin de
datos comnmente se hace en orden secuencial, o sea se toman uno a uno y en forma consecutiva, y
adems se les aplica a todos el mismo proceso o muy parecido. Por estas caractersticas es muy
conveniente el uso de lazos en el manejo de dichas estructuras. En cada repeticin se modifican los
vectores de entrada a la matriz y se selecciona un nuevo dato.
La matriz ms simple es la serie, solo se necesita saber el valor del puntero, que indicar la posicin del
primer elemento, y el nmero de datos que componen la serie llamado longitud.
En el PIC16F628A solo se tiene un puntero de memoria RAM, el registro FSR (posicin 04h). Permite
direccionar posiciones de RAM en cualquiera de los bancos, en conjunto con el bit STATUS,IRP.
Ejercicio:
Dado una serie de KANT elementos a partir de la posicin ORIG,
colocarla a partir de la posicin DEST.
Hay un solo puntero fsico (FSR) en el micro, por lo que es necesario
ir alternando la informacin de cada uno de los punteros lgicos del
programa.
La mayora de los micros, y en particular el PIC16F628A, no pueden
mover de una posicin de memoria direccionada por un puntero a
otra posicin de memoria direccionada de la misma forma. Por lo
tanto hay que usar una variable que sirva de intermediario.
Antes de entrar en el lazo a todas las variables se le asigna un valor
inicial. Valor con el que operan durante la primera vez que recorran
el lazo. Al salir de la iteracin vemos que su valor se ha modificado.
K=0
Pdest = DEST + K + 1
Pdat = ORIG + K + 1
Observar que los punteros en este diagrama terminan valiendo uno
ms que la posicin de los ltimos elementos.
Personalizar este diagrama presenta una particular dificultad en el
bloque de movimiento con el origen y el destino direccionados en
forma indirecta por registro.

INICIO
Pdat <-- ORIG

Cargo parametros
de entrada

Pdst <-- DEST


K <-- KANT
LAZO

M(Pdat) --> M(Pdst)


Pdat + 1 --> Pdat
Pdst + 1 --> Pdst

Traigo un dato
de la seie
origen a la
serie destino
Actualizo ambios
punteros

K 1 --> K
NO

K = 00

Verifico si todos los


elementos fueron
movidos.

SI

FINAL

M(Pdat) --> VAR


Todo movimiento pasa a travs del
M(Pdat) --> M(Pdst)
registro W. Los punteros Pdat y Pdest
se van cargando alternadamente en el
VAR --> M(Pdst)
registro FSR para direccionar a los
elementos de la serie.
La variable VAR es para almacenar momentneamente el valor que se esta
trasladando.

Pdat -->W
W --> FSR
M(FSR) --> W
W --> VAR
Pdst --> W
W --> FSR
VAR --> W
W --> M(FSR)

76

INICIO

movlw DEST ;Setea puntero destino de la serie


movwf PDST

LAZO

INICIO

movlw ORIG ;Setea puntero donde esta la serie


movwf PDAT

movlw KANT ;Carga el nmero de elementos a mover


movwf K

W <-- ORIG
Pdat <-- W
W <-- DEST
Pdst <-- W
W <-- KANT
K <-- W
LAZO

movf PDAT,W
movwf FSR
;Coloca 1 puntero lgico en el puntero fsico
movf INDF,W
movwf VAR ;El dato trado es colocado en la variable de intercambio

Pdat --> W
W --> FSR
M(FSR) --> W

movf PDST,W
movwf FSR
;Coloca 2ndo puntero lgico en el puntero fsico

W --> VAR

movf

W --> FSR

Pdst--> W

VAR,W ;Trae el dato guardado en la variable de intercambio

movwf INDF
incf
PDAT,F
incf
PDST,F

;Guarda el dato en la posicin destinada


;Incrementa puntero origen
;Incrementa puntero destino

decfsz K,F
;Verifica si queda algn elemento por trasladar
goto
LAZO

VAR --> W
W --> M(FSR)
Pdat + 1 --> Pdat
Pdst + 1 --> Pdst
K + 1 --> K
NO

FINAL

;------------Ejercicio traslado de una Serie ----------------------;Es aconsejable llenar el programa de comentarios que guen ;en la comprensin del
mismo
;Primero definir el micro a usar y las condiciones de uso
LIST
p=16f628a
;Configura el ensamblador
__CONFIG
0x2150
;Configura Oscilador XT ,No WDT, Si PWRT, No CP
;Se debe definir los valores de las variables y constantes a usar.
ORIG
EQU
0x20 ;Valor inicial del puntero fuente
DEST
EQU
0x30 ;Valor inicial del puntero destino
KANT
EQU
0x0A ;Nro de elementos de la serie
PDAT
EQU
0x70 ;Puntero de la serie
PDST
EQU
0x71 ;Puntero de la serie final
K
EQU
0x72 ;Variable de lazo
VAR
EQU
0x73 ;Variable auxiliar para procesar los datos
;Cargo los nombres de los FSR mediante el comando include
include
<p16f628a.inc>
INICIO

LAZO

ORG
movlw
movwf
movlw
movwf
movlw
movwf

0x0000
ORIG
PDAT
DEST
PDST
KANT
K

movf PDAT,W
movwf FSR
movf INDF,W

;Setea puntero donde esta la serie


;Setea puntero destino de la serie
;Carga el nmero de elementos a mover

;Coloca 1 puntero lgico en el puntero fsico


77

K = 00
SI
FINAL

FINAL

movwf
movf
movwf
movf
movwf
incf
incf
decfsz
goto

VAR
PDST,W
FSR
VAR,W
INDF
PDAT,F
PDST,F
K,F
LAZO

;El dato trado es colocado en la variable de intercambio


;Coloca 2ndo puntero lgico en el puntero fsico
;Trae el dato guardado en la variable de intercambio
;Guarda el dato en la posicin destinada
;Incrementa puntero origen
;Incrementa puntero destino
;Verifica si queda algn elemento por trasladar

END

Subrutinas
Es una seccin del programa con principio y fin definidos, usado mediante invocacin o llamada en el
programa principal. No depende de su extensin sino de que se desarrolle aparte y ser invocada por el
programa principal.
El diagrama se debe desarrollar aparte (sin ramas que lo conecten) del diagrama
principal. En el bloque de inicio va el nombre de la subrutina. El nombre en el inicio
SUBPROCESO
debe ser el mismo que en el bloque de invocacin, de esa forma se asocia un
diagrama con otro.
La instruccin que se asocia a este bloque es CALL nnn. El argumento de la misma es un valor numrico
que indica la direccin ROM donde comienza la subrutina.
En lugar de un numero se utiliza una etiqueta, que se define al comienzo de la subrutina como etiqueta de
posicin. El compilador la calcula automticamente.
Las subrutinas se desarrollan antes o despus del programa
SUBPROCESO principal. En el caso de los PIC16F628A se pueden ubicar en
SUBPROCESO
cualquier parte de la ROM
VAR + 1 --> VAR El o los bloques de finalizacin se llaman de retorno. Puede
tener ms de un bloque de finalizacin, el bloque de retorno
RETORNO
que se ejecute al cumplirse alguna condicin se le llama
retorno condicionado.
SUBPROCESO
incf
VAR2,f
return
Otra forma puede ser
SUBPROCESO
incf
VAR2,f
retlw PRONTO
PROGRAMA_PRINCIPAL
.
call
SUBPROCESO
.
.
call
SUBPROCESO
.
.

;Cada subrutina comienza con la etiqueta de su nombre


;Incrementar registro VAR2
;Retornar al bloque siguiente al llamado de subrutina
;Cada subrutina comienza con la etiqueta de su nombre
;Incrementar registro VAR2
;Retornar con el valor PRONTO en W

;Se invoca a la subrutina llamada SUBPROCESO


;Al volver de la subrutina se sigue en esta lnea
;Se invoca de nuevo la subrutina SUBPROCESO
;Al volver de la subrutina se sigue en esta lnea

La conexin entre el programa principal y la subrutina son las variables que se comparten, llamadas de
intercambio. Es decir las usa el programa principal y las usa la subrutina. Se debe tener cuidado de no
alterar ninguna variable que se necesite con su valor original despus de ejecutar la subrutina y regresar al
programa principal.
La unin entre la subrutina y el programa principal es la o las variables que usen en comn. El programa
principal entrega los datos a la subrutina en las variables de entrada y las variables en que la subrutina
entrega sus datos son variables de salida.

78

ROM
PROG. PRINCIPAL

Instruccin
Instruccin
CALL nnn
Instruccin
Instruccin
CALL nnn
Instruccin

nnn

Instruccin
Instruccin

SUBRUTINA

Cada vez que el procesador ejecuta una instruccin CALL guarda el PC en la


pila, cada vez que ejecuta una instruccin RETURN o RETLW el ltimo valor
de la pila es cargado en el PC. Del tamao de la pila depende la cantidad de
subrutinas que pueden anidarse. Si el dispositivo puede guardar datos en la
pila que no sea el PC, se debe tener cuidado de sacarlos antes de terminar y
regresar de la subrutina.
La PILA del pic16f628a permite guardar 8 direcciones de vuelta de subrutinas,
se usa exclusivamente para direcciones de retorno. Eso implica que se
pueden anidar hasta 8 subrutinas una dentro de otras. Si se supera este
nmero se perder la posicin del primer regreso por sobre-escritura.
Como el PC guarda la direccin de la prxima instruccin a ejecutar, la
instruccin return hace volver el PC a la instruccion siguiente de la instruccion
CALL que realiz la llamada.
El diagrama muestra como suceden los saltos cuando se invoca una subrutina
ubicada a partir de 0xnnn, se observa la caracteristica de poder ser invocada
varias veces desde distintas partes del programa principal.

Instruccin
RETURN

Ejercicio: Realizar una rutina que halle la diferencia absoluta entre dos
nmeros, ambos cargados de forma directa.
INICIO

COMPLEMENTO A2

La subrutina puede ser invocada tantas veces como se


VAR1 <-- nn1
necesite. Las variables que usa deben tener el valor
FF VAR2 --> VAR2
adecuado. En el ejercicio la variable de entrada y de salida es
VAR2 <-- NN2
VAR2 + 1 --> VAR2
VAR2. Para operar en la subrutina [COMPLEMENTO A2] se
copia RESTA en VAR2. Al volver de la misma se copia el
COMPLEMENTO A2
RETORNO
valor de la variable de salida en RESTA. Al finalizar el
VAR1

VAR2
-->
RESTA
programa en la variable RESTA se encuentre el valor de la
diferencia entre nn1 y nn2.
NO
Si la subrutina altera alguna variable de la que no queremos
CY = 0
perder su valor debemos hacer un respaldo o copia de ella.
SI
Al finalizar la subrutina esta automticamente vuelve
RESTA --> VAR2
al programa principal. Se retorna a la siguiente instruccin
despus del llamado a subrutina. Esto es posible gracias a la
COMPLEMENTO A2
pila, la cual es una estructura lgica que permite almacenar
VAR2 --> RESTA
datos en forma temporal, con fcil acceso. En algunos micros
es un rea de la memoria RAM definida por el usuario, en
FINAL
otros son registros especiales para tal fin. La pila puede estar
definida en la RAM o ser hardware en registros especiales. Al menos se debe guardar el valor de contador
de programa. La profundidad o capacidad de la pila limita la posibilidad de encadenar subrutinas una dentro
de otra.
La pila del PIC16F628A es un banco de 8 registros (por hardware) de 13 bit usados nicamente para este
propsito. Solo almacena valores del PC. Esto limita a solo 8 subrutinas anidadas.
INICIO

Considerar 2 series cuyos punteros


son P1 y P2 ambas de igual longuitud,
una comienza en ORIG1 y la otra en
ORIG2. La cantidad de elementos se
almacena en K
Generar una nueva serie intercalando
los elementos de ambas series,
colocando primero el mayor de cada
pareja, comenzada en DEST.
Este ejercicio trabaja con 3 punteros
logicos pero en el micro solo hay un
puntero fisico (FSR). Se va alternando
cada uno de los valores de los 3
punteros en FSR.
Se usa direccionamiento indirecto por
registro. La seleccion del mayor lo
haremos en una subrutina.

MAYOR

D1 - D2
M(P1) D1
M(P2) D2

DEST + 1 DEST
P1 + 1 P1

D1 < D2
NO

MAYOR

P2 + 1 P2

D1 DM1

DM1 M(DEST)

K-1K

D2 DM2

DEST + 1 DEST
DM2 M(DEST)

NO

K = 00
SI

FIN

RETORNO
D1 DM2
D2 DM1

79

RETORNO

SI

Este diagrama es una solucion general. Muchos de los bloques no pueden ser representados por una
instruccion. Por lo tanto convertiremos esos bloques en varios ms simples.
La subrutina tiene 2 posibles retornos. Cuando ambos valores son iguales no importa cual se coloque
en DM1 y en DM2.
Las variables D1, D2, DM1 y DM2 sirven para el intercambio de informacion entre la subrutina y el programa
principal.
Se personaliza y desglosa el diagrama en bloques mas simples.
INICIO

INICIO

MAYOR
movf

D2, W

D2 W

W FSR

subwf

D1, W

D1 - W

INDF W

btfss
goto

STATUS, CY
NOMAYOR

CY = 1

P1 W

movf P1, W
movwf FSR
movf INDF, W
movwf D1

MAYOR

W D1
P2 W

movf P2, W
movwf FSR

W FSR

DEST, F

return
NOMAYOR
movf

MAYOR
DEST W

movf DM1, W
movwf INDF

DM1 W

movf

W INDF

movwf DM1
return

DEST W

movf DM2, W
movwf INDF

DM2 W

W FSR

W INDF
DEST + 1 DEST

incf

DEST, F

incf

P1, F

P1 + 1 P1

incf

P2, F

P2 + 1 P2
K-1K
NO

K = 00
SI

FIN

D1, W

movwf DM2

DEST + 1 DEST

FIN

80

NO

D1 W
W DM1
D2 W
W DM2
RETORNO

W FSR

movf DEST, W
movwf FSR

decfsz K, F
goto
INICIO

D2, W

movwf DM2

W D2

call MAYOR

incf

movf

INDF W

movf INDF, W
movwf D2

movf DEST, W
movwf FSR

movf
D1, W
movwf DM1

SI

D2, W

NOMAYOR

D1 W
W DM2
D2 W
W DM1
RETORNO

;------------Ejercicio con 3 punteros ----------------------;Es aconsejable llenar el programa de comentarios que guen en la comprensin del mismo
;Para simularlo se debe cargar en las posiciones 0x20, 0x21, 0x22 y 0x23 valores adecuados y
;los registros RAM del espacio de las series con datos variados.
;Primero definir el micro a usar y las condiciones de uso
LIST
p=16f628a
;Configura el ensamblador
__CONFIG
0x2150
;Configura Oscilador XT ,No WDT, Si PWRT, No CP
;Se debe definir los valores de las variables y constantes a usar.
P1
EQU
0x20
;Puntero logico de la serie 1
P2
EQU
0x21
;Puntero logico de la serie 2
DEST
EQU
0x22
;Puntero de la serie resultante
K
EQU
0x23
;variable con el nro de elementos de cada serie
DM1
EQU
0x24
;Variable de intercambio con la subrutina
DM2
EQU
0x25
;Variable de intercambio con la subrutina
D1
EQU
0x26
;Variable de intercambio con la subrutina
D2
EQU
0x27
;Variable de intercambio con la subrutina
CY
EQU
.0
;El orden de los bit los expreso en decimal
;Cargo los nombres de los FSR mediante el comando include
include
<p16f628a.inc>
ORG
VECTOR_RESET
MAYOR
movf
subwf
btfss
goto
movf
movwf
movf
movwf
return
NOMAYOR
movf
movwf
movf
movwf
return
;Programa principal
INICIO
movf
movwf
movf
movwf
movf
movwf
movf
movwf
call
movf
movwf
movf
movwf
incf
movf
movwf

0x000
goto

INICIO

D2, W
D1, W
STATUS, CY
NOMAYOR
D1, W
DM1
D2, W
DM2

;Salto por encima de las subrutinas


;Etiqueta dce posicion que identifica la subrutina
;Comparo mediante resta ambos valores
;Si D1 > D2 salto la sifguiente instruccin
;Si son iguales no importa el orden
;En DM1 coloco el mayor de ambos
;En DM2 coloco el menor de ambos
;

D1, W
DM2
D2, W
DM1

P1, W
FSR
INDF, W
D1
P2, W
FSR
INDF, W
D2
MAYOR
DEST, W
FSR
DM1, W
INDF
DEST, F
DEST, W
FSR

;Llevo el valor del primer puntero logico al FSR


;Unico puntero fisico de la RAM
;
;Cargo la variable de intrercambio
;Llevo el valor del segundo puntero logico al FSR
;
;
;Cargo la Variable de intercambio

;leo la variable de intercambio


;Actualizo el puntero destino

81

FIN

movf
movwf
incf
incf
incf
decfsz
goto

DM2, W
INDF
DEST, F
P1, F
P2, F
K, F
INICIO

;leo la variable de intercambio


;Actualizo el puntero destino
;Apunto al siguiente elemento
;Apunto al siguiente elemento
;Cuento los elementos que faltan procesar

END
Nunca salir de una subrutina con la instruccin goto, eso genera que la pila se llene y desborde.
Situacin que se agrava si son subrutina anidadas.

Direccionamiento Indexado
Este micro solo posee un puntero para memoria RAM, y no aceptar cargar datos en la memoria de
programa. Una forma de recuperar datos desde la ROM es mediante direccionamiento inmediato, (movlw k,
addlw k, y otras instrucciones que trabajan con literales). Pero se puede usar el contador de programa PC
para obtener datos guardados en la ROM de programa. El PC siempre guarda la direccin de la prxima
instruccin a ejecutar.
El PC se pude alterar a travs de 2 registros, PCL y PCLATH
PCL - Registro de lecto/escritura copia los bit 0 a bit 7 del PC.
PCLATH - Registro de solo escritura permite cargar del bit 8 al bit 12 del PC.
Cualquier operacin sobre PCL altera al PC, o sea a la secuencia del programa, y vuelca PCLATH en los 5
MSB del PC. Este salto es un GOTO COMPUTADO. Un desborde o borrow en PCL no afecta a los bits altos
del PC.
La instruccin addwf PCL,F suma W al registro PCL y guarda el resultado en PCL. Vuelca el PCL en el
byte LSB del PC, y el PCLATH en los 5 MSB del PC.
Esta instruccin altera el PC segn el resultado de esta instruccin concatenado al valor cargado en
PCLATH. Lo cargado en PCLATH no se afecta a menos que sea escrito, pues no lee al PC sino que lo
carga solamente.
Si W = 3F , PCLATH = 03 y PC=0210 por lo tanto PCL = 10
addwf
PCL,F
Da como resultado PCL = 4F entonces PC=034F. Se produce un salto computado hacia delante en el
programa
Si W = 1A , PCLATH=01 y PC = 1F3 entonces PCL = F3
addwf
PCL,F
Da como resultado PCL = 0D entonces PC = 010D. Se produce un salto computado hacia atrs en el
programa.
Se puede usar cualquier instruccin que tenga a PCL como destino.

*La instruccin

retfie
retfie

produce el retorno de una subrutina con el valor literal k cargado en W.


k
; Pila PC y k W

Ejercicio:
Realizar una rutina que tome el valor binario de la posicion 0x70 y halle el equivalente BCD de las unidades
y decenas. Guarde este resultado en los nibles de la posicin 0x7F, unidades en el nible bajo y decenas en
el nible alto. Utilizar la obtencin de datos mediante direccionamiento indexado.
La letra pide las decenas y las unidades del dato ya que con 8 bits solo se pueden representar 2 simbolos
BCD. Podria realizarse mediante clculos aritmeticos, el usar tabla es ms rapido y todos los datos
demoran lo mismo en ser procesados.
Con 8 bits hay 256 valores posibles, pero con decenas y unidades solo 100 valores. Una forma es para
cada posible valor de la posicin 0x70 tener un elemento de la tabla que represente sus unidades y
decenas. Implica tener una tabla de 256 elementos. Otra forma es determinar, si es mayor a 200 restarle
200 , si es mayor de 100 restarle 100, en otro caso no restarle nada. Asi se obtiene el valor de decenas y
unidades en binario, con una tabla de 100 elementos alcanzaria.

82

INICIO
M(70) --> DATO
PROCESAR DATO

CONVERSOR
M(Ind + k) --> W
RETORNO

CONVERSOR
W --> M(7F)

200h 20Ah 214h 21Eh 228h 232h 23Ch 246h 250h 25Ah
00
01
02
03
04
05
06
07
08
09

10
11
12
13
14
15
16
17
18
19

20
21
22
23
24
25
26
27
28
29

30
31
32
33
34
35
36
37
38
39

40
41
42
43
44
45
46
47
48
49

50
51
52
53
54
55
56
57
58
59

60
61
62
63
64
65
66
67
68
69

70
71
72
73
74
75
76
77
78
79

80
81
82
83
84
85
86
87
88
89

90
91
92
93
94
95
96
97
98
99

En el diagrama se incluye la tabla ROM con los datos y direcciones que ocupen. En la cabecera de cada
columna esta escrito el valor de direccion ROM para el dato inmediato, los demas van en posiciones
consecutivas. Si los datos no estan en posiciones consecutivas es necesario indicar la direccion de cada
elemento.
El uso del direccionamiento indexado supone el uso de una tabla en la ROM. Se carga PCLATH con el valor
de la pagina ROM donde se encuentra la tabla.
El bloque PROCESAR DATOS se desglosa en bloques mas simples. El proceso es restar 100, si el dato es
menor a 100 el CY ser igual a 0 sino sera 1. Mas de 3 restas no sera necesario realizar.
DATO 64 --> DATO

PROCESAR DATO

CY = 1
Basicamente se resta 100 (64h) hasta que hay borrow.
El resultado si se le suma de nuevo 100 dara el valor
de las decenas y unidades del dato. Se observa la
estructura de resta repetitiva y se convierte en un lazo,
donde la variable de lazo es el CY.

NO

SI

DATO 64 --> DATO

DATO 64 --> DATO


CY = 0

SI

NO

SI

CY = 1
NO

DATO + 64 --> DATO

DATO + 64 --> DATO


INICIO
movf 0x70, W
mowf INDAT
INDAT --> DATO
PROCESAR
movlw d'100'
subwf DATO, F
DATO 64 --> DATO
btfsc STATUS, CY
SI
goto
PROCESAR
CY = 1
INICIO

NO

DATO + 64 --> DATO


CONVERSOR
W --> OUTDT

02 --> PCLATH
DATO --> PCL

movlw d'100'
addwf DATO, F
call

CONVERSOR

M(PC) --> W

CONVERSOR

RETORNO

CONVERSOR
movlw
0x02
movwf PCLATH
movf
movwf

DATO, W
PCL

;Se produce un goto


;computado

movwf OUTDT
goto
INICIO

La tabla ROM se escribe en el programa con instrucciones RETLW k, en cada posicin de memoria, donde
k es el dato deseado. Colocando la etiqueta de posicin en la direccion adecuada el ensamblador calcula la
direccion para las instrucciones que le sigan. En este programa la etiqueta de posicin esta ubicada en
0x200. En estas posiciones los 8 LSB los carga el PCL, los 5 MSB los carga el PCLATH, por esto se carga
02 en el mismo.
Se sustituye los valores 0x70 y 0x7F por las etiquetas INDAT y OUTDT

83

;Conversor de Binario a BCD con direccionamiento indexado


; primero seteamos Palabra de Configuracin
LIST
p=16f628S
;Indico compilar para el PIC16F628A
__CONFIG
0x2051
;Selecciono XT, PWTE, No WDT y No CP
__IDLOCS
0x0008
;Identifico el software
;---------Declaro los nombres de todos los SFR (registros de uso especial)----------include <p16f628a.inc>
;------------ Declaro todas las constantes, etiquetas y variables a usar-------------DATO
EQU
0x22
CY
EQU
.0
INDAT
EQU
0x70
OUTDT
EQU
0x7F
;Comienzo el programa colocando el programa en la posicin ROM donde se buscara la primera
;instruccin al salir de reset
ORG
0x000
VECTOR_RESET
goto
PRINCIPIO
ORG
0x004
VECTOR_DE_INTERRUPCION
SUBRUTINAS
;*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.
CONVERSOR
movlw
movwf

0x02
PCLATH

movf
DATO, W
movwf
PCL
;Se produce un goto computado
;Debido al goto computado aqui no lleva instruccin de retorno
;*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*ORG
0x100
PRINCIPIO
INICIO
movf
INDAT, W
movwf
DATO
PROCESAR
movlw
d'100'
subwf
DATO, F
btfsc
STATUS, CY
goto
PROCESAR
movlw
addwf

d'100'
DATO, F

call

CONVERSOR

movwf

OUTDT

goto
INICIO
;El programa no tiene fin vuelve a iniciarse
;El programa principal termino pero despus de l se coloca una subrutina que viene
;de la pgina 00
;-----------------------------TABLA ROM---------------------------------------ORG
0x200
BINBCD
retlw
0x00 ;Como se sali del programa principal llamando a una subrutina,
84

retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw

0x01
0x02
0x03
0x04
0x05
0x06
0x07
0x08
0x09
0x10
0x11
0x12
0x13
0x14
0x15
0x16
0x17
0x18
0x19
0x20
0x21
0x22
0x23
0x24
0x25
0x26
0x27
0x28
0x29
0x30
0x31
0x32
0x33
0x34
0x35
0x36
0x37
0x38
0x39
0x40
0x41
0x42
0x43
0x44
0x45
0x46
0x47
0x48
0x49
0x50
0x51
0x52
0x53
0x54
0x55
0x56
0x57
0x58
0x59

;en la pila tengo la posicin donde debo regresar


;al programa principal.
;

85

retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
;Fin de la tabla ROM
END

0x60
0x61
0x62
0x63
0x64
0x65
0x66
0x67
0x68
0x69
0x70
0x71
0x72
0x73
0x74
0x75
0x76
0x77
0x78
0x79
0x80
0x81
0x82
0x83
0x84
0x85
0x86
0x87
0x88
0x89
0x90
0x91
0x92
0x93
0x94
0x95
0x96
0x97
0x98
0x99

;Aqui termino el programa fuente

86

Contadores y Temporizadores:
Son estructuras lgicas que permiten contar eventos.
El primero comnmente se refiere a eventos o seales, su perodo es variable segn qu lo haga actuar,
son de pequeo valor y baja frecuencia.
El segundo se refiere a medir el tiempo, su uso es en general para producir retardos. Lo normal es usar el
ciclo de mquina para modificarlo, por lo que no es raro que sean de gran tamao. Inclusive es comn usar
varios registros para formar una cifra mayor.
El micro es ms rpido que la mayora de los actuadores o que las acciones del operador. Es vital en
algunos casos generar demoras para poder esperar resultados, ah el lazo en conjunto con un contador
permite hacer un retardo o espera. Los micros ms modernos permiten colocar al chip en modo STANDBY
o POWER DOWN, donde no se ejecutan instrucciones ni se avanza en el programa. El mismo sale de dicho
estado cuando se presentan ciertas seales externas como peticiones de interrupcin o reset.
En los casos que no se puede detener el micro o se necesita seguir haciendo otras funciones se pueden
implementar retardo. El temporizador bsico consta de una variable dentro de un lazo, donde en cada
iteracin se le suma o resta uno a dicha variable. Asignarle un valor antes del lazo y disminuir la variable del
contador es la ms usual. Debido a que es ms sencillo detectar cuando se hace cero (bandera Z=1) que
cualquier otro valor.
Esta es la estructura base de un contador. Al llegar a 00 se sale del loop. El clculo de tiempo de duracin
del contador debe ser realizado tomando en cuenta el tiempo de instruccin de todas las instrucciones que
lo componen.
K nn
LAZO

0xnn
K

;Dura 1 ciclo
;Dura 1 ciclo

Decfsz

K, F

;Dura 1 ciclo y si salta 2 ciclos

Goto

LAZO

;Dura 2 ciclos

LAZO

K1K
K = 00

Movlw
Movwf

SI

NO

Temporizador 8 bits

La instruccin decfsz K, F demora 1 ciclo en los nn-1 veces que el resultado no es 00. Cuando K se hace
00 esta instruccin genera el salto y demora 2 ciclos.
La instruccin goto LAZO siempre dura 2 ciclos y se ejecuta nn-1 veces.
Si se usa el oscilador interno de 4Mhz, cada ciclo de instruccin dura aproximadamente 1 micro-segundo.
La ecuacin de sumar todos los ciclos de instruccin es:
1 + 1 + 1x (nn-1) + 2 + 2x (nn-1)=
3 (nn 1) + 4 =
3 nn + 1 =
Para OSC= 4Mhz y nn = 1
3 x 1 + 1 = 4 micro-segundos
Para OSC= 4Mhz y nn = 255
3 x 255 + 1 = 766 microsegundos
Las simplificaciones realizadas desprecian el valor nn = 00. En la ecuacin resumida queda:
0 +1 = 1 microsegundo
En la original es:
3 x (00 -1) + 4 =
El sistema de numeracin es limitado en cifras, as que (00 1) es igual a 255:
3 x (255) + 4 = 769 microsegundos
Si con una variable no alcanza se pueden usar dos contadores encadenados. Encadenar dos contadores
permite dar mayor exactitud al contador completo, y ms fcil de variar si queremos modificarlo que si fuese
una variable sola. Adems muchas veces los registros del micro son pequeos para el valor que se necesita
del retardo. En el ejemplo del temporizador de 16bit se realiza el lazo central 5E x 2A veces. El clculo
exacto de cunto dura un retardo depende del nmero de instrucciones ejecutadas antes de terminar el
contador, cuanto dura cada instruccin, etc. A su vez la duracin de la instruccin depende del oscilador
principal, una diferencia de nanosegundos en cada ciclo de instruccin se convierte en varios minutos al
87

cabo de un rato. El ajuste final se debe realizar en forma emprica, as que cuanto ms ajuste pueda tener el
programa ms exacto puede ser el temporizador.
El encadenamiento de variables para ampliar un temporizador o contador puede ser tan grande como se
necesite. Cada variable agrega 8 bit al contador/temporizador.
Se llaman contadores de 8 bit, 16 bit, 24 bit, etc
K2 nn2
LAZO2

LAZO2

K1 nn1
LAZO1

Movlw nn2
Movwf K2

; 1c
; 1c

Movlw nn1
Movwf K1

; [1c] x nn2
; [1c] x nn2

Decfsz

K1, F

; [1c x (nn1 1) + 2] x nn2

Goto

LAZO1 ; [2c x (nn1 1) ] x nn2

Decfsz

K2, F

Goto

LAZO2 ; 2c x (nn2 1)

LAZO1

K 1 1 K1
NO

K1 = 00
SI

K2 1 K2
NO
K2 = 00

; 1c x (nn2 1) + 2

SI

Temporizador 16 bits

Tomando en cuenta el temporizador de 8 bit la ecuacin de este seria:


3 x (nn2 1) + 4 + [3 x (nn1 1) + 4] x nn2 =
Despreciando que ninguna de las variables nn2 o nn1 sea 00 queda:
3 x nn2 x nn1 + 4 x nn2 + 1 =
Si nn2 = nn1 = 255 y OSC = 4MHz
3 x 255 x 255 + 4 x 255 + 1 = 196.865 microsegundos
K3 nn3
LAZO3
K2 nn2

LAZO3

LAZO2
K1 nn1

LAZO2

LAZO1
K 1 1 K1
NO

K1 = 00
SI

Movlw nn3
Movwf K3

; 1c
; 1c

Movlw nn2
Movwf K2

; {1c} x nn3
; {1c} x nn3

Movlw nn1
Movwf K1

; {[1c] x nn2} x nn3


; {[1c] x nn2} x nn3

Decfsz

K1, F

;{ [1c x (nn1 1) + 2] x nn2} x nn3

Goto

LAZO1 ; {[2c x (nn1 1) ] x nn2} x nn3

Decfsz

K2, F

Goto

LAZO2 ; {2c x (nn2 1)} x nn3

Decfsz

K3, F

Goto

LAZO3 ; 2c x (nn3 1)

LAZO1

K2 1 K2
NO
K2 = 00
SI
K3 1 K3
NO
K3 = 00

; {1c x (nn2 1) + 2} x nn3

; 1c x (nn3 1) + 2

SI

Temporizador 24 bits

Tomando en cuenta la ecuacin para el temporizador de 16 bits:


3 x (nn3 1) + 4 + {3 x (nn2 1) + 4 + [3 x (nn1 1) + 4] x nn2} x nn3 =
Despreciando que ninguna de las variables nn3, nn2 o nn1 sea 00 queda:
3 x nn3 x nn2 x nn1 + 4 x nn3 x nn2 + 4 x nn3 + 1 =
Si nn3 = nn2 = nn1 = 255 y OSC = 4MHz
3 x 255 x 255 x 255 + 4 x 255 x 255 + 4 x 255 + 1 = 50:005.246 microsegundos

88

Herramientas de Programacin
El uso de este entorno de desarrollo (IDE) se basa en la idea de generar un proyecto donde se escribe el
archivo fuente y todas las libreras que se necesiten (algunas ya las incluye el propio entorno). Despus el
MPLAB genera el resto del trabajo.
La versin usada en este curso podra ser de la 5.70.40 en adelante que es la primera que soporta al
PIC16F628A.
En otro material se incluye las explicaciones de cmo se utiliza. Debido a una cuestin de costos solo
usaremos las utilidades de MPLAB que no requieren hardware extra.

PROGRAMADOR
Se usara el que este disponible

PROBADOR
Para simularle el mundo al pic usaremos un banco de LEDs, un banco de switch, una matriz de leds y una
matriz de switch. La fuente es de 5 volt, se aconseja que sea regulada debido a la tolerancia del pic
Agregamos el plano electrnico sugerido.

89