Está en la página 1de 69

CURSO DE MICROCONTROLADORES

PIC16F87X Fernando Remiro Domnguez


Profesor de Sistemas Electrnicos
IES. Juan de la Cierva
www.terra.es/personal/fremiro

Equipos de desarrollo para


trabajar con la familia de
microcontroladores PIC16F87X.

Procesador de arquitectura
RISC avanzada
Juego de solo 35 instruccio-
nes de 14 bits de longitud.
Todas ellas se ejecutan en
un ciclo de instruccin,
menos las de salto que tar-
dan dos.
NOVEDADES

Hasta 8K palabras de 14 bits


para la Memoria de Progra-
ma, tipo FLASH en los
modelos 16F876 y 16F877
y 4KB de memoria para los
omenzamos este formas se recomienda a los lec- PIC 16F873 y 16F874.
72
RESISTOR
C nuevo curso des-
pus de la acepta-
cin que han
teniendo los ante-
riores relacionados con el mun-
do de los microcontroladores
PIC. En esta Revista se han
tores que vayan a seguir este
curso que consigan el software
MPLAB que se puede bajar de
la web de Arizona Microchip
www.microchip.com, as mis-
mo, se necesitar un programa-
dor para los microcontrolado-
Hasta 368 Bytes de memoria
de Datos RAM.
Hasta 256 Bytes de memoria
de Datos EEPROM.
Pines de salida compatibles
para el
16C73/74/76/77.
PIC

publicado con anterioridad el res, es valido cualquiera de los Hasta 14 fuentes de interrup-
Curso de aplicaciones con publicados en esta Revista, cin internas y externas.
microcontroladores PIC basa- pero como ya hemos dicho a lo Pila de 8 niveles.
do en el microcontrolador PIC largo del curso plantearemos Modos de direccionamiento
16F84, escrito por el Dr. Euge- alguno de bajo costo. Espera- directo e indirecto.
nio Martn Cuenca, (revistas n mos que os guste el curso y lo Power-on Reset (POP).
161 a 171), y el Curso de pro- disfrutis. Temporizador Power-on
gramacin de Microcontrola- (POP) y Oscilador Tempori-
dores PIC: El MPLAB, escri- El corazn de los zador Start-Up (OST).
to por el profesor Fernando Microcontroladores Perro Guardin (WDT).
Remiro Domnguez (revistas n PIC16F87X Cdigo de proteccin pro-
179-187). En el nmero 189 gramable.
hemos publicado un Mdulo La mejor forma de comen- Debugger In-Circuit
de aprendizaje sobre microcon- zar a estudiar un microcontrola- Modo SLEEP de bajo con-
troladores PIC diseado por el dor, en este caso una familia de sumo.
profesor Juan de Dios Calle, microcontroladores es la de ver Programacin serie en cir-
sobre el que se podrn realizar sus caractersticas ms relevan- cuito con dos pines.
las prcticas que se diseare- tes, y es justamente lo que Solo necesita 5V para pro-
mos para este curso. No obs- vamos a hacer en las siguientes gramarlo en este modo.
tante, iremos planteando a lo lneas: Voltaje de alimentacin com-
largo de este curso, la realiza- prendido entre 2 y 5,5 V.
cin practica de herramientas Principales Caractersticas Bajo consumo:
de fcil desarrollo y bajo coste, Enumeramos las prestaciones y < 2 mA valor para 5 V y 4 Mhz
para hacer verdaderamente dispositivos especiales que 20 A para 3V y 32 Mhz
prctico este curso. De todas rodean a los PIC16F87X.. <1 A en standby
Dispositivos Perifricos
Tirner0: Temporizador-con-
tador de 8 bits con preesca-
ler de 8 bits
Timerl: Temporizador-conta-
dor de 16 bits con preesca-
ler que puede incrementarse
en modo sleep de forma
externa por un cristal/clock.
Timer2: Temporizador-con-

NOVEDADES
tador de 8 bits con preesca-
ler y postescaler.
Dos mdulos de Captura,
Comparacin, PWM
(Modulacin de Anchura de
Impulsos).
Conversor A/D de 10 bits.
Puerto Serie Sncrono Mas-
ter (MSSP) con SPI e I2C
(Master/Slave). Encapsulado DIP,SOIC de 28 pines.
USART/SCI (Universal
Syncheronus Asynchronous
Receiver Transmitter) con 9
bit.
73
RESISTOR
Puerta Paralela Esclava
(PSP) solo en encapsulados
con 40 pines
Diferencias entre los
modelos de 28 y los
de 40 patitas

El PIC 1 6F873 y el 876 tie-


nen 28 pines, mientras que el
PIC 16F874 y 877 tienen 40.
Nos centraremos en el PIC
16F873 y las diferencias que
tiene con sus hermanos son
mnimas y se detallan a conti-
nuacin:

1. Los modelos de 40 pines


disponen de 5 Puertos de E/S:
A, B, C, D y E, mientras que
los de 28 solo tienen 3 Puer-
tos: A, B y C.
2. Los modelos de 40 pines
tienen 8 canales de entrada al
Conversor A/D, mientras que
los de 28 solo tienen 5 canales.
3. Slo poseen la Puerta Para-
lela Esclava los PIC 16F87X
de 40 pines. Encapsulado PDIP de 40 pines.
Caractersticas 16F873 16F874 16F876 16F877

Frecuencia Mxima DC-20Mhz DX-20Mhz DX-20Mhz DX-20Mhz


Memoria de programa 4KB 4KB 8KB 8KB
FLASH Palabra de 14 bits
Posiciones RAM de datos 192 192 368 368
Posiciones EEPROM de datos 128 128 256 256
Ports E/S A, B y C A, B, C y D A, B y C A, B, C y D
N de Pines 28 40 28 40
Interrupciones 13 14 13 14
Timers 3 3 3 3
NOVEDADES

Mdulos CCP 2 2 2 2
Comunicaciones Serie MSSP, USART MSSP,USART MSSP,USART MSSP, USART
Comunicacin Paralelo - PSP - PSP
Lneas de entrada en 5 8 5 8
Convertidor A/D de 10 bits
Juego de Instrucciones 35 instrucciones 35 instrucciones 35 instrucciones 35 instrucciones
Longitud de la instruccin 14 bits 14 bits 14 bits 14 bits

Tabla 1.- Comparacin de entre los PIC de la Familia 16F87X.

74
RESISTOR
Los PIC 16F87X
Bajo el nombre de esta sub-
En la Tabla 1 se muestran las
caractersticas comparativas
Ejercicio Prctico
Para todos aquellos que ya
familia de microcontroladores, ms relevantes de esta familia habis trabajado con algn
actualmente encontramos cua- de microcontroladores : microcontrolador de Micro-
tro modelos: EL PIC chip, como por ejemplo el
16F873/4/6 y 7. Estos micro- Descripcin global PIC16F84 o ya disponis de
controladores disponen de una del dispositivo un programador para este
memoria de programa FLASH La familia consta de cuatro tipo de microcontroladores,
de 4 a 8 KBytes de 14 bits, con- dispositivos (PIC16F873, os proponemos un primer
siderablemente superior frente PIC16F874, PIC16F876 y programa que ser muy fcil
al PIC 16F84 en el que solo dis- PIC16F877). Los PIC de seguir, ya que el juego de
ponamos de l Kbyte de 14 bits. 16F876/873 entran en el blo- instrucciones es exactamente
Esta caracterstica, junto con la que de dispositivos encapsula- el mismo que para el
posibilidad de realizar, con las dos en 28 pines y los PIC PIC16F84. Se trata de leer el
herramientas adecuadas, un 16F877/874 entran en el blo- valor de las lneas del POR-
debugger en circuito, nos han que de dispositivos encapsula- TA, que conectaremos a unos
parecido de lo ms interesante dos en 40 pines. Los dispositi- interruptores que nos den un
para el aprendizaje de esta fami- vos de 28 pines no tienen 0 o un 1, y mostrar dicho
lia de microcontroladores y pos- implementado el puerto para- valor sobre unos diodos
terior desarrollo de proyectos. lelo esclavo. LEDs conectados al PORTB.
De los microcontroladores Las siguientes figuras Hay que tener en cuenta
indicados, el 16F873 y el corresponden a los diagramas que las entradas del PORTA
16FS76 son de 28 pines, mien- de bloque de los dispositivos. se configuran como entradas
tras que 16F874 y el 16F877 Los de 28 pines en la Figura 3 analgicas, al hacer un reset,
tienen 40 patillas, lo que les y los de 40 pines en la Figura por lo tanto, lo primero que
permite disponer de hasta 33 4, y en la Tabla 2 se muestra tendremos que hacer, es con-
lneas de E/S. En su arquitectu- un listado de cada uno de los figurar estas entradas en el
ra adems incorporan: pines corresponden a los dis- registro ADCON1 como
Varios Timer positivos de 40 que tienen su entradas. Esto lo veremos en
USART correspondiente ptilla en los su momento cuando estudie-
Bus 12C dispositivos de 28 pines. mos los registros de configu-
INFORMTICA
75
RESISTOR

Diagrama de bloques del PIC16F873 Y del PIC16F876.


Nombre Pin DIP PLCC QFP I/O/P Buffer Descripcin
Pin# Pin# Pin# Tipo Tipo
OSC1/CLKIN 13 14 30 I ST/CMOS(4) Entrada externa de reloj
OSC2/CLKOUT 14 15 31 O Salida oscilador de cristal. Conexin a
cristal o resonador en modo oscilador
a cristal. En modo RC, la salida OSC2 es
1/4 de la frecuencia de OSC1,
es el ciclo de instruccin.
MCLR/Vpp/THV 1 2 18 I/P ST Entrada Master Clear (reset) o entrada de
voltaje de programacin o alto voltaje de
prueba en modo control. El Reset se activa
con nivel bajo.
PORTA es bidireccional de Entrada/Salida
RA0/AN0 2 3 19 I/0 TTL RA0 puede ser entrada analgica 0
RA1/AN1 3 4 20 I/O TTL RA1 puede ser entrada analgica 1
RA2/AN2/VREF- 4 5 21 I/O TTL RA2 puede ser entrada analgica 2 o
voltaje negativo de referencia.
RA3/AN3/VREF+ 5 6 22 I/O TTL RA3 puede ser entrada analgica
RA4/TOCKI 6 7 23 I/O ST RA4 puede ser entrada de reloj a TMR0.
La salida es de tipo Drenador Abierto
RA5/SS/AN4 7 8 24 I/O TTL RA5 puede ser entrada analgica 4 o
NOVEDADES

la seleccin del puerto esclavo sncrono.


PORTB es bidireccional de Entrada/Salida.
Puede programarse con polarizacin
interna Pull-up
RB0/INT 33 36 8 I/O TTL/ST(1) RB0 puede ser entrada externa de interrupcin
RB1 34 37 9 I/O TTL
RB2 35 38 10 I/O TTL
RB3/PGM 36 39 11 I/O TTL RB3 puede ser entrada de bajo voltaje
de programacin
RB4 37 41 14 I/O TTL Interrupciones por cambio de estado en la patilla
RB5 38 42 15 I/O TTL Interrupciones por cambio de estado en la patilla

76
RESISTOR
RB6/PGC 39 43 16 I/O TTL/ST(2) Interrupciones por cambio de estado en la patilla
o patilla In-Circuit Debugger o reloj serie para
programacin.
RB7/PGD 40 44 17 I/O TTL/ST(2) Interrupciones por cambio de estado en la patilla
o patilla In-Circuit Debugger o datos serie
para programacin.
PORTC es bidireccional de Entrada/Salida
RC0/T1OSO/T1CKI 15 16 32 I/O ST RC0 puede ser salida oscilador Timer1
o entrada de reloj para Timer1
RC1/T1OSI/CCP2 16 18 35 I/O ST RC0 puede ser entrada oscilador Timer1
o Captu2/COMP2 Salida/PWM2.
RC2/CCP1 17 19 36 I/O ST RC2 Puede ser Captu1 Entrada/Comp1
salida/PWM1.
RC3/SCK/SCL 18 20 37 I/O S/T RC3 puede ser entrada/salida del reloj sncrono
para los modos SPI e I2C.
RC4/SDI/SDA 23 25 42 I/O ST RC4 puede ser datos de entrada SPI (modo SPI)
o datos I/O (modo I2C).
RC5/SDO 24 26 43 I/O ST RC5 puede ser datos de salida SPI (modo SPI).
RC6/TX/CK 25 27 44 I/O ST RC6 Puede ser transmisin asncrona USART
o reloj Sncrono.
RC7/RX/DT 26 29 1 I/O ST RC7 puede ser recepcin Asncrona USART
o datos Sncronos.
PORTD es bidireccional de Entrada/Salida
o puerto esclavo paralelo
RD0/PSP0 19 21 38 I/O ST/TTL(3)
RD1/PSP1 20 22 39 I/O ST/TTL(3)
RD2/PSP2 21 23 40 I/O ST/TTL(3)
RD3/PSP3 22 24 41 I/O ST/TTL(3)
RD4/PSP4 27 30 2 I/O ST/TTL(3)
RD5/PSP5 28 31 3 I/O ST/TTL(3)
RD6/PSP6 29 32 4 I/O ST/TTL(3)
RD7/PSP7 30 33 5 I/O ST/TTL(3)
Nombre Pin DIP PLCC QFP I/O/P Buffer Descripcin
Pin# Pin# Pin# Tipo Tipo
PORTE es bidireccional de Entrada/Salida
RE0/RD/AN5 8 9 25 I/O ST/TTL(3) RE0 puede ser control de lectura del puerto
paralelo, 0 entrana analgica 5
RE1/WR/AN6 9 10 26 I/O ST/TTL(3) RE1 puede ser control de escritura del
puerto paralelo o entrada analgica 6
RE2/CS/AN7 10 11 27 I/O ST/TTL(3) RE2 puede ser control de seleccin del
puerto paralelo, entrana analgica 7
VSS 12,31 13,34 6,29 P Masa lgica y patillas de Entrada/Salida
VDD 13,31 12,35 7,28 P Positivo para lgica y patillas
de Entrada/Salida
NC 1,17,28, 12,13, No tienen conexin interna.
40 33,34 Deben mantenerse sin conexin.
Leyenda: I = Entrada O = Salida I/O = Entrada/Salida P = Alimentacin
= No usada TTL = Entrada TTL ST = Entrada Trigger Schmitt
Notas.-
1: Este buffer es una entrada Trigger Schmitt cuando se configura como interrupcin externa
2: Este buffer es una entrada Trigger Schmitt en modo programacin
3: Este buffer es una entrada Trigger Schmitt cuando se configura como I/O y entrada TTL en modo puerto paralelo

INFORMTICA
4: Este buffer es una entrada Trigger Schmitt cuando se configura en modo oscilador RC y entrada CMOS en otros casos
Descripcin de los Pines del PIC 16F874 y PIC16F877.

77
RESISTOR

Diagrama de Bloques del PIC16F874 y 16F877.


racin del convertidor Anal-
gico/Digital, pero vale la
pena que lo comentemos
aqu.

El organigrama del progra-


ma es el que se muestra en la
Figura 5 y el programa es el
de la Tabla 3. Por supuesto que
este programa tambin pode-
mos simularlo en el programa
MPLAB, que como ya hemos
comentado en nmeros ante-
riores es gratuito y de libre
distribucin.
NOVEDADES

Organigrama del Programa ES1.

;***************************************************************************************************
; Programa ES1.ASM Fecha : 11- Febrero-2002
; Este programa configura las entradas del PORTA como entradas digitales y lee el
; contenido del PORTA y muestra su valor sobre los diodos LED conectados al PORTB
; Revisin : 0.0 Programa para PIC16F87X
; Velocidad del Reloj: 4 MHz Reloj Instruccin: 1 MHz = 1 uS
; Perro Guardin: habilitado Tipo de Reloj : XT

78
RESISTOR
; Proteccin del cdigo: OFF
;****************************************************************************************************
List p=16F876 ;Tipo de procesador
include P16F876.INC ;Definiciones de registros internos

ORG 0x00 ;Vector de Reset


goto INICIO

ORG 0x05 ;Salva el vector de interrupcin

INICIO clrf PORTB ;Borra los latch de salida del PORTB


bsf STATUS,RP0 ;Selecciona banco 1
movlw b00000110
movwf ADCON1 ;PORTA E/S digitales
clrf TRISB ;Configura PORTB como salida
movlw b00011111
movwf TRISA ;Configura PORTA como entrada
bcf STATUS,RP0 ;Selecciona banco 0

BUCLE movf PORTA,W ;Lee el PORTA sobre W


movwf PORTB ;Escribe el valor de W en el PORTA
goto BUCLE ;Salta a BUCLE

END

Programa ES1.asm.
CURSO DE MICROCONTROLADORES
PIC16F87X (...Y II)
NUESTROS CURSOS

44
RESISTOR

ORGANIZACIN dispositivos de PIC16F877/876 Funciones Especiales (FSR). Los


DE LA MEMORIA tienen 8K x 14 posiciones de bits RP1 (STATUS <6>) y RP0
memoria de programa tipo (STATUS <5> ) seleccionan cada
FLASH y el PIC 16F873/874 uno de estos Bancos, de acuerdo a
Esta familia de microcontrolado- tienen 4Kx 14. Acceder a una la Tabla1.
res, al igual que el PIC16F84, posicin de memoria no
dispone den de tres bloques de implementada, provoca la lectura RP1 RP0 Banco
memoria. La Memoria de 0 0 Banco 0
o escritura de la posicin de
Programa y la Memoria de Datos 0 1 Banco 1
RAM que tienen los buses sepa- memoria envolvente.
1 0 Banco 2
rados para poder permitir el El vector de Reset est en la 1 1 Banco 3
acceso simultneo a estos dos posicin de memoria 0000h y el
bloques y la Memoria de datos vector de Interrupcin est en la Tabla 1.- Seleccin de los
EEPROM. posicin de memoria 0004h. Bancos de memoria RAM con
RP0 y RP1
Organizacin de la Organizacin de la
Memoria de programa Memoria de datos En cada Banco hay 7Fh posi-
Los dispositivos de PIC 16F87X La memoria de los datos se divide ciones de memoria (128 bytes).
Las posiciones ms bajas estn,
tienen un contador de programa de en los cuatro Bancos que contiene
reservadas para los Registros de
13 bits capaz de direccionar 8Kxl4 los Registros de Propsito Funciones Especiales. Por enci-
posiciones de memoria. Los Generales y los Registros de la ma de los Registros de Funciones
Las Figuras 1 y 2 muestran el mapa de memoria y Stack de los PIC16F876/7 y PIC16F873/4

NUESTROS CURSOS
45
RESISTOR

Figura 1.- Mapa de Memoria y Figura 2.- Mapa de Memoria y


STACK del PIC16F876/877 SACK del PIC16F873/874

Especiales se encuentran los tienen disponibles 80 bytes de en la Figura 4 en la que se presenta


Registros de Propsito General, memoria para datos (Registros la definicin de los Bancos, tienen
que se utilizan como posiciones de Propsito General) que son disponibles 96 bytes en el Banco 0,
de memoria RAM esttica. independientes los unos de los que son conjuntamente accedidos a
Todos estn estructurados en otros. Los Bancos 2 y 3 tienen 16 travs del Banco 2. El Banco 1
Bancos. Algunos Registros de bytes adicionales, que son tam- tiene igualmente 96 bytes, que tam-
Funciones Especiales estn refle- bin independientes. Sin embar- bin son accesibles desde a travs
jados en varios Bancos para go, los 16 bytes superiores de del Banco 3, lo que hace un total
reducir el cdigo y tener un acce- memoria en cada Banco tienen de 96+96= 192 bytes.
so ms rpido. Se puede ver el una raiz comn. Accediendo a (Nota.- La memoria EEPROM
mapa de la memoria de datos y cualquiera de los 16 bytes en de Datos se describe en el aparta-
los registros especiales en las cualquier Banco, automtica- do 3 de estos apuntes sobre las
Figuras 3 y 4. Si analizamos mente nos da acceso a los mis- hojas de caractersticas.)
estas figuras podemos ver como mos en el Banco 0 (70h a 7Fh).
efectivamente despus de cada Esta forma de acceder puede ser REGISTROS DE
grupo de registros especiales de muy ventajosa en algunos casos. PROPSITO GENERAL
cada Banco estn las posiciones Para los PIC16F876/7, la memo-
de memoria que pueden ser usa- ria disponible para datos en total Se puede acceder a cualquier
das para el almacenamiento de es de 96+80+16+80+16+80 = registro utilizando el direcciona-
datos. 368 bytes. miento directo o indirecto, en
En el caso de los Para el caso de los este ltimo caso a travs del
PIC16F876/7, los Bancos 0 a 3 PIC16F873/4, como puede verse registro FSR.
46
RESISTOR
47
RESISTOR
REGISTROS DE FUNCIONES zados como RAM esttica. Un los perifricos. Los registros que
ESPECIALES listado de estos registros con afectan directamente a la CPU se
Los Registros de Funciones cada uno de sus bits es el que se describen seguidamente con
Especiales (SFR) son registros muestra en la Tabla 2. detalle. Aquellos registros rela-
usados por la CPU y los mdulos Los Registros de Funcin cionados con el funcionamiento
perifricos para hacer trabajar el Especiales podemos clasificarlos de los perifricos se describen en
dispositivo como nosotros quere- en dos tipos, los correspondien- el apartado correspondiente al
mos. Estos registros estn reali- tes a la CPU y los que controlan perifrico.
NUESTROS CURSOS

50
RESISTOR

Seguidamente pasamos a describir cada uno de los bits de los Registros Especiales FSR.

REGISTRO DE STATUS (Direcciones 03h, 83h,103h, 183h)

" " " " "


R/W-0 R/W-0 R/W-0 R-1 R-1 R/W-x R/W-x R/W-x
IRP RP1 RP0 #T0 #PD Z DC C
Bit 7 Bit 0

bit 7: IRP: Seleccin de Bancos para el direccionamiento 1= Despus de conectar VDD o al ejecutar la instruccin CLRWDT
indirecto 0 = Al ejecutar la instruccin SLEEP
1 = Bancos 2 y 3 (1 00h- 1 FFh) bit 2: Z: Flag de Cero
0= Bancos 0 y 1 (00h-FFh) 1= El resultado de la ltima operacin aritmtica o lgica
bit 6-5: RP1:RP0: Seleccin del Banco para el direcciona- es Cero
miento directo 0= El resultado de la ltima operacin aritmtica o lgica
11 = Banco 3 (1 80h- 1 FFh) es distinto cero
10 =Banco 2(100h-17Fh) bit 1: DC: Flag de acarreo en el 4 bit de menos peso
01 =Banco 1 (80h-FFh) 1 = Acarreo en la suma
00 = Banco 0 (00h-7Fh) 0 = No acarreo en la suma
Cada Banco es de 128 bytes En la resta es al contrario
bit 4:#TO: Flag de Timer Out bit 0:C: Flag de acarreo en el octavo bit
1= Despus de conectar VDD o ejecutar CLRWDT o SLEEP 1 = Se ha producido un acarreo en la suma y no en la resta
0= Al desbordarse el temporizador de WDT 0= Se ha producido un acarreo en la resta y no en la suma
bit 3:#PD:Flag de Power Down Este bit tambin se utiliza en las instrucciones de rotacin
REGISTRO OPTION u OPTION_REG (Direccin 81h,181h)

El Registro de OPTION_REG es un registro que puede ser ledo o escrito y que contiene varios bits de
control para configurar la asignacin del preescaler al TMR0 o al WDT, la interrupcin externa, el TMR0 y
las resistencias de pull-up del PORTB.

Nota.- Asignar el preescaler como 1: 1 al registro TMR0, asigna el preescaler al Watchdog.

NUESTROS CURSOS
R/W-1 R/W-1 R/W-1 R/W-1 R/W-1 R/W-1 R/W-1 R/W-1
RBPU INTED T0CS T0SE PSA PS2 PS1 PS0
Bit 7 Bit 0

bit 7:#RBPU: Resistencia de Pull-up en, el PORTB 1 = El preescaler se le asigna al WDT


1=Resistencia de Pull-up desactivada 0 = El preescaler se le asigna al TMR0
0= Resistencia de Pull-up activada bit 2-0:PS2:PS0: Rango de actuacin del preescaler
bit6 1:INTEDG:, Flanco, de control de interrupciones
1:Interrupcin por flanco ascendente en el pin RB0/INT,
0:Interrupcin por flanco: descendente en el pin RB0/INT PS2 PS1 PS0 Divisor de TMR0 Divisor de WDT
bit 5:T0SC. Seleccin del tipo de Reloj para TMRO 0 0 0 1:2 1:1
1 = Los pulsos se introducen a travs del, pin RA4/TOCK1 0 0 1 1:4 1:2
0 = Los Pulsos de reloj internos- Fosc/4 0 1 0 1:8 1:4
bit 4:T0SE: Tipo de flanco para TMR0 0 1 1 1:16 1:8
1 = Incremento de TMR0 en cada flanco, descendente por 1 0 0 1:32 1:16
el pin RA4/TOCKI 1 0 1 1:64 1:32
0 = Incremento de TMR0 en cada flanco ascendente por el 1 1 0 1:128 1:64
pin RA4/TOCKI 1 1 1 1:256 1:128
bit 3:PSA: Asignacin del Preescaler
51
RESISTOR
REGISTRO INTCON (Direccin 0Bh, 8Bh, l0Bh, 18Bh)

El registro INTCON es un registro de lectura y escritura que contiene los bit de habilitacin de interrupcio-
nes por desbordamiento de TMR0 por cambio de nivel en el PORTB e interrupciones externas por la lnea
RBO/INT.

" " "


R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-x
GIE PEIE T0IE INTE RBIE T0IF INTF RBIF
Bit 7 Bit 0

bit 7:GIE: bit de habilitacin global de Interrupciones de nivel en el PORTB


1= Habilita el permiso de interrupciones 1= Habilita la interrupcin
0= Inhabilita todas las interrupciones 0= Inhabilita la interrupcin
bit 6:PEIE: bit de habilitacin de interrupciones de los bit 2:T0IF: flag de indicacin de desbordamiento de
perifricos que no se controla con el registro INTCON TMR0
1= Habilita el permiso de interrupciones de los perifri- 1= El TMR0 se ha desbordado. Se borra por software
cos 0= El TMR0 no se ha desbordado
0= Inhabilita las interrupciones de los perifricos bit 1:INTF: flag de estado de la interrupcin externa INT
bit 5:T0IE: bit de habilitacin de la interrupcin por des- 1= La interrupcin externa se ha producido. Se borra
bordamiento del TMR0 por software
1= Habilita la interrupcin 0= La interrupcin externa no se ha producido
0= Inhabilita la interrupcin bit 0:RBIF: flag de indicacin de interrupcin por cambio
bit 4:INTE: bit de habilitacin de la interrupcin externa de nivel en PORTB
por el pin RB0/INT 1= Se ha producido un cambio de nivel en los pines
1= Habilita la interrupcin RB7:RB4. Se borra por software.
0= Inhabilita la interrupcin 0= No se ha producido un cambio de nivel en los pines
bit 3:RBIE: bit de habilitacin de interrupcin por cambio RB7:RB4
REGISTRO PIE1 (Direccin 8Ch)

Este registro contiene los bits individuales de habilitacin de interrupciones de los perifricos.

Nota.El bit PEIE (INTCON <6>) debe esta a uno para habilitar las interrupciones de
cualquiera de los perifricos.

R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0


NUESTROS CURSOS
PSPIE(1) ADIE RCIE TXIE SSPIE CCP1IE TMR2IE TMR1IE
Bit 7 Bit 0

bit 7:PSPIE: bit de habilitacin de inte- 1 = Habilita interrupcin por recepcin produce una captura o una comparacin.
rrupcin por lectura / escritura en el en el USAR 1= Habilita la interrupcin del CCPI
Puerto Paralelo Esclavo. Para los 0 = Inhabilita interrupcin por recep- 0=. Inhabilita la interrupcin del CCPI
modelos de 40 pines. cin en el USAR bit 1:TMR2IE: bit de habilitacin de inte-
1 = Habilita la interrupcin por bit 4:TXIE: bit de interrupcin al trans- rrupcin por desbordamiento de TMR2
lectura/escritura en el PSP mitir por el USAR, cuando se vaca el que
0= inhabilita la interrupcin por lectu- buffer. est emparejado con el registro PR2
ra/escritura en el PSP 1 = Habilita la interrupcin de transmi- (92h)
bit 6:ADIF: bit de habilitacin de inte- sin por el USAR 1= Habilita la interrupcin por desborda-
rrupcin por finalizacin de la conver- 0 = Inhabilita la interrupcin de trans- miento de TMR2 emparejado a PR2
sin A/D misin por el USAR 0= Inhabilita la interrupcin de TMR2
l = Habilita la interrupcin del converti- bit 3:SSPIE: bit de habilitacin de inte- emparejado a PR2
dor A/D rrupcin por el Puerto Serie Sncrono bit 0:TMR1IE: bit de habilitacin de inte-
0 = Inhabilita la interrupcin del con- (SSP) rrupcin por desbordamiento del TMRI
vertidor A/D 1= Habilita la interrupcin del SSP 1= Habilita la interrupcin por desborda-

52
RESISTOR
bit 5:RCIE: bit de habilitacin de inte-
rrupcin en recepcin por el USAR,
cuando se llena el buffer,
0= Inhabilita la interrupcin del SSP
bit 2:CCP1IE: bit de habilitacin de inte-
rrupcin del mdulo CCPI cuando se
miento de TMR1
0= Inhabilita la interrupcin por desbor-
damiento de TMR1

Nota 1.- PSPIE para los dispositivos de 28 pines, siempre mantiene este bit a cero

REGISTRO PIE2 (Direccin 8Dh)

El registro de PIE2 contiene los bit individuales que habilita las interrupciones del perifrico CCP2,. la inte-
rrupcin por colisin del SSP y la ininterrupcin de escritura en la EEPROM.

U-0 R/W-0 U-0 R/W-0 R/W-0 U-0 U-0 R/W-0


--- 0 --- EEIE BCLIE -- -- CCP2IE
Bit 7 Bit 0

bit 7:No implementado: se lee como 0 bit 3:BCLIE: Habilita la interrupcin por colisin en el bus
bit 6: Reservado, Mantiene este bits a cero SSP cuando dos o ms maestros tratan de transferir al
bit 5:No implementado: se lee como 0 mismo tiempo.
bit 4:EEIE: Habilita la interrupcin por escritura en la 1 = Habilita la interrupcin por colisin de bus SSP
EEPROM de datos 0 = Deshabilita la interrupcin por colisin en el bus SSP.
1= Habilita la interrupcin por escritura de la EEPROM de bit 2-1No implementados, se leen como 0
datos bit 0:CCP2IE: Habilita la interrupcin del modulo CCP2
0 =Deshabilita la interrupcin por escritura en la EEPROM 1 = habilita la interrupcin de CCP2
de datos 0 = inhabilita la interrupcin de CCP2
REGISTRO PIR1 (Direccin 0Ch)
El registro de PIRI contiene los flags individuales que indican las interrupciones provocadas por los perifricos.

" " " " " " " "


R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-x
PSPIF ADIF RCIF TXIF SSPIF CCP1IF TMR21F TMR1IF
Bit 7 Bit 0
bit 7:PSPIF: Flag de Lectura/Escritura por 1= La condicin del SSP ha ocurrido, bit 2:CCP1IF: Flag de interrupcin de
el Puerto Paralelo esclavo debe ponerse a cero por software antes CCPI
1= Concedido el permiso de interrupcin de volver del programa de atencin a la
para la puerta paralela esclava al realizar interrupcin. Las condiciones que sopor- Modo Captura
una operacin de Lectrura/Escritura. En ta este bit son 1= Ocurri una captura de TMR1 (debe
los modelos de 40 pines. SPI ponerse a cero por software)
0= No est permitida la interrupcin Ha tenido lugar una Transmisin / 0= No ocurri ninguna captura de TMR1

NUESTROS CURSOS
bit 6:ADIF: Flag de final de conversin del Recepcin Modo Comparacin
convertidor A/D I2C Slave 1= Se ha realizado una comparacin de
1= El convertidor A/D ha finalizado la Ha tenido lugar una Transmisin / TMR1 Con el registro emparejado /debe
conversin Recepcin ponerse a cero por Software)
0= El convertidor A/D no ha finalizado la I2C Master 0= No se ha realizado comparacin
conversin Ha tenido lugar una Transmisin / Modo PWM
bit 5:RCIF: Flag de recepcin por el USAR Recepcin Este modo no se utiliza
1= El buffer de datos recibidos por el La condicin de salida iniciada se com- bit 1:TMR2IF: Flag de interrupcin de
USAR est lleno plet por el mdulo de SSP. TMR2 emparejado con PR2
0= El buffer de datos recibidos por el La condicin de parada inicio se comple- 1= TMR2 emparejado con PR2 ocurri
USAR no est lleno t por el mdulo de SSP. (debe ponerse a cero por software)
bit 4:TXIF: Flag de transmisin el USAR La condicin de reinicializacin se com- 0= No ha ocurrido el emparejamiento de
1= El buffer de datos a transmitir no est pleto por el mdulo SSP TMR2 con PR2
lleno Una condicin de la salida se ha realizado bit 0: TMR1IF: Flag de desbordamiento
0= El buffer de daos a transmitir est mientras el mdulo de SSP estaba en de TMRI
lleno estado de espera (sistema de Multimaster). 1 =el registro se desbordo (debe ponerse
bit 3: SSPIF: Flag de interrupcin del 0 = no ha ocurrido ninguna condicin de a cero por software)
Puerto Serie Sncrono (SSP) interrupcin del mdulo SSP 0 = el registre de TMRI no se desbordo

Nota 1.- PSPIF est reservado para los dispositivos de 28 pines; se mantiene siempre a cero.

REGISTRO PIR2 (Direccin 0Dh)


El registro de PIR2 contiene los flags que indican la interrupcin del CCP2, de la colisin del bus SSP y la inte-
53
RESISTOR
rrupcin de la escritura en la EEPROM

" " " " " " " "


U-0 R/W-0 U-0 R/W-0 R/W-0 U-0 U-0 R/W-x
---(1) --- EEIF BCLIF --- --- CCP2IF
Bit 7 Bit 0
bit 7:No implementado: se lee como 0 bit 2-1:No implementados: se leen como 0
bit 6:Reservado: Mantiene este bit siempre a cero bit 0: CCP21F: Flag de ininterrupcin de CCP2
bit 5:No implementado: se lee como 0 Modo Captura
bit 4:EEIF: Flag que indica si se ha producido escritura en al 1 = Ha ocurrido una captura del registro TMR1 (debe ponerse a
EEPROM cero por software)
1 = Se ha completado la escritura en la EEPROM (Se pone a cero 0= No se ha producido captura
por software) Modo Comparacin
0 = No se ha finalizado la escritura o no se ha comenzado 1 = Se ha producido una comparacin de TMR1 con su pareja
bit 3:BCLIF: Flag que indica la colisin en el bus (debe ponerse a cero por software).
1 = Se ha producido una colisin en el bus SSP, cuando se confi- 0 = No se ha producido comparacin
gura en el modo I2C Master. Modo PWM
0 = No se ha producido colisin en el bus No se utiliza

REGISTRO PCON (Direccin 8Eh)


El registro PCON (Power Control) Control de Alimentacin, contiene los flags que permiten diferenciar entre un
Power-on Reset (POP), un Brown-out Reset (BOR), un Reset por Watchdog (WDT) y un Reset externo por MCLR.

U-0 U-0 U-0 U-0 U-0 U-0 R/W-0 R/W-0


--- 0 --- --- --- --- #POR #BOR
Bit 7 Bit 0
bit 7-2:No implementado: se lee como 0 bit 0:#BOR: bit de estado de Borwn-out Reset
bit 1:#POR: bit de estado Power-on Reset 1 = No se ha producido ningn Brown-out Reset
1 = No se ha producido un Power-on Reset 0= Se ha producido un Brown-out Reset (debe reestablecerse
0= Se ha producido un Power-on Reset (debe reestablecerse por software)
por software)
Curso microcontroladoresPAGS 27/12/02 10:01 Pgina 54

CURSO DE
MICROCONTROLADORES
MICROCONTROLADORES
PIC16F87X (...y III)
Fernando Remiro Domnguez
Profesor de Sistemas Electrnicos
IES. Juan de la Cierva
www.terra.es/personal/fremiro

54
RESISTOR

Programador para PIC16F87X con bootloader.

S
i habis utilizado un hexadecimal del programa que DESCRIPCIN DEL CIRCUITO
programador por el queremos que se ejecute. Esto El circuito consta de un
puerto serie del ordena- reduce considerablemente el microcontrolador PIC16F876 al
dor para programar los tiempo de programacin ya que que se le han conectado un cristal
PIC16F87X, utilizando solo carga los cdigos del pro- de cuarzo de 4MHz y los
el maravilloso software libre IC- grama que queremos cargar. condensadores de desacoplo de 27
Prog, habris comprobado que el La placa que hemos diseado pF y un pulsador que cuando se
tiempo de carga del PIC16F876, adems de utilizarla como pro- activa pone un nivel bajo en la
por ejemplo, que tiene 8K es de gramadora, se puede utilizar entrada MCLR para provocar un
varios minutos que se hacen como placa de desarrollo, ya que RESET del sistema. Adems para
interminables, sobretodo cuando se dispone de acceso a todos y poder conectar la USART del
estamos programando y depu- cada uno de los pines del micro- microcontrolador al ordenador, se
rando programas. controlador a travs de la tira de ha utilizado un circuito adaptador
Lo que presentamos en este postes para circuito impreso de niveles MAX232, tal y como
curso es un circuito que a travs macho acodados y dispone de un indica el fabricante en sus notas
de la USAR de los PIC 16F87X circuito oscilador a cristal en de aplicacin, y por ltimo se le
es capaz de ponerse en comuni- nuestro caso a 4 MHz, tal y como ha dotado de un conector
cacin con ellos y cargar en la se puede ver en el circuito de la acodado DB-9 macho para poder
memoria de programa el cdigo Figura 1. conectar el circuito al puerto serie
Curso microcontroladoresPAGS 27/12/02 10:01 Pgina 55

VCC

P1
DB9 C1 C2
1uF U1
1uF
1 9
C1+ 9

6
5
9
4
8
3
7
2

1
2 10
E1 V+ 10
3 11 RC6
C1- T1IN
RXPC 4 12 RC7
C2+ R10UT
ESP 5 13 RXPC
C2- R1IN
TXPC C3 6 14 TXPC
1uF V- T1OUT
7 15
7 GND
8 16
8 VCC
C4
VCC C5 MAX232
1uF
1uF

R1
SW1 10K
U2 VCC
R2
MCLR 1 28 RB7
MCLR/VPP RB7
RESET RA0 2 27 RB6
100 RA0/AN0 RB6
RA1 3 26 RB5
RA1/AN1 RB5
RA2 4 25 RB4 VSS VCC
RA2/AN2 RB4
RA3 5 24 RB3
RA3/AN3/VREF RB3
RA4 6 23 RB2
RA4/TOCKI RB2
C6 27pF RA5 7 22 RB1 VCC
RA5/SS/AN4 RB1
8 21 RB0
VSS VSS RB0/INT
9 20
X1 OSC1/CLKIN VDD
10 19
OSC2/CLKOUT VSS
4MHz 18 RC7
RC7/RX/DT
C7 27pF 17 RC6
RC6/TX/CK
RC0 11 VDD
RC0/T1OS0/T1CKI
RC1 12
RC1/T1OS1/CCP2
RC2 13 16 RC5 VCC
RC2/CCP1 RC5/SDO
RC3 14
RC3/SCK/SCL
15 RC4
RC4/SDI/SDA
J1
PIC16F873
MCLR
6
C8
5
4
RB7 0.1u
3
VCC RB6
2
RB3
1

CONECTOR RJ11
CON6 DEBUGE
MCLR
RA2
RA3
RA4

RA0
RA1

RA5
RB0
RB1
RB2
RB3
RB4
RB5
RB6
RB7

RC0
RC1
RC2
RC3
RC4
RC5
RC6
RC7

J2
1
2
3
4
5
6
7
8
9

12
13
14
15
16
17
18
19
20
21
22
23
24
25
10
11

CON25

Figura 1.- circuito de la placa de desarrollo y de programacin con el bootloadaer


que conectada al PC y en el
mismo entorno del MPLAB,
permite la visualizacin de los
registros del microcontrolador
en los puntos de ruptura que se
establezcan. Pudindose ejecutar
los programas en tiempo real o
en modo paso a paso.
Figura 2.- Conexin del ICD a
la placa de desarrollo.

del ordenador. El cable de


conexin debe ser un modem
nulo, es decir, un cable que solo
necesita la lnea de masa
conectada al terminal 5 de los dos
conectores y se cruzan las lneas 2
de un extremo (RxD) con la 3 del
otro (TxD) y viceversa. Ver el
diagrama de conexin de la
Figura 3.
Adems la placa dispone de
un conector ARJ11, conectado a
las lneas MCLR, RB3, RB6 y
RB7 del microcontrolador, lo
que permite realizar la conexin
a un mdulo ICD (Depurador en
circuito), que como veremos es Figura 3 .- Cable de conexin MODEM nulo para la conexin de la placa de desarrollo
una herramienta de bajo costo con el PC.
Curso microcontroladoresPAGS 27/12/02 10:01 Pgina 56

;============================ Seccin fijada por el usuario ==========================

list p=16f876 ; <<< fijar el tipo de microcontrolador

;Poner el mismo microcontrolador en el proyecto


MICROCONTROLADORES
#include <p16f876.inc> ; <<< poner el archivo *.inc del microcontrolador seleccionado

#define FOSC D'4000000' ;<<< Poner la frecuencia del cuarzo (Hz), max. 20 MHz
#define BAUD D'9600' ;<<< poner la velocidad de transmisin (Bd)
#define BAUD_ERROR D'4' ;<<< Poner la tasa de error (%)
#define TIME ;<<< Poner el mtodo inicio del bootloader PIN/TIME/AUTO

;Disparo por puesta a nivel bajo de la seal de disparo


;TIME Inicia la recepcin del byte de IDENT despus el RESET
#define POR PORTB ;<<< solo para el PIN del puerto en juego
PORTB/PORTC/PORTD/PORTE
#define PORT_BIT 7 ; <<< solo para el pin PIN poner el bit de la lnea
seleccionada 0/1/2/3/4/5/6/7
#define TIMEOUT D'3' ; <<< solo para el TIME fijar el tiempo(0.1 s), max. 25.5 s

;============ Fin de la seccin fijada por el usuario ====================================

Tabla 1.- Seccin del programa bootloader que debe fijar el usuario.
COMO UTILIZAR
aclaratorio es ver un ejemplo
56
RESISTOR
EL PROGRAMA
BOOTLOADER
1. En primer lugar debemos
3. Si se modifica alguno de los
parmetros anteriores, debe-
mos de volver a compilar el
con un programa que utiliza
este mtodo de carga del pro-
grama de usuario en el micro-
obtener el programa en la programa bootldr.asm. controlador.
siguiente web http://www.ehl.cz/ 4. Programar el microcontrola- El programa TMR0_1.asm es
pic/pic_e.htm , donde tambin se dor con el archivo bootldr.hex un programa ejemplo que uti-
puede obtener el PIC donwloa- utilizando cualquier progra- liza una temporizacin utili-
der V1.8. mador de los que ya se han zando TMR0 sin utilizar las
visto en esta Revista, por interrupciones. Realiza una
2. Abrir el proyecto bootldr.pjt ejemplo el que el que aparece temporizacin de 32,77 ms
utilizando el programa en el mdulo de aprendizaje que se emplea para hacer par-
Microchip MPLAB y cambiar de microcontroladores PIC padear los diodos LED pares
los parmetros de la seccin que apareci en el nmero o impares respectivamente
de usuario marcados dentro 189. Poniendo los bits de con- conectados al PORTB. En el
del ensamblador con las mar- figuracin para que el micro- cdigo de este programa con
cas <<<, tal y como se muestra controlador trabaje en la apli- separados por un ";" (es decir,
en la Tabla 1, en la que hemos cacin. como un comentario) se
fijado el microcontrolador 5. Recompilar el programa de la encuentran las instrucciones
PIC16F876, con un oscilador aplicacin para que no borre el de salto a INICIO que utiliza-
de 4MHz, una velocidad de bootloader. El bootloader usa ramos con un programador
transmisin de 9600 baudios y los 256 bytes de la parte alta de convencional. Y al final del
utiliza el pin 7 del PORTB memoria de programa programa, en la posicin
como seal de disparo para (0x1F04-0x1FFF). de memoria 0x1F00 hemos
ejecutar el bootloader cuando Llegado a este punto lo ms escrito:
est a nivel bajo y correr el
programa de usuario cuando
est a nivel alto. Por tiempo
entra en el programa de usua- ORG 0x1F00
rio despus de haber pasado bcf PCLATH,4 ;Selecciona el banco 0 de memoria
0,3 segundos sin recibir la bcf PCLATH,3
palabra de IDENTIFICA- goto INICIO
CIN.
Curso microcontroladoresPAGS 27/12/02 10:01 Pgina 57

;****************************************************************************
; Programa TMR0_1.ASM Fecha : 7- Mayo-2002
; Este programa utiliza una temporizacin utilizando TMR0 sin utilizar las interrupciones.
;Se realiza una temporizacin de 32,77 ms que se emplea para hacer parpadear los diodos LED
; pares o impares respectivamente conectados al PORTB
; Programa preparado para cargar con el PIC downlader

MICROCONTROLADORES
; Revisin : 0.1 Programa para PIC16F87X
; Velocidad del Reloj: 4 MHz Reloj Instruccin: 1 MHz = 1 uS
; Perro Guardin: Deshabilitado Tipo de Reloj : XT
; Proteccin del cdigo: OFF
;*****************************************************************************
List p=16F876 ;Tipo de procesador
include "P16F876.INC" ;Definiciones de registros internos

;ORG 0x00 ; Inicio del programa en


;goto INICIO

ORG 0x05 ;salva el vector de Interrupciones


INICIO bcf STATUS,RP1
bsf STATUS,RP0 ; Banco 1
movlw b'11010111' ; Valor a cargar en OPTION_REG
movwf OPTION_REG ; predivisor 256 asignado a TMR0
clrf TRISB ; PORTB como salida
bcf STATUS,RP0 ; Banco 0
clrf PORTB ; Apaga los LEDS del PORTB

BUCLE
movwf
call
movlw
PORTB
RETARDO
b'01010101'
; Enciende los LED impares del PORTB
; Llamada a subrutina de RETARDO
57
RESISTOR
movlw b'10101010'
movwf PORTB ; Enciende los LED pares del PORTB
call RETARDO
goto BUCLE

RETARDO
clrf TMR0 ; TMR0 = 0 y empieza su incremento
EXPLORA
btfss TMR0,7 ; Es el bit 7 de TMR0=1?
goto EXPLORA ; No ha llegado TMR0 a 128 Decial
return ; Ha llegado TMR0 al valor 128D y retorna
; al programa principal
ORG 0x1F00
bcf PCLATH,4 ;Selecciona el banco 0 de memoria
bcf PCLATH,3
goto INICIO ;Salta a INICIO
END

Tabla 2.- Programa TMR0-1.asm para cargar con el bootloader.

Es decir, en las posiciones de 6. Recompilar el programa de la nulo, tal y como se comento


memoria 0x1F00-0x1F03, escri- aplica anteriormete.
bimos un salto largo de 14 bits a 2. Para realizar la carga del pro-
la posicin de memoria INICIO, COMO REALIZAR LA CARGA grama de usuario, vamos a
que est en el banco cero de EN EL MICROCONTROLADOR utilizar un programa de
memoria de programa. Esto lti- 1. En primer lugar se conecta la "carga" freware, se trata del
mo debe verificarse si se utiliza placa de desarrollo al PC PIC downloader de Petr
un compilador en C. mediante un cable de modem Kolomaznik y que hemos con-
Curso microcontroladoresPAGS 27/12/02 10:01 Pgina 58

0x0000
El Bootloader utiliza las
Salto al Bootloader 4 primeras posiciones
0x0004 (0x0000-0x0003)
MICROCONTROLADORES
Espacio disponible
Espacio de memoria, para el programa
para cargar los del usuario
programas transmitidos (0x0004-0x1EFF)

Figura 5.- Apariencia de la


pantalla que aparece al ejecutar el
programa PIC dowloader.

seguido en la web
0x1F00
Salto al programa Primeras 4 posiciones http://www.microchipc.com/ .
de usuario para el usuario Una vez instalado, al ejecutar-
0x1F04 (0x1F00-0x1F03)
lo, aparece una pantalla
como la que se muestra en la
Cdigo del Bootloader Cdigo del programa
Figura 5.

58
RESISTOR 0x1FFF
Bootloader
(0x1F04-0x1FFF) 3. Seleccionamos la velocidad de
transmisin en baudios, en
nuestro caso 9600, el puerto
serie de comunicacin, en el
Figura 4.- Mapa de memoria del Bootloader para un microcontrola- ejemplo hemos seleccionado
dor de 8KBytes. el COM2 y buscamos el nom-
bre del programa en cdigo
Caractersticas del programa PIC dowloader 1.8 : hexadecimal que queremos
cargar en el microcontrolador,
Compatible con el bootloader de HI-TECH's o de Shane Tolmie TMR0-1.hex.
para los microcontroladores PIC16F87x Este programa tiene las
Funcionamientos bajo Windows 9x/ME/NT/2000 siguientes teclas de funcin
Seleccin de la velocidad a partir del 2400 a 56000 Bd
rpida:
F2 - Bsqueda
Seleccin del puerto serie entre el COM1-6
F4 - Escribir
Trabaja con datos de EEPROM en el archivo hexadecimal
ESC - Cancelacin
No enva la palabra de los configuracin a la posicin 0x2007 o F10 - Salida
palabra de la identificacin desde el bootloader 4. Seguidamente se pulsa el
Mantiene las ltimas configuraciones botn de RESET y el progra-
Se incluye el cdigo de fuente ma se carga en el microcon-
El downloader del PIC se controla al realizar una seal de dispa- trolador PIC. Segn se va rea-
lizando la carga, aparece un
ro del RESET en el microcontrolador
indicador de carga (lnea
Se trabaja en ensamblador para todos aquellos programadores
azul) y al finalizar la carga
que no utilizan el lenguaje C. El bootloader es muy fcil de recom- suena una seal acstica.
pilar para otros microcontroladores actualizando el pin/tieme y la 5. Si volvemos a actuar manual-
frecuencias del cristal de cuarzo. Solo se necesita el programa mente sobre el pulsador de
MPLAB de Microchip que tambin es gratuito. RESET, se ejecutar el pro-
Se puede obtener en las siguientes webs: (http://www.ehl.cz/pic/) grama de usuario.
(http://www.microchipc.com/)
Curso microcontroladoresPAGS 21/1/04 10:14 Pgina 56

CURSO DE
MICROCONTROLADORES
MICROCONTROLADORES
PIC16F87X (...y IV)
Fernando Remiro Domnguez
Profesor de Sistemas Electrnicos
IES. Juan de la Cierva
www.terra.es/personal/fremiro

LOS REGISTROS PCL correctamente los bits PCLATH La pila funciona como un buf-
y PCLATH <4:3> que seleccionan el Banco. fer circular. Esto significa que
El contador del programa Es labor del programador despus de que se han guardado 8
(PC) est formado por 13 bit que modificar el valor de dichos bits valores en ella, el noveno borra el
sirven para direccionar la en las instrucciones CALL y valor que se guard en primer
memoria de cdigo, estos bits se GOTO. lugar, el dcimo borra el que se
encuentran en dos registros La familia de los PIC 16F87X guardo en segundo lugar, etc.
especficos. El byte bajo viene del dispone de una pila de 8 niveles
registro de PCL que puede ser de profundidad para un tamao Paginacin de la Memoria
ledo y escrito. Los bits superiores de PC de 13 bits. Esta pila es de Programa
56
RESISTOR
(PC<12:8>). Estn alojados en el
registro PCH , sobre el que no se
puede leer ni escribir, pero se
transparente al programador, es
decir, funciona automticamente
y no dispone de instrucciones
Los dispositivos de la familia
PIC 16F87X son capaces de
direccionar un bloque de hasta
puede acceder a l indirectamente para guardar o sacar de ella 8K de memoria continua. Las
a travs del registro PCLATH. informacin. instrucciones CALL y GOTO
Las instrucciones de salto Con la Instruccin CALL y proporcionan solo 11 bits de la
CALL y GOTO slo con las interrupciones el valor de direccin de memoria, lo que
proporcionan 11 bits de la PC se salva en el nivel superior. permite un salto de bifurcacin
direccin a saltar. Esto limita el Con las instrucciones RETURN, dentro de una pgina de 2K de la
salto dentro de cada Banco de 2K. RETLW y RETFIE el valor con- memoria de programa.
Cuando se desea salir del Banco tenido en el valor superior de la Al hacer un CALL o una ins-
actual hay que programar pila se carga en el PC. truccin GOTO, dos 2 bit supe-
riores de la direccin son pro-
PCH PCL porcionados por el PCLATH
<4:3>. Al hacer un CALL o un
12 8 7 0 GOTO, el usuario debe asegu-
Instrucciones con rarse de que la pgina se han
PC destino en el PCL seleccionados con los bit corres-
pondientes a la pgina que se
desea llamar. Hay que tener pre-
caucin en los retornos de subru-
5 PCLATH<4:0> tinas y retornos de ininterrup-
cin para no salirse con el valor
8 almacenado en la PILA.
ALU
Por consiguiente, manipula-
cin del PCLATH <4:3> no se
requieren los bits para las ins-
trucciones del retorno. Este es el
caso del ejemplo Inter.asm, en el
PCLATH que el programa principal, que
consiste en encender y apagar un
Figura 1.- Estructura del Contador de Programa LED, conectado a travs de una
Curso microcontroladoresPAGS 21/1/04 10:14 Pgina 57

;***********************************************************************************
; Programa INTER.asm Fecha : 24- Enero-2003
; Este programa genera una intermitencia en un lED conectado a la lnea RB0. El programa principal
; est en la pagina 0 de memoria de programa y la subrutina en la pgina 1 de programa
; Revisin 0.0 Programa para PIC16F87X
; Velocidad del Reloj: 4 MHz Reloj Instruccin: 1 MHz = 1 uS
; Perro Guardin :deshabilitado Tipo de Reloj : XT
; Proteccin del cdigo : OFF
;**********************************************************************************
List p=16F876 ;Tipo de procesador
include "P16F876.INC" ;Definiciones de registros internos
;__config _CP_OFF & _DEBUG_OFF & _WRT_ENABLE_ON & _CPD_OFF & _LVP_OFF & _XT_OSC & _WDT_OFF
; org 0x00 ;Vector de Reset
; goto INICIO
CONTA1 EQU 0x20
CONTA2 EQU 0x21
PCLATH_TEMP EQU 0x22

org 0x05 ;Salva el vector de interrupcin


INICIO clrf PORTB ;Borra los latch de salida
bsf STATUS,RP0 ;Selecciona banco 1
movlw b'00000110'
movwf ADCON1 ;Puerta A E/S digitales
clrf TRISB ;Puerta B se configura como salida
bcf STATUS,RP0 ;Selecciona banco 0
BUCLE bsf PORTB,0
movf PCLATH,W ;Salvamos valor de PCLARH en un registro temporal
movwf PCLATH_TEMP
bsf PCLATH,3 ;Selecciona la Pgina 1
bcf PCLATH,4
call TEMPO
bcf PORTB,0
movf PCLATH,W
movwf PCLATH_TEMP
bsf PCLATH,3 ;Selecciona la Pgina 1
bcf PCLATH,4
call TEMPO
goto BUCLE

ORG 0x0800 ;Direccin de Inicio de la Pgina 1


TEMPO clrf CONTA1 ;Borra el contenido de counter1
clrf CONTA2 ;Borra el contenido de counter2
BUCLE_1 decfsz CONTA1,f ;resta 1 al contenido de CONTA1.si CONTA1 llega a
;cero: salta la instruccin GOTO BUCLE1
;Si counter1 no llega a cero: ejecuta la siguiente instruccin
goto BUCLE_1 ;Cierra el primer bucle de retardo
decfsz CONTA2,f ;Lo mismo que el caso anterior, pero esta vez aplicado a CONTA2
goto BUCLE_1 ;Cierra el segundo bucle de retardo
movf PCLATH_TEMP,W ;Repone el valor de PCLATH antes de la subrutina
movwf PCLATH
return ;Retorno de subrutina

ORG 0x1F00
bcf PCLATH,4
bcf PCLATH,3 ;Selecciona la pgina 0
goto INICIO
end ;Fin del programa fuente
Programa Inter1.asm
Curso microcontroladoresPAGS 21/1/04 10:14 Pgina 58

resistencia de 330 W a la lnea instrucciones CALL y GOTO o un programador con el IC-


RB0, cada cierto tiempo, el pro- proporcionan solo 11 bits de la PROG, tal y como est es valido
grama principal se ejecuta en la direccin de memoria, lo que para los primeros y si se quitan
pgina cero y la subrutina de permite un salto de bifurcacin los ";", se puede cargarse direc-
temporizacin se encuentra en la dentro de una pgina de 2K de la tamente utilizando cualquiera de
pgina 1 de memoria de progra- memoria de programa. los dems programadores, estas
MICROCONTROLADORES
ma. Al hacer un CALL o una ins- lneas de programa se han mar-
truccin GOTO, dos 2 bit supe- cado en azul. En rojo se han mar-
EL STACK riores de la direccin son propor- cado las lneas de programa utili-
La familia de los PIC 16F87X cionados por el PCLATH <4:3>. zadas para salvar el valor de
dispone de una pila de 8 niveles Al hacer un CALL o un GOTO, registro PCLATH en un registro
de profundidad para un tamao el usuario debe asegurarse de temporal, antes de manipular
de PC de 13 bits. Esta pila es que la pgina se han selecciona- PCLATH <4:3>, cargando en el
transparente al programador, es dos con los bit correspondientes bit 4 y 3 del mismo, respectiva-
decir, funciona automticamente a la pgina que se desea llamar. mente los valores 0 y 1, que
y no dispone de instrucciones Hay que tener precaucin en los seleccionan la pgina 1 de
para guardar o sacar de ella retornos de subrutinas y retornos memoria de programa.
informacin. de ininterrupcin para no salirse Por ltimo, en la subrutina
Con la Instruccin CALL y con el valor almacenado en la que empieza en la pgina 1, en la
con las interrupciones el valor de PILA. direccin 8000h, se ha marcado
PC se salva en el nivel superior. Por consiguiente, manipula- en verde las instrucciones que
Con las instrucciones RETURN, cin del PCLATH <4:3> no se reponen el valor que tena el
RETLW y RETFIE el valor con- requieren los bits para las ins- PCLATH antes de saltar a la
tenido en el valor superior de la trucciones del retorno. Este es el subrutina.
pila se carga en el PC. caso del ejemplo Inter.asm, en el
La pila funciona como un buf- que el programa principal, que Direccionamiento indirecto,
fer circular. Esto significa que consiste en encender y apagar un los registros INDF y FSR
despus de que se han guardado LED, conectado a travs de una El registro INDF no es un
8 valores en ella, el noveno borra resistencia de 330 a la lnea registro fsico, que ocupa la
58
RESISTOR
el valor que se guard en primer
lugar. El dcimo borra el que se
guardo en segundo lugar, etc.
RB0, cada cierto tiempo, el pro-
grama principal se ejecuta en la
pgina cero y la subrutina de
direccin 0 en todos los
Bancos, este registro se utiliza
cuando queremos realizar un
temporizacin se encuentra en direccionamiento indirecto.
Paginacin de la Memoria la pgina 1 de memoria de Cuando se hace referencia al
de Programa programa. registro, se accede realmente a la
Los dispositivos de la familia El programa est diseado direccin de un Banco de registro
PIC 16F87X son capaces de para aquellos que utilicen el boo- especificada con los 7 bits de
direccionar un bloque de hasta tloader con el circuito que pre- menor peso del registro FSR. El
8K de memoria continua. Las sentamos en el nmero anterior bit de ms peso del FSR junto al
Direccionamiento Directo Direccionamiento Indirecto

Cdigo de operacin instruccin


RP1:RP0 6 0 IRP Registro FSR

Seleccin de Banco Direccin dentro del Banco Seleccin de Banco Direccin dentro del Banco

00 01 10 11
00h 80h 100h 180h

Memoria
de datos

FFh 17Fh 1FFh


7Fh

Banco 0 Banco 1 Banco2 Banco3

Figura 2.-Forma de seleccionar el Banco y la direccin de la RAM en los direccionamientos directo e


indirecto.
Curso microcontroladoresPAGS 21/1/04 10:14 Pgina 59

bit IRP de registro de STATUS se


encarga de seleccionar el Banco a
acceder, mientras que los 7 bits de
menos peso apuntan a la posicin.

LOS PUERTOS DE E/S Y

MICROCONTROLADORES
RECURSOS ESPECIALES DEL
PROCESADOR
Alguno de los pines de los
puertos de E/S estn multiplexa-
dos con una o unas funciones
alternativas para la utilizacin de
los perifricos internos. En gene-
ral, cuando un perifrico se habi-
lita el pin correspondiente no
puede utilizarse como pin de E/S.
Los microcontroladores
PIC16F87X que estn encapsula-
dos en 28 pines, disponen de tres
puertos (PORTA, B y C) mien-
tras que los microcontroladores
de 40 pines disponen de cinco
puertos (PORA, B, C, D y E).

PORTA y el registro TRISA


Este puerto dispone de 6
pines bidireccionales denomina-
dos RA0 - RA5 cuyo sentido
est controlado por el registro
TRISA, cuando se pone a 1 el bit
correspondiente del registro
59
RESISTOR
TRISA, la lnea correspondiente
del PORTA se comporta como
una entrada, mientras que si se
pone a 0 se comporta como
salida.
Al leer el registro del PORTA
se est leyendo el estado de los Figura 3.-Diagrama de conexin de los pines RA0-RA3 y RA5 que
pines, que es, el que se halla multiplexan la funcin de E/S digital con la del canal de entrada de
escrito en el biestable de datos, una seal analgica para el Conversor A/D
La funcin de escritura implica
la operacin de lectura, modifi- entrada de reloj para el del convertidor A/D y entrada de
cacin y escritura. Es decir, le lee TIMER0. la tensin de referencia para los
el pin, se modifica su valor y por Los pines RA0/AN0, perifricos que la necesitan.
ltimo se escribe en el biestable RA1/AN1, RA2/AN2, adems de El pin RA5/AN4/SS# tiene
el dato. Todos los pines del E/S digital tambin pueden multiplexada tres funciones: E/S
PORTA entregan niveles TTL. actuar como los canales 0, 1 y 2 digital, entrada del canal 4 del
El pin RA4 est multiplexado del convertidor A/D. convertidor A/D y seleccin del
con el mdulo de reloj TIMER0, El pin RA3/AN3/VREF+ modo esclavo cuando trabaja con
por lo tanto el pin RA4/TOCKI tiene multiplexadas tres funcio- la comunicacin serie sncrona.
acta como E/S digital y como nes: E/S digital, entrad del canal 3 Cuando se produce un Reset al

RELACIN DE REGISTROS RELACIONADOS CON EL PORTA


Direccin Nombre Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
Valor en Valor en
POR,BOR el resto
de Reset
05 h PORTA -- -- RA5 RA4 RA3 RA2 RA1 RA0 --0x 0000 --0u 0000
85 h TRISA -- -- Registro de direccionamiento del PORTA --11 1111 --11 1111
97 h ADDCON1 ADFM -- -- -- PCFG3 PCFG2 PCFG1 PCFG0 --0- 0000 --0- 0000
Curso microcontroladoresPAGS 21/1/04 10:14 Pgina 60

conectar la tensin de alimenta- se quiere configurar el PORTA EL PORTB y el registro TRISB


cin (POR: Power-on Reset) como E/S digitales bastar con El PortB es est formado por
todos los pines del PORTA que- escribir en los 4 bit menos signi- 8 lneas bidireccionales controla-
dan configurados corno canales ficativos del registro ADCON1 das por el registro de direcciona-
de entrada para el convertidor el valor 011x. miento TRISB, poniendo un "1"
A/D y son ledas como 0. El registro TRISA que confi- en un bit del registro TRISB se
Para seleccionar el modo de gura los pines deL PORTA, debe direcciona la lnea correspon-
MICROCONTROLADORES
funcionamiento como E/S digita- configurarse como entrada cuan- diente como entrada, mientras
les o analgicas para el converti- do se utilizan las entradas que los bit que se ponen a "0" en
dor A/D hay que configurar el analgicas. el registro de direccionamiento
registro ADCON1 que se expli- Ejemplo de inicializacin del TRISB, se configuran como
car con detalle ms adelante. Si PORTA salida.
Los PIC16F87X pueden ser
bcf STATUS,RP0 programados en modo bajo vol-
bcf STATUS,RP1 ;Selecciona el Banco 0 de memoria taje o alto voltaje, en el primero
clrf PORTA ;inicializa el PORTB, borrando de los casos se puede programar
;todas las basculas de datos con VDD=5V. El modo alto vol-
bsf STATUS,RP0 ;Selecciona el Banco 1 de memoria taje es el modo que utiliza el
movlw b00000110 ;Configura el PORTA como PIC16F84, en este caso se intro-
movwf ADCON1 ;E/S digitales duce por el pin MCLR#Vpp una
tensin entre 12 y 14V. En el
movlw b00001111 ;Direcciona las lneas de RA0-RA3
modo de programacin de bajo
movwf TRISA ;como salida RA4-RAS como entrada voltaje se pone el pin
MCLR#Vpp 5V y por los pines
RB3/PGM se pone a nivel alto.
Como la programacin en cual-
quiera de los casos se realiza sin-
cronamnte en serie, por el pin
RB6/PGC se introducen los
impulsos de reloj y por
60
RESISTOR
RB7/PGD los bit de datos serie.
Las lneas RB7-RB4 pueden
programarse para generar una
interrupcin cuando una de ellas
cambia de estado. Se deben con-
figurarse como entradas y el
valor que se introduce por ellas
se compara con el anterior de tal
forma que si no coinciden se
genere una interrupcin, siempre
que esta est autorizada. De
todas forma el bit RBIF, que es
el bit 0 del registro INTCON, se
pondr a 1.
El pin RB0/INT tambin
puede programarse como peti-
cin de interrupcin externa, si
se autoriza con el correspondien-
te bit de permiso de ininterrup-
cin, que corresponde con el bit
(4) INTE del registro INTCON y
con el bit INTEDG del registro
OPTION_REG se programa el
flanco de disparo.
Los pines del PORTB tienen
una resistencia de pull-up a posi-
tivo de alimentacin programa-
ble, esta se conecta cuando el bit
7 del OPTION REG, es decir
RBPU# tiene un cero. La resis-
tencia de pull-up realmente es un
Figura 4.- Diagrama interno de las lneas RB7-RB4 del PORTB transistor CMOS tipo P, tal y
Curso microcontroladoresPAGS 21/1/04 10:14 Pgina 61

RELACIN DE REGISTROS RELACIONADOS CON EL PORTB


Direccin Nombre Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 Valor en Valor en
POR,BOR el resto
de Reset
06 h 106 h PORTB RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0 xxxx xxxx uuuu uuuu
86 h 186 h TRISB Registro de direccionamiento del PORTB 1111 1111 1111 1111
81 h 181 h OPTION_REG RBPU# INTEDG T0SC T0SC PSA PS2 PS1 PS0 1111 1111 1111 1111
Leyenda
x = desconocido, u = inalterado. Las celdas sombreadas no son usadas por el PORTB

como puede verse en la Figura 4, El PORTD y el registro TRISD Para que trabaje como puerto
que se conecta siempre que la Este puerto solo existe en los de comunicacin esclavo, hay
lnea est configurada como sali- microcontroladores de la familia que poner a 1 el bit PSPMODE,
da. Cuando se produce un Reset 16F87X de 40 pines. El PORTD que se encuentra en el registro
por conexin de alimentacin est formado por 8 lneas TRISE.
(POP) se desconectan todas las bidireccionales denominadas
resistencias de pull-up. RD0/PSP0-RD7/PSP7 controla- El PORTE y el registro TRISE

INFORMTICA
das por el registro de direcciona- Este puerto solo existe en los
EL PORTC y el Registro TRISC miento TRISD. Poniendo un 1 microcontroladores de la familia
El PORTC est formado por 8 en un bit del registro TRISD se 16F87X de 40 pines. Est forma-
lneas bidireccionales controladas direcciona le lnea correspon- do por 3 pines multifuncin
por el registro de direccionamien- diente como entrada. Mientras R E 0 / R D # / A N 5 ,
to TRISC, Poniendo un 1 en un que los bit que se ponen a 0 en el R E 1 / W R # / A N 6 , y
bit del registro TRISC se direc- registro de direccionamiento RE2/CS#/AN7, que se configu-
ciona la lnea correspondiente TRISD, se configuran como sali- ran individualmente como entra-
como entrada. Mientras que los da. En este puerto todas las da o salida a travs de los tres bit
bit que se ponen a 0 en el registro entradas disponen de un Trigger de menor peso del registro
de direccionamiento TRISC, se Schmitt. TRISE (TRISE <2:0>).
configuran como salida. Adems los pines de E/S digi- Las E/S del PORTE se con-
Las lneas del PORTC estn
multiplexadas con varias funcio-
nes de los perifricos. En la
tales de este puerto, pueden mul-
tiplexarse como una puerta para-
lela de 8 lneas (PSP), que sirve
vierten en entradas de control
(RD#, WR# y CS#)para el puerto
PSP cuando el bit PSPMODE que
61
RESISTOR
Tabla 1, se muestra los pines del para permitir la comunicacin en corresponde con el bit 4 del regis-
PORTC y las distintas funciones paralelo con otros elementos del tro TRISE. Los pines de E/S digi-
multiplexadas que tienen. sistema. tal del PORTD estn multiplexa-

Nombre bit Funcin


RC0/T1OSO/TICK1 bit 0 E/S digital. Salida Timer 1. Entrada de impulsos para el Timer1
RC1/T1OSI/CCP2 bit 1 E/S digital, entrada al oscilador del Timer1. Entrada del mdulo de
Captura 2. Salida del Comparador 2; Salida del PWM2
RC2/CCP1 bit 2 E/S digital. Entrada Captura 1; Salida Comparador 1; Salida PWM 1
RC3/SCK/SCL bit 3 E/S digital. Seal de reloj en modo SPI. Seal de reloj en modo I2C
RC4/SDI/SDA bit 4 E/S digital. Entrada de datos en modo SPI. Lnea de datos en modo I2C
RC5/SDO bit 5 E/S digital. Salida de datos en modo SPI
RC6/TX/CK bit 6 E/S digital. Lnea de transmisin en USART. Seal de reloj sncrona en
transmisin serie.
RC7/RX/DT bit 7 E/S digital. Lnea de transmisin en USART. Lnea de datos en transmisin serie
sncrona.
Tabla 1

RELACIN DE REGISTROS RELACIONADOS CON EL PORTC


Direccin Nombre Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 Valor en Valor en
POR,BOR el resto
de Reset
07 h PORTC RC7 RC6 RC5 RC4 RC3 RC2 RC1 RC0 xxxx xxxx uuuu uuuu
87 h TRISC Registro de direccionamiento del PORTC 1111 1111 1111 1111
Leyenda: x = desconocido, u = inalterado
Curso microcontroladoresPAGS 21/1/04 10:14 Pgina 62

RELACIN DE REGISTROS RELACIONADOS CON EL PORTD


Direccin Nombre Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 Valor en Valor en
POR,BOR el resto
de Reset
08 h PORTD RD7 RD6 RD5 RD4 RD3 RD2 RD1 RD0 xxxx xxxx uuuu uuuu
88 h TRISC Registro de direccionamiento del PORTC 1111 1111 1111 1111
89 h TRISE IBF OBF IBOV PSPMODE -- Registro de 0000 111 0000 -111
MICROCONTROLADORES
direccionamiento
del PORTE
Leyenda: x = desconocido, u = inalterado; Las celdas sombreadas no son usadas por el PORTD

RELACIN DE REGISTROS RELACIONADOS CON EL PORTE


Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 Valor en Valor en
POR,BOR el resto
de Reset
09 h PORTE --- --- --- --- --- RE2 RE1 RE0 ---- -xxx ---- -uuu
89 h TRISE IBF OBF IBOV PSPMODE --- Registro de
direccionamiento
del PORTE
97 h ADCON1 ADFM --- --- --- PCFG3 PCFG1 PCFG0 --0- 0000 --0- 0000
Leyenda: x = desconocido, u = inalterado; - = no implementado se lee como 0. Las celdas sombreadas no son usadas por el PORTE

das con las entradas digitales. Nota.- Despus de un Power- xadas de los bit del PORTD son
Cuando se seleccionan las entra- on-Reset, estos pines quedan las siguientes:
das analgicas los bit de control configurados como entradas ana- Para aclarar el concepto del
del TRISE deben ponerse a 0. lgicas. Las funciones multiple- manejo de los puertos vamos a

62
RESISTOR
Nombre
RE0/#RD/AN5
Bit
Bit 0
Funcin
E/S digital. Seal de lectura en el modo de puerta paralelo esclava. Canal 5 del
Conversor A/D
RE1/WR#/AN6 Bit 1 E/S digital. Seal de escritura PSP. Canal 6 del Conversor A/D
RE2/CS#/AN7 Bit 2 E/S digital. Seal de Chip Select en el modo PSP. Canal 7 del Conversor A/D

Descripcin del registro TRISE


" " "
R-0x R-0 R/W-0 R/W-0 U-1 R/W-1 R/W-1 R/W-1
IBF OBF IBOV PSPMODE --- Bit2 Birt1 Bit0
Bit 7 Bit 0

bit 7: IBF: Flag de buffer de entrada lleno


1 = Una palabra se ha recibido y esta esperando a ser leda por la CPU
0 = No se ha recibido ninguna palabra
bit 6: OBF: Flag de buffer salida lleno
1 = El buffer de salida todava tiene la palabra previamente escrita
0 = El buffer de salida ha sido ledo
bit 5 IBOV: La entrada de desbordamiento de buffer de entrada detecta bit ( en modo
microprocesador).
1 = Se ha producido una escritura antes de que la palabra de entrada se haya ledo (debe ponerse a cero
por software).
0 = No ha ocurrido desbordamiento
bit 4: PSPMODE: bit de seleccin de modo de Puerto Paralelo Esclavo
1 =Seleccionado el modo puerto paralelo esclavo
0 = Seleccionado el modo de E/S digital de propsito general
bit 3 :No implementado se lee como "0"
bit 2 :Bit2:bit de seleccin del modo de direccionamiento del pin RE2/CS#/AN7
1 = Entrada
0 = Salida
bit 1: Bit1: bit de seleccin del modo de direccionamiento del pin RE1 /WR#/AN6
1= Entrada
0 = Salida
bit 0: Bit0: bit de seleccin del modo de direccionamiento del pin RE0/RD#/AN5
1 = Entrada
0 = Salida
Curso microcontroladoresPAGS 21/1/04 10:14 Pgina 63

;**********************************************************************************
; Programa Display.asm Fecha : 27- Enero-2003
; Este programa lee el estado de cuatro interruptores conectados al PORTA <RA3:RA0>
; y representa sobre un display conectado al PORTB, el valor hexadecimal correspondiente
; Revisin 0.0 Programa para PIC16F87X
; Velocidad del Reloj: 4 MHz Reloj Instruccin: 1 MHz = 1 uS
; Perro Guardin :deshabilitado Tipo de Reloj : XT
; Proteccin del cdigo : OFF
;**********************************************************************************
List p=16F876 ;Tipo de procesador
include "P16F876.INC" ;Definiciones de registros internos
;__config _CP_OFF & _DEBUG_OFF & _WRT_ENABLE_ON & _CPD_OFF & _LVP_OFF & _XT_OSC & _WDT_OFF
; org 0x00 ;Vector de Reset
; goto Inicio
org 0x05
INICIO clrf PORTB ;Borra los latch de salida
bsf STATUS,RP0 ;Selecciona banco 1
clrf TRISB ;Puerta B se configura como salida
movlw b'00000110' ;Configura PORTA como E/S Digitales
movwf ADCON1
movlw b'00001111' ;Configura RA3:RA0 como entradas
movwf TRISA
bcf STATUS,RP0 ;Selecciona banco 0
BUCLE movf PORTA,W
andlw b'00001111' ;Lee el cdigo de RA0-RA3
call Tabla ;Convierte a 7 segmentos
movwf PORTB ;Visualiza sobre el display
goto BUCLE
;**********************************************************************************
Tabla: addwf PCL,F ;Desplazamiento sobre la tabla
retlw b'00111111' ;Dgito 0
retlw b'00000110' ;Dgito 1
retlw b'01011011' ;Dgito 2
retlw b'01001111' ;Dgito 3
retlw b'01100110' ;Dgito 4
retlw b'01101101' ;Dgito 5
retlw b'01111101' ;Dgito 6
retlw b'00000111' ;Dgito 7
retlw b'01111111' ;Dgito 8
retlw b'01100111' ;Dgito 9
retlw b'01110111' ;Dgito A
retlw b'01111100' ;Dgito b
retlw b'00111001' ;Dgito C
retlw b'01011110' ;Dgito d
retlw b'01111001' ;Dgito E
retlw b'01110001' ;Dgito F
;**********************************************************************************
ORG 0x1F00
bcf PCLATH,4
bcf PCLATH,3 ;Selecciona la pgina 0
goto INICIO
end

realizar un sencillo ejercicio que El circuito de aplicacin es el tal y como est es valido para
consiste en la lectura de unos que se muestra en la Figura 5. El los primeros y si se quitan los ";",
interruptores conectados al programa est diseado para se puede cargarse directamente
PORTA y la representacin de aquellos que utilicen el bootloa- utilizando cualquiera de los
dicho valor binario en hexadeci- der con el circuito que presenta- dems programadores, estas
mal sobre un display de 7 seg- mos en el nmero anterior o un lneas las hemos marcado en
mentos conectado en el PORTB. programador con el IC-PROG, azul.

Vcc= 5V
Figura 5.- Circuito de aplicacin del programa
Display.asm utilizando el PIC 16F876.

R3 R4 R5 R6 R1
10K 10K 10K 10K 10K R7 300
g a
Reset R8 300
R2 100 f
MCLR RB7 R9 300 f b
e
RA0 RA0 R10 300 g
RA1 RB6 d
RA2 R11 300
RA1 RA3 c
RA4 RB5 R12 300 e c
b
RA2 RA5 RB4
Vss RB3 R13 300 d
RB2 a
C1 27 pF
RB1
RA3 RB0
OSC1
XT 4Mhz
OSC2/CKOUT Vcc=5V
VDD

VSS
C2 27 pF
RC0 RC7
RC1 RC6
RC2 RC5
RC3 RC4
Curso microcontroladoresPAGS 29/4/03 10:38 Pgina 52

CURSO DE
MICROCONTROLADORES
MICROCONTROLADORES
PIC16F87X (...y V)
Fernando Remiro Domnguez
Profesor de Sistemas Electrnicos
IES. Juan de la Cierva
www.terra.es/personal/fremiro

MODULO TIMER0 de referencia de los <4>). Ponindose a cero T0SE se


El mdulo TIMER0 es un microcontroladores de la escala selecciona el flanco ascendente.
temporizador/contador con las media (DS33023). El preescaler se comparte
siguientes caractersticas: El modo temporizador se exclusivamente entre el TIMER0 y
El temporizador / contador selecciona poniendo a cero el bit el WDT. Y adems no es de
dispone de 8 bits T0CS (registro OPTION_REG lectura/escritura.
Puede escribirse y leerse <5>). En el modo temporizador, el
Preescaler programable por mdulo Timer0 se incremento en INTERRUPCIN DEL TIMER0
software de 8 bits cada ciclo de instruccin (sin el La interrupcin de TMR0 se

52
Puede trabajar con el reloj preescaler). Si el registro TMR0 se produce cuando el registro TMR0
interno o con una seal de reloj escribe, el incremento se inhibe se desborda al pasar de FFh a 00h.
externa durante los siguientes dos ciclos de Este desbordamiento pone a
RESISTOR Dispone de una interrupcin por instruccin. EL usuario puede uno el bit T0IF (INTCON<2>).
desbordamiento al pasar de FFh trabajar teniendo en cuenta esto y La ininterrupcin puede
a 00h ajustando el valor a cargar en el enmascararse poniendo a cero el
Seleccin de flanco ascendente o TMR0. bit T0IE (INTCON <5>). EL bit
descendente para el flaco del El modo contador se selecciona T0IF debe ponerse a cero por
reloj externo poniendo a uno el bit T0CS software al finalizar la rutina de
(registro OPTION_REG <5>). El atencin a la interrupcin del
En la Figura 1 se muestra un modo contador, Timer0 se desbordamiento de TMR0. La
diagrama de bloques del TIMER0 incremento en cada flaco de subida interrupcin de TMR0 no saca al
y el preescaler que comparte con el o de bajada de la seal que le llega microcontrolador del estado de
WDT. Puede encontrarse por RA4/TOCK1. El flanco de SLEEP, debido a que el
informacin adicional sobre incremento se determina por el bit temporizador est desactivado
el mdulo Timer0 en el manual T0SE (registro OPTION_REG durante el modo SLEEP
Bus de datos
Figura 1.- Diagrama de bloques del TIMER 0

8
Foosc/4 0
RA4/T0CKI Sincronizacin
1 PSout con el reloj
pin TMR0
1 interno
Preescaler 0 PSout
Programable (Retardo de 2 ciclos)
T0SE
El bit T0IF se
3 pone a 1 si hay
overflow
T0CS PS2,PS1,PS0 PSA

Notas:
1. El preescaler es compartido con el WDT (En la Figura 2 se puede ver un diagrama de bloques detallado
2. TOCS, TOSE, PSA, PS2:PS0 (OPTION_REG<5:0>)
Curso microcontroladoresPAGS 29/4/03 10:38 Pgina 53

Bus de datos
CLKOUT (=Foosc/4)

8
0 M 1 Retardo
RA4/T0CKI U M

MICROCONTROLADORES
U de 2 Registro TMRO
pin 1 X
0 X ciclos

T0SE
T0CS PSA

0
M Preescaler de 8 bits
Perro 1 U El bit T0IF se
Guardin X 8 pone a 1 si hay
overflow
3
Multiplexor 1-8 PS2:PS0
PSA
WDT bit de habilitacin
0 1
MUX PSA

WDT Figura 2.- Diagrama de bloques del TMR0


time-out

TABLA DE REGISTROS ASOCIADOS AL TIMER0


Direccin Nombre Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 Valor en Valor en el
POR,BOR resto de Reset
53
RESISTOR
01h 101h TMR0 Mdulo del registro del TMR0 xxxx xxxx uuuu uuuu
0bh, 8Bh
10Bh,18Bh INTCON GIE PEIE T0IE INTE RBIE TOIF INTF RBIF 0000 000x 0000 000x
81h,181h OPTION_REG RBPU INTEDG T0CS T0SE PSA PS2 PS1 PS0 1111 1111 1111 1111
85h TRISA --- --- Registro de direccionamiento de datos del PORTA --11 1111 --11 1111
Leyenda: x = desconocido, u = inalterado; - = no implementado se lee como 0. Las celdas sombreadas no son usadas
por el TIMER0

UTILIZACIN DEL TIMER0 puede asignarse indistintamente al WDT. EL preescaler no se puede


CON UN RELOJ EXTERNO modul de TIMER0 y el al WDT. leer ni escribir.
Cuando no se utiliza el La asignacin del preescaler al Nota.- Escribir en TMR0,
preescaler, la entrada de reloj Timer0 hace que no haya ningn cuando el preescaler es asignado a
externa es igual a la salida del preescaler para el WDT, y viceversa. TIMER0, limpia la cuenta del
preescaler. La sincronizacin de Este preescaler no se puede leer ni preescaler, pero no cambia la
TOCKI con los relojes de fase escribir (ver la Figura 2). configuracin del preescaler.
interior se acopla, a la salida del El bit PSA y PS2:PS0
preescaler en los ciclos Q2 y Q4 de (OPTION_REG <3:0>) PROGRAMA EJEMPLO DE
los relojes de fase internos. Por determinan la asignacin del FUNCIONAMIENTO DEL
consiguiente, es necesario que preescaler y el rango del preescaler. TIMER0
TOCKI est a nivel alto por al Cuando se le asigna al mdulo del Para comprobar el
menos durante 2Tosc (y un Tirner0 , todas las instrucciones, que funcionamiento de este programa
pequeo retardo de 20ns) y a nivel escriben en el registro TMR0 (por debemos de montar un circuito
bajo por lo menos 2Tosc (y un ejemplo CLRF TMR0, MOVWF como el que se muestra en la Figura
retardo RC de 20ns). TMR0, BSF TMR0,x... etc.) ponen 3, en el que se ha conectado un
a cero el preescaler. Cuando se le display del tipo ctodo comn al
PREESCALER asigna al WDT, una instruccin PORTB de PIC16F876. Una vez
Hay slo un preescaler CLRWDT limpia el preescaler cargado el programa TMR0_2.asm,
disponible que est compartido y junto con el temporizador del en el display se irn representado
Curso microcontroladoresPAGS 29/4/03 10:38 Pgina 54

Vcc= 5V

R1
10K R7 300
g a
Reset R8 300
R2 100 f
MICROCONTROLADORES
MCLR RB7 R9 300 f b
e
RA0 R10 300 g
RA1 RB6 d
RA2 R11 300
RA3 c
RA4 RB5 R12 300 e c
b
RA5 RB4
Vss RB3 R13 300 d
RB2 a
C1 27 pF
RB1
RB0
OSC1
XT 4Mhz
OSC2/CKOUT Vcc=5V
VDD
VSS
C2 27 pF
RC0 RC7
RC1 RC6
RC2 RC5
RC3 RC4

Figura 3.- Circuito de aplicacin para el programa TMR0_2 utilizando el PIC16F876

los nmeros del 0 al 9 con una


cadencia de aproximadamente un
TMR0_2.asm INT_TMR0
segundo.
El organigrama del programa es
el que se muestra en la Figura 4 y
INICIALIZA
en el programa que est pensado
54 PORTB-->SALIDA Guardar W y
R STATUS
PREESCALER--> 256 TMRO
Reg.TEMPORALES para cargarlo con el bootloader, se
han separado con un ";" y se han
RESISTOR marcado en azul, las lneas que
16-->CONTA 0 -->TMR0
habra que cargar si se utiliza un
programador como el ic-prog. En
este programa al TIMER0 se le
hace trabajar como temporizador,
que genera una interrupcin
0-->TMR0 CONTA-1 --> CONTA
cuando se desborda TMR0.

EL MDULO DE TIMER1
El mdulo de TIMER1 es un
0-->DIGITO CONTA=0? temporizador/contador de 16 bits,
formado por dos registros de 8 bits
SI SI cada uno TMR1H y TMR1L, que
son de lectura y escritura y que son
LEETABL DIGITO+1-->DIGITO los que guardan el valor de la
A cuenta en cada momento. El valor
NO
de los registros TMR1H y TMR1L
se incrementan desde 0000H hasta
NO
DIGITO=10?
16 -->CONTA FFFFH, en cuyo instante se vuelve
a poner a 0000h y se activa el
flag TMR1IF (PIR1<0>). La
REPONER W
ininterrupcin de TMR1 puede ser
Y habilitada/deshabilitada segn este
STATUS
a uno/cero el bit TMR1IE (PIE1
<0>).
EL TIMERl tiene los siguientes
1 -->TOIF modos de trabajo:
1. Como Temporizador
2. Como contador Sncrono
Figura 4.- Cronograma del programa 3. Como contador Asncrono
TMR0_2 RETFIE
Curso microcontroladoresPAGS 29/4/03 10:38 Pgina 55

;*************************************************************************************
; Programa TMR0_2.ASM Fecha : 15 - Abril - 2003
; Este programa presenta en el display de ctodo comn conectado en el PORTB
; los nmeros del 0 al 9, mostrando un dato por segundo (aproximadamente), la
; temporizacin la realiza utilizando la interrupcin por TMR0 y el registro auxiliar CONTA
; Revisin : 0.0 Programa para PIC16F87X
; Velocidad del Reloj: 4 MHz Reloj Instruccin: 1 MHz = 1 uS
; Perro Guardin : deshabilitado Tipo de Reloj : XT
; Proteccin del cdigo : OFF
;********************************************************************************************
List p=16F876 ;Tipo de procesador
include "P16F876.INC" ;Definiciones de registros internos
;************************** DEFINICION DE VARIABLES ************************************
W_TEMPORALequ 0x20 ;Almacena W antes de atender la interrupcin
S_TEMPORAL equ 0X21 ;Almacena Status antes de atender la interrupcin
DIGITO equ 0x22 ;numero a representar en display
CONTA equ 0x23 ;Contador auxiliar para alargar el tiempo a 1 segundo
;entre cada cambio de digito, ya que los 256 (FF) del Timer,
;aunque se divida por 256, es 4x256x256=262,144 ms
;*******************************************************************************************
; ORG 0x00
; goto INICIO
ORG 0x04
;*************************** ATENCION A LA INTERRUPCION *******************************
INT_TMR0
movwf W_TEMPORAL ;Guarda el valor actual de W cuando se interrumpe
swapf STATUS,W ;Intercambia nibbles y guarda en W
movwf S_TEMPORAL ;Almacena Status pero cambiado el ..
;.. nibble alto por el bajo
clrf TMR0 ;Inicializa TMR0=00
decfsz CONTA,f ;Decrementa CONTA y si =0 incrementa DIGITO
goto FIN_INT ;Si cont_aux <> 0 finaliza interrupcin
incf DIGITO,F ;Incrementa el DIGITO
movlw D'16' ;Al cargar TMR0 con 0 hace 256 cuentas con un predivisor de 256
;(programado en OPTION_REG). Como queremos 1sg. ponemos 16 en CONTA
; as obtenemos 4*256*256*16 = 1,048576s
movwf CONTA ;inicializa de nuevo CONTA para un nuevo digito
FIN_INT
swapf S_TEMPORAL,W ;Deja Status como estaba antes y en W
movwf STATUS
swapf W_TEMPORAL,F ;Intercambia nibbles del W guardado
swapf W_TEMPORAL,W ;Vuelve a intercambiar pero ya en W
bcf INTCON,T0IF ;Borra el flag de la interrupcin
retfie ;Retorno de interrupcin
;********************* PROGRAMA PRINCIPAL *************************************
INICIO
bcf STATUS,RP0
bsf STATUS,RP0 ;Habilita Banco1 de registros
clrf TRISB ;direcciona PortB como salidas
movlw B'00000111' ;Reloj interno asignado aTMR0 con divisor por 256
movwf OPTION_REG
bsf INTCON,GIE ;habilitacin general de las interrupciones
bsf INTCON,T0IE ;habilitacin de la interrupcin por TMR0
bcf STATUS,RP0 ;RP0=0 habilita Banco0 de registros
clrf TMR0 ;Inicializa TMR0 a 0
movlw D'16' ;Carga CONTA con 16
movwf CONTA
PONER_0
clrf DIGITO ;Carga DIGITO a 0 para iniciar cuenta
LEETABLA
call TABLA
movwf PORTB ;Muestra digito en el display 7 segmentos (PortB)
movlw D'9' ;
subwf DIGITO,W ;Compara DIGITO con 9
btfss STATUS,Z ;
goto LEETABLA ;Si DIGITO NO = 9, incrementa DIGITO
goto PONER_0 ;Si DIGITO=9,lo pone a 0 de nuevo.
;********************* TABLA CON LOS VALORES DE LOS DIGITOS ******************
TABLA
movf DIGITO,W ;Guarda digito en acumulador
addwf PCL,F ;Suma al contador de programa el digito
DT 0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X67
;*******************************************************************************
ORG 0x1F00
bcf PCLATH,4
bcf PCLATH,3 ;Selecciona la pgina 0
goto INICIO ;Salto a la direccin de INICIO del programa
;*******************************************************************************
END
Curso microcontroladoresPAGS 29/4/03 10:38 Pgina 56

REGISTRO T1CON: Registro de control del TIMER1 (direccin 10h)


U-0 U-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0
--- --- T1CKPS1 T1CKPS0 T1OSCEN T1SYNC TMR1CS TMR1ON
Bit 7 Bit 0

bit 7-6: No implementados: Se lee como "0"


bit 5-4: TlCKPS1:T1CKPS0: bit de seleccin del preescaler de la seal de reloj del TIMER1
MICROCONTROLADORES
11 = valor del preescaler 1:8
10 = valor del preescaler 1:4
01 = valor del preescaler 1:2
00 = valor del preescaler 1: 1
bit 3 : T1OSCEN: bit de habilitacin del oscilador del TIMER1. Cuando se emplea un oscilador
externo, hay que poner este bit a 1. El TMR1 puede trabajar a una frecuencia totalmente independiente
de la del sistema.
1 = Habilita el oscilador
0 = Deshabilita el oscilador
Nota.- El oscilador y la resistencia de desconectan para reducir el consumo

bit 2: #TlSYNC: bit de control de sincronizacin de la seal de entrada.


Con TMR1CS = 1
1= No sincroniza la entrada de reloj externa
0 = Sincroniza la entrada de reloj externa
Con TMR1CS = 0
En esta condicin se ignora. El TIMER1 utiliza el reloj interno cuando TMRICS=0
bit 1 TMR1CS: bit de seleccin de la fuente de reloj del TIMER1
1 = Reloj externo por el pin RC0/T1OSO/T1CK1 (flanco ascendente)
0 = Reloj interno (FOSC/4)
bit 0: TMR1ON: TIMER1. activo. Hace entrar o no en funcionamiento el TIMER1.
1 = Habilita el TIMER1

56
RESISTOR
0 = Deshabilita el TIMER1

El modo de trabajo viene efecto ya que el reloj interno est T1OSCEN est a uno, y por el pin
determinado por la fuente de los siempre sincronizado. RC1/TlOSI/CCP2, cuando el bit
impulsos de reloj, es decir, la seal T1OSCEN est a cero.
de reloj puede ser externa o interna, MODO DE Si T1SYNC se pone a cero,
se selecciona con el bit TMR1CS FUNCIONAMIENTO DEL entonces la entrada de reloj externa
del registro T1CON<l>, cuando TIME1 COMO CONTADOR se sincroniza con los relojes de fase
este bit est a nivel bajo En este modo puede trabajar interiores. La sincronizacin se hace
se selecciona el reloj el interno del como contador sncrono o despus de la fase del preescaler. En
micro-controlador (Fosc/4) y asncrono . Cuando el TIMER1 se el preescaler la fase de la seal de
cuando est a uno se selecciona el est incrementando segn le llegan reloj es por lo tanto asncrona.
modo contador y cuenta los los impulsos externos, los En este modo de trabajo,
impulsos que le llegan a travs del incrementos ocurren en los flancos durante el modo SLEEP el
pin RC0/TlCKl. Adems como se de subida. Despus de que el TIMER1 no se incrementa an
ver mas adelante el TIMER1 TIMER1 se ha configurado como cuando la seal de reloj
tiene la posibilidad de contador, debe producirse un flanco externa est presente. El
reinicializarse, a partir del mdulo de bajada antes de empezar a preescaler sin embargo continua
CCP. contar. incrementndose.

MODO DE MODO DE MODO DE


FUNCIONAMIENTO DEL FUNCIONAMIENTO DEL FUNCIONAMIENTO DEL
TIMER1 COMO TIMER1 COMO CONTADOR TIMER1 COMO CONTADOR
TEMPORIZADOR SNCRONO ASNCRONO
Este modo se selecciona Para seleccionar este modo se Cuando el bit de control
poniendo a cero el bit TMR1CS pone a uno el bit TMR1CS T1SYNC (T1CON <2>) se poner a
(T1CON <1>. En este modo la (T1CON <1>). En este modo el uno, la seal de reloj externa no se
seal de reloj es el reloj interno del contador se incrementa en cada sincroniza. El contador sigue
microcontrolador FOSC/4. En este flanco ascendente de la seal de realizando la cuenta de forma
modo de trabajo el bit T1SYNC reloj que se introduce por el pin asncrona respecto a la fase de la
(T1CON <2>) no tiene ningn RC0/T1OSO/TICK1 cuando el bit seal de reloj interna. El contador
Curso microcontroladoresPAGS 29/4/03 10:38 Pgina 57

T1CK1
(Por defecto a
nivel alto)

MICROCONTROLADORES
T1CKI
(Por defecto a
nivel bajo)

Nota.- Las flechas indicas los incrementos del contador

El bit TMR1F se pone a 1


cuando se desborda

TMR1 Entrada Clock


0
Sincronizada
TMR1H TMR1L
1

TMR1ON
on/off T1SYNC

1 Preescaler sincronizacin
RC0/T1OSO/T1CKI deteccin
1,2,4,8
FOSC/4 0
RC1/T1OSI/CCP2 Clok

T1OSCEN
Interno

TMR1CS
2
T1CKPS1:T1CKPS0 Entrada SLEEP 57
RESISTOR
Habilita
Oscilador
Figura 5.- Diagrama de bloques de TIMER1
Tipo de Oscilador Frecuencia C1 C2
LP 32 kHz 33pF 33pF
100kHz 15 pF 15 pF
200 15 pF 15 pF
Estos valores son para los siguientes cristales de referencia
32.768 EpsonC-001R21.768K-A 20 PPM
100 kHz Epson C-2 100.000 KC-p1 20 PPM
200 kHz STD XTL 200.000 kHz 20 PPM
Nota.-
1. Capacidades mayores aumentan la estabilidad del oscilador, pero tambin aumentan el start-up.
2. Cada cirstal/resonador tiene sus propias caractersticas, el usuario debe consultar los valores apropiados
de los componentes externos al cristal.
Tabla 1.- Seleccin de los condensadores para el oscilador del TIMER1
contina la cuenta incluso en el para el mdulo CCP (Captura y recibiendo (teniendo cuidado con el
modo SLEEP y puede generar una comparacin-PWM) hardware). Sin embargo, el usuario
interrupcin por desbordamiento debe tener en cuenta que el
que despierta al procesador. Hay LECTURA Y ESCRITURA EN EL contador es de 16 bits y se pueden
que tener especial cuidado con el TIMER1 CUANDO SE tener ciertos problemas al leer los
software al leer o escribir el TRABAJA EN EL MODO dos registros de ocho bits, ya que el
contador. CONTADOR ASNCRONO contador puede desbordarse entre
Cuando se trabaja en el modo Se pueden leer los contadores las lecturas.
contador asncrono, el TIMER1 no TMR1H y TMR1L mientras la Para escribir en l, se
puede usare como base de tiempos seal externa del contador se est recomienda que el usuario
Curso microcontroladoresPAGS 29/4/03 10:38 Pgina 58

simplemente pare el contador y (CP1CON<3:0>)), esta seal un disparo de evento especial en


escriba los valores deseados. reestablecer el TIMIER1. CCP1 y CCP2. El registro T1CON
Cuando se escribe el registro del Nota.- El evento especial que se inicializa a 00h despus de un
contador puede haber conflicto activa los mdulos CCP1 y CCP2 no Power-on Reset o Brown-out Reset
mientras este se est activar el flag que deja a 1:1 el preescaler. En los
incrementando. Esto puede TMR1IF (PIR1<0>). dems reset, el registro no es
producir un valor imprevisible en el El TIMER1 debe configurarse alterado.
contador. como temporizador o contador
sncrono. TIMER1 PREESCALER
OSCILADOR DEL TIMER1 Restablecimiento TIMER1 que El contador del preescaler se
Se puede conectar un oscilador usa un disparador de CCP. pone a cero al escribir en los
a cristal entre los pines T1OSI TIMER1 debe configurarse registros TMR1H o TMR1L.
(entrada) y T1OSO (salida para temporizador o contador
del amplificador). Se debe sncrono para aprovechar esta RESUMEN DE REGISTROS
habilitar poniendo a uno el bit de caracterstica. Si el TIMER1 est ASOCIADOS AL TIMER1
control TLOSCEN (TICON <3>). trabajando en modo contador En la siguiente tabla se muestran
El oscilador de bajo consumo asncrono, el reset no puede ser los registros principales que
puede trabajar hasta 200 kHz. En activado. controlan el comportamiento del
estas condiciones el oscilador sigue En el caso de escribir sobre el TIMER1 y la distribucin de los
funcionando aunque se fuerce el TIMER1 en el momento del bit.

Direccin Nombre Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 Valor en Valor en el
POR,BOR resto de Reset
0Bh,8Bh
10Bh,18Bh INTCON GIE PEIE T0IE INTE RBIE TOIF INTE RBIF 0000 000x 0000 000u
0Ch PIR1 PSPIF ADIF RCIF TXIF SSPIF CCP1IF TMR2IF TMR1IF 0000 0000 0000 0000
0Bh PIE1 PSPIE ADIE RCIE TXIE SSPIE CCP1IE TMR2IE TMR1IE 0000 0000 0000 0000
0Eh TMR1L Registro de carga del byte de menor peso del registro de 16 bits de TMR1 xxxx xxxx uuuu uuuu
0Fh TMR1H xxxx xxxx uuuu uuuu
10h T1CON --- --- T1CKPS1 T1CKPS0 T1OSCEN T1SYNC TMR1CS TMR1ON --xx xxxx --uu uuuu

Leyenda
x = desconocido, u = inalterado; - = no implementado se lee como 0. Las celdas sombreadas no son usa-
das por el TIMER1
Nota 1: Los bits PSPIE y PSPIF estn reservados para el PIC16F873/876, mantener estos bits a cero.

modo SLEEP. Est pensado para disparo del evento especial de


trabajar con un cristal de hasta 32 CCP1 o CCP2, se tomar el valor PROGRAMA EJEMPLO DE
kHz. La Tabla 1 muestra el valor anterior. FUNCIONAMIENTO DEL
de los condensadores para el En el caso de escribir sobre TIMER1
TIMER1. TIMER1 si coincide con un disparo Para comprobar el
El oscilador TIMER1 es por evento especial de CCP1 o funcionamiento de este programa
idntico al oscilador LP. El CCP2, se carga el valor anterior. utilizaremos el circuito de la
usuario debe proporcionar un En este modo de Figura 3 que es el mismo
tiempo de retardo por software funcionamiento, el par de registros que hemos utilizado para
para asegurar la salida apropiada CCPRxH:CCPRxL se reponen comprobare el funcionamiento del
del oscilador. para volver a tener el periodo del TIMER0, en el que se ha
TIMER1. conectado un display del tipo
RESTABLECIMIENTO DEL ctodo comn al PORTB de
TIMER1 UTILIZADO LA RESTABLECIMIENTO DEL PAR PIC16F876. Una vez cargado el
SALIDA TRIGGER DEL CCP DE REGISTRO DEL TIMER1 programa TMR1_0.asm, en el
Si el mdulo CCP1 o CCP2 (TMR1H, TMR1L) display se irn representado los
se configuran en modo Los registros TMR1H y nmeros del 0 al 9 con una
comparacin para generar un TMR1L no se inicializan a 00h cadencia de aproximadamente un
"disparo por evento especial" despus de un Power-on Reset o segundo.
(CCP1M3:CCP1M0 = 1011 por cualquier otro reset excepto por
Curso microcontroladoresPAGS 29/4/03 10:38 Pgina 59

;*************************************************************************************
; Programa TMR1_0.ASM Fecha : 15 - Abril - 2003
; Este programa presenta en el display de ctodo comn conectado en el PORTB
; los nmeros del 0 al 9, mostrando un dato por segundo (aproximadamente), la
; temporizacin la realiza utilizando la interrupcin por TMR1 y el registro auxilar CONTA
; Revisin : 0.0 Programa para PIC16F87X
; Velocidad del Reloj: 4 MHz Reloj Instruccin: 1 MHz = 1 uS
; Perro Guardin : deshabilitado Tipo de Reloj : XT
; Proteccin del cdigo : OFF
;********************************************************************************************
List p=16F876 ;Tipo de procesador
include "P16F876.INC" ;Definiciones de registros internos
;********************* DEFINICION DE VARIABLES *****************************
W_TEMPORALequ 0x20 ;Almacena W antes de atender la interrupcin
S_TEMPORAL equ 0X21 ;Almacena Status antes de atender la interrupcin
DIGITO equ 0x22 ;numero a representar en display
CONTA equ 0x23 ;Contador auxiliar para alargar el tiempo a 1 segundo
;entre cada cambio de digito, ya que los 256 (FF) del Timer,
;aunque se divida por 256, es 4x256x256=262,144 ms
;*******************************************************************************
; ORG 0x00
; goto INICIO
ORG 0x04
;******************* ATENCION A LA INTERRUPCION **************************
INT_TMR1
movwf W_TEMPORAL ;Guarda el valor actual de W cuando se interrumpe
swapf STATUS,W ;Intercambia nibbles y guarda en W
movwf S_TEMPORAL ;Almacena Status pero cambiado el ..
;.. nibble alto por el bajo
movlw low ~.62500 ;Carga parte baja del contador con el complemento
movwf TMR1L ; de 62500 en hex.
movlw high ~.62500 ;Carga parte baja del contador con el complemento
movwf TMR1H ;de 62500 en hex.
bcf PIR1,0 ;Desconecta el flag del TMR1
incf PORTB,F ;Incrementa el contador de la Puerta B
decfsz CONTA,f ;Decrementa CONTA y si =0 incrementa DIGITO
goto FIN_INT ;Si cont_aux <> 0 finaliza interrupcion
incf DIGITO,F ;Incrementa el DIGITO
movlw D'2'
movwf CONTA ;inicializa de nuevo cont_aux para un nuevo digito
FIN_INT
swapf S_TEMPORAL,W ;Deja Status como estaba antes y en W
movwf STATUS
swapf W_TEMPORAL,F ;Intercambia nibbles del W guardado
swapf W_TEMPORAL,W ;Vuelve a intercambiar pero ya en W
bcf INTCON,T0IF ;Borra el flag de la interrupcin
retfie
;********************* PROGRAMA PRINCIPAL *************************************
INICIO
bcf STATUS,RP0
bsf STATUS,RP0 ;Habilita Banco1 de registros
clrf TRISB ;direcciona PortB como salidas
movlw b'11111111'
movwf OPTION_REG ;Preescaler d 128 asociado al WDT
bsf PIE1,0 ;habilita interrupcin del TMR1
bcf STATUS,RP0 ;Selecciona banco 0
;El TMR1 trabaja con oscilador interno y un preescaler de 1:8. Si se trabaja a una frecuencia
;de 4 MHz, el TMR1 deber ser cargado con 62500 para que provoque interrupcin al de 0.5s b
movlw b'00110001'
movwf T1CON
movlw b'11000000'
movwf INTCON ;Habilitacin global de interrupciones
movlw D'2' ;Carga CONTA con 2
movwf CONTA
PONER_0
clrf DIGITO ;Carga DIGITO a 0 para iniciar cuenta
LEETABLA
call TABLA
movwf PORTB ;Muestra digito en el display 7 segmentos (PortB)
movlw D'9' ;
subwf DIGITO,W ;Compara DIGITO con 9
btfss STATUS,Z ;
goto LEETABLA ;Si DIGITO NO = 9, incrementa DIGITO
goto PONER_0 ;Si DIGITO=9, lo pone a 0 de nuevo.
;********************* TABLA CON LOS VALORES DE LOS DIGITOS ******************
TABLA
movf DIGITO,W ;Guarda digito en acumulador
addwf PCL,F ;Suma al contador de programa el digito
DT 0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X67
;*******************************************************************************
ORG 0x1F00
bcf PCLATH,4
bcf PCLATH,3 ;Selecciona la pgina 0
goto INICIO ;Salto a la direccin de INICIO del programa
;*******************************************************************************
END
Curso (60-64) 3/7/03 09:47 Pgina 60

CURSO DE
MICROCONTROLADORES
MICROCONTROLADORES
PIC16F87X (...y VI)
Fernando Remiro Domnguez
Profesor de Sistemas Electrnicos
IES. Juan de la Cierva
www.terra.es/personal/fremiro

EL MDULO TIMER2 selecciona a travs de los bits especiales, de manera, que al incre-
El TIMER2 es un temporizador- T2CKPS1:T2CKPS0 (T2CON mentarse TMR2 y coincidir con el
contador ascendente de 8 bits que <1:0>). El postsrscaler tiene como valor del registro PR2 se produce un
ocupa la posicin 11H del banco de misin poner a nivel alto el flag de impulso de salida por EQ, estos
registros especiales, con un preesca- interrupcin del TMR2 cuando se impulsos pueden ser divididos por
ler y un postscaler. Se puede usar haya producido la igualdad entre el un postescaler antes de activar el
como base de tiempo para el mdulo registro PR2 y el TMR2 un nmero flag TMR2IF (PIR1<1>). El registro
PWM, el mdulo CCP (Mdulo de de veces comprendido entre 1 y 16 y PR2 es un registro de 8 bits que pue-
Captura y Comparacin) y el Puerto que se indica con los bits de ser escrito y ledo. Este registro

60
Serie Sncrono (SSP). El registro T2OUTPS3:T2CKPS0 (T2CON toma el valor FF despus de un
TMR2 se puede leer y escribir y se <6:3>) Reset.
pone a cero despus de realizar un El postscaler permite dividir la
RESISTOR Reset. OPERACIONES CON EL seal que activa el flag
La seal de reloj interna TIMER2 de interrupciones por desbordamien-
(FOSC/4) antes de llegar al TMR2 El Titner2 tiene emparejado el to del TMR2 por cualquier valor
pasa por un preescaler (Predivisor) registro PR2 que ocupa la posicin comprendido entre 1:1 hasta 1:16,
con rangos de 1:1, 1:4, 1:16 que se de 92H del banco 1 de registros para controlar el postescaler se utili-

Figura 1.- Diagrama de bloques del mdulo TIMER2


Curso (60-64) 3/7/03 09:47 Pgina 61

zan los bit TOUTPS3:TOUTPS0 REGISTRO T2CON: REGISTRO DE CONTROL DEL TIMER2
(T2CON <6:3>). (DIRECCIN 12H)
El Preescaler y el Postescaler se
ponen a cero cuando:
Se escribe sobre el registro TMR2 U-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0
Se escribe sobre el registro
T2CON --- TOUTPS3 TOUTPS2 TOUTPS1 TOUTPS0 TMR2ON T2CKPS1 T2CKPS0
Se produce un reset (POR, MCLR
restablecido, WDT reestablecido o Bit 7 Bit 0
BOR)
TMR2 no se pone a cero cuando
se escribe en T2CON. bit 7: No implementado: Se lee como 0
Para reducir el consumo total del
microcontrolador se puede "apagar" bit 6-3: TOUTPS3:TOUTPS0: bit de seleccin del rango del divisor del
el temporizador poniendo a cero el
bit TMR2ON (T2CON<2>). Postescaler para el TIMER2

INTERRUPCIONES DEL 0000 = Divisor del postescaler 1:1


TIMER2
0001 = Divisor del postescaler 1:2
El temporizador TMR2 tiene un
flag de desbordamiento el TMR2IF 0010 = Divisor del postescaler 1:3
(<1>PIR1).
El TMR2 tiene asociado un 0011 = Divisor del postescaler 1:4
Registro de Periodo PR2, que ocupa
la posicin 92h. Cuando el valor de 0100 = Divisor del postescaler 1:5
cuenta de TMR2 coincide con el
valor cargado en PR2 se genera un 0101 = Divisor del postescaler 1:6
impulso en la salida EQ (ver la Figu-
ra 1) y se pone a cero el TMR2. Estos 0110 = Divisor del postescaler 1:7
impulsos pueden ser divididos por el 0111 = Divisor del postescaler 1:8
postdivisor antes de activar el flag
TMR21F(<1> PIR1). 1000 = Divisor del postescaler 1:9
El temporizador puede producir
una interrupcin si se pone a 1 el bit 1001 = Divisor del postescaler 1:10
TMR2IE (<1> PIE1)
1010 = Divisor del postescaler 1:11
SALIDA DEL TMR2
La salida de TMR2 (antes del 1011 = Divisor del postescaler 1:12
postscaler) alimenta al Mdulo de
1100 = Divisor del postescaler 1:13
SSP que opcionalmente puede usar-
se para generar la seal de reloj de 1101 = Divisor del postescaler 1:14
desplazamiento.
1110 = Divisor del postescaler 1:15
PROGRAMA EJEMPLO
DE FUNCIONAMIENTO 1111 = Divisor del postescaler 1:16
DEL TIMR2 CON
INTERRUPCIONES. bit 2: TMR2ON: bit de activacin del TIMER2
Para comprobar el funcionamien-
to de este programa, utilizaremos el 1:= habilita el funcionamiento del TIMER2
mismo montaje que hemos utilizado 0 = Inhibe el funcionamiento del TIMER2
para comprobar el funcionamiento
del Timer0 y del Timer1, que es el bit 1-2: T2CKPS1:T2CKPS0 Seleccin del rango de divisor del Preescaler
que se representa en la Figura 2.
La estrategia para conseguir del TIMER2
la temporizacin de aproximada-
mente un segundo es la que se refle- 00 = Divisor del Preescaler 1:1
ja en el diagrama de flujos de la
Figura 3, y consiste en lo siguiente. 01 = Divisor del Preescaler 1:4
Partiendo de la base de que nuestro
Ix = Divisor del Preescaler 1:16
microcontrolador tiene un cristal de
Curso (60-64) 3/7/03 09:47 Pgina 62

REGISTROS ASOCIADOS AL TMR2


Direccin Nombre Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 Valor en Valor en el
MICROCONTROLADORES
POR,BOR resto de Reset
0Bh,8Bh INTCON GIE PEIE T0IE INTE T0IF RBIE INTF RBIF 0000 000x 0000 000u
10Bh,18Bh
0Ch PIR1 PSPIF(1) ADIF RCIF TXIF SSPIF CCP1IF TMR2IF TMR1IF 0000 0000 0000 0000
0Bh PIE1 PSPIE(1) ADIE RCIE TXIE SSPIE CCP1IE TMR2IE TMR1IF 0000 0000 0000 0000
11h TMR2 Mdulo Del registro Timer2 0000 0000 0000 0000
12h T2CON --- TOUTPS3 TOUPS2 TOUPS1 TOUPS0 TMR2ON T2CKPS1 T2CKPS0 - 000 000 - 000 0000
92h PR2 Registro de perodo del TMR2 1111 1111 1111 1111

Leyenda
x = desconocido, u = inalterado; - = no implementado se lee como 0. Las celdas sombreadas no son usadas
por el TIMER2
Nota 1: Los bits PSPIE y PSPIF estn reservados para el PIC16F873/876, mantener estos bits a cero.

62
RESISTOR

Figura 2.- Circuito de aplicacin para el programa TMR2_1

cuarzo de 4 Mhz, y de que un ciclo 195, con un preescaler de 1/16, se as de cdigo que hemos eliminado
mquina se ejecuta en un 1 s, la puede llegar a 3120 s y por ltimo para utilizar el programa bootloader
mxima cuenta del que podemos con un postescaler de 1/16 se obtiene para poder realizar la carga del mis-
hacer con el TIMER2 es de 256 s, una temporizacin de 49.920 s que mo y en color verde, las lneas que
si tenemos en cuenta la mxima divi- aproximadamente es de 50 ms. Pues hemos aadido, de tal manera que
sin del preescaler de 1/16 y del bien, si esta temporizacin se realiza eliminado las lneas de color verde y
postscaler 1/16 la mxima cuenta o 20 veces, ya tenemos prcticamente habilitando las que estn en azul el
temporizacin a la que se puede lle- 1 segundo. programa puede grabarse directa-
gar es a 256 x 16 x 16 = 65536 s. El programa es el siguiente, en el mente en un PIC16F876.
Por lo tanto, si se carga el registro de que como viene siendo habitual
periodos PR2 con el valor decimal estn marcado en color azul las lne-
Curso (60-64) 3/7/03 09:47 Pgina 63

MICROCONTROLADORES
63
RESISTOR

Figura 3.- Organigrama del programa TMR2_1.asm


Curso (60-64) 3/7/03 09:47 Pgina 64

;**********************************************************************************
;TIMER2-1.asm
;El TMR2. Temporizacin hace que el display que est conectado al PORTB se incremente cada
; segundo. El TMR2 provoca una interrupcin cada 50 mS. Transcurridas 20 interrupciones, el tiempo
; total obtenido es de 1 segundo.
; Revisin : 0.0 Programa para PIC16F87X
MICROCONTROLADORES
; Velocidad del Reloj: 4 MHz Reloj Instruccin: 1 MHz = 1 uS
; Perro Guardin : deshabilitado Tipo de Reloj : XT
; Proteccin del cdigo : OFF
;**********************************************************************************
List p=16F876 ;Tipo de procesador
include "P16F876.INC" ;Definiciones de registros internos
VECES equ 0x20 ;Variable de temporizacin
CONTADOR equ 0x21 ;Variable del contador
; org 0x00 ;Vector de Reset
; goto INICIO
org 0x04
goto INTERUPCION ;Vector de interrupcin
;********************* TABLA CON LOS VALORES DE LOS DIGITOS ******************
TABLA addwf PCL,F ;Suma al contador de programa el digito
DT 0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X67;
;*******************************************************************************
;PROGRAMA DE ATENCIN A LA INTERRUPCION. se ejecuta cada 50 ms, cuado se ejecuta
;20 veces, indica de que ha transcurrido 1 segundo
INTERUPCION decfsz VECES,F ;Ha pasado un segundo ??
goto No_es_1_seg ;No
incf CONTADOR,F ;Si, incrementa el contador
movlw .10
subwf CONTADOR,W
64
RESISTOR
btfsc
clrf
STATUS,Z
CONTADOR
movf CONTADOR,W
call TABLA
;Contador > 9 ??
;Si, ponerlo a 0
;Convierte a 7 segmentos
movwf PORTB ;presenta el dato en el display
movlw .20
movwf VECES ;Reinicia variable delay
No_es_1_seg bcf PIR1,TMR2IF ;Repone el flag del TMR2
clrf TMR2 ;Reinicia el TMR2
retfie
;*****************************************************************************
;PROGRAMA PRINCIPAL
;*****************************************************************************
INICIO clrf PORTB ;Desconecta salidas
bsf STATUS,RP0 ;Selecciona banco 1
movlw b'00000110'
movwf ADCON1 ;Configura PORTA E/S digitales
clrf TRISB ;Configura PORTB como salida
bsf PIE1,TMR2IE ;Habilita interrupcin del TMR2
movlw .195
movwf PR2 ;Carga registro de periodos con 195
bcf STATUS,RP0 ;Selecciona banco 0
movlw b'01111111'
movwf T2CON ;TMR2 ON, preescaler 1/16 y postcaler 1/16
clrf TMR2 ;pone a cero TMR2
movlw .20
movwf VECES ;Inicia variable de VECES
movlw b'11000000'
movwf INTCON ;Habilita interrupciones
clrf CONTADOR ;Inicia el contador
goto $ ;Bucle infinito
;*****************************************************************************
ORG 0x1F00
bcf PCLATH,4
bcf PCLATH,3 ;Selecciona la pgina 0
goto INICIO ;Salto a la direccin de INICIO del programa
;*****************************************************************************
end
56-83 MICROCONTROLADORES 14/8/03 13:26 Pgina 56

CURSO DE
MICROCONTROLADORES
MICROCONTROLADORES
PIC16F87X (...y VII)
Fernando Remiro Domnguez
Profesor de Sistemas Electrnicos
IES. Juan de la Cierva
www.terra.es/personal/fremiro

MODULO CCP CAPTURA / de provocar peridicamente inte- CCP2CON que se encuentra en la


COMPARACIN / PWM rrupciones. direccin lDh. El modo de disparo
(Modulacin de anchura de especial se genera por igualdad en la
impulsos) Mdulo CCP2: comparacin con el TIMER1 lo que
Los microcontroladores de la El registro de Captura / Compa- provoca que se reestablezca el
familia 16F87X disponen de dos racin / PWM (CCPR2) de 16 bits TIMER1 y comience una conversin
mdulos de Captura/ Comparacin y est formado por dos registros de 8 A/D, si el convertidor A/D est habi-
PWM, cada modulo tiene un registro bits: CCPR2L (byte bajo) que ocupa litado. Con lo se cual puede realizar
de 16 bits que pueden trabajar como: la direccin lBh y CCPR2H (byte la conversiones A/D de forma peri-

56
Registro de captura de 16 bit alto) que ocupa la direccin 1Ch. El dica sin en control del programa de
Registro de comparacin de 16 registro de control del CCP2 es el instrucciones.
bits
RESISTOR Modulacin de anchura de pulsos
Modo CCP Recurso de Timer Mdulo de Captura
PWM Captura Timer1 En este modo se captura en
CCPRxH:CCPRxL el valor del
Comparacin Timer1
Los mdulos CCP1 y CCP2 son registro de 16 bits del TMR1 cuan-
idnticos en su modo de funciona- PWM Timer2 do se produce un evento por el pin,
miento, con la excepcin del modo Tabla 1.- Modo CCP Recurso de RCy/CCPx . Un evento puede ser:
de disparo especial. En las tablas 1 y TIMER. En los mdulos de captura
Cada flanco descendente
2 se muestran los recursos e interac- Cada flanco ascendente
y comparacin intervienen el
ciones de los mdulos. Seguida- Cada 4 flancos ascendentes
mente describiremos el funciona- TMR1, en PWM el TMR2. Cada 16 flancos ascendentes
miento del mdulo CCP1. El mdu-
lo CCP2 opera de igual modo salvo
en lo referente al modo de disparo
INTERACCIN DE LOS DOS MDULOS CCP
especial. Modo CCPx Modo CCPy Interaccin
Captura Captura La misma base de tiempos de TMR1
Mdulo CCP1: Captura Comparacin El comparador debe configurarse para el
El registro de Captura / Compa-
modo de disparo especial que pone a cero
racin / PWM (CCPR1) de 16 bits
esta formado por dos registros de 8 el TMR1
bits: CCPR1L (byte, bajo) que ocupa Comparacin Comparacin El comparador(es) debe configurarse para
la direccin 15h y el CCPR1H (byte el modo de disparo especial que pone a
alto) que ocupa la posicin 16h. El cero el TMR1
registro de control o configuracin PWM PWM El PWM tendr la misma frecuencia y
del CCP1 es el CCP1CON que ocu-
pa la direccin 17h. El modo de dis- proporcin de actuacin (interrupcin de
paro especial se genera por la igual- TMR2)
dad en la comparacin de CCPR1 PWM Captura Ninguna
con TMR1 y reestablecer el PWM Comparacin Ninguna
TIMER1 y el CCPR1, funciona
como un registro de perodo, capaz Tabla 2.- Interacin de los mdulos CCP
56-83 MICROCONTROLADORES 14/8/03 13:26 Pgina 57

Tabla 3.- Registros de configuracin CCP1CON/CCP2CON

Un evento se selecciona por biar las condiciones de funciona- cambiar las condiciones de funciona-
medio de los bit de control miento en el modo de captura para miento en el modo captura para evi-
CCP1M3:CCP1M0 del registro evitar que se produzcan falsas inte- tar que se produzcan falsas interrup-
CCP1CON. Cuando se produce una rrupciones durante la operacin. ciones durante la operacin.
captura, se pone a " 1 " el flag Se debe poner a cero el flag
CCP1IF del registro PIRI <2>, ade- Configuracin del pin CCP CCP1IF por software.
ms si est a " 1 " el bit PIE de En el modo captura, el pin
CCP1IE<2>, se genera una peticin RC2/CCP1 debe configurarse como CCP Preescaler
de interrupcin. El flag CCP1IF entrada, poniendo un "1" en Hay cuatro modos de preescaler,
debe ponerse a cero por software. Si TRISC<2>. que vienen seleccionados por los bits
se produce otra captura antes de lee Nota.- Si el pin RC2/CCP1 se CCPxM3:CCPxM0. Siempre que el
el registro CCPR1, el valor captura- configura con resistencia de pull- mdulo CCP est desactivado o no
do se perder. up, una escritura en el puerto, est en modo de captura, el contador
Cuando se trabaja en el modo puede causar una condicin de del preescaler se pone a cero. Cual-
captura con el CCP1, el TMR1 debe captura. quier reset tambin pone a cero el
estar configurado para trabajar como preescaler.
temporizador o como contador sn- Software de Interrupcin Cuando se cambia el preescaler
crono. Nunca en modo asncrono. Es recomendable desactivar el durante una captura, se puede gene-
Es recomendable desactivar el mdulo CCP poniendo a cero rar una interrupcin. Puede ocurrir
mdulo CCP cuando se van a cam- CCP1IE (PIE1 <2>) cuando se van a tambin que el contador de preesca-
56-83 MICROCONTROLADORES 14/8/03 13:26 Pgina 58

Se pone a "1" el flag CCPIF


Preescaler (PIR1<2>)
1,4,16
Pin RC2/CCP1 CCPR1H CCPR1L
MICROCONTROLADORES
Deteccin Habilita
de
Flanco Captura

TMR1H TMR1L

Q's CCP1CON<3:0>

Figura 1.- Diagrama de Bloques del Mdulo de Captura

ler no se encuentre a cero antes de Modo Comparacin do de la configuracin de los bits


comenzar la primera captura. En el modo de Comparacin los CCP1M3:CCP1M0 (CCP1CON
En las lneas de programa en 16 bits que forman los registros <3:0>):
ensamblador del ejemplo, se muestra CCPRH-L comparan de forma conti- Pasa a nivel alto
el mtodo recomendado para modifi- nua su contenido con el del TMR1. Pasa a nivel bajo
car el preescaler en el modo de cap- Cuando los dos valores coinciden en No cambia su estado pero se pro-
tura. Este ejemplo tambin pone a el pin RC2/CCP1, que debe estar duce una interrupcin
cero el contador del preescaler y no configurado como salida, puede dar- Adems cuando se da la coinci-
genera una falsa interrupcin. se los siguientes eventos dependien- dencia entre los dos registros el bit
58
RESISTOR
Ejemplo:
CLRF CCP1CON ;Desactiva el mdulo CCP
CCP1IF se pone a 1

Configuracin del pin CCP


MOVLW NEW_CAPT_PS ;Carga el registro W EL usuario debe configurar el pin
;con el nuevo preescaler RC2/CCP1 con resistencia de pull-
;Carga el valor en CCP ON up y poner a cero el bit TRISC<2>
para configurarlo como pin de
MOVWF CCP1CON ;Carga CCP1CON con este valor salida.

Figura 2.- Diagrama de Disparo especial de disparo:


bloques de la forma de Reset del Timer1,no pone a "1" el flag TMR1IF (PIR1<0>)
operar en el Modo Pone a "1" el bit GO/DONE (ADCON0<2>)
Comparacin

Disparo especial

Se pone a "1" el flag CCPIF


(PIR1<2>) CCP1H CCP1L

Q S Salida
Comparador
Lgica
Pin RC2/CCP1 R Iguales

TRISC<2> CCP1ON<3:0> TMR1H TMR1L


Habilita Salida Seleccin de modo
56-83 MICROCONTROLADORES 14/8/03 13:26 Pgina 59

Modo de trabajo del


TIMER1
El Timer1 debe estar trabajando
en modo temporizador o contador
sncrono, nunca en modo asncrono.

Modo de Interrupcin por

MICROCONTROLADORES
software
Cuando se elige el modo de tra-
bajo de Interrupcin por Software, el
pin CCP1 no es afectado. El flag
CCPIF se pone a "1" y se produce
una interrupcin de CCP (si se ha
habilitado).

Modo especial de disparo


En este modo de trabajo, el dis-
paro interior puede usarse para ini-
ciar una accin. El mdulo CCP1
pone a cero el TMR1 y el CCPR1
funciona como un registro de pero-
do, capaz de provocar peridicamen-
te interrupciones.
En este modo de disparo el CCP2
pone a "0" el TMR1 y, adems, ini-
cia una conversin A/D de forma
peridica, pudindose realizar una
conversin A/D sin el control del
programa de instrucciones.
Para que tenga lugar una conver-
sin A/D peridicamente, se puede
cargar en los registros CCPR2H y
59
RESISTOR
CCPR2L el nmero de impulsos a
los que una vez transcurridos, desea-
mos que se realice una conversin. Figura 3.- Organigrama del programa COMPARA_1.asm
Como estos registros se comparan
continuamente con los del mdulo en hexadecimal por el PORTA MODULO DE MODULACIN
temporizador TMR1, cuando ambos (RA0:RA5) . Para ello se hace con- DE ANCHURA DE IMPULSOS
sean iguales, comenzar la conver- tar al TIMER1 los impulsos que se (PWM)
sin. Esta operacin no afecta al flag inyectan por la lnea Con el modo de modulacin de
de interrupcin del temporizador RC0/T1OSO/T1CKI y cada vez que anchura de impulsos se pueden con-
TMRIF (PIR1<0>). Como la igual- se llega al valor indicado por las seguir impulsos a nivel alto de
dad tambin pone a cero al tempori- lneas RA0:RA5, la lnea RB0 cam- anchura variable, con los mdulos
zador, se volver a repetir de nuevo bia de estado. CCPx se puede obtener una resolu-
el ciclo. Si slo nos interesa la inte- El organigrama del programa es cin de 10 bits para la salida PWM.
rrupcin que ocasionar el mdulo el que se indica en la Figura 3. Estas seales tienen mucha aplica-
convertidor cuando finalice la con- El programa COMPARA_ cin para el control de motores a tra-
versin, habilitaremos solamente la 1.asm, en el que como viene siendo vs de un triac u otro tipo de driver
de ste ltimo, deshabilitando la del habitual estn marcado en color para los motores de corriente conti-
comparador, es evidente que no azul las lneas de cdigo que hemos nua, en el ejemplo hemos utilizado
deseamos saber cuando tiene lugar la eliminado para utilizar el programa un LM293B.
igualdad entre los registros CCPR y bootloader para poder realizar la El CCP1 se multiplexa con el
TMR2, o lo que es lo mismo, el ini- carga del mismo y en color verde, lacht del PORTC, por lo que habr
cio de la conversin. las lneas que hemos aadido, de tal que poner el bit TRISC<2> a cero
manera que eliminado las lneas de para que trabaje como salida.
EJEMPLO DE MANEJO DEL color verde y habilitando las que En la Figura 5 se muestra el dia-
COMPARADOR estn en azul el programa pueda grama de bloques simplificado del
El siguiente programa utiliza el grabarse directamente en un mdulo CCP trabajando en modo
comparador del PIC16F87X para PIC16F876 utilizando un programa- PWM.
realizar un divisor de frecuencia por dor universal, un T-20 o cualquier Cuando el valor almacenado en
dos veces el nmero que se indique otro. el registro PR2 coincide con los
56-83 MICROCONTROLADORES 14/8/03 13:26 Pgina 60

;***********************************************************************************
**
; Programa COMPARA_1.ASM
; Este programa emplea el mdulo CCP1 para compara el contenido del
; los registros CCPR2H y CCPR2L con el TIMER1 y cuando coinciden se
; produce una interrupcin que hace cambiar de estado el contenido de la
;lnea RB0
; Revisin : 0.0 Programa para PIC16F87X
; Velocidad del Reloj: 4 MHz Reloj Instruccin: 1 MHz = 1 S
MICROCONTROLADORES
; Perro Guardin :deshabilitado Tipo de Reloj : XT
; Proteccin del cdigo : OFF
;
List p=16F876 ;Tipo de procesador
include "P16F876.INC" ;Definiciones de registros internos
; org 0x00 ;Vector de Reset
; goto INICIO
org 0x04
;*********************************************************************************
;PROGRAMA DE ATENCIN A LA INTERRUPCIN
INTER bcf PIR1,CCP1IF ;Repone el flag del mdulo CCP1
bcf T1CON,TMR1ON ;TMR1 en Off
clrf TMR1L
clrf TMR1H ;Puesta a 0 del TMR1
movlw b'00000001'
xorwf PORTB,F ;RB0 cambia de estado
bsf T1CON,TMR1ON ;TMR1 en On
retfie
;***********************************************************************************
**
;PROGRAMA PRINCIPAL
INICIO clrf PORTB ;inicializa el PORB a cero
bsf STATUS,RP0 ;Selecciona banco 1
movlw b'00000110'

60
RESISTOR
movwf ADCON1
clrf TRISB
movlw b'00111111'
movwf TRISA
;PORTA E/S digitales
;PORTB B se configura como salida
;PORTA A entradas
movlw b'00000001'
movwf TRISC ;RC0 entrada
bsf PIE1,CCP1IE ;Habilita interrupcin del mdulo CCP1
bcf STATUS,RP0 ;Selecciona banco 0
;Configuracin del TMR1 como contador de flancos de subida externos
movlw b'00000010'
movwf T1CON ;TMR1 en OFF
movlw b'11000000'
movwf INTCON ;Habilita interrupciones
;Configuracin del CCP1CON modo Comparacim
movlw b'00001010'
movwf CCP1CON ;Mdulo CCP en modo comparacin
clrf CCPR1H ;0--> CCPR1H
clrf TMR1L ;0--> TMR1L
clrf TMR1H ;0--> TMR1H
bsf T1CON,TMR1ON;TMR1 en ON
BUCLE movf PORTA,W
andlw b'00011111' ;Lee las entradas RA4-RA0
movwf CCPR1L ;Ajusta la parte baja del valor a comparar
goto BUCLE
;*****************************************************************************
ORG 0x1F00
bcf PCLATH,4
bcf PCLATH,3 ;Selecciona la pgina 0
goto INICIO ;Salto a la direccin de INICIO del programa
;*****************************************************************************
end

ocho bits de mayor peso de TMR2, de mayor peso CCPR1H y se Por lo tanto, el tiempo que la
el pin pasa a valer "1" y se borra el comienza de nuevo la comparacin seal PWM est a nivel alto viene
temporizador para iniciar de nuevo con TMR2, cuando ambos son igua- dada por el registro CCPR1H y el
la cuenta. El contenido de menor les el pin se pone a "0" para repetir periodo de la seal por el registro
peso del CCPR1L se pasa al registro la secuencia. PR2.
56-83 MICROCONTROLADORES 14/8/03 13:26 Pgina 61

Vcc= 5V

R5 10K
R4 10K

R6 10K

R7 10K

R8 10K

R9 10K
R1
10K

Reset PIC16F876
R2 100
MCLR
RB7
RA0 RB6
RA1 RB5
RA2 RB4
RA3 RB3 Diodo LED
RA4 RB2
RA5 RB1 R3 330
Vss RB0
C1 27 pF
RA0

RA1

RA2

RA3

RA4

RA5

OSC1
XT 4Mhz
OSC2/CKOUT Vcc=5V
VDD

VSS
C2 27 pF
RC0 RC7
RC1 RC6
RC2 RC5
RC3 RC4
Entrada de Impulsos

Figura 4.- Circuito para la comprobacin del programa Compara_1.asm Se borra el TMR2 ( se pone a
CCP1CON<5:4> cero)
Registreo de Periodos La patilla RC2/CCP1 se pone a
"1"
CCPR1L El valor de CCPR1L, que es el
que determina la anchura del
impulso se carga en CCPR1H
El tiempo que la patilla de salida
est a nivel alto, que es la anchura
CCPR1H(Slave) del impulso, depende del contenido
cargado de CCPR1L y de los bits 5
y 4 del CCP1CON, cuando trabaja-
Comparador R Q mos con una precisin de 10 bits.
Por su parte, la anchura del
RC2/CCP1 impulso a nivel alto viene dada por
S la expresin:
TMR2 (Nota1) El valor de CCPR1L:
TRISC<2> CCP1CON<5:4> puede cargarse en
cualquier momento, puesto que el
Comparador mismo no se traspasa a CCPR1H y
Borra Timer, compara hasta que coincidan PR2
patilla CCP1 y
Latch D.C. con TMR2. En el modo PWM el
registro CCPR1L solo puede ser
PR2
ledo.
Como en todos los mdulos del
Nota 1.- Los 8 bits del TMR2 se concatenan con los 2 bits Q del reloj interno microcontrolador, en necesario res-
o con los 2 bits del preescaler para crear una base de tiempos de 10 bits petar y mantener cierto orden en la
programacin. El orden seguido
Figura 5.-Diagrama de bloques del mdulo CCP trabajando en modo PWM. para su configuracin ser:

Periodo PWM PWM es la inversa del periodo Colocar en PR2 el periodo calculado
La salida PWM que se obtiene (1/T). La duracin del perodo de la Colocar en los registros CCPR1L y en los bit <5:4> de
en el pin RC2/CCP1, como puede seal depende del valor que se haya CCP1CON los valores calculados
verse en la figura 6, la seal tiene cargado en PR2, de acuerdo con la Programar como salida el bits TRISC<2>.
un periodo base y sobre el la seal siguiente expresin. Poner el valor del preescaler del TMR2 y habilitar el
est a nivel alto durante un tiempo Cuando el valor TMR2 coincide temporizador (T2CON).
(duty cycle). La frecuencia del con el de PR2 suceden tres eventos: Configurar el CCP1 para una operacin PWM.
56-83 MICROCONTROLADORES 14/8/03 13:26 Pgina 62

Figura 8.- Organigrama del programa


PWM1.asm

Periodo (PR2)

CCPR1H
Duty Cycle

TMR2=PR2

TMR2=Duty Cycle

TMR2=PR2

Figura 6.- Impulsos de salida donde se controla el tiempo que est a nivel
alto la seal

EJEMPLO DE MANJO DEL en la que puede verse que la salida


MODULO PWM RC2 se ha conectado a la patilla de
El programa PWM1.asm genera inhibicin del circuito L293B, por lo
una seal PWM por la patilla que el valor medio de la seal que le
RC2/CCP1 que corresponde con el llega al motor depender del valor de
pin 13 del PIC16F876. La anchura la anchura del impulso, variando en
del impulso se determina por la el programa este valor el motor debe
constante ANCHURA y el periodo ir ms deprisa o ms despacio e
de la seal por la constante PERIO- incluso pararse. El organigrama del
DO, que pueden ser modificadas por programa es el que se muestra en la
el usuario. Para comprobar los resul- figura 8.
tados es necesario un osciloscopio El programa puede modificarse
conectado entre la patilla RC2 y fcilmente para que el valor del
masa. Pero para los que no dispon- PORTA pase a ser el valor de la
gan de un osciloscopio pueden com- constante PERIODO y as variar la
probar el resultado de la seal PWM velocidad del motor con los
sobre un motor de corriente continua interruptores de entrada.
utilizando el circuito de la figura 7,

Vcc= 5V
MOTOR
R5 10K
R4 10K

R6 10K

R7 10K

R8 10K

R9 10K

R1
10K
+Vcc
Reset PIC16F876
R2 100
MCLR 1 L293B
16
RB7 2 EN1 15
RA0 RB6 IN1 IN4
RA1 RB5
RA2 RB4 1 4
RA3 RB3
RA4 RB2 3 OUT1 OUT4 14
RA5 RB1
Vss RB0 4 GND GND 13
C1 27 pF 5 GND GND 12
6 11
RA0

RA1

RA2

RA3

RA4

RA5

OSC1 OUT2 OUT3


XT 4Mhz
OSC2/CKOUT Vcc=5V 2 3
VDD
2 7 IN2 IN3 10
VSS
C2 27 pF EN2 9
8 VS
RC0 RC7
RC1 RC6
RC2 RC5
RC3 RC4
+Vcc

Figura 7.- Circuito para la comprobacin de la seal PWM generada por el microcontrolador
56-83 MICROCONTROLADORES 14/8/03 13:26 Pgina 63

;***********************************************************************************
************************
; Programa PWM1.ASM
; Este programa emplea al mdulo CCP1 con salida de seal por la lnea RC2/CCP1. La seal
; de salida tiene un periodo determinado pora la constante "Periodo" y una anchura de la
; seal a nivel alto determinada por la constante "Anchura" .
; Revisin : 0.0 Programa para PIC16F87X
; Velocidad del Reloj: 4 MHz Reloj Instruccin: 1 MHz =1 s
; Perro Guardin :deshabilitado Tipo de Reloj : XT
; Proteccin del cdigo : OFF
;***********************************************************************************
**********************
List p=16F876 ;Tipo de procesador
include "P16F876.INC" ;Definiciones de registros internos
PERIODO equ .200 ;Periodo de 200 s
ANCHURA equ .50 ;Anchura 50 s
; org 0x00 ;Vector de Reset
; goto INICIO
org 0x05
;***********************************************************************************
**********************
; Programa principal
;***********************************************************************************
**********************
INICIO clrf PORTA
clrf PORTB
clrf PORTC ;Borra salidas
bsf STATUS,RP0 ;Selecciona banco 1
movlw b'00000110'
movwf ADCON1 ;Puerta A E/S digitales
clrf TRISB ;Puerta B se configura como salida
movlw b'11111011'
movwf TRISC ;RC2 salida
movlw PERIODO-1
movwf PR2 ;Carga el registro de periodos
bcf STATUS,RP0 ;Selecciona banco 0
movlw b'00000001' ;hace girar el motor en sentido horario
movwf PORTB
movlw ANCHURA
movwf CCPR1L ;Carga la anchura del pulso
;Mdulo CCP1 en el modo PWM con salida de seal por RC2/CCP1
movlw b'00001100'
movwf CCP1CON
movlw b'00000100'
movwf T2CON ;T2 en On
BUCLE goto BUCLE ;Bucle infinito
;***********************************************************************************
**********************
ORG 0x1F00
bcf PCLATH,4
bcf PCLATH,3 ;Selecciona la pgina 0
goto INICIO
;***********************************************************************************
**********************
end

Registros Asociados al PWM y al TMR2


Direcc in Nombre Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 Valor en POR,BOR Valor en el resto de Reset
0Bh,8Bh
10Bh,18Bh INTCON GIE PEIE TOIE INTE TOIF RBIE INTE RBIF 0000 000x 0000 000u
0Ch PIR1 PSPIF(1) ADIF RCIF TXIF SSPIF CCP1IF TMR2IF TMR1IF 0000 0000 0000 0000
0Bh PIE1 PSPIE(1) ADIE RCIE TXIE SSPIE CCP1IE TMR2IE TMR1IE 0000 0000 0000 0000
87h TRISC Registro de configuracin del PORT C 1111 1111 1111 1111
11h TMR2 Mdulo Del registro Timer2 0000 0000 0000 0000
92h PR2 1111 1111 1111 1111
12h T2CON --- TOUTPS3 TOUPS2 TOUPS1 TOUPS0 TMR2ON T2CKPS1 T2CKPS0 -000 000 -000 0000
15h CCPR1L Registro de byte de menor peso del mdulo de captura / comparacin / PWM xxxx xxxx uuuu uuuu
16h CCPR1H Registro de byte de mayor peso del mdulo de captura / comparacin / PWM xxxx xxxx uuuu uuuu
17 h CCP1CON --- --- CCP1X CCP1Y CCP1M3 CCP1M2 CCP1M1 CCP1M0 --00 0000 --00 0000

Leyenda
x = desconocido, u = inalterado; - = no implementado se lee como 0. Las celdas sombreadas no son usadas por el TIMER2
Nota 1: Los bits PSP no estn implementados para el PIC16F873/876, mantener estos bits a cero.
56-63 MICROCONTROLADORES 28/10/04 14:20 Pgina 56

CURSO DE
MICROCONTROLADORES
PIC16F87X (...y VIII)
MICROCONTROLADORES
Fernando Remiro Domnguez
Profesor de Sistemas Electrnicos
IES. Juan de la Cierva
www.terra.es/personal/fremiro

MODULO CONVERTIDOR A travs de la entrada analgica El mdulo del convertidor A/D


ANALGICO/DIGITAL (A/D) se aplica la seal analgica a un con- puede seleccionar como tensin de
La familia de microcontroladores densador de captura y retencin referencia la interna, es decir entre
PIC16F87X, disponen de un mdu- (sample and hold) que despus se VDD y masa o bien una externa que
lo de conversin Analgico/Digital introduce en el convertidor. El con- se introduzca entre RA3/AN3/
que tiene de cinco entradas para los vertidor A/D que es de aproximacio- VREF+ y RA2/AN2/VREF-. Cuan-
dispositivos de 28 pines y ocho para nes sucesiva da como resultado una do se selecciona la tensin de refe-
los otros dispositivos de la familia. palabra de 10 bits. rencia externa, hay que tener en

Registro ADCON0 (direccin 1Fh)


R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 U-0 R/W-0
ADCS1 ADCS0 CHS2 CHS1 CHS0 G0/#DONE --- ADON

56
RESISTOR
Bit 7

bit 7-6: ADCS1:ADCS0: bit de seleccin de reloj para el Convertidor A/D


Bit 0

00 Fosc/2
01 Fosc /8
10 Fosc/32
11 FRC (Procede del
oscilador RC interno)

bit 5-3: CH2:CH0: bit de


seleccin del canal
analgico
000 = Canal 0, (RA0/AN0)
001 = Canal 1, (RA1/AN1)
010 = Canal 2, (RA2/AN2)
011 = Canal 3, (RA3/AN3)
100 = Canal 4, (RA4/AN4)
101 = Canal 5, (RA5/AN5); los PIC16F87X de 28 pines no tienen este canal
110 = Canal 6, (RA6/AN6); los PIC16F87X de 28 pines no tienen este canal
111 = Canal 7, (RA7/AN7),, los PIC 1 6F87X de 28 pines no tienen este canal

bit 2: GO/#DONE. bit de estado de la conversin A/D


Si ADON=1
1= La conversin A/D est en marcha (mientras est a 1 se est realizando la conversin)
0 = La conversin ha finalizado. (el bit se pone a cero automticamente por hardware cuando la conversin A/D
finaliza) el resultado de la conversin aparece en ADRESH: ADRESL

bit 1: No implementado: Se lee como "0"

bit 0: ADON: bit de puesta en marcha


1 = El convertidor A/D est operativo
0 = El convertidor A/D est apagado y no consume corriente.
56-63 MICROCONTROLADORES 28/10/04 14:20 Pgina 57

Registro ADCON1 (direccin 9Fh)


U-0 U-0 R/W-0 U-0 R/W-0 R/W-0 R/W-0 R/W-0
ADFM --- --- --- PCFG3 PCFG2 PCFG1 PCFG0
Bit 7 Bit 0

bit 7: ADFM: Selecciona el formato del resultado de la conversin A/D (ver figura 5)
1 = Pone en el registro ARDESH los seis bit de mayor peso a "0" (alineacin a la derecha).

MICROCONTROLADORES
0 = pone los 6 bit de menor peso del registro ADRESL a "0" (alineacin a la izquierda).
Por lo tanto los 16 bits que forman el registro ARDESH-ARDESL con ADFM=1 tiene los 6 bit de mayor
peso a cero y con ADFM=0 los 6 bit de menor peso estn a cero

bit 6-4: No implementados: Se leen como cero

bit 3-0: PCFG3:PCFG0: bits de configuracin de los canales de entrada del convertidor A/D. Se utilizan para
configurar las patillas como E/S digital o como entrada analgica de acuerdo con la siguiente tabla:

PCFG3: AN7(1) AN6(1) AN5(1) AN4 AN3 AN2 AN1 AN0 VREF+ VREF- CHAN/
PCFG0 RA5 RA3 RA2 RA1 RA0V REFS
RE2 RE1 RE0
0000 A A A A A A A A VDD VSS 8/0
0001 A A A A VREF+ A A A RA3 VSS 7/1
0010 D D D A A A A A VDD VSS 5/0
0011 D D D A VREF+ A A A RA3 VSS 4/1
0100 D D D D A D A A VDD VSS 3/0
0101 D D D D VREF+ D A A RA3 VSS 2/1
011X D D D D D D D D VDD VSS 0/0
1000 A A A A VREF+ VREF- A A RA3 RA2 6/2
1001
1010
1011
D
D
D
D
D
D
A
A
A
A
A
A
A
VREF+ A
A

VREF+ VREF- A
A
A
A
A
A
RA3
RA3
RA3
VSS
VSS
RA2
6/0
5/1
4/2
57
RESISTOR
1100 D D D A VREF+ VREF- A A RA3 RA2 3/2
1101 D D D D VREF+ VREF- A A RA3 RA2 2/2
1110 D D D D D D D A VDD VSS 1/0
Tabla 1

1111 D D D D VREF+ VREF- D A RA3 RA2 _


A= Entrada Analgica; D = E/S Digital; (1) Estos canales no estn disponibles para los dispositivos de

cuenta que existen algunas limitacio- ADRESH : Parte alta del resultado ADRESH:ADRESL y se pone a cero
nes; la mxima tensin aplicada a la de la conversin el bit GO/DONE y el flag de fin de
patilla VREF+ (RA3/AN3) podr ser ADRESL : Parte baja del resultado conversin ADIF (PIR1<6>) se pone a
de VDD+0,3V y la mnima de VDD- de la conversin 1. El diagrama de bloques del mdulo
2,5V. En cuanto a la tensin VREF- ADCON0: Registro de Control 0 conversar A/D es el de la Figura 1.
(RA2/AN2) la mnima tensin ser ADCON1, Registro de Control 1 Despus de que el conversor A/D
VSS-0,3V y la mxima VREF+ - 2V, En esta pgina se muestra el se ha configurado como se desea uti-
as por ejemplo, si la tensin de ali- registro ADCON0 de configuracin lizar, la seleccin del canal debe rea-
mentacin es de 5V, la tensin en del funcionamiento del convertidor lizarse antes de hacer la adquisicin.
RA3/AN3 no podr exceder de 5V. y en la pgina anterior el ADCON1 Los canales de entrada analgica
Por lo que la mxima tensin en la que es el registro de configuracin deben tener los correspondientes bits
VREF- ser de 3V. Siempre se ha de de los pines del puerto. Los pines del del registro TRIS seleccionados
cumplir que VREF+ - VREF - 2V. PORTA pueden configurarse como como entradas.
El convertidor A/D tiene como entradas analgicas (RA, tambin Para realizar una conversin A/D
caracterstica especial el ser capaz de puede ser entrada de tensin de refe- deben seguirse los siguientes pasos:
seguir trabajando mientras el dispo- rencia) o como E/S digital. 1. Configurar el mdulo conversor A/D
sitivo est en el modo SEEP. Para Los registros ADRESH: ADRESL Configurar los pines que actan
ello el oscilador interno RC debe contienen los 10 bits resultado de como entradas analgicas, las
conectarse al conversor A/D. la conversin A/D. Cuando se seales que harn de tensin de
El mdulo conversor A/D tiene completa la conversin A/D, el resul- referencia la que trabajarn como
asociados cuatro registros: tado se guarda en los registros E/S digitales (ADDCON1).
56-63 MICROCONTROLADORES 28/10/04 14:20 Pgina 58

Seleccionar el canal de entrada.


CHS2:CHS0
A/D (ADCON0).
Seleccionar la fuente de la seal de
111
RE2/AN7(*) reloj para la conversin A/D
CONVERTIDOR
110
RE1/AN6(*) (ADCON0).
101 Activar el mdulo de conversin
A/D RE0/AN4(*)
MICROCONTROLADORES
VAIN 100 A/D (ADCON0)
RA5/AN4
011
Tensin de entrada RA3/AN3/REF+ 2. Activar si, se desea, la interrup-
010
001
RA2/AN2/REF- cin. del mdulo conversor A/D
VDD RA1/AN1 Poner a cero el bit ADIF
000
RA0/AN0 Poner a uno el bit ADIE
VREF+ Poner a uno los bits habilitadores
GIE y PEIE
3. Esperar el tiempo requerido para
PCFG3:PCFG0 la adquisicin
4. Inicio de la conversin
Poner a 1 el bit GO/#DONE
VSS (ADCON0)
5. Tiempo de espera para terminar la con-
PCFG3:PCFG0
versin A/D que puede detectarse por:
Exploracin de bit GO/#DONE ,
que al finalizar la conversin toma
el valor "0"
(*) No exisnten en los dispositivos de 28 pines Esperar que se produzca una inte-
rrupcin si se ha programado al
Figura 1.- Diagrama de bloques del convertidor A/D finalizar la conversin.

58
RESISTOR

Figura 2.- Diagrama de flujos que deber seguir el programa para realizar una conversin A/D
56-63 MICROCONTROLADORES 28/10/04 14:20 Pgina 59

VDD
Conmutador
de muestreo
VT=0.6V SS
Rs RAx RIC <1K Rss

MICROCONTROLADORES
CHOLD
+500nA =DAC capacidad
VA =51.2 pF
Cpin VT=0.6V I de dispersin
5pF + 500 nA
Vss

VDD

6V
5V
Leyenda:
Cpin = Capacidad de entrada 4V
VT = Tensin de umbral
Idispersin = Corriente de dispersin 3V
debida a varias uniones
RIC =Tesistencia de interconexin 2V
SS = Conmutador de muestreo
CHOLD = Capacidad del A/D
(Kohm)
5 6 7 8 9 10 11
Conmutador de muestreo

Figura 3.- Estructura de un pin de un canal Analgico

Aunque no se autorice la interrup- Requisitos para la adquisicin. Antes de realizar, la


cin el flag. ADIF se pone a " 1 "
al finalizar la interrupcin.
6. Leer el par de registros
Adquisicin A/D
Para que el convertidor A/D pue-
da tener la exactitud especificada,
conversin debe seleccionarse el
canal de la entrada analgica.
Para calcular el tiempo mnimo
59
RESISTOR
ADRESH:ADRESL donde se debe permitirse la carga del conden- de adquisicin se puede utilizar la
encuentran los 10 bits que resultan sador (CHOLD) que mantiene la siguiente ecuacin, que asume un
de la conversin y poner a cero el entrada a un nivel de tensin. El error de _ LSB para 1024 pasos del
flag ADIF. modelo de una entrada analgica se convertidor A/D. TACQ=Amplisier
7. Para una nueva conversin volver muestra en la figura 3. Settling Timer + Holting Capacitor
a los pasos 1 y 2 , El tiempo de De la impedancia de la fuente Chargine Time + Temperature Coef-
conversin por bit est definido (RS) se toma una muestra a travs ficient = TAMP + TC + TCOFF
por TAD, se exige un mnimo de del interruptor (RSS) la impedancia 19.72 S
2*TAD para realizar una nueva afecta directamente al tiempo de car-
conversin. ga del condensador CHOLD. La Seleccin del reloj
El diagrama de flujos que deber impedancia recomendada para las del convertidor A/D
seguir el programa para realizar una fuentes analgicas es de 10 k. Se define por TAD al tiempo de
conversin A/D puede ser la que se Cuando la impedancia disminuye conversin por bit. El convertidor
muestra en la Figura 2 tambin disminuye el tiempo de A/D requiere un mnimo de 12 TAD

Fuente del Reloj A/D Frecuencia mxima del dispositivo


Operacin ADCS1:ADCS0 Mx
FOSC/2 00 1.25 MHz
FOSC/8 01 5 MHz
Tabla 2.

FOSC/32 10 20 MHz
RC (1,2,3) 11 Nota 1

Nota.-
1. Si la fuente es el oscilador RC tiene un TAD tpico de 4 s, pero puede variar entre 2 6 s.
2. Cuando la frecuencia del dispositivo es mayor de 1MHz, la fuente del oscilador RC para la conversin A/D se
recomienda solo si se trabaja en el modo Sleep.
3. Para dispositivos de tensin mayores (LC), comprobar las caractersticas elctricas
56-63 MICROCONTROLADORES 28/10/04 14:20 Pgina 60

MICROCONTROLADORES

Figura 4.- Ciclos TAD del convertidor A/D

para la conversin de los 10 bits. La Para realizar conversiones Configuracin de los Pines
seal de reloj para la conversin A/D correctas el reloj del convertidor del Puerto Analgico
se selecciona por software mediante A/D debe seleccionarse para Los registros ADCON1 y TRI-
los bits ADCS1:ADCS0 asegurar un tiempo mnimo de TAD SA controlan la configuracin de los
2 TOSC de 1,6 mS. pines del puerto del convertidor A/D.
8 TOSC La tabla 2 muestra los tiempos de Cuando se desea configurar una
60
RESISTOR
32 TOSC
Oscilador interno RC
(2-6 s)
TAD dependiendo de la seal de
reloj seleccionada para la conversin
A/D
entrada como analgica, debe confi-
gurarse como entrada los bits corres-
pondientes del registro TRISA. Si

Figura 5.- Justificacin de los resultados de la conversin A/D


56-63 MICROCONTROLADORES 28/10/04 14:20 Pgina 61

Registros asociados al Convertidor A/D


Direccin Nombre Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 Valor en POR,BOR Valor en el resto
de Reset
0Bh,8Bh INTCON GIE PEIE TOIE INTE RBIE TOIF INTF RBIF 0000 000x 0000 000u

MICROCONTROLADORES
10Bh,18Bh
0Ch PIR1 PSPIF1 ADIF RCIF TXIFSSPIF CCP1IF TMR2IF TMR1IF 0000 0000 0000 0000
8Ch PIE1 PSPIE1 ADIE RCIE TXIESSPIE CCP1IE TMR2IE TMR1IE 0000 0000 0000 0000
1E h ADDRESH Parte alta de la conversin A/D xxxx xxxx uuuu uuuu
9E h ADDRESL Parte baja de la conversin A/D xxxx xxxx uuuu uuuu
1Fh ADCON0 ADCS1 ADCS0 CHS2 CHS1 CHS0 GO/#DONE ADON 0000 00-0 0000 00-0
9Fh ADCON1 ADFM --- --- --- PCFG3 PCFG2 PCFG1 PCFG0 --0- 0000 --0- 0000
85h TRISA --- --- Registro de direccionamiento de datos de PORTA --11 1111 --11 1111
05h PORTA --- --- Latch de datos para escritura del PORTA --0x 0000 --0u 0000
89h (1) TRISE IBF OBF IBOV PSPMODE --- Bit de direccionamiento 0000 -111 0000 -111
del PORTE
09h (1) PORTE --- --- --- --- --- RE2 RE1 RE0 ---- -xxx ---- uuuu

los bits del TRISA correspondientes ADRESH:ADRESL) despus de Funcionamiento del


se ponen a cero (salida), el valor digi- abortar la conversin A/D, es Convertidor A/D en el modo
tal de la salida (VOH o VOL) se conver- requerido el TAD de espera para Sleep
tir. realizar la prxima adquisicin El mdulo del convertidor A/D
El funcionamiento del convertidor comience. Despus de 2 TAD de puede trabajar durante el modo Sleep.
A/D es independiente de los bits espera, la adquisicin en cauce se Para ello se debe poner como fuente
CHS2:CHS0 y del valor del
TRISA:
comienza automticamente.
En la figura 4 se aprecia como
despus de poner el bit GO a uno, la
de reloj el modo
(ADCS1:ADCS0 = 11). Cuando la
fuente de reloj es el oscilador RC
RC
61
RESISTOR
Notas: primera vez el segmento tiene un TCY interno, el mdulo A/D espera un
1. Al leer el registro del puerto, cual- mnimo y un TAD mximo. ciclo de mquina antes de empezar la
quier pin configurado como un conversin. Esto permite eliminar el
canal analgico se lee como un Nota: ruido de la conversin digital, cuando
cero (nivel bajo). Los pines confi- El bit GO/#DONE no debe la conversin finaliza el bit
gurados como entradas digitales ponerse a uno en la misma GO/#DONE se pone a cero y el
convertirn la entrada analgica. instruccin que se pone en ON el resultado se carga en, la pareja de
Los niveles analgicos de una convertidor A/D. registros ADRESH:ADRESL. Si la
entrada digital no afectarn la interrupcin por final de conversin
exactitud de la conversin. Registro de resultados de la A/D est habilitada, el dispositivo se
2. Los niveles analgicos en cual- conversin A/D despierta. Si la interrupcin no est
quier pin de entrada digital En el par de registros habilitada, el mdulo A/D se apagar
(AN7:AN0 ) pueden causar que el ADRESH:ADRESL se carga con el aunque el bit ADON (ADCON0
buffer de entrada consuma una resultado de 10 bits de la conversin <0>) permanezca a uno. Cuando el
corriente superior a la de las espe- A/D. Este par de registros se extien- reloj del convertidor A/D es otra
cificaciones del dispositivo. den hasta 16 bits. El mdulo A/D tie- fuente distinta del oscilador RC inter-
ne la posibilidad de justificar el resul- no, la instruccin sleep aborta la con-
Conversiones A/D tado de 10 bits de la conversin, den- versin actual y el mdulo A/D se
Si se pone a cero el bit tro de los 16 bits de la pareja de apaga, aunque el bit ADON perma-
GO/#DONE durante la conversin, registros. La seleccin del formato nezca a uno. Desconectando el mdu-
se aborta la conversin actual. de justificacin a la izquierda o dere- lo del convertidor A/D el consumo es
El par de registros no se modifi- cha se realiza con el bit ADFM ms bajo.
carn parcialmente con los bit que se (ADCON1 <7>) . Los bits restantes (
hayan completado hasta el a los 10 de la conversin) se llenan Efectos del Reset
momento. Es decir, los registros con ceros. Estos dos registros cuando Cuando se fuerza un Reset se
ADRESH: ADRESL seguirn con- el convertidor A/D est en OFF y no reestablecen todos los registros, esto
teniendo el valor de la ltima se utiliza, pueden utilizarse como dos obliga a apagar el convertidor A/D y
conversin completa (o el ltimo registros de 8 bits de propsito se aborta cualquier conversin
valor que se haya escrito en general. en curso. El valor de los
56-63 MICROCONTROLADORES 28/10/04 14:20 Pgina 62

MICROCONTROLADORES

Figura 6.- Circuito para comprobar el funcionamiento del programa AD1_LEDS.asm

Caractersticas del convertidor A/D


Symb. Caractersticas Mnimo Tpica Mximo Unid. Condiciones

62
RESISTOR
NR

EIL
Resolucin

Error absoluto
--

--
--

--
10-bits

<1
Bit

LSb
VREF=VDD = 5.12V
VssVAIN VREF
VREF=VDD = 5.12V
VssVAIN VREF
EDL Error Direccional -- -- <1 LSb VREF=VDD = 5.12V
VssVAIN VREF
EGN Error de ganancia -- -- <1 LSb VREF=VDD = 5.12V
VssVAIN VREF
-- Monotonicidad -- Garantizada -- -- VssVAIN VREF
VREF Voltaje de referencia (VREF+- VREF-) 2.0V -- VDD+0.3 V Absoluta especificacin.
Asegura la precisin de 10 bits
VREF+ Voltaje de referencia alto AVDD-2.5V AVDD+0.3V V
VREF- Voltaje de referencia bajo AVSS 0.3 -- VREF + 0.3 V
VAIN Voltaje analgico de entrada VSS-0.3 -- VREF + 0.3 V
ZAIN Impedancia recomendada
para la fuente de voltaje analgico -- -- 10.0 K
IAD Corriente de conversin Estndar -- 220 -- A Promedio de consumo
de corriente cuando el
A/D est activado
(Nota1)
Extendida -- 90 -- A
IREF Corriente de entrada VREF (Nota 2) 10 -- 1000 A Durante la adquisicin
VAIN basada en la dife-
rencia VHOLD y VAIN
a carga
Durante el ciclo de
-- -- 10 A conversin.
56-63 MICROCONTROLADORES 28/10/04 14:20 Pgina 63

registros ADRESH:ADRESL no es que en el esquema del circuito de poder realizar la carga del mismo y
modificado por un Power-on Reset. aplicacin que hemos utilizado y que en color verde, las lneas que hemos
se muestra en la figura 6, est conec- aadido, de tal manera que eliminado
EJEMPLO DE MANEJO DEL tada a una resistencia variable que las lneas de color verde y habilitando
CONVERTIDOR A/D acta como divisor de tensin. Como las que estn en azul el programa
El programa AD1_LEDS.asm, viene siendo habitual en el programa pueda grabarse directamente en un
presenta en el PORTB lo 8 bits se ha marcado en color azul las lneas PIC16F876 utilizando un programa-
menos significativos del resultado de de cdigo que hemos eliminado para dor universal, un T-20 o cualquier

MICROCONTROLADORES
la conversin A/D de la entrada AN3 utilizar el programa bootloader para otro.

;***********************************************************************************
; Programa AD1_LEDS.asm Fecha : 6- Octubre-2003
;Este programa realiza la conversin de la tensin presente en el canal RA3/AN3. Esta
;se puede variar con el potencimetro conecatodo a AN3 . Lo 8 bits menos significativos
;de la conversin se visualiza sobre los 8 LEDS conectados al PORTB
; Revisin 0.0 Programa para PIC16F87X
; Velocidad del Reloj: 4 MHz Reloj Instruccin: 1 MHz = 1 uS
; Perro Guardin :habilitado Tipo de Reloj : XT
; Proteccin del cdigo : OFF
;***********************************************************************************

List p=16F876 ;Tipo de procesador


include "P16F876.INC" ;Definiciones de registros internos

; org 0x00 ;Vector de Reset


; goto Inicio

org 0x05 ;Salva el vector de interrupcin

;Visualiza: Esta rutina coge los 8 bits menos significativos resultantes de la conversin
;y los visualiza sobre el los LEDS conectados al PORTB

Visualiza: bsf STATUS,RP0


movf ADRESL,w
bcf STATUS,RP0
;Selecciona pgina 1

;Selecciona pgina 0
63
RESISTOR
movwf PORTB
return
;***********************************************************************************
; Programa principal
;***********************************************************************************
INICIO clrf PORTB
bsf STATUS,RP0 ;Selecciona banco 1
clrf TRISB ;Puerta B se configura como salida
movlw b'00001000' ;Configura RA3 com entrada
movwf TRISA
bcf STATUS,RP0 ;Selecciona banco 0
;Se activa el ADC y se selecciona el canal RA3/AN3. Frecuencia de trabajo Fosc/32
movlw b'10011001'
movwf ADCON0 ;ADC en On, seleciona canal AN3
BUCLE bsf STATUS,RP0 ;Selecciona pgina 1
movlw b'10000000'
movwf ADCON1 ;PORTA entradas analgicas y justificacin a la izquierda
bcf STATUS,RP0 ;Selecciona pgina 0
bcf PIR1,ADIF ;Restaura el flag del conversor AD
nop
bsf ADCON0,GO ;Inicia la conversin
ADC_Wait btfss PIR1,ADIF ;Fin de conversin ??
goto ADC_Wait ;Todava no
call Visualiza ;Visualiza el resultado de la conversin
goto BUCLE
;***********************************************************************************
ORG 0x1F00
bcf PCLATH,4
bcf PCLATH,3 ;Selecciona la pgina 0
goto INICIO
;***********************************************************************************
end ;Fin del programa fuente
64-73 MICROCONTROLADORES 30/12/03 12:32 Pgina 64

CURSO DE
MICROCONTROLADORES
PIC16F87X (...y IX)
MICROCONTROLADORES
Fernando Remiro Domnguez
Profesor de Sistemas Electrnicos
Registro SSPSTAT: Registro de estado
IES. Juan de la Cierva del puerto Serie (Direccin 94h)
www.terra.es/personal/fremiro
R/W-0 R/W-0 R-0 R-0 R-0 R-0 R-0 R-0
SMP CKE D/#A P S R/#W UA BF
Bit 7 Bit 0
MDULO DE bit 7: SMP: Fase de datos de entrada SPI
COMUNICACIONES Modo Master SPI
SERIE SNCRONA: MSSP 1 = Muestra datos de entrada al final del tiempo de salida
El mdulo de comunicaciones se- 0 = Muestra datos de entrada a la mitad del tiempo de salida
rie sncrona (MSSP) es un interface Modo esclavo SPI
serie, til para comunicar con otro pe- SMP debe ser borrado cuando SPI se emplea en modo esclavo
rifrico o dispositivos. Estos perif- Modo I2C Master o Esclavo
ricos pueden ser memorias EEPROMs 1= Deshabilita control de variaciones para velocidad estndar
serie, registros de desplazamiento, (100 KHz y 1MHz)
controladores de displays, converti- 0= Habilita control (400KHz)
dores A/D, convertidores D/A, etc. bit 6: CKE: Seleccin del flanco de reloj SPI

64
RESISTOR
El mdulo de MSSP pueda ope-
rar en uno de estos dos modos:
Serial Peripheral Interface (SPI)
SI CKP = 0
1= Dato transmitido en flanco ascendente de SCK
0= Dato transmitido en flanco descendente de SCK
SI CKP = 1
Inter-Integrated el Circuito (I2C)
1= Dato transmitido en flanco descendente de SCK
Para el control de este mdulo hay 0= Dato transmitido en flanco ascendente de SCK
dos registros de configuracin se tra- Modo I2C Master o Esclavo
ta del registro SSPCON : Registro de 1= Niveles de entrada de acuerdo a SMBUS
control del Puerto Serie Sncrono 0= Niveles de entrada conforme a I2C
(Sync Serial Port Control Register) bit 5: D/#A: Bit Datos/Direcciones (solo en modo I2C)
en la direccin 14h y el SSPCON2: 1= Indica el ltimo byte recibido o transmitido es un dato
Registro de Control 2 del Puerto Serie 0= Indica que el ltimo byte recibido o transmitido es una
Sncrono (Sync Serial Port Control direccin
Register2) en la direccin 91h . Ade- bit 4: P: Bit de Stop (Solo en modo I2C. Ese bit es borrado cuando se
ms se dispone del registro SSPSTAT: deshabilita el mdulo SSP, o cuando el ltimo bit Start es
detectado, SSPEN es borrado)
Registro de estado del puerto Serie 1= Indica que se ha detectado un bit de Stop (este bit es "0" en
(Sync Serial Port Status Register) en RESET)
la direccin 94h, que seguidamente 0= Bit de Stop no detectado.
se describen. bit 3: S: Bit de Start (Solo en modo I2C. Este bit es borrado cuando se
deshabilita el mdulo SSP, o cuando el bit ltimo bit Start es
Modo SPI detectado, SSPEN es borrado)
Este modo permite la transferencia 1= Indica que se ha detectado un bit de Start (este bit es "0" en
de datos de 8 bits en serie, que pueden RESET)
ser transmitidos y recibidos de forma 0= Bit de Start no detectado
sncrona y simultanea. Para el esta- Bit 2: R/#W: Bit de informacin Lectura/Escritura (solo en modo I2C)
blecimiento de la comunicacin se 1= Lectura
utilizan tres hilos de conexin : 0= Escritura
Serial Data Out (SDO): Salida de Modo I2C Modo Esclavo
1= Lectura
datos Serie 0= Escritura
Serial Data In (SDI); Entrada de da-
Modo I2C Modo Master
tos Serie 1= Transmisin en progreso
Serial Clock (SCK), Reloj de 0= Transmisin no en progreso
Sincronizacin
64-73 MICROCONTROLADORES 30/12/03 12:32 Pgina 65

bit 1 UA: Activacin de direccin (slo en modo I2C 10-bits)


1= Indica que es necesario actualizar la direccin en el registro
SSPADD
0= No es necesario actualizar la direccin Fase de datos de entrada (es decir,
debemos de precisar el momento en
bit 0 BF: Bit estado de Buffer lleno el que se toma la muestra del dato
Receptor (Modo SPI e I2C) de entrada, que puede ser en la mi-
1= Recepcin completa, SSPBUF est lleno tad o al final del impulso).

MICROCONTROLADORES
0= Recepcin no completa, SSPBUF est vaco Seleccin del flanco del reloj
Transmisor (Modo I2C)
1= Transmisin en progreso, SSPBUF est lleno (no incluye ACK (Transmisin por flanco de bajada o
y bit de Stop) subida de SCK)
0= Transmisin completa, SSPBUF est vaco (no incluye ACK y Velocidad de SCK (Solo en modo
bit de Stop) Master)
Seleccin del modo Es-
clavo, si trabajamos de
esta forma.

En la Figura 1 se mues-
tra el diagrama de bloques
del mdulo SSP, donde
pueden apreciarse los cua-
tro pines que intervienen
en las comunicaciones.
Para habilitar el puerto
serie, deben configurarse
adecuadamente los bits del
registro SSPCON <5:0> y
los bit SMP y CKE del re-
gistro SSPSTAT <7:6>.
Cuando se inicializa el mo-
do SPI es necesario espe-
cificar en el registro SSP-
CON la diferentes opcio-
65
RESISTOR
nes de trabajo:
Modo Mater, donde la
seal SCK ser salida
Modo Slave, donde la l-
nea SCK ser entrada
Polaridad de la seal de
reloj, flanco ascendente
o descendente.
Velocidad del SCK, evi-
dentemente solo en el
modo master.
Definir el momento en el
que se va a tomar la
muestra del dato de en-
trada, que puede ser en
la mitad o al final del
Figura 1.- Diagrama de bloques del mdulo SSP. impulso.

Adicionalmente puede utilizarse (SSPCON<5:0> y SSPSTAT<7:6>). En el modo de recepcin los da-


un cuarto pin trabajando en modo de Pudindose seleccionar las distintas tos recibidos se introducen en serie en
funcionamiento esclavo. modalidades de trabajo: el registro de desplazamiento SSPSR
Slave Select (#SS): Seleccin de Es- Modo Master (donde la seal de re- que, una vez haya recibido el octavo
clavo loj SCK ser de salida) bit, pasarn al registro SSBUF en pa-
Modo Esclavo (donde la seal de ralelo, ponindose en ese momento
MODO DE TRABAJO reloj SCK ser de entrada) los bits BF (SSPSTAT <0>) y SSPIF
Al inicializarse el mdulo SPI, Polaridad del Reloj: (Cambio de es- (PIR1 <3>) a uno, indicando el pri-
se necesita configurar varias especi- tado por flanco ascendente o des- mero de ellos que el buffer est lleno
ficaciones de la configuracin. Esto es cendente de SCK, y su estado de y el segundo para indicar que la re-
en los registros SSPSTAT y SSPCON inactivad) cepcin/transmisin ha finalizado. Si
64-73 MICROCONTROLADORES 30/12/03 12:32 Pgina 66

durante la recepcin/transmisin se Registro SSPCON: Registro de control del


intenta escribir en el registro SSPBUF,
la escritura ser ignorada y el bit puerto Serie (Direccin 14h)
WCOL (SSPCON<7>) se pone a uno
para indicar que ha habido "colisin". R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0
El bit BF se pone a cero, cuando se WCOL SSPOV SSPEN CKP SSPM3 SSPM2 SSPM1 SSPM0
procede a leer el registro SSPBUF, lo bit 7 bit 0
cual debe realizarse antes de que ten-
ga lugar una nueva recepcin. Bit 7: WCOL: Bit detector de colisin
El registro SSPSR no se puede 1= El registro SSPBUF se ha escrito cuando hay una transmisin en
leer o escribir directamente, y solo se proceso (Se debe borrar por software)
puede acceder a l a travs del registro 0= No hay colisin
SSPBUF. Por lo tanto, por el registro bit 6: SSPOV: Bit detector de desbordamiento en recepcin
SSPBUF deben pasar forzosamente En modo SPI
todos los datos tanto en transmisin
1= Se recibe un nuevo byte cuando el registro SSPBUF an mantie-
como en recepcin. En el ejemplo de
la tabla 1, se muestra el proceso de ne los datos anteriores. En caso de rebose, los datos del registro
carga en modo transmisin SSPSR sern falsos, slo puede ocurrir en modo esclavo. Se deber
leer el SSPBUF, an si slo se envan datos, para anular el rebose. En
modo master el bit no se pone a uno ya que en cada nueva recep-
cin/transmisin es inicializado por la escritura del registro SSPBUF.
0= No hay desbordamiento.
En modo I2C
1= Se recibe un nuevo byte cuando el registro SSPBUF an mantie-
ne los datos anteriores. En modo de transmisin no tiene importan-
cia, en cualquier caso debe borrarse por software.
0= No hay desbordamiento
bit 5: SSPEN: Bit de habilitacin del mdulo SSP (Synchronous Serial
Port)
En modo SPI
1= Habilita puerto serie y configura SCK, SDO y SDI como patillas
del puerto serie.
Figura 2.- Conexin SPI Master/Slave slo uno de los
0= Deshabilita el puerto serie y configura estas patillas como puerto
procesadores puede actuar cada vez como master.
de Entrada/Salida..
En modo I2C
1= Habilita el puerto serie y configura SDA y SCL como patillas del
CONEXIN TPICA puerto serie
En la Figura 2 se muestra la
0= Deshabilita el puerto serie y configura estas patillas como puerto
conexin entre dos procesadores,
donde slo uno puede actuar como de Entrada/Salida.
master cada vez . El circuito que En ambos casos, se debern configurar como entradas o salidas
trabaja como master (Procesador 1) adecuadamente.
indica la transferencia de datos con la bit 4: CKP: Bit de seleccin de polaridad del reloj
seal de reloj. Cada bit es desplazado En modo SPI
en el registro por cada flanco 1= Reloj en nivel alto. Transmisin en flancos de bajada, en
programado de reloj; en el flanco recepcin de subida
opuesto es enclavado en el latch. 0= Reloj en nivel bajo. Transmisin en flancos de subida, en
Los dos procesadores debern recepcin por flancos de bajada.
programarse con idntica polaridad de En modo I2C Esclavo (En este modo no se usa como master)
reloj. Los circuitos a conectar por
Control de desbloqueo de SCK
medio de este protocolo pueden
ser dos o ms perifricos o 1= Habilita reloj
microcontroladores pero, como se ha 0= Mantiene reloj en estado bajo.
comentado, solo uno puede trabajar
cada vez como master.
se escribe en el registro SSPBU. Si el registro SSPSR por cada pulso de re-
MODO MASTER mdulo acta como esclavo, la patilla loj recibido. El rango programable pa-
Cuando el microcontrolador se CLK deber configurarse como en- ra el reloj con los bits SSPM3:SSPM0
configura como Master, los datos son trada para que la seal, presente en la es de FOSC/4, FOSC/16, FOSC/64 y
transmitidos/recibidos cada vez que patilla SDI, se vaya desplazando en el Timer2 (Salida/2).
64-73 MICROCONTROLADORES 30/12/03 12:32 Pgina 67

Bit 3-0:SSPM3:SSPM0: Bit de seleccin del modo del SSP (Syncrhonous Serial Port)
0000 Modo Master del SPI, reloj = FOSC/4 0110 Modo Esclavo I2C, direccin de 7 bits
0001 Modo Master del SPI, reloj =FOSC/16 0111 Modo Esclavo I2C, direccin de 10 bits
0010 Modo Master del SPI, reloj =FOSC/32 1000 Modo Master I2C, reloj =
F=OSC/(4x(SSPADD+1))
0011 Modo Master del SPI, reloj =TMR2 salida/2 1011 Modelo Esclavo I2C con soporte
0100 Modo Master del SPI, reloj = patilla SCK. 1110 Modo Esclavo I2C, direccin de 7 bits

MICROCONTROLADORES
Habilita patilla de control #SS de interrupcin Start y Stop habilitados
0101 Modo Esclavo del SPI, reloj = patilla SCK. 1111 Modo Esclavo I2C, direccin de 10 bits con bits
Deshabilitada patilla #SS, se puede emplear de interrupcin Start y Stop habilitados
como I/O
1001, 1010, 1100 y 1101 Estn reservados

SSPCON2: Registro de control 2 del puerto Esto permite a una frecuencia de


Serie (direccin 91) reloj mxima (a 20 MHz) de bits de
5MHz. La Figura 3 muestra el crono-
R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 grama en modo Master. Cuando CKE
GCEN ASKSTART ACKDT ACKEN RCEN PEN RSEN SEN =1, el dato de SDO es valido si es an-
Bit 7 Bit 0 terior a un flanco de reloj en SDO. El
cambio en la entrada en el ejemplo es
bit 7: GCEN: Bit de habilitacin general (slo en modo esclavo I2C) en el flanco de reloj de SCK. El cam-
1= Habilita Interrupcin cuando una llamada general es recibida en bio en el ejemplo de entrada se de-
pende del estado del bit SMP. El tiem-
el SSPST (0000h)
po de la seal corresponde al de carga
0= Deshabilita direccin de llamada general de los bit recibidos en el registros
bit 6: ACKSTART: Bit de estado de reconocimiento (solo en modo master I2C) SSPBUF.
Modo de Transmisin En una operacin de SLEEP,
1= Reconocimiento del esclavo no recibido cuando est configurado como mas-
0= Reconocimiento del esclavo recibido ter, todos los mdulos de reloj son de-
bit 5: ACKDT: Bit de reconocimiento (solo en modo master I2C)
Modo de Recepcin
Valor transmitido cuando el usuario indica una secuencia de recono-
tenidos por lo que la transicin re-
cepcin permanecer congelada has-
ta que el microcontrolador despierte.
67
RESISTOR
cimiento y final de una recepcin. Momento en el que el mdulo reanu-
1= No reconocimiento dar la transmisin o la recepcin. En
el modo esclavo, los desplazamientos
0= Reconocimiento
sobre el registro son asncronos, lo
bit 4: ACKEN: Bit de habilitacin de secuencia de reconocimiento (slo que permite seguir transmitiendo o
en modo master I2C) recibiendo datos estando el procesador
Modo de Recepcin en estado Sleep. El microcontrolador
1= Indica una secuencia de reconocimiento en patillas SDA y SCL y despertar del SLEEP cuando los
transmite bit ACKDT. Automticamente borrado por hardware. ocho bits se hayan recibido y, como
0= Secuencia de reconocimiento en reposo es obvio, si la interrupcin corres-
bit 3: RCEN: Bit de habilitacin de recepcin (slo en modo master I2C) pondiente est habilitada.
1= Habilita recepcin en modo I2C Un Reset, deshabilita el mdulo
0= Recepcin en reposo MSSP, por lo que si se produce du-
bit 2: PEN: Bit de habilitacin de condicin de Stop( slo en modo rante una transferencia sta se dar
por finalizada.
master I2C)
Control SCK desbloqueado MODO SLAVE
1= Indica una condicin de Stop en SDA y SCL. Automticamente Como ya se ha comentado, en es-
borrado por hardware. te modo de trabajo los datos son trans-
0= Condicin de Stop en reposo mitidos o recibidos con el control de la
bit 1: RSEN: Bit de habilitacin repetir condicin Start (slo en modo seal externa de reloj. Cuando el lti-
master I2C) mo bit ha sido enclavado, el flag de
1= Indica repeticin de condicin de Start en SDA y SCL. Autom- interrupcin SSPIF (PIR<3>) se pon-
ticamente borrado por hardware. dr a uno. En este caso, como la fuen-
0= Condicin de repeticin de Start en reposo. te de reloj es externa, la patilla SCK
bit 0: SEN: Bit de habilitacin de condicin Start (slo en modo master I2C) deber programarse como entrada.
El pin #SS permite sincronizar el
1= Indica condicin de Start en SDA y SCL. Automticamente
modo esclavo. Cuando este modo es
borrado por hardware habilitado (SSPCON<3:0> = 0110)
0= Condicin de Start en reposo.
64-73 MICROCONTROLADORES 30/12/03 12:32 Pgina 68

Tabla 1, ejemplo de proceso de carga en modo transmisin.


bsf STATUS, RP0 ;Selecciona el banco 1
LOOP btfss SSPSTAT, BF ;Buffer lleno? (BF=1?)
goto LOOP ;No, entonces esperar
bcf STATUS, RP0 ;Selecciona el banco 0
movf SSPBUF, W ; SSPBUF W
movwf RXDATA ;Guardar el dato en una memoria temporal RAM
movf TXDATA, W ; TXDATA W
movwf SSPBUF ;Nuevo dato a transmitir

Figura 5.- Cronograma del SPI en modo Esclavo (CKE=0)

Figura 3.- Cronograma del modo SPI (Modo Master). La seal de reloj
acta como motor del proceso.

Figura 6.- Cronograma del SPI en Modo Esclavo (CKE=1)El bit CKE
del registro SSPSTAX determina el flanco del reloj que transmite el bit;
hay que tener en cuenta que actuar de forma inversa con el bit CKP del
registro SSPCON.

el pin #SSP se comporta como caso las patillas SDI y SDO pueden
una entrada, por lo que habr que unirse eliminando as la tercera cone-
programarla como tal (TRI- xin. Cuando la pastilla SDI necesita
SA<5> =1). Forzando esta pati- operar como receptora, la patilla SDO
lla a nivel alto, el mdulo SPI se deber ser configurada como una nue-
Resetea y el bit SSPEN se borra. va entrada, de este modo, se deshabi-
Es posible realizar transmi- lita la transmisin por esta ltima y
siones y recepciones con slo no crea conflictos con los datos de la
Figura 4.- Cronograma de sincronizacin del slave dos hilos de conexin; en este SDI.
64-73 MICROCONTROLADORES 30/12/03 12:32 Pgina 69

Registros Asociados con una operacin SPI


Direccin Nombre Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 Valor en POR,BOR Valor en
el resto de Reset
0Bh,8Bh
10Bh,18Bh INTCON GIE PEIE(1) TOIE INTE RBIE TOIF INTF RBIF 0000 000x 0000 000u
0Ch PIR1 PSPIF1 ADIF(1) RCIF TXIF SSPIF CCP1IF TMR2IF TMR1IF 0000 0000 0000 0000
8Ch PIE1 PSPIE ADIE RCIE TXIE SSPIE CCP1IE TMR2IE TMR1IE 0000 0000 0000 0000
87h TRISC PORTC (Direccinamiento de los Datos) 1111 1111 1111 1111
13h SSPBUF Registro Buffer Transmisin/Recepcin del mdulo SSP xxxx xxxx uuuu uuuu
14h SSPCON WCOL SSPOV SSPEN CKP SSPM3 SSPM2 SSPM1 SSPPM0 0000 0000 0000 0000
85h TRISA --- --- Registro de direccionamiento de datos de PORTA --11 1111 --11 1111
94h SSPSTAT SMP SKE D/#A P S R/W UA BF --00 0000 --00 0000
Leyenda
x = desconocido, u = inalterado; - = no implementado se lee como 0. Las celdas sombreadas no son usadas para la conversin A/D
Nota 1: Estos registros/bits no estn disponibles para los dispositivos de 28 pines

EJEMPLO DE MANEJO DE UN
PERIFRICO SPI
El montaje de la Figura 8, est
basado en una nota de aplicacin que
nos ha mandado Marcos Fernndez.
Se trata de un convertidor A/D con
protocolo SPI de 16 bits con dos
canales de entrada de la marca Analog
Device con un circuito de referencia
de tensin de referencia de 2,50V de
la misma marca, conectados al puerto
de comunicaciones serie sncronas de
un PIC16F876.El programa propuesto
para comprobar el funcionamiento de
puerto SPI del PIC16F876 es el
siguiente. Los pines del AD7705 son Figura 7.- Patillas de los convertidores AD7006 y AD7706
los que se muestran en la Figura 7 y la

Pin Nemnico Funcin


1 SCLK Serial Clock. Entrada Trigger Schmit. Un reloj externo se aplica a esta entrada para acceder los datos serie
del AD7705/AD7706. Este reloj serie puede ser un reloj continuo con todos los datos transmitidos en un tren
continuo de pulsos. Alternativamente, puede ser un reloj no continuo con la informacin transmitindose al
AD7705/AD7706 en lotes de datos ms pequeo.
2 MCLK IN Seal de reloj Master del dispositivo. Se puede conseguir utilizando un crystal/resonator o un reloj externo.
El crystal/resonator puede conectarse a los pines MCLK IN y MCLK OUT.
Alternativamente, en el pin MCLK puede controlarse con un reloj CMOS-compatible y MCLK OUT no
conectado. Se puede trabajar con frecuencias de reloj con un rango entre 500 kHz a 5 MHz.
3 MCLK OUT Cuando el reloj del dispositivo en modo master es un crystal/resonator, el crystal/resonator se conecta entre
MCLK IN y MCLK OUT. Si un reloj externo se aplica a MCLK IN, MCLK OUT proporciona una seal de
reloj invertido. Este reloj puede usarse para proporcionar una fuente del reloj para que la circuitera externa
y es capaz de atacar a dispositivos CMOS. Si el usuario no lo requiere, este MCLK OUT puede eliminarse.
Esto asegura que no se absorba potencia innecesaria en lar cargas capacitivas que controlan la MCLK OUT.
4 CS Chip Select. Entrada activa a nivel bajo selecciona el AD7705/AD7706. Con esta entrada hard-wired a nivel
bajo, el AD7705/AD7706 puede trabajar en tres hilos SCLK, DIN y DOUT unidos al bus del dispositivo. CS
puede activar el dispositivo en sistemas con mas dispositivos conectado al bus serie o como una seal de sin-
cronismo en la comunicacin con el AD7705/AD7706.
64-73 MICROCONTROLADORES 30/12/03 12:32 Pgina 70

6 AIN2(+)[AIN1] AD7705: entrada positiva o entrada analgica diferencial del Canal 2. AD7706: La Entrada analgica Canal 1.
7 AIN1(+)[AIN2] AD7705: entrada positiva o entrada analgica diferencial del Canal 1. AD7706: La Entrada analgica Canal 2
8 AIN1()[COMMON] AD7705: Entrada negativa o Entrada de Analgica diferencial del Canal . AD7706:
La entrada COMN. Entradas analgicas de referencia para los canales 1, 2 y 3.
9 REF IN(+) Entrada de Referencia. Entrada positiva de Referencia diferencia del AD7705/AD7706.
La entrada de la referencia es diferencial y puede tomar cualquier valor teniendo la prevencin de que REF
IN(+) debe ser mayor que REF IN (). REF IN(+) puede ser cualquier valor entre VDD y GND.
10 REF IN() Entrada de referencia. Entrada negativa de referencia diferencial del AD7705/AD7706.
La entrada de la referencia es diferencial y puede tomar cualquier valor teniendo la prevencin de que REF
IN(+) debe ser mayor que REF IN (). REF IN(+) puede ser cualquier valor entre VDD y GND.
11 AIN2()[AIN3] AD7705: Entrada diferencial negativa de la entrada analgica del Canal 2. AD7706: Entrada analgica del
Canal 3.
12 DRDY Salida lgica. Un nivel lgico bajo en esta salida indica que una nueva palabra de salida est disponible en
el registro de datos del AD7705/AD7706 . El pin DRDY volver a tomar el nivel alto cuando se realice una
funcin de lectura de la palabra de salida completa. Si los datos no se leen la lnea DRDY volver a tomar un
nivel alto cuando pasen 500 x tCLK IN ciclos, para actualizar la salida.
Mientras DRDY est a nivel alto, deber intentarse realizar una funcin de lectura. La lnea DRDY volver
indicar de nuevo cuando la actualizacin ha tenido lugar. DRDY tambin es acostumbrado a indicar cuando
el AD7705/AD7706 ha completado secuencia de calibracin del chip.
13 DOUT Salida de datos serie con los datos en serie se lee la saoda del registro de desplazamiento que contiene la
informacin del registro de indicio, registro de comunicaciones, registro de reloj o registro de datos, depen-
de en cada momento del registro de seleccin de comunicaciones
14 DIN Entrada de datos serie que se escriben en serie por la entrada de desplazamiento de entrada. Los datos de este
registro de desplazamiento de entrada se transfiere al registro de configuracin, al registro del reloj o al regis-
tro de comunicaciones, dependiendo, en el momento del registro de de seleccin o del Registro de
Comunicaciones.
15 VDD Tensin de alimentacin comprendida entre +2.7 V a +5.25 V.
16 GND Masa , punto de tendin de referencia para el AD7705/AD7706 en el interior del circuito.

Figura 8.- Montaje Experimental del


PIC16F876 con un convertidor A/D SPI
64-73 MICROCONTROLADORES 30/12/03 12:32 Pgina 71

El programa propuesto para comprobar el funcionamiento de puerto SPI del PIC16F976 es el siguiente.
;***********************************************************************************
;Para trabajar con el A/D utilizo bsicamente dos rutinas:
;1-CONFAD, donde se realiza la configuracin del A/D

MICROCONTROLADORES
;2-MEDIR, donde se realiza una nueva medida
;El tratamiento que realizo es por poling de la pata DRDY(RC6).Se Utiliza una referencia
;de tensin que se obtiene del ANALOG DEVICES (REF192 de 2.5V). El cristal del A/D es de 2.4576
;El pin de RESET del A/D se conecta a nivel alto porque no utiliza (se activa a nivel bajo).
;Nada mas comenzar el inicio se realiza una temporizacin de 6msg y a continuacin se activa el
;SPI, se realiza toda la configuracin; a continuacin se configura el A/D y se pone la pata SCK
;a nivel alto. A partir de este momento se puede hacer cualquier cosa y en el momento que se
;desee realizar una medicin se llama a la funcin ACTSPI que activa al SPI y a MEDIR, guardando
;el resultado en DATOL y DATOH. Al final de esta rutina se vuelve a poner SCK a alto.
;La visualizacin de la conversin se realiza sobre los diodos LED, primero la parte alta y pasado
;un tiempo la parte baja.
;***********************************************************************************

LIST P=16F876 ;Se indica el modo de procesador

INCLUDE <P16f876.inc> ;se incluye la definicion de los

AUX EQU 0x20


CONT equ 0x21
DATOH equ 0x22
DATOL equ 0x23
AUX1 equ 0x24
AUX2 equ 0x25

INICIO
bsf
movlw
movwf
STATUS,RP0
b'11000111'
OPTION_REG
71
RESISTOR
clrf TRISB
bcf STATUS,RP0

call TEMP_6MS ;Temporizacin de 6msg

movlw b'00110000' ;modo master spi, reloj = fosc/4


movwf SSPCON ;sspen (bit 5) para la activacion del modulo spi
bsf STATUS,RP0 ;banco 1

;realizo el resto de la configuracin que se necesite para el micro

movlw b'01010000' ;i/o de sck, sdi y sdo


movwf TRISC
clrf SSPSTAT
bcf STATUS,RP0 ;banco 0

;Inicializacin de variables que se deseen

bcf SSPCON,SSPEN
bsf PORTC,3 ;PONGO A ALTO SCK

;-----------------------------EJEMPLO DE PRUEBA

A_OTRA call ACTSPIAD


call MEDIR
call VISUALIZA ;Se podra mandar visualizar sobre un LCD
movlw .50
movwf CONT
YA2 bcf INTCON,T0IF
movlw .0
movwf TMR0
64-73 MICROCONTROLADORES 30/12/03 12:32 Pgina 72

YA3 btfss INTCON,T0IF


goto YA3
decfsz CONT,F
goto YA2
goto A_OTRA

;------------------------
MICROCONTROLADORES
CONFAD
movlw 0x20 ;dato a enviar- al C. R. dando el canal y el registro a
movwf SSPBUF ;escribir (sera el clock register)
call WAITBF
btfsc SSPCON,SSPOV
goto PREINI
movlw 0x0C ;dato a enviar- al clock r. dando datos para que funcione con

movwf SSPBUF ;cristal. la lectura tiene que ser cada 2 ms.


call WAITBF
btfsc SSPCON,SSPOV
goto PREINI
movlw 0x10 ;dato a enviar C.R. dando el canal y el registro a

movwf SSPBUF ;escribir (ser el setup register)


call WAITBF
btfsc SSPCON,SSPOV
goto PREINI

movlw 0x40 ;dato a enviar al Setup R. autocalibracin y ganancia 1

movwf SSPBUF
call WAITBF

72
RESISTOR
btfsc
goto
return
SSPCON,SSPOV
PREINI

;--------------------------

MEDIR movf PORTC,W ;Se realiz as en vez de directamente al puerto porque a


movwf AUX ;veces daba error
btfsc AUX,6 ;drdy# esta conectado al pin 6 del puerto C
goto MEDIR

movlw 0x38 ;dato a enviar al C. R. dicindole que ahora voy a leer

movwf SSPBUF ;del data reg


call WAITBF
btfsc SSPCON,SSPOV
goto PREINI
;leo el bufer 2 veces para almacenar en las variables DATOH

movlw 0x00 ;y DATOL el resultado de la conversin


movwf SSPBUF
call WAITBF
btfsc SSPCON,SSPOV
goto PREINI

movwf DATOH
movlw 0x00
movwf SSPBUF
call WAITBF
btfsc SSPCON,SSPOV
goto PREINI
movwf DATOL
bcf SSPCON,SSPEN
bsf PORTC,3 ;PONGO A ALTO SCK

return
64-73 MICROCONTROLADORES 30/12/03 12:32 Pgina 73

;----------------------------
TEMPO clrf AUX1
ACTSPIAD clrf AUX2
BUCLE decfsz AUX1,f
movlw b'00110000' ;modo master goto BUCLE
spi, reloj = fosc/4 decfsz AUX2,f
movwf SSPCON goto BUCLE
return return
;--------------------------- ;------------------------------
WAITBFbsf STATUS,RP0
WAITB btfss SSPSTAT,BF TEMP_6MS
goto WAITB movlw D'2'
bcf STATUS,RP0 movwf AUX1
movf SSPBUF,W movlw D'53'
return movwf AUX2
BUCLE1 decfsz AUX2,1
;------------------------------ goto BUCLE1
decfsz AUX1,1
VISUALIZA goto BUCLE1
movf DATOH,W return
movwf PORTB ;------------------------------
call TEMPO
movf DATOL,W PREINI bcf SSPCON,SSPOV
movwf PORTB goto INICIO
call
return
TEMPO ;------------------------------

END
73
RESISTOR
;------------------------------

PICTRONIC
Herramientas para el aprendizaje y desarrollo de los C PIC

"Curso Bsico de microcontroladores PIC"


"PICTRON-0/EXT", aprendizaje y pequeos proyectos sin soldadura
Circuitos programadores, puerto serie y paralelo
Mdulo ICD "in circuit debugger" 16F8XX compatible con MPLAB-ICD
PROTOBOARDS para proyectos medios con PIC de todos los formatos
Placas de desarrollo IN/OUT
Mdulos auxiliares para proyectos profesionales

Vistanos en: http://www.pictronic.com


e-mail: info@pictronic.com

También podría gustarte