Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Manual Pic18f77
Manual Pic18f77
16F87X
TRABAJO
EXPLICACIN
2 DPE
INDICE
DIFERENCIAS ENTRE PIC16F84 Y 16F87X ____________________________________ 4
PIC 16F87X_________________________________________________________________ 5
DIFERENCIAS ENTRE 16F84 Y 16F87X __________________________________________ 5
SENSORES ANALOGICOS MAS UTILIZADOS __________________________________ 6
SENSOR DE LUMINOSIDAD LDR _______________________________________________ 7
SENSOR DE TEMPERATURA LM35 _____________________________________________ 7
ORGANIZACIN DE LA MEMORIA__________________________________________ 8
MEMORIA DE PROGRAMA ____________________________________________________ 9
MEMORIA DE DATOS RAM ___________________________________________________ 9
INSTRUCCIONES _________________________________________________________ 10
REGISTROS ESPECFICOS_________________________________________________ 12
REGISTRO DE ESTADO (STATUS) _________________________________________ 13
REGISTRO DE OPCIONES (OPTION) _______________________________________ 14
REGISTRO PARA CONTROLAR LAS INTERRUPCIONES ____________________ 15
REGISTRO DE CONTROL DE INTERRUPCIONES (INTCON) __________________ 16
REGISTRO DE PERMISO DE INTERRUPCIONES 1 (PIE1) _____________________ 17
REGISTRO DE PERMISO DE INTERRUPCIONES 2 (PIE2) _____________________ 18
REGISTRO DE LOS SEALIZADORES DE INTERRUPCION 1 Y 2 (PIR1 PIR2) __ 19
LECTURA Y ESCRITURA EEPROM Y FLASH ________________________________ 21
LECTURA Y ESCRITURA DE LAS MEMORIAS EEPROM Y FLASH ____________ 22
PUERTAS E/S _____________________________________________________________ 23
PUERTAS DE E/S ____________________________________________________________ 24
PUERTA A _______________________________________________________________ 24
PUERTA B _______________________________________________________________ 25
PUERTA C _______________________________________________________________ 26
PUERTA D _______________________________________________________________ 26
PUERTA E _______________________________________________________________ 26
2 DPE
2 DPE
DIFERENCIAS ENTRE
PIC16F84 Y 16F87X
2 DPE
PIC 16F87X
Diferencias entre 16F84 y 16F87X
El PIC 16F84 ha sido precedido por el 16C84, prcticamente igual, con
excepcin de la memoria de programa que era de tipo EEPROM en lugar de FLASH. El
FLASH soporta 1.000 operaciones de Escritura/Borrado y el EEPROM 100.000.
El PIC 16F84 tiene una memoria FLASH de 1K palabras, solo un Timer y 13
lneas de E/S digitales y el modelo normal soporta una frecuencia de 10 MHz. Aunque
el A, llega a 20 MHz. Es un microcontrolador categorizado como gama baja por su
bajo coste y sencillez, pero que ha dado mucho que hablar.
La memoria RAM de datos de los PIC 16F87X posee una capacidad de 192
bytes en dos de los modelos y de 368 bytes en los otros dos. Aunque superan
ampliamente los 68 bytes del 16F84 mantienen la misma estructura bsica de 4 bancos
de 128 bytes cada uno, seleccionables por los bits RP0 y RP1 del registro de estado
(STATUS bits 5 y 6 respectivamente).
La memoria de datos no voltil de 64 bytes tipo EEPROM que tena el 16F84,
en los nuevos 16F87X de 28 patas sube a 128 bytes, y en los de 40 patas hasta 256
bytes.
Los 16F87X manejan hasta 14 posibles fuentes de interrupcin y 3 Timer, frente
a las 4 fuentes y 1 Timer del 16F84. El numero de puertas tambin se ha aumentado
considerablemente, con 3 puertas los de 28 patas y hasta 5 puertas los de 40.
Adems lo nuevos PICs, incorporan los siguientes mdulos, inexistentes en el
antiguo 16F84:
- Dos mdulos CCP:
Capaces de comparar y capturar impulsos. La captura se efecta con
una precisin de 12,5 ns y una resolucin de 16 bits, mientras que la
comparacin con igual resolucin alcanza una precisin de 200 ns.
Adems, la seccin PWM vara la anchura de los impulsos, tcnica muy
empleada en los motores.
-
Comunicacin Serie:
La tpica USART, orientada a la comunicacin entre subsistemas o
mquinas (RS-232) y la MSSP destinada a la comunicacin entre
diversos circuitos integrados y que admite el protocolo I2C y SPI.
Comunicacin en Paralelo:
Los PIC 16F874/7 de 40 patas est disponible el protocolo PSP, ms
rpido que la comunicacin serie pero hipoteca muchas minas de E/S, 8 de la
puerta D y 3 de control de la Puerta E.
-
Conversor A/D:
En todos los PIC 16F87X existe un conversor A/D de 10 bits, con 5
canales de entrada en los de 28 patas y 8 en los de 40.
DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS
2 DPE
SENSORES ANALOGICOS
MAS UTILIZADOS
2 DPE
2 DPE
ORGANIZACIN DE
LA MEMORIA
2 DPE
Organizacin de la Memoria
Memoria de Programa
La memoria FLASH en la que se graba el programa de aplicacin en los
PIC 16F87X, puede tener una capacidad de 4K u 8K palabras de 14 bits
cada una. Dicha memoria est dividida en pginas de 2K palabras y est
direccionada con el PC, que tiene un tamao de 13 bits. La pila que tiene 8
niveles de profundidad, es transparente para el usuario, es decir, funciona
automticamente y no dispone de instrucciones para guardar o sacar de
ella informacin. Con la instruccin CALL y con las interrupciones, el
valor se salva en el nivel superior. Con las instrucciones RETURN,
RETFIE Y RETLW, en valor contenido en el nivel superior de la pila, se
carga en el PC. Al poseer la pila solo 8 niveles, le corresponde al
programador preocuparse por los anidamientos en las subrutinas para
sobrepasar dicho valor. El vector de reset ocupa la direccin 0000h y el
vector de interrupcin la 0004h, igual que el PIC 16F84.
Memoria de Datos RAM
La memoria de datos tiene posiciones implementadas en RAM y otra en
EEPROM. En la seccin RAM, se alojan los registros operativos
fundamentales, en el funcionamiento del procesador y en el manejo de sus
perifricos, adems de registros que el programador puede usar para
informacin de trabajo propia de la aplicacin. La memoria EEPROM es
para guardar datos de forma no voltil y se considera un dispositivo
especial.
La RAM esttica consta de 4 bancos con 128 bytes cada uno. En las
posiciones iniciales de banco se ubican los registros especficos que
gobiernan el procesador y sus recursos. Dos modelos de 16F87X tienen 192
bytes de RAM y otros dos de 368 bytes.
Para seleccionar el banco al que se desea acceder en la RAM se emplean
los bits 6 y 5 del Registro de Estado (STATUS) RP1 y RP0
respectivamente, segn el cdigo siguiente:
BANCO
0
1
2
3
RP1
0
0
1
1
RP0
0
1
0
1
2 DPE
INSTRUCCIONES
10
2 DPE
Instrucciones
Los mismos formatos, iguales modos de direccionamiento y las mismas 35
instrucciones que tena el PIC 16F84 sirven para todos los modelos PIC 16F87X. No
obstante, en los nuevos PIC, al contener ms recursos, existen nuevos registros
especficos de control cuyos bits se debern escribir o leer para su gobierno.
Suma W y F
AND W con F
Borra F
Borra W
Complementa F
Decrementa F
Decrementa F, si es 0 salta
Incrementa F
Incrementa F, si es 0 salta
OR entre W y f
Mueve f
Mueve W a f
No opera
Rota f a la izquierda, a travs del acarreo
Rota f a la derecha, a travs del acarreo
Resta a f el registro W
Intercambia f
XOR de W con f
INSTRUCCIONES QUE MANIPULAN BITS
BCF
BSF
BTFSC
BTFSS
Borra bit de f
Pone a 1 el bit de f
Testea un bit de f y salta si vale 0
Testea un bit de f y salta si vale 1
Suma inmediata a W
AND inmediato con W
Llamada a subrutina
Borra el Perro guardin
Salto incondicional
OR inmediato con W
Mueve a W un valor inmediato
Retorno desde interrupcin
Retorno y carga de W
Retorno de subrutina
Pasa a estado de reposo
Resta W de un inmediato
OR Exclusiva a W
11
2 DPE
REGISTROS
ESPECFICOS
12
2 DPE
Registros
REGISTRO DE ESTADO (STATUS)
Este es el registro ms usado de todos pues sus bits estn destinado a
controlar las funciones vitales del procesador. Por ese motivo est
duplicado en las cuartas posiciones de cada banco (03h, 83h, 103h, 183h)
IRP
Los tres bits de menos peso son los sealizadores de ciertas condiciones
en las operaciones lgico-aritmticas:
- Z: Sealizador de cero. Se pone 1 cuando el resultado es 0.
- C: Acarreo-llevada del 8 bit. Se pone a uno automticamente
cuando existe acarreo en el bit de ms peso en las
instrucciones de suma. Tambin acta como sealizador de
llevada en las instrucciones de resta, pero en este caso la
correspondencia es inversa, si vale 0 es llevada.
- DC: Acarreo-llevada en el cuarto bit. Funciona igual que el
sealizador C, pero para el 4 bit. Es muy til para las
operaciones en BCD.
Los sealizadores PD# y TO#, son activos por nivel bajo (#) y sirven
para indicar la causa que ha provocado la reinicializacin del procesador.
- PD#: Se activa a 0 al ejecutarse la instruccin SLEEP. Se
pone a uno automticamente tras la conexin de alimentacin
o bien al ejecutarse la instruccin CLRWDT
- TO#: Se activa a nivel bajo al desbordarse el perro guardin.
Toma el valor 1 tras la conexin de alimentacin o al
ejecutarse las instrucciones CLRWDT o SLEEP.
Los PIC se resetean al conectar la alimentacin (POR Power on Reset).
Tambin se resetean cuando la tensin de alimentacin baja de 4V (BOR
Brown on Reset), aunque esta funcin es factible desactivarla poniendo
a 0 el bit BODEM, presente en la palabra de configuracin, tanto en el
Reset POR como en el BOR los bits PD# y TO# toman el valor 1,
mientras que en los dems casos dependen de la causa que ha provocado
el Reset.
Finalmente los tres bits de ms peso del registro de estado se emplean
para seleccionar el banco de la RAM al que se desea acceder
RP1 RP0 BANCO SELECCIONADO
0
0 Banco 0 (00h 7Fh)
0
1 Banco 1 (80h FFh)
1
0 Banco 2 (100h 17Fh)
1
1 Banco 3 (180h 1FFh)
El bit IRP se usa conectado con el bit de ms peso del registro FSR para
elegir el banco de RAM en el direccionamiento indirecto.
DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS
13
2 DPE
INTEDG
PS1
0
0
1
1
0
0
1
1
PS0
0
1
0
1
0
1
0
1
TOCS
TOSE
PSA:
TOSE:
TOCS:
INTEDG:
Flanco activo de la interrupcin externa.
1 = Flanco ascendente
0 = Flanco descendente
RBPU#:
Resistencias de pull-up de la Puerta B
1 = Desactivadas
0 = Activadas
DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS
14
2 DPE
15
2 DPE
PEIE:
TOIE:
INTE:
RBIE:
TOIFF:
INTF:
RBIF:
16
2 DPE
TMR1IE
RCIE:
TXIE:
SSPIE:
CCP1IE:
17
2 DPE
EEIE BCLIE
CCP2IE
EEIE:
BCLIE:
CCP2IE:
18
2 DPE
TMR1IF
REGISTRO PIR2
-
EEIF BCLIF
CCP2IF
19
2 DPE
INDF
TMR0
PCL
STATUS
FSR
100h
101h
102h
103h
104h
105h
106h
107h
108h
109h
10Ah
10Bh
10Ch
10Dh
INDF
OPTION_REG
PCL
STATUS
FSR
10Eh
10Fh
110h
Reservado
Reservado
INDF
TMR0
PCL
STATUS
FSR
PORTA
PORTB
PORTC
PORTD
PORTE
PCLATH
INTCON
PIR1
PIR2
00h
01h
02h
03h
04h
05h
06h
07h
08h
09h
0Ah
0Bh
0Ch
0Dh
INDF
OPTION_REG
PCL
STATUS
FSR
TRISA
TRISB
TRISC
TRISD
TRISE
PCLATH
INTCON
PIE1
PIE2
80h
81h
82h
83h
84h
85h
86h
87h
88h
89h
8Ah
8Bh
8Ch
8Dh
TMR1L
TMR1H
T1CON
0Eh
0Fh
10h
PCON
8Eh
8Fh
90h
TMR2
T2CON
SSPBUF
SSPCON
CCPR1L
CCPR1H
CCP1CON
RCSTA
TXREG
RCREG
CCPR2L
CCPR2H
CCP2CON
ADRESH
11h
12h
13h
14h
15h
16h
17h
18h
19h
1Ah
1Bh
1Ch
1Dh
1Eh
SSPCON2
PR2
SSPADD
SSPSTAT
ADRESL
91h
92h
93h
94h
95h
96h
97h
98h
99h
9Ah
9Bh
9Ch
9Dh
9Eh
ADCON0
1Fh
ADCON1
9Fh
11Fh
19Fh
A0h
120h
1A0h
TXSTA
SPBRG
20h
Registros
Propsito
General
96 Bytes
Registros
Propsito
General
80 Bytes
accesses
70h-7Fh
7Fh
Banco 0
EFh
F0h
PORTB
PCLATH
INTCON
EEDATA
EEADR
EEDATH
EEADRH
Propsito
General
16 Bytes
Registros
Propsito
General
80 Bytes
accesses
70h-7Fh
FFh
Banco 1
111h
112h
113h
114h
115h
116h
117h
118h
119h
11Ah
11Bh
11Ch
11Dh
11Eh
16Fh
170h
TRISB
PCLATH
INTCON
EECON1
EECON2
Propsito
General
16 Bytes
Registros
Propsito
General
80 Bytes
accesses
70h - 7Fh
17Fh
Banco 2
180h
181h
182h
183h
184h
185h
186h
187h
188h
189h
18Ah
18Bh
18Ch
18Dh
18Eh
18Fh
190h
191h
192h
193h
194h
195h
196h
197h
198h
199h
19Ah
19Bh
19Ch
19Dh
19Eh
1EFh
1F0h
1FFh
Banco 3
20
2 DPE
LECTURA Y ESCRITURA
EEPROM Y FLASH
21
2 DPE
CP1
0
0
0
0
0
1
1
1
1
1
1
CP2
0
1
1
1
1
0
0
0
0
1
1
WRT
X
0
0
1
1
0
0
1
1
0
1
POSICIONES DE
FLASH
Memoria de prog.
reas no protegidas
reas protegidas
reas no protegidas
reas protegidas
reas no protegidas
reas protegidas
reas no protegidas
reas protegidas
Memoria de prog.
Memoria de prog.
No
No
No
S
No
No
No
S
No
No
S
No
S
No
S
No
S
No
S
No
S
S
No
No
No
No
No
No
No
No
No
S
S
22
2 DPE
PUERTAS E/S
23
2 DPE
Puertas de E/S
Los microcontroladores PIC 16F87X encapsulados con 28 patas, disponen de 3
puertas de E/S (A,B,C) mientras que los de 40 patas, alcanzan 5 (A,B,C,D,E).
1. PUERTA A
Solo dispone de 6 lneas (RA0-RA5), son bidireccionales y se configuran
a travs del registro TRISA, situado en el Banco 1. En cada bit del registro
TRISA de la Puerta se configura la correspondiente lnea. Si el bit es 0, la
lnea est configura como salida, a su vez, si se pone a 1, la lnea se
configura como entrada.
El registro PORTA, es el de la Puerta A, que recoge el estado de cada
lnea de la Puerta, independientemente de cmo estn configuradas.
Las lneas R0/AN0, R1/AN1 y R2/AN2, adems de lneas de E/S
digitales, tambin pueden actuar como los canales 0, 1 y 2 por los que se
puede aplicar una seal analgica al conversor A/D. La pata
RA3/AN3/Vref+, tambin puede actuar como entrada de Tensin de
Referencia para los perifricos que la precisan. La pata RA4/TOCKI acta
adems de E/S digital, como entrada de seal de reloj para el Timer 0. La
pata RA5/AN5/SS# tiene multiplexadas tres funciones: E/S digital, canal 4
para el conversor A/D y seleccin del modo esclavo cuando se trabaja con
la comunicacin serie sncrona.
Para seleccionar si las lneas de la Puerta A van a trabajar como E/S
digitales o como canales de entrada para el conversor A/D, hay que
escribir el valor adecuado sobre el registro ADCON1. Si se carga en dicho
registro el valor 011x en sus 4 bits de menos peso, todas las lneas de
puertas funcionan como E/S digitales.
DIRECCION
NOMBRE
BIT 7
BIT 6
BIT 5
BIT 4
05h
85h
9Fh
PORTA
TRISA
ADCON1
ADFM
RA5
RA4
RA3
RA2
RA1
RA0
Registro de configuracin de la Puerta A
PCFG3 PCFG2 PCFG1 PCFG0
x
u
-
BIT 3
BIT 2
BIT 1
BIT 0
VALOR
EN POR
BOR
-0x 000
-11 1111
-0- 0000
significa desconocido
significa que no cambia
significa que no est implementado y se lee como 0
24
VALOR EN
EL RESTO
DE RESETS
-0u 000
-11 1111
-0- 0000
2 DPE
2. PUERTA B
Dispone de 8 lneas bidireccionales cuya funcin se elige mediante la
programacin del TRISB. Todas las patas de la puerta B disponen de una
resistencia interna de pull-up al positivo de la alimentacin. Esta va
conectada cuando el bit RBPU# (es bit 7 del registro OPTION), tiene valor
0. La resistencia de pull-up se conecta automticamente siempre que la
lnea est configurada como salida. Cuando se produce un Reset por
conexin de la alimentacin (POR) se desconectan todas las resistencias de
pull-up.
Las lneas RB<7-4> pueden programarse para generar una interrupcin
cuando una de ellas cambia de estado. Se deben configurar como entradas
y el valor que se introduce por ellas se compara con el anterior para si no
coinciden generar una interrupcin, siempre que lo autorice el bit de
permiso situado en el INTCON.
La pata RB0/INT tambin puede programarse como peticin de
interrupcin externa, el bit de permiso tambin est ubicado en el
INTCON.
DIRECCION
NOMBRE
BIT 7
BIT 6
06h
86h
81h
PORTB
TRISB
OPTION
RB7
RB6
x
u
-
BIT 5
BIT 4
BIT 3
BIT 2
BIT 1
BIT 0
RB5
RB4
RB3
RB2
RB1
Registro de configuracin de la Puerta B
RBPU# INTEDG TOCS TOSE
PSA
PS2
PS1
RB0
PS0
VALOR
VALOR EN
EN POR EL RESTO
BOR
DE RESETS
xxxx xxxx uuuu uuuu
1111 1111 1111 1111
1111 1111 1111 1111
significa desconocido
significa que no cambia
significa que no est implementado y se lee como 0
25
2 DPE
3. PUERTA C
Consta de 8 lneas bidireccionales cuyo sentido se configura mediante el
registro TRISC. Todas las patas de esta puerta tienen multiplexadas
diferentes funciones:
-
4. PUERTA D
Consta de 8 lneas bidireccionales. Solo la tienen los PIC encapsulados
con 40 patas (16F877). Se configura mediante el registro TRISD. Todas
las patas disponen en su entrada de un Trigger Schmitt.
Adems de usarse como lneas de E/S digitales normales, implementan
una puerta paralela esclava de 8 lneas (PSP), que sirve para permitir la
comunicacin en paralelo con otros elementos del sistema.
Las patas se denominan RD0/PSP0-RD7/PSP7, y para que funcionen
como puerto de comunicacin esclava en paralelo, es preciso poner el bit
PSP MODE=1.
5. PUERTA E
Solo la tienen los PIC de 40 patas. Dispone de tres patas multifuncin,
que se configuran como entrada o salida, segn el valor de los tres bits de
menos peso del registro TRISE
-
26
2 DPE
RECURSOS
ESPECIALES
27
2 DPE
Recursos especiales
PALABRA DE CONFIGURACIN
Es una posicin reservada de la memoria de programa FLASH que ocupa la
direccin 2007h y que solo es accesible durante la programacin del PIC
CP1
CP0 DEBUG
CP1:CP0
CP1
0
0
0
0
1
1
1
WRT
CPD
LVP
PWRTE#
WDTE
FOSC1
FOSC0
Cdigo de proteccin de la memoria del programa. Estn repetidos en los bits 13:12 y
5:4. Si los bits de cdigo de proteccin no se programan, las protecciones de la memoria
de cdigo pueden ser ledas para verificacin
CP0
0
0
1
1
0
0
1
Proteccin desde...
...hasta
Modelo PIC
0000h
0FFFh
16F873/4
0000h
1FFFh
16F876/7
0800h
0FFFh
16F873/4
1000h
1FFFh
16F876/7
0F00h
0FFFh
16F873/4
1F00h
1FFFh
16F876/7
No hay cdigo protegido en la memoria FLASH
DEBUG
WRT
CPD
LVP
BODEN
PWRTE#
WDTE
FOSC1:0
Tipo de oscilador
FOSC1
0
0
1
1
FOSC0
0
1
0
1
Tipo
LP (Baja Potencia. De 35 a 200 kHz)
XT (Estndar. De 100 kHz a 4 MHz)
HS (Alta velocidad. Ms de 4 MHz)
RC (Resistencia-Condensador)
28
2 DPE
PALABRA DE IDENTIFICACIN
Se trata de cuatro palabras de la memoria de programa que se hallan
comprendidas entre la direccin 2000h y la 2003h y estn reservadas para que
el usuario las pueda emplear en funciones de comprobaciones o checksums,
cdigos de identificacin, nmeros de serie, fecha, modelo, lote, nmeros
secuenciales o aleatorios, etc. Estas cuatro posiciones solo son accesibles en la
lectura y escritura durante la operacin de programacin/ verificacin. Solo se
deben emplear los cuatro bits de menos peso de las palabras de identificacin.
REINICIALIZACIN O RESET
Los PIC 16F87X disponen de diversa maneras de reinicializarse.
1 Reset por conexin de alimentacin. (POR: Power on Reset) El valor de
tensin de alimentacin Vdd sube entre 1,2 a 1,7 V.
2 Activacin de la pata MCLR#. (nivel bajo en dicha pata durante una
operacin normal)
3 Activacin de la pata MCLR# estando el PIC en reposo (SLEEP)
4 Reset provocado por desbordamiento del Perro Guardin en una
operacin normal.
5 Reset provocado por el desbordamiento del Perro Guardia durante el
estado de reposo (SLEEP)
6 Reset provocado por una cada de voltaje (BOR: Brown out Reset) Vdd
baja entre 3,8 y 4,2 V.
Los bits TO# y PD# del registro de Estado toman un valor determinado en
cada tipo de reset. Tambin los bits 0 y 1 del registro PCON, llamados BOR#
y POR# respectivamente, sirven para especificar las causas de un reset.
POR#
0
0
0
1
1
1
1
1
BOR#
x
x
x
0
1
1
1
1
TO#
1
0
x
1
0
0
u
1
PD#
1
x
0
1
1
0
u
0
TIPO DE RESET
Conexin de alimentacin POR
Ilegal
Ilegal
Por cada de tensin BOR
Por WDT (operacin normal)
Por WDT (modo SLEEP)
Activacin normal MCLR#
MCLR# en SLEEP o interrupcin para despertar de SLEEP
29
2 DPE
30
2 DPE
VDD = 5V
GND o Tierra
Vpp = 12 a 14 V que se introducen por la pata MCLR#/Vpp
RB6 : Recibe los impulsos de reloj.
RB7 : Lnea de datos con los bits en serie.
31
2 DPE
TEMPORIZADORES
32
2 DPE
33
2 DPE
34
2 DPE
TMR1CS TMR1ON
35
2 DPE
TOUTPS3
TOUTPS2
TOUTPS1
TOUTPS0
TMR2ON
T2SCKPSI
T2SCKPSO
Los bits 1 y 0 del T2CON sirven para seleccionar el rango de divisin del predivisor de
impulsos de la siguiente forma:
T2CKPS1 T2CKPS0
0
0
0
1
1
x
36
2 DPE
CAPTURA, COMPARACIN
Y MODULACIN DE
ANCHURA DE PULSOS
37
2 DPE
CCPxX
CCPxY
CCPxM3
CCPxM2
CCPxM1
CCPxM0
38
2 DPE
MODO CAPTURA
La pareja CCPxH-L del mdulo CCPx captura el valor de 16 bits que contiene el
Timer1 cuando sucede un evento en la pata RC/CCPx de la Puerta C, que previamente
ha sido configurada como entrada poniendo a 1 el bit del registro TRISC.
Los eventos que pueden ocurrir sobre la pata RCy/CCPx para producir la captura
del valor del TMR1 sobre la pareja de registros CCPxH-L son:
1 Un flanco ascendente
2 Un flanco descendente
3 Cada 4 flancos ascendentes
4 Cada 16 flancos ascendentes
39
2 DPE
MODO COMPARACIN
En esta forma de trabajo, la pareja de registros CCPR1H-L compara su
contenido de forma continua, con el valor del TMR1. Cuando coinciden ambos valores,
la Pata Rc2/CCP1, que se halla configurada como salida, le acontece uno de los
siguientes eventos de acuerdo con la programacin del los bits CCP1M3-0:
40
2 DPE
41
2 DPE
EL CONVERSOR
A/D
42
2 DPE
ADCS0
CHS2
CHS1
CHS0
GO/DONE#
ADON
43
2 DPE
REGISTRO ADCON1
ADFM
PCFG3
PCFG2
PCFG1
PCFG0
FRECUENCIA
Fosc/2
Fosc/8
Fosc/32
FRC (Procede del oscilador RC interno)
TAD
2 Tosc
8 Tosc
32 Tosc
Oscilador RC interno en el C A/D
CANAL
Canal 0 (RA0/AN0)
Canal 1 (RA1/AN1)
Canal 2 (RA2/AN2)
Canal 3 (RA3/AN3)
Canal 4 (RA5/AN4)
Canal 5 (RE0/AN5). Los PIC de 28 patas no la tienen
Canal 6 (RE1/AN6). Los PIC de 28 patas no la tienen
Canal 7 (RE2/AN7). Los PIC de 28 patas no la tienen
44
2 DPE
ADFM=1
07
ADRESH
ADMF=0
RESULTADO DE 10 BITS
ADRESL
07
ADRESH
ADRESL
PCFG3-0
0000
0001
0010
0011
0100
0101
011x
1000
1001
1010
1011
1100
1101
1110
1111
AN7/
RE2
A
A
D
D
D
D
D
A
D
D
D
D
D
D
D
AN6/
RE1
A
A
D
D
D
D
D
A
D
D
D
D
D
D
D
AN5/
RE0
A
A
D
D
D
D
D
A
A
A
A
D
D
D
D
AN4/
RA5
A
A
A
A
D
D
D
A
A
A
A
A
D
D
D
AN3/
RA3
A
VREF+
A
VREF+
A
VREF+
D
VREF+
A
VREF+
VREF+
VREF+
VREF+
D
VREF+
AN2/
RA2
A
A
A
A
D
D
D
VREFA
A
VREFVREFVREFD
VREF-
AN1/
RA1
A
A
A
A
A
A
D
A
A
A
A
A
A
D
D
AN0/
RA0
A
A
A
A
A
A
D
A
A
A
A
A
A
A
A
VREF+
VREF-
VDD
RA3
VDD
RA3
VDD
RA3
VDD
RA3
VDD
RA3
RA3
RA3
RA3
VDD
RA3
VSS
VSS
VSS
VSS
VSS
VSS
VSS
RA2
VSS
VSS
RA2
RA2
RA2
VSS
RA2
CHAN/
REFS
8/0
7/1
5/0
4/1
3/0
2/1
0/0
6/2
6/0
5/1
4/2
3/2
2/2
1/0
1/2
45
2 DPE
Configurar las patas que actuarn como entradas analgicas, las que
trabajan como E/S digitales y las usadas para la tensin de referencia
(ADCON1).
Seleccionar el reloj de la conversin (ADCON0)
Seleccionar el canal de entrada A/D (ADCON0)
Activar el mdulo A/D (ADCON0)
46
2 DPE
MDULO DE COMUNICACIONES
SERIE SNCRONA MSSP
47
2 DPE
INTRODUCCIN
La comunicacin serie es una forma muy apreciada de transferir datos
digitales entre sistemas y circuitos integrados, dada la reducida cantidad de
lneas que precisa.
En los PIC16F87X se ha implantado el mdulo MSSP (Master
Synchronous Serial Port), que proporciona una excelente interfaz de
comunicacin de los microcontroladores con otros microcontroladores y
diversos perifricos, entre los que destacan la memoria EEPROM serie, los
conversores A/D, los controladores de displays, etc.
Adems el mdulo MSSP admite dos de las alternativas ms usadas en la
comunicacin serie sncrona:
1 SPI (Serial Peripheral Interface).
2 I2C (Inter Integrated Circuit).
La comunicacin serie en modo SPI la utilizan principalmente las
memorias (RAM y EEPROM) y utiliza tres lneas para llevarla a cabo. En el
modo I2C slo se emplean dos lneas y, recientemente, ha conseguido una
importante implantacin en la comunicacin de circuitos integrados, existiendo
en el mercado todo tipo de perifricos capaces de trabajar con este protocolo.
El mdulo MSSP consta bsicamente de dos registros: el SSPSR, que es un
registro de desplazamiento que transforma la informacin serie en paralelo
y viceversa, y el registro SSPBUF, que acta como buffer de la informacin
que se recibe o transmite.
El funcionamiento del mdulo MSSP es muy sencillo. En transmisin, el
byte que se quiere transmitir se carga en el registro SSPBUF a travs del bus de
datos interno y automticamente se pasa al registro SSPSR, que va desplazando
bit a bit el dato, sacndolo ordenadamente al exterior al ritmo de los impulsos
del reloj. En recepcin, los bits van entrando al ritmo del reloj por una pata y se
van desplazando en el SSPSR hasta que lo llenan, en cuyo momento la
informacin se traspasa al SSPBUF, donde queda lista para su lectura. Este
doble almacenamiento de datos recibidos, permite iniciar la recepcin de un
nuevo dato antes de que se haya ledo el ltimo.
Cuando se han recibido 8 bits durante la recepcin en SSPSR, se traspasa
dicha informacin a SSPBUF y entonces el bit sealizador BF (Buffer-Full) se
pone a 1, al igual que el flag de interrupcin SSPIF. Cualquier escritura en el
SSPBUF se ignora durante la transferencia de informacin y se sealiza
poniendo a 1 el bit WCOL. Recae la responsabilidad del programador pasar el
bit WCOL a 0 una vez completada la escritura en SSPBUF.
48
2 DPE
MODO SPI
Permite la transferencia de datos de 8 bits en serie, que pueden ser
transmitidos y recibidos de forma sncrona y simultnea. Para el establecimiento
de la comunicacin se utilizan tres lneas:
1 SDO (Serial Data Out): Salida de datos en serie.
2 SDI (Serial Data In): Entrada de datos en serie.
3 SCK (Serial Clock): Reloj de sincronizacin.
SS
RA5/SS#
PIC esclavo 1
SDI
SDO CLK
RA5/SS#
PIC esclavo 1
SDI
SDO CLK
PIC MAESTRO
PIC 16F87x
RC3/SDO
SDO
RC4/SDI
SDI
RC5/SCK
SCK
49
2 DPE
MODO I2C
El protocolo I2C fue desarrollado por Philips para cubrir sus propias
necesidades en la implementacin de diversos productos electrnicos que
requeran una elevada interconexin de circuitos integrados. El protocolo I2C
(Inter-Integrated Circuits) utiliza nicamente dos lneas para la transferencia de
informacin entre los elementos que se acoplan al bus. Una de dichas lneas se
dedica a soportar los datos, es bidireccional y se llama SDA; la otra lleva los
impulsos de reloj para la sincronizacin, es unidireccional y recibe el nombre de
SCL. Los impulsos de reloj siempre los genera el maestro y tienen la funcin de
sincronizar las transferencias con todos los esclavos colgados a las dos lneas.
SS
SS
PIC MAESTRO
PIC 16F87x
PIC esclavo 1
SDA
SCL
PIC esclavo 1
SDA
SCL
RC4/SDA
SDA
RC3/SCL
SCL
50
2 DPE
Para activar el bus I2C, poner el bit SSPEN = 1, que es el bit 5 del
registro SSPCON
SSPCON
Registro de control
2.
SSPCON2
Registro de control 2
3.
SSPSTAT
Registro de estado
4.
SSPBUF
5.
SSPSR
6.
SSPADD
Registro de direccin
51
2 DPE
SSPCON
WCOL SSPOV
SSPEN
CKP
SSPM3
SSPM2
SSPM1
SSPM0
WCOL
SSPOV
SSPEN
CKP
SSPM3-0
SSPM3-0
0000
0001
0010
0011
1000
SSPCON2
GCEN ACKSTAT ACKDT ACKEN RCEN
PEN
RSEN
SEN
GCEN
ACKSTAT
ACKDT
ACKEN
RCEN
PEN
RSEN
SEN
52
2 DPE
SSPSTAT
SMP CKE
D/A#
R/W#
UA
BF
SMP
bit de muestreo
1 = los bits de datos se muestran al final del periodo
0 = los bits de datos se muestran a mitad del periodo
CKE
D/A#
R/W#
UA
BF
tipo de direccionamiento
1 = direccin de 10 bits
0 = direccin de 7 bits
sealizador del buffer de datos
1 = tiene un dato y la transmisin est en proceso
0 = no tiene ningn dato
53
2 DPE
USART (SCI)
54
2 DPE
55
2 DPE
PROGRAMAS (ASM)
56
2 DPE
PROGRAMA 1
Lee el estado de los 6 interruptores del entrenador (RA5-RA0) y reflejar el nivel
lgico de los mismos sobre los leds RB5-RB0 conectados a la puerta B
Inicio
Aqui
List
include
p=16F876
"P16F876.INC"
org
0x05
clrf
bsf
clrf
movlw
movwf
movlw
movwf
bcf
PORTB
STATUS,RP0
TRISB
0x06
ADCON1
b'00111111'
TRISA
STATUS,RP0
movf
movwf
goto
PORTA,W
PORTB
Aqui
;Borra el Puerto B
;Selecciona banco 1
;Puerta B se configura como salida
;Puerta A configurada como digital
;Puerta A se configura como entrada
;Selecciona banco 0
;Leer las entradas RA0-RA5
;Reflejar en las salidas
;Bucle de lectura
end
57
2 DPE
PROGRAMA 2
Control de los leds RB0 y RB1 desde el interruptor RA0. RB0 refleja el estado de RA0,
RB1 el complemento de RA0
List
include
p=16F876
"P16F876.INC"
org
0x05
clrf
bsf
clrf
movlw
movwf
movlw
movwf
bcf
PORTB
STATUS,RP0
TRISB
0x06
ADCON1
b'00011111'
TRISA
STATUS,RP0
Aqui
btfsc
goto
bcf
bsf
goto
PORTA,0
RA0_es_1
PORTB,0
PORTB,1
Aqui
;RA0 = 1 ??
;Si
;No, desconecta RB0
;Conecta RB1
;Buble
RA0_es_1
bsf
bcf
goto
PORTB,0
PORTB,1
Aqui
;Activa RB0
;Activa RB1
;Bucle
Inicio
;Borra el Puerto B
;Selecciona banco 1
;Puerta B se configura como salida
;Puerta A como entrada digital
;Puerta A se configura como entrada
;Selecciona banco 0
end
58
2 DPE
PROGRAMA 3
Se trata de realizar una rotacin secuencial en el encendido de cada led conectados a la
puerta B del entrenador. Si RA0 = 0, la rotacin ser de derecha a izquierda y viceversa.
Cada led permanece encendido 0.25 segundos (250 mS)
Contador
List
include
p=16F876
;Tipo de procesador
"P16F876.INC" ;Definiciones de registros internos
equ
0x20
org
goto
0x05
Inicio
;-------------------------------------------------------------------------------------------------------------------;Delay es una rutina que realiza una temporizacin de 250 mS que es el tiempo en que han
;de permanecer encendido cada uno de los leds. Se basa en repetir 25 veces la temporizacin
;de 10mS que se emple en el ejercicio anterior.
Delay
Delay_0
Delay_1
movlw
movwf
bcf
b10
Contador
INTCON,T0IF
movlw
movwf
btfss
goto
decfsz
b195
TMR0
INTCON,T0IF
Delay_1
Contador,F
goto
Delay_0
;Todava no, temporiza otros 10 ms
return
;Ahora si
;-------------------------------------------------------------------------------------------------------------------Inicio
Loop
A_Izda
A_Dcha
clrf
bsf
clrf
movlw
movwf
movlw
movwf
movlw
movwf
bcf
PORTB
STATUS,RP0
TRISB
0x06
ADCON1
b'00011111'
TRISA
b'00000111'
OPTION_REG
STATUS,RP0
bsf
call
btfsc
goto
rlf
goto
rrf
goto
STATUS,C
Delay
PORTA,0
A_Dcha
PORTB,F
Loop
PORTB,F
Loop
;Borra el Puerto B
;Selecciona banco 1
;Puerta B se configura como salida
;Puerta A digital
;Puerta A se configura como entrada
;Preescaler de 256 para el TMR0
;Selecciona banco 0
;Activa el carry
;Temporiza 250mS
;Est a 0 RA0 ??
;No, rotacin a derecha
;Si, rotacin a izquierda
;Rotacin a derecha
end
59
2 DPE
PROGRAMA 4
La interrupcin del TMR0.
Se trata de comprobar la interrupcin provocada por el TMR0. El programa lee el
estado de los interruptores conectados a RA0 y RA4 para reflejarlo en los leds conectados a RB0
y RB4 respectivamente. Al mismo tiempo el TMR0 genera una interrupcin cada 0.05 seg. (10
mS) que se repetir 50 veces con objeto de hacer intermitencia de 500 mS sobre el led conectado
a RB7.
Contador
Inter
Con_si_0
Seguir
Inicio
List
include
p=16F876
;Tipo de procesador
"P16F876.INC" ;Definiciones de registros internos
equ
0x020
org
goto
0x04
Inter
;Vector de interrupcin
org
goto
0x05
Inicio
bcf
decfsz
INTCON,T0IF
Contador,F
goto
movlw
movwf
Seguir
b50
Contador
movlw
xorwf
movlw
movwf
retfie
b'10000000'
PORTB,F
b195
TMR0
clrf
bsf
clrf
movlw
movwf
movlw
movwf
movlw
movwf
bcf
PORTB
STATUS,RP0
TRISB
0x06
ADCON1
b'00111111'
TRISA
b'00000111'
OPTION_REG
STATUS,RP0
;El TMR0 se carga con 195. Con un preescaler de 256 y a una frecuencia de 20MHz se obtiene
;una interrupcin cada 10mS. Se habilita la interrupcin del TMR0.
movlw
movwf
movlw
movwf
movlw
movwf
b195
TMR0
b50
Contador
b'10100000'
INTCON
60
2 DPE
;Este es el cuerpo principal del programa. Consiste en leer constantemente el estado de RA0 y
;RA1 para visualiza sobre RB0 y RB1.
Loop
RA0_ES_1
TEST_RB1
RA1_ES_1
btfsc
goto
bcf
goto
bsf
btfsc
goto
bcf
goto
bsf
goto
PORTA,0
RA0_ES_1
PORTB,0
TEST_RB1
PORTB,0
PORTA,1
RA1_ES_1
PORTB,1
Loop
PORTB,1
Loop
end
61
2 DPE
PROGRAMA 5
La interrupcin externa RBO/INT.
Se trata de comprobar la interrupcin externa que se aplica a travs del pin RBO/INT.
El programa principal est en un ciclo cerrado en modo SLEEP (standby de bajo consumo).
Cada vez que se detecta un flanco descendente en RB0 se provoca una interrupcin cuyo
tratamiento hace iluminar las salidas RB7-RB1 durante 1 seg.
List
include
p=16F876
;Tipo de procesador
"P16F876.INC" ;Definiciones de registros internos
equ
0x20
org
goto
0x04
Inter
;Vector de interrupcin
org
goto
0x05
Inicio
Inter
bcf
movlw
movwf
movlw
movwf
Seguir
bcf
movlw
movwf
btfss
goto
decfsz
goto
clrf
retfie
clrf
bsf
movlw
movwf
movlw
movwf
bcf
movlw
movwf
PORTB
STATUS,RP0
b'00000001'
TRISB
b'00000111'
OPTION_REG
STATUS,RP0
b'10010000'
INTCON
Contador
Delay_10ms
Inicio
;Borra el Puerto B
;Selecciona banco 1
;RB7-RB1 salidas, RB0/INT entrada
;Preescaler de 256 para el TMR0
;Selecciona banco 0
;Activa la interrupcin externa RB0/INT
;Este es el cuerpo del programa principal. Se mantiene en estado SLEEP hasta que se produce
;interrupcin
Loop
sleep
nop
goto
Loop
end
62
2 DPE
PROGRAMA 6
El Display de 7 segmentos del entrenador. Decodificador hex. BCD a 7 segmentos.
Mediante los cuatro interruptores RA0-RA3 se introduce un valor hexadecimal de 4 bits que
debe visualizarse sobre el display.
List
include
p=16F876
;Tipo de procesador
"P16F876.INC" ;Definiciones de registros internos
org
goto
0x05
Inicio
;-------------------------------------------------------------------------------------------------------------------;Tabla: Esta rutina convierte el cdigo binario presente en los 4 bits de menos peso del reg. W en
;su equivalente a 7 segmentos. Para ello el valor de W se suma al valor actual del PC. Se obtiene
;un desplazamiento que apunta al elemento deseado de la tabla.El cdigo 7 segmentos retorna
;tambin en el reg. W.
Tabla:
addwf
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
PCL,F
b'00111111'
b'00000110'
b'01011011'
b'01001111'
b'01100110'
b'01101101'
b'01111101'
b'00000111'
b'01111111'
b'01100111'
b'01110111'
b'01111100'
b'00111001'
b'01011110'
b'01111001'
b'01110001'
Inicio
clrf
bsf
clrf
movlw
movwf
movlw
movwf
PORTB
STATUS,RP0
TRISB
0x06
ADCON1
b'00111111'
TRISA
;Borra el Puerto B
;Selecciona banco 1
;Puerta B se configura como salida
bcf
STATUS,RP0
;Selecciona banco 0
movf
andlw
call
movwf
goto
PORTA,W
b'00001111'
Tabla
PORTB
Loop
Loop
;Puerta A digital
;Puerta A se configura como entrada
end
63
2 DPE
PROGRAMA 7
La memoria EEPROM de datos
Se trata de imitar el funcionamiento de las mquinas tipo "SU TURNO" habituales en mltiples
comercios. Sobre el display se visualizar el nmero del turno actual. Este se incrementa a cada pulso
aplicado por RA0. En la memoria EEPROM del PIC16F876 se almacena el ltimo nmero visualizado,
de forma que, en caso de haber un fallo de alimentacin, se reanude la cuenta en el ltimo nmero.
Si se parte de que el sistema se emplea por vez primera , se visualiza el 0
Contador
List
p=16F876
include "P16F876.INC"
;Tipo de procesador
;Definiciones de registros internos
equ
0x20
org
goto
0x05
Inicio
;-----------------------------------------------------------------------------------------------------------------------------;EE_Write: Graba un byte en la EEPROM de datos. La direccin ser la contenida en EEADR y el dato
;se le supone previamente metido en EEDATA
EE_Write
Wait
bsf
bsf
bcf
bsf
movlw
movwf
movlw
movwf
bsf
btfsc
goto
bcf
bcf
bcf
bcf
return
STATUS,RP0
STATUS,RP1
EECON1,EEPGD
EECON1,WREN
b'01010101'
EECON2
b'10101010'
EECON2
EECON1,WR
EECON1,WR
Wait
EECON1,WREN
EECON1,EEIF
STATUS,RP0
STATUS,RP1
;Selecciona banco 3
;Acceso a EEPROM de datos
;Permiso de escritura
;-----------------------------------------------------------------------------------------------------------------------------;EE_Read: Leer un byte de la EEPROM. Se supone al registro EEADR cargado con la direccin a leer.
;En EEDATA aparecer el dato ledo.
EE_Read
bsf
bsf
bcf
bsf
bcf
bcf
return
STATUS,RP0
STATUS,RP1
EECON1,EEPGD
EECON1,RD
STATUS,RP0
STATUS,RP0
;Seleccin de banco 3
;Selecciona EEPROM de datos
;Orden de lectura
;Seleccin de banco 0
64
2 DPE
;-----------------------------------------------------------------------------------------------------------------------------;Tabla: Esta rutina convierte el cdigo BCD presente en los 4 bits de menos peso del reg. W en su
;equivalente a 7 segmentos. El cdigo 7 segmentos retorna tambin en el reg. W
Tabla:
addwf
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
PCL,F
b'00111111'
b'00000110'
b'01011011'
b'01001111'
b'01100110'
b'01101101'
b'01111101'
b'00000111'
b'01111111'
b'01100111'
bcf
INTCON,T0IF ;Desconecta el flag de rebosamiento
movlw b195
movwf TMR0
;carga el TMR0 con 195
Delay_10_ms_1 btfss
INTCON,T0IF ;Rebasamiento del TMR0 ??
goto
Delay_10_ms_1 ;Todava no
bcf
INTCON,T0IF ;Ahora si, reponer el flag
return
;-----------------------------------------------------------------------------------------------------------------------------Inicio
Ini_0
Ini_1
clrf
bsf
clrf
movlw
movwf
movlw
movwf
movlw
movwf
bcf
PORTB
STATUS,RP0
TRISB
0x06
ADCON1
b'00111111'
TRISA
b'00000111'
OPTION_REG
STATUS,RP0
;Borra el Puerto B
;Selecciona banco 1
;Puerta B se configura como salida
bsf
clrf
STATUS,RP1
EEADR
;Selecciona banco 2
;Selecciona direccin 00 de EEPROM
call
bsf
movlw
subwf
btfsc
goto
goto
bcf
clrf
goto
movf
bcf
movwf
EE_Read
STATUS,RP1
0x09
EEDATA,W
STATUS,C
Ini_0
Ini_1
STATUS,RP1
Contador
Loop
EEDATA,W
STATUS,RP1
Contador
;Puerta A digital
;Puerta A se configura como entrada
;Mayor de 9 ??
;Si, poner a 0 el contador
;No
;Banco 0
;Poner a 0 el contador
;Banco 0
;Iniciar contador
65
2 DPE
movf Contador,W
call
Tabla
movwf PORTB
Wait_0
btfss
goto
call
PORTA,0
Wait_0
Delay_10_ms
Wait_1
btfsc
goto
call
PORTA,0
Wait_1
Delay_10_ms
incf
movlw
subwf
btfsc
clrf
movf
bsf
movwf
call
goto
Contador,F
b10
Contador,W
STATUS,Z
Contador
Contador,W
STATUS,RP1
EEDATA
EE_Write
Loop
;Incrementa contador
;Contador mayor de 9 ??
;Si, vuelta a 00
;Selecciona el Banco 2
;Graba el nuevo valor del contador en la EEPROM
end
66
2 DPE
PROGRAMA 8
El manejo de la pantalla LCD
Este ejemplo pretende introducirnos en el manejo de la pantalla LCD, para la visualizacin
de diferentes mensajes.
List
p=16F876
;Tipo de procesador
include "P16F876.INC" ;Definiciones de registros internos
Lcd_var
Delay_Cont
Temporal_1
Temporal_2
equ
equ
equ
equ
0x20
0x22
0x23
0x24
org
goto
0x05
Inicio
;-----------------------------------------------------------------------------------------------------------------------------;La directiva dt genera tantas intsrucciones retlw como bytes o caracteres contenga
Mens_0
equ
dt
$
"Trabajo / Explic",0x00
Mens_1
equ
dt
$
"PIC 16F87x",0x00
Mens_2
equ
dt
$
"Sebastian Martin",0x00
Mens_3
equ
dt
$
" Andoni Beraza",0x00
;-----------------------------------------------------------------------------------------------------------------------------;Delay_var: Esta rutina de propsito general realiza una temporizacin variable entre 10 mS y 2.5". Se
;emplea un preescaler de 256 y al TMR0 se le carga con 195. La velocidad de trabajo es de 20Mhz y por
;tanto el TMR0 se incrementa cada 200nS. De esta forma, el TMR0 debe contar 195 eventos que, con un
;preescaler de 256 hace un intervalo total de 10000 uS (195 * 256 * 0,2). Este intervalo de 10 mS se repite
;tantes veces como indique la variable "Delay_cont", es por ello que el delay mnimo es de 10 mS
;("Delay_cont=1) y el mximo de 2.5" (Delay_cont=255).
Delay_var:
Intervalo
bcf
movlw
movwf
btfss
goto
decfsz
goto
return
INTCON,T0IF
b195
TMR0
INTCON,T0IF
Intervalo
Delay_Cont,F
Delay_var
67
2 DPE
;Mensaje: Esta rutina visualiza en el LCD el mensaje cuyo inicio est indicado en el acumulador. El fin
;de un mensaje se determina mediante el cdigo 0x00
Mensaje
Mensaje_1
No_es_ultimo
Inicio
movwf
movf
call
movwf
movf
btfss
goto
return
call
incf
goto
Temporal_1
Temporal_1,W
Tabla_Mensajes
Temporal_2
Temporal_2,F
STATUS,Z
No_es_ultimo
LCD_DATO
Temporal_1,F
Mensaje_1
;Visualiza en el LCD
;Siguiente caracter
clrf
bsf
clrf
movlw
movwf
movlw
movwf
movlw
movwf
bcf
PORTB
STATUS,RP0
TRISB
0x06
ADCON1
b'00110001'
TRISA
b'00000111'
OPTION_REG
STATUS,RP0
;Borra el Puerto B
;Selecciona banco 1
;Puerta B se configura como salida
call
LCD_INI
movlw b'00001100'
call
LCD_REG
Loop
movlw
call
movlw
call
movlw
call
movlw
call
movlw
movwf
call
movlw
call
movlw
call
movlw
call
movlw
call
movlw
movwf
call
goto
b'00000001'
LCD_REG
Mens_0
Mensaje
b'11000000'
LCD_REG
Mens_1
Mensaje
b200
Delay_Cont
Delay_var
b'00000001'
LCD_REG
Mens_2
Mensaje
b'11000000'
LCD_REG
Mens_3
Mensaje
.200
Delay_Cont
Delay_var
Loop
;Mira si es el ltimo
;Puerta A digital
;RA1-RA3 salidas
;Preescaler de 256 para el TMR0
;Selecciona banco 0
;Secuencia de inicio del LCD
;Enva instruccin: LCD ON, Cursor OFF y blink OFF
;Borra LCD y Home (colocar cursor en 1 posicin)
;Visualiza el mensaje 0
;Coloca cursor en 2 fila del LCD
;Visualiza mensaje 1
;Temporiza 2 segundos
;Borra LCD y Home (colocar cursor en 1 posicin)
;Visualiza el mensaje 2
;Coloca cursor en 2 fila del LCD
;Visualiza el mensaje 3
;Temporiza 2 segundos
end
68
2 DPE
PROGRAMA 9
Introduccin al manejo del teclado
Haciendo uso de las rutinas incluidas en el fichero TECLADO.INC, se trata de leer el teclado y,
visualizar sobre los leds de la puerta B el cdigo BCD de la tecla pulsada. La visualizacin se mantiene
estable durante dos segundos hasta una nueva pulsacin.
Se trata de un ejemplo en el que la Puerta B se reconfigura dinmicamente. Inicialmente es
configurada como salida para presentacin del resultado. Posteriormente, la rutina de exploracin del
teclado reconfigura RB0-RB3 como salidas y RB4-RB7 como entradas.
List
p=16F876
;Tipo de procesador
include "P16F876.INC" ;Definiciones de registros internos
Key_var
del teclado
Delay_Cont
equ
0x20
equ
0x26
org
goto
0x05
Inicio
include "TECLADO.INC"
;-----------------------------------------------------------------------------------------------------------------------------Delay_var:
bcf
INTCON,T0IF ;Desconecta el flag de rebosamiento
movlw b195
movwf TMR0
;carga el TMR0 con 195
Intervalo
btfss
INTCON,T0IF ;Rebasamiento del TMR0 ??
goto
Intervalo
;Todava no
decfsz Delay_Cont,F ;Decrementa contador de intervalos
goto
Delay_var
;Repite el intervalo de 10 mS
return
;-----------------------------------------------------------------------------------------------------------------------------Inicio
Loop
clrf
bsf
clrf
movlw
movwf
bcf
PORTB
STATUS,RP0
TRISB
b'00000111'
OPTION_REG
STATUS,RP0
call
movlw
subwf
btfsc
goto
Key_Scan
0x80
Tecla,W
STATUS,Z
Loop
;Explora el teclado
movf
movwf
movlw
movwf
call
clrf
goto
Tecla,W
PORTB
b200
Delay_Cont
Delay_var
PORTB
Loop
end
69
2 DPE
PROGRAMA 10
El teclado y el LCD.
Haciendo uso de las rutinas incluidas en los ficheros TECLADO.INC y LCD_CXX.INC, se trata
de leer el teclado y, visualizar sobre el mdulo LCD la tecla pulsada.
El ejemplo pretende mostrar la interrupcin por cambio de estado en cualquiera de las lneas
RB4-RB7 del PIC el sistema se mantiene en el modo SLEEP de bajo consumo y slo reacciona cuando
tiene lugar la pulsacin de cualquier tecla.
Lcd_var
Key_var
Temporal_1
Temporal_2
Temporal_3
List
p=16F876
include "P16F876.INC"
;Tipo de procesador
;Definiciones de registros internos
equ
equ
equ
equ
equ
0x20
0x22
0x28
0x29
0x2a
org
goto
org
goto
0x04
Interrupcion
0x05
Inicio
include "LCD_CXX.INC"
include "TECLADO.INC"
Tabla_Mensajes movwf PCL
Mens_0
equ
dt
;Vector de interrupcin
$
"Se ha pulsado: ",0x00
;-----------------------------------------------------------------------------------------------------------------------------;Mensaje: Esta rutina visualiza en el LCD el mensaje cuyo inicio est indicado en el acumulador. El fin
;de un mensaje se determina mediante el cdigo 0x00
Mensaje
Mensaje_1
No_es_ultimo
movwf
movf
call
movwf
movf
btfss
goto
return
call
incf
goto
Temporal_1
Temporal_1,W
Tabla_Mensajes
Temporal_2
Temporal_2,F
STATUS,Z
No_es_ultimo
LCD_DATO
Temporal_1,F
Mensaje_1
;Visualiza en el LCD
;Siguiente caracter
;Mira si es el ltimo
;Se incluye una temporizacin de 10mS para eliminar los rebotes de las teclas
Delay_10ms
Delay_1
bcf
movlw
movwf
btfss
goto
return
INTCON,T0IF
b195
TMR0
INTCON,T0IF
Delay_1
70
2 DPE
Inter_1
bcf
call
movf
movwf
call
INTCON,RBIE
Key_Scan
Tecla,W
Temporal_3
Delay_10ms
call
movlw
subwf
btfss
goto
call
Key_Scan
0x80
Tecla,W
STATUS,Z
Inter_1
Delay_10ms
call
UP_LCD
movlw
call
movf
sublw
btfss
goto
movf
addlw
call
goto
0x8f
LCD_REG
Temporal_3,W
b9
STATUS,C
Mayor_que_9
Temporal_3,W
0x30
LCD_DATO
Inter_Fin
movf
addlw
call
Temporal_3,W
0x37
LCD_DATO
del LCD
Mayor_que_9
Inter_Fin
clrf
PORTA
PORTB
STATUS,RP0
b'11110000'
TRISB
STATUS,RP0
bcf
movf
bcf
bsf
retfie
INTCON,RBIE
PORTB,W
INTCON,RBIF
INTCON,RBIE
bsf
movlw
movwf
movlw
movwf
bcf
STATUS,RP0
0x06
ADCON1
b'00000111'
OPTION_REG
STATUS,RP0
call
call
movlw
call
movlw
UP_LCD
LCD_INI
b'00001100'
LCD_REG
b'00000001'
clrf
bsf
movlw
movwf
nop
nop
bcf
Inicio:
;Selecciona banco 1
;Puerta A digital
;Activa Pull-Up para las entradas de la puerta B
;Selecciona pgina 0 de datos
;LCD en ON
71
LCD_REG
2 DPE
;Borra LCD y HOME
Loop
;Visualiza el mensaje
clrf
clrf
bsf
movlw
movwf
nop
nop
bcf
PORTA
PORTB
STATUS,RP0
b'11110000'
TRISB
STATUS,RP0
bcf
movf
bcf
bsf
bsf
INTCON,RBIE
PORTB,W
INTCON,RBIF
INTCON,RBIE
INTCON,GIE
sleep
nop
goto
Loop
;Selecciona banco 1
end
72
2 DPE
PROGRAMA 11
El TMR1 en el modo contador. Frecuencmetro
Mediante un generador de onda cuadrada, se aplican pulsos por la lnea RC0/T1CKI.
El TMR1 cuenta los pulsos durante un intervalo de 1s. Al resultado de la cuenta representa el
nmero de pulsos por segundo o herzios.
Dicha frecuencia se visualiza por la pantalla LCD del entrenador
List
p=16F876
;Tipo de procesador
include "P16F876.INC" ;Definiciones de registros internos
Lcd_var
Byte_L
Byte_H
BCD_2
BCD_1
BCD_0
Contador
Temporal
Delay
equ
equ
equ
equ
equ
equ
equ
equ
equ
0x20
0x22
0x23
0x24
0x25
0x26
0x27
0x28
0x29
org
goto
0x04
Inter
;Vector de interrupcin
org
goto
0x05
Inicio
include "LCD_CXX.INC"
;Visualizar: Visualiza sobre la pantalla LCD los cinco dgitos situados en las variables BCD_0, BC_1 y
;BCD_2
Visualizar
Visual_loop
movlw
call
movlw
movwf
movlw
movwf
swapf
andlw
iorlw
call
movf
andlw
iorlw
call
decf
decfsz
goto
return
0x80
LCD_REG
3
Contador
BCD_0
FSR
INDF,W
0x0f
0x30
LCD_DATO
INDF,W
0x0f
0x30
LCD_DATO
FSR,F
Contador,F
Visual_loop
;Posiciona el cursor
;Inicia contador de bytes a convertir
;Inicia puntero ndice
;Convierte a ASCII el nible de ms peso
;Lo visualiza
;Convierte a ASCII el nible de menos peso
;Lo visualiza
;Siguiente byte
73
2 DPE
;16Bits_BCD: Esta rutina convierte un nmero binario de 16 bits situado en Cont_H y Cont_L y, lo
;convierte en 5 dgitos BCD que se depositan en las variables BCD_0, BCD_1 y BCD_2, siendo esta
;ltima la de menos peso.
Bits16_BCD
Loop_16
Ajuste
Ajuste_BCD
bcf
clrf
bsf
clrf
clrf
clrf
STATUS,C
Contador
Contador,4
BCD_0
BCD_1
BCD_2
rlf
rlf
rlf
rlf
rlf
decfsz
goto
return
Byte_L,F
Byte_H,F
BCD_2,F
BCD_1,F
BCD_0,F
Contador,F
Ajuste
movlw
movwf
call
incf
call
incf
call
goto
BCD_2
FSR
Ajuste_BCD
FSR,F
Ajuste_BCD
FSR,F
Ajuste_BCD
Loop_16
movf
addlw
movwf
btfsc
movwf
movf
addlw
movwf
btfsc
movwf
return
INDF,W
0x03
Temporal
Temporal,3
INDF
INDF,W
0x30
Temporal
Temporal,7
INDF
;Inicia el ndice
;Ajusta el primer byte
;Ajusta el segundo byte
decfsz
goto
bcf
bcf
movf
movwf
movf
movwf
call
call
movlw
movwf
movlw
movwf
Delay,F
No_1000_mS
T1CON,0
STATUS,C
TMR1L,W
Byte_L
TMR1H,W
Byte_H
Bits16_BCD
Visualizar
b195
TMR0
b100
Delay
74
INTCON,2
TMR1L
TMR1H
T1CON,0
movlw b195
movwf TMR0
bcf
INTCON,2
retfie
2 DPE
;Repone flag del TMR0
;Borra el TMR1
;TMR1 en On, se inicia la nueva cuenta de pulsos externos
;-----------------------------------------------------------------------------------------------------------------------------Inicio
clrf
clrf
bsf
movlw
movwf
clrf
clrf
movlw
movwf
movwf
bcf
PORTB
PORTA
STATUS,RP0
b'00000110'
ADCON1
TRISB
TRISA
b'11000111'
OPTION_REG
TRISC
STATUS,RP0
;El TMR1 acta como contador externo asncrono y con un preescaler de 1:1
Loop
movlw b'00000010'
movwf T1CON
;TMR1 Off
clrf
clrf
TMR1L
TMR1H
call
call
movlw
call
UP_LCD
LCD_INI
b'00001100'
LCD_REG
movlw
movwf
movlw
movwf
b100
Delay
b195
TMR0
bsf
T1CON,0
movlw b'10100000'
movwf INTCON
nop
goto
;Bucle
Loop
end
75
2 DPE
PROGRAMA 12
El TMR2. Temporizacin simple, segundero
El TMR2 provoca una interrupcin cada 10 mS. Transcurridas 100 interrupciones, el tiempo
total transcurrido es de 1 segundo.
El display conectado a la puerta B, cuenta intervalos de 1 segundo.
List
p=16F876
;Tipo de procesador
include "P16F876.INC" ;Definiciones de registros internos
Delay
Contador
equ
equ
0x20
0x21
;Variable de temporizacin
;Variable del contador de segundos
org
goto
0x04
Inter
;Vector de interrupcin
org
goto
0x05
Inicio
;-----------------------------------------------------------------------------------------------------------------------------;Tabla: Esta rutina convierte el cdigo binario presente en los 4 bits de menos peso del reg. W en su
;equivalente a 7 segmentos. El cdigo 7 segmentos retorna tambin en el reg. W
Tabla:
addwf
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
PCL,F
b'00111111'
b'00000110'
b'01011011'
b'01001111'
b'01100110'
b'01101101'
b'01111101'
b'00000111'
b'01111111'
b'01100111'
No_es_1_seg
decfsz
goto
incf
movlw
subwf
btfsc
clrf
movf
call
movwf
movlw
movwf
bcf
retfie
Delay,F
No_es_1_seg
Contador,F
b10
Contador,W
STATUS,Z
Contador
Contador,W
Tabla
PORTB
b100
Delay
PIR1,TMR2IF
76
clrf
bsf
clrf
bsf
movlw
movwf
bcf
PORTB
STATUS,RP0
TRISB
PIE1,TMR2IE
b195
PR2
STATUS,RP0
2 DPE
;Desconecta salidas
;Selecciona banco 1
;Puerta B se configura como salida
;Habilita interrupcin del TMR2
;Carga registro de periodos con 195
;Selecciona banco 0
;El TMR2 emplea un preescaler y un postcaler de 1:16 (total 1:256). Trabajando a una frecuencia de 20
;MHZ el TMR2 evoluciona cada 3.2uS (preescaler 1:16). La cuenta avanza hasta alcanzar el valor del
;registro de periodos (195), con lo que el tiempo transcurrido es de 624 uS. Este lapsus se repite 16 veces
;(postcaler 1:16) antes de provocar la interrupcin (al de 9984 uS).
Loop
movlw b'01111111'
movwf T2CON
clrf
TMR2
movlw b100
movwf Delay
movlw b'11000000'
movwf INTCON
;Habilita interrupciones
clrf
Contador
nop
goto
Loop
;Bucle
end
77
2 DPE
PROGRAMA 13
Los mdulos CCPx. Modo de Captura.
Medida del tiempo entre un pulso y el siguiente.
El ejemplo emplea el mdulo CCP1 y trata de capturar el valor del TMR1 cada vez que lleguen
un flanco descendente y otro ascendente por la lnea RC2/CCP1. Conocida la velocidad a la que
evoluciona el TMR1, se puede determinar el lapsus de tiempo transcurrido entre ambos flancos, lo que
nos dar el tiempo transcurrido entre el final de un pulso y el comienzo del siguiente.
La pantalla LCD visualiza dicho lapsus de tiempo expresado en microsegundos.
List
p=16F876
;Tipo de procesador
include "P16F876.INC" ;Definiciones de registros internos
Lcd_var
Byte_L
Byte_H
BCD_2
BCD_1
BCD_0
Contador
Temporal
Captura
Cap_1_L
Cap_1_H
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
0x20
0x22
0x23
0x24
0x25
0x26
0x27
0x28
0x29
0x2a
0x2b
org
goto
0x04
Inter
org
goto
0x05
Inicio
include "LCD_CXX.INC"
;Visualizar: Visualiza sobre la pantalla LCD los cinco dgitos situados en las variables
;BCD_0, BC_1 y BCD_2
Visualizar
Visual_loop
movlw
call
movlw
movwf
movlw
movwf
swapf
andlw
iorlw
call
movf
andlw
iorlw
call
decf
decfsz
goto
movlw
0x80
LCD_REG
3
Contador
BCD_0
FSR
INDF,W
0x0f
0x30
LCD_DATO
INDF,W
0x0f
0x30
LCD_DATO
FSR,F
Contador,F
Visual_loop
''
;Posiciona el cursor
;Inicia contador de bytes a convertir
;Inicia puntero ndice
;Convierte a ASCII el nible de ms peso
;Lo visualiza
;Convierte a ASCII el nible de menos peso
;Lo visualiza
;Siguiente byte
78
LCD_DATO
0xe4
LCD_DATO
'S'
LCD_DATO
2 DPE
;Visualiza ' '
;Visualiza micro
;Visualiza 'S'
;16Bits_BCD: Esta rutina convierte un nmero binario de 16 bits situado en Byte_H y Byte_L y, en 5
;dgitos BCD que se depositan en las variables BCD_0, BCD_1 y BCD_2, siendo esta ltima la de menos
;peso.
Bits16_BCD
Loop_16
Ajuste
Ajuste_BCD
bcf
clrf
bsf
clrf
clrf
clrf
STATUS,C
Contador
Contador,4
BCD_0
BCD_1
BCD_2
rlf
rlf
rlf
rlf
rlf
decfsz
goto
return
Byte_L,F
Byte_H,F
BCD_2,F
BCD_1,F
BCD_0,F
Contador,F
Ajuste
movlw
movwf
call
incf
call
incf
call
goto
BCD_2
FSR
Ajuste_BCD
FSR,F
Ajuste_BCD
FSR,F
Ajuste_BCD
Loop_16
movf
addlw
movwf
btfsc
movwf
movf
addlw
movwf
btfsc
movwf
return
INDF,W
0x03
Temporal
Temporal,3
INDF
INDF,W
0x30
Temporal
Temporal,7
INDF
;Inicia el ndice
;Ajusta el primer byte
;Ajusta el segundo byte
;Programa de tratamiento de la interrupcin que provoca el mdulo CCP1 cada vez que se detecta,
;primero un flanco descendente y, luego un ascendente por la lnea RC2/CCP1.
Inter
bcf
btfsc
goto
incf
movf
movwf
movf
movwf
bsf
PIR1,CCP1IF
Captura,0
Medir
Captura,F
CCPR1L,W
Cap_1_L
CCPR1H,W
Cap_1_H
CCP1CON,0
79
2 DPE
retfie
Medir
movf
subwf
movwf
btfss
incf
movf
subwf
movwf
call
incf
call
bcf
retfie
Cap_1_L,W
CCPR1L,W
Byte_L
STATUS,C
Cap_1_H,F
Cap_1_H,W
CCPR1H,W
Byte_H
Bits16_BCD
Captura,F
Visualizar
CCP1CON,0
;-----------------------------------------------------------------------------------------------------------------------------Inicio
clrf
clrf
bsf
movlw
movwf
clrf
clrf
movlw
movwf
bsf
bcf
PORTB
PORTA
STATUS,RP0
b'00000110'
ADCON1
TRISB
TRISA
b'11111111'
TRISC
PIE1,CCP1IE
STATUS,RP0
call
call
movlw
call
UP_LCD
LCD_INI
b'00001100'
LCD_REG
;Desconecta salidas
;Selecciona banco 1
;Puerta A E/S digitales
;Puerta B se configura como salida
;Puerta A salidas
;Puerta C entrada
;Habilita interrupcin del mdulo CCP1
;Selecciona banco 0
;Configura puertos para el LCD
;Inicia el LCD
;LCD On, cursor y blink Off
;El TMR1 acta en el modo temporizador con reloj interno y un preescaler 1:8 evoluciona cada 1.6uS.
;Segn esto, el periodo mximo que se puede medir ser en torno a los 100mS (10Hz). El periodo mnimo
;estar en torno a los 1.6 uS (62KHz). Para otros rangos se debe seleccionar un preescaler diferente.
movlw b'00110001'
movwf T1CON
movlw b'11000000'
movwf INTCON
;Habilita interrupciones
Loop
movlw b'00000100'
movwf CCP1CON
;Mdulo CCP en On
clrf
Captura
nop
goto
Loop
;Bucle
end
80
2 DPE
PROGRAMA 14
Los mdulos CCPx. Modo de Comparacin.
El TMR1 cuenta tantos pulsos externos como se indique mediante los interruptores RA5-RA0.
Cada vez que se alcanza el valor fijado, la salida RB0 cambia de estado.
List
p=16F876
;Tipo de procesador
include "P16F876.INC" ;Definiciones de registros internos
org
goto
org
goto
0x04
Inter
0x05
Inicio
;Vector de interrupcin
;Programa de tratamiento de la interrupcin que provoca el mdulo CCP1 cada vez que el TMR1 cuenta
;tantos pulsos externos como los prefijados mediante las entradas RA5-RA0.
Inter
bcf
bcf
clrf
clrf
movlw
xorwf
bsf
retfie
PIR1,CCP1IF
T1CON,TMR1ON
TMR1L
TMR1H
b'00000001'
PORTB,F
T1CON,TMR1ON
;-----------------------------------------------------------------------------------------------------------------------------Inicio
clrf
clrf
bsf
movlw
movwf
clrf
movlw
movwf
movwf
bsf
bcf
PORTB
PORTA
STATUS,RP0
b'00000110'
ADCON1
TRISB
b'00111111'
TRISA
TRISC
PIE1,CCP1IE
STATUS,RP0
;Desconecta salidas
;Selecciona banco 1
;Puerta A E/S digitales
;Puerta B se configura como salida
;Puerta A entradas
;RC0 entrada
;Habilita interrupcin del mdulo CCP1
;Selecciona banco 0
;El TMR1 acta en el modo contador de pulsos externos sensible al flanco ascendente y con un preescaler
;de 1:1. Estos pulsos pueden ser suministrador por el generador del entrenador
movlw b'00000010'
movwf T1CON
;TMR1 en Off
movlw b'11000000'
movwf INTCON
;Habilita interrupciones
81
2 DPE
Loop
clrf
clrf
clrf
CCPR1H
TMR1L
TMR1H
bsf
T1CON,TMR1ON
clrf
movf
andlw
movwf
goto
CCPR1H
PORTA,W
b'00111111'
CCPR1L
Loop
end
82
2 DPE
PROGRAMA 15
Los mdulos CCPx. Modo PWM. Modulacin de anchura de pulsos.
Consiste en generar una seal de onda cuadrada por la lnea RC2/CCP1 cuyo periodo puede
ser modificado as como la anchura del pulso (Duty Cycle). El periodo se determina segn la frmula
T=(PR2+1)*4*Tosc*TMR2 preescaler. La duracin del pulso o "Duty Cycle" (d) se determina segn
d=(CCPR1L:CCPCON1<5:4>)*Tosc*TMR2 preescaler.
El ejemplo emplea al mdulo CCP1 con salida de seal por la lnea RC2/CCP1 y un preescaler
de 16. La seal de salida tiene un periodo de 640uS. La anchura del ciclo "Duty" es variable y se
determina, segn el valor binario de los interruptores del entrenador (RA5-RA0)
List
p=16F876
;Tipo de procesador
include "P16F876.INC" ;Definiciones de registros internos
Temporal
equ
0x20
;Variable temporal
Periodo
equ
b200
org
0x05
;-----------------------------------------------------------------------------------------------------------------------------Inicio
clrf
bsf
movlw
movwf
movlw
movwf
movlw
movwf
movlw
movwf
bcf
PORTC
STATUS,RP0
0x06
ADCON1
b'00111111'
TRISA
b'11111011'
TRISC
Periodo-1
PR2
STATUS,RP0
;Borra salidas
;Selecciona banco 1
;Puerta A digital
;Puerta A entrada
;RC2 salida
;Carga el registro de periodos
;Selecciona banco 0
;El mdulo CCP1 acta en el modo PWM con salida de seal por RC2/CCP1
movlw b'00001100'
movwf CCP1CON
;El TMR2 trabaja con un preescaler 1:16 por lo que con una frecuencia de 20MHz evoluciona
;cada 3.2uS ((4*Tosc)*16)
Loop
movlw b'00000111'
movwf T2CON
;T2 en On
movf
andlw
movwf
goto
PORTA,W
b'00111111'
CCPR1L
Loop
end
83
2 DPE
PROGRAMA 16
El mdulo conversor ADC.
Los dispositivos PIC16F87X disponen de un convertidor A/D de 10 bits de resolucin y 5 u 8
canles de entrada analgica. Con 5 Vref=4.8 mV/Bit; con 2.5 Vref=2.4 mV/Bit
El ejemplo propone realizar la conversin de la tensin presente en el canal RA0/AN0. Esta se
puede variar con el potencimetro P1 del entrenador. El resultado de la conversin se visualiza, en
binario, sobre la pantalla LCD.
List
p=16F876
;Tipo de procesador
include "P16F876.INC" ;Definiciones de registros internos
Lcd_var
Temporal_1
equ
equ
0x20
0x22
org
goto
0x05
Inicio
include "LCD_CXX.INC"
;Visualiza: Esta rutina coge los 10 bits resultantes de la conversin, presentes en ADRESH y ADRESL,
;los convierte a caracteres ACII (0 o 1) y los visualiza sobre el LCD.
Visualiza:
Visual_loop
Bit_1
Visu_1
movlw
call
movlw
movwf
bsf
rlf
bcf
rlf
btfsc
goto
movlw
goto
movlw
call
decfsz
goto
return
0x80
LCD_REG
b9
Temporal_1
STATUS,RP0
ADRESL,F
STATUS,RP0
ADRESH,F
STATUS,C
Bit_1
'0'
Visu_1
'1'
LCD_DATO
Temporal_1,F
Visual_loop
;-----------------------------------------------------------------------------------------------------------------------------Inicio
clrf
clrf
bsf
movlw
movwf
clrf
clrf
bcf
PORTA
PORTB
STATUS,RP0
b'00000110'
ADCON1
TRISB
TRISA
STATUS,RP0
call
call
movlw
call
UP_LCD
LCD_INI
b'00001100'
LCD_REG
;Selecciona banco 1
;Puerta A E/S digitales
;Puerta B se configura como salida
;RA5-RA0 salidas
;Selecciona banco 0
;Configura E/S para el LCD
;Secuencia de inicio del LCD
;LCD On, cursor y blink Off
84
2 DPE
ADC_Wait
bsf
movlw
movwf
clrf
bcf
bcf
nop
bsf
STATUS,RP0
b'00111111'
TRISA
ADCON1
STATUS,RP0
PIR1,ADIF
;Selecciona pgina 1
;Puerta A entradas
;Puerta A entradas analgicas
;Selecciona pgina 0
;Restaura el flag del conversor AD
ADCON0,GO
;Inicia la conversin
btfss
goto
PIR1,ADIF
ADC_Wait
;Fin de conversin ??
;Todava no
STATUS,RP0
b'11000111'
ADCON1
STATUS,RP0
UP_LCD
Visualiza
Loop
;Selecciona banco 1
;Puerta A digital
;Selecciona banco 0
;Reconfigura E/S para el LCD
;Visualiza el resultado de la conversin
end
85