Documente Academic
Documente Profesional
Documente Cultură
Arquitectura Harvard
Tecnologa RISC
Tecnologa CMOS
instrucciones
33 instrucciones de12 bits
35 instrucciones de 14 bits
58 instrucciones de 16 bits
nomenclatura
PIC12XXX y PIC14XXX
PIC16XXX
PIC17XXX y PIC18XXX
Variantes principales
Los microcontroladores que produce Microchip cubren una amplio rango de
dispositivos cuyas caractersticas pueden variar como sigue:
-
Empaquetados
Aunque cada empaquetado tiene variantes, especialmente en lo relativo a las
dimensiones del espesor del paquete, en general se pueden encontrar paquetes
tipo PDIP (Plastic Dual In Line Package), PLCC (Plastic Leaded Chip Carrier),
PDIP
SOIC
DIL package
PLCC package
QFP package
PGA package
Nomenclatura
Adems de lo mostrado en la tabla anterior, en el nombre especfico del
microcontrolador pueden aparecer algunas siglas que dependen del rango de
voltaje manejado y del tipo de memoria ROM incluida, como se muestra en la
siguiente tabla:
Tipo de memoria
EPROM, OTP
ROM
Flash
Rango de voltaje
Estndar (4.5 a 6 volts)
Extendido (2.5 a 6 volts)
PIC16CXXX
PIC16LCXXX
PIC16CRXXX
PIC16LCRXXX
PIC16FXXX
PIC16LFXXX
12
11
10
_________
CP1 CP0 DEBUG - WRT CPD LVP BODEN CP1 CP0 PWRTE WDTE FOSC1 FOSC0
FOSC0
0
1
0
1
LP
XT
HS
RC
Obs: Algunos PICs poseen un modo de oscilacin que les permite usar una
resistencia y un capacitor interno calibrados para 4 Mhz.
Los tres modos LP, XT y HS usan un cristal o resonador externo, la diferencia sin
embargo es la ganancia de los drivers internos, lo cual se ve reflejado en el rango
de frecuencia admitido y la potencia consumida. En la siguiente tabla se muestran
los rangos de frecuencia as como los capacitores recomendados para un
oscilador en base a cristal.
Modo
Frecuencia tpica
LP
32 khz
200 khz
100 khz
2 Mhz
4 Mhz
8 Mhz
10 Mhz
20 Mhz
XT
HS
Capacitores recomendados
C1
C2
68 a 100 pf
15 a 30 pf
68 a 150 pf
15 a 30 pf
15 a 30 pf
15 a 30 pf
15 a 30 pf
15 a 30 pf
68 a 100 pf
15 a 30 pf
150 a 200 pf
15 a 30 pf
15 a 30 pf
15 a 30 pf
15 a 30 pf
15 a 30 pf
A la lgica interna
SLEEP
XTAL
Rf
C2
A la lgica interna
OSC2
Vdd
Rext
Fosc
OSC1
Reloj interno
Cext
Fosc/4
OSC2
Seal externa
OSC1
OSC2
Resistencia a tierra
para reducir ruido
Oscilador interno de 4Mhz.- En los PICs que poseen este modo de oscilacin,
(modo INTRC) el PIC usa un arreglo RC interno que genera una frecuencia de 4
Mhz con un rango de error calibrable de 1.5%. Para calibrar el error de
oscilacin se usan los bits CAL3, CAL2 , CAL1 Y CAL0 del registro OSCCAL.
Calibracin del oscilador interno.- El fabricante ha colocado un valor de
calibracin para estos bits en la ltima direccin de la memoria de programa. Este
dato ha sido guardado en la forma de una instruccin RETLW XX. Si no se quiere
perder este valor al borrar el PIC (en versiones EPROM con ventana) primero se
deber leer y copiar. Es una buena idea escribirlo en el empaquetado antes de
borrar la memoria).
2.2.- Caractersticas generales del PIC16F877
La siguiente es una lista de las caractersticas que comparte el PIC16F877 con los
dispositivos ms cercanos de su familia:
PIC16F873
PIC16F874
PIC16F876
PIC16F877
CPU:
- Tecnologa RISC
- Slo 35 instrucciones que aprender
- Todas las instrucciones se ejecutan en un ciclo de reloj, excepto los saltos que
requieren dos
- Frecuencia de operacin de 0 a 20 MHz (200 nseg de ciclo de instruccin)
- Opciones de seleccin del oscilador
Memoria:
- Hasta 8k x 14 bits de memoria Flash de programa
- Hasta 368 bytes de memoria de datos (RAM)
- Hasta 256 bytes de memoria de datos EEPROM
PIC16F873
PIC16F876
Timer0
Timer1
PIC16F874
PIC16F877
PortA,
B,C,D,E
Timer0
Timer1
Timer2
Timer2
PortA,B,C
Captura
Comparacin
PWM
1 Convertidor A/D AN0,...,AN4
SSP
Puertos Serie
USART/SCI
ICSP
Puerto Paralelo
PSP
Esclavo
2 mdulos CCP
Caractersticas
con lneas digitales programables individualmente
Captura
Comparacin
PWM
AN0,...,AN7
SSP
USART/SCI
ICSP
PSP
13
Memoria de
Programa en
FLASH
Program Counter
14
Bus de programa
Bus de datos
Archivo de
registros en
RAM
Stack de 3 niveles
(13 bits)
PORTA
Registro de
Instrucciones
Mux
Direc.
8 indirecto
Reg FSR
7
Direc. directo
PORTB
Reg STATUS
Decodificacin
de instrucciones
y control
Generacin de
tiempo
Timer de encendido
(PWRT)
Timer de aranque del
oscilador (OST)
Reset de encendido
(POR)
Timer del watchdog
3
Mux
PORTC
Timer0
ALU
Brown-out Reset
Programacin en
bajo voltaje
MCLR
VDD,VSS
Timer1
RB0/INT
RB1
RB2
RB3/PGM
RB4
RB5
RB6/PGC
RB7/PGD
RC0/T1OSO/T1CKI
RC1/T1OSI/CCP2
RC2/CCP1
RC3/SCK/SCL
RC4/SDI/SDA
RC5/SDO
RC6/TX/CK
RC7/RX/DT
Reg W
Depurador In-circuit
OSC1/CLKIN
OSC2/CLKOUT
RA0/AN0
RA1/AN1
RA2/AN2/VREFRA3/AN3/VREF+
RA4/T0CKI
RA5/AN4/SS
Memoria de
datos
EEPROM
Timer0
PORTD
Timer0
RD0/PSP0
RD1/PSP1
RD2/PSP2
RD3/PSP3
RD4/PSP4
RD5PSP5
RD6/PSP6
RD7/PSP7
RE0/AN5/RD
PORTE
Memoria de
datos
EEPROM
CCP1,2
RE1/AN6/WR
RE2/AN7/CS
Puerto Serie
Sncrono
USART
Q1
Q2
Tcy1
Q3
Q4
Q1
Q2
Tcy2
Q3
Q4
OSC1
OSC2 / Tosc
CLKOUT
PC
Lee instruccin PC
Ejecuta instruccin PC-1
PC+1
Lee instruccin PC+1
Ejecuta instruccin PC
Como puede verse, cada ciclo de instruccin (Tcy = 4Tosc) se compone a su vez de
cuatro ciclos del oscilador (Tosc= 1/Fosc)). Cada ciclo Q provee la sincronizacin
para los siguientes eventos:
Q1: Decodificacin de la instruccin
Q2: Lectura del dato (si lo hay)
Q3: Procesa el dato
Q4: Escribe el dato
Debido a esto cada ciclo de instruccin consume 4 ciclos de reloj, de manera que
si la frecuencia de oscilacin es Fosc, Tcy ser 4/Fosc.
Registros de la CPU.
Registro PC.- Registro de 13 bits que siempre apunta a la siguiente instruccin a
ejecutarse. En la siguiente seccin se dan mayores detalles en el manejo de este
registro.
R/W-0
R/W-0
R-1
R-1
R/W-x
R/W-x
R/W-x
____
PD
DC
Bit 0
IRP
RP1
RP0
____
Bit 7
TO
* Notacin:
R= Bit leble W= Bit Escribible U= No implementado (se lee como 0)
-n= Valor despus del Reset de encendido
Z.- Este bit se pone (=1) para indicar que el resultado de la ltima operacin fue
cero, de lo contrario se limpia (=0)
C.- Bit de acarreo/prstamo de la ltima operacin aritmtica (en el caso de
prstamo (resta), el bit se invierte antes de guardarse)
__________ _
DC.- Acarreo/ prestamo proveniente del cuarto bit menos significativo. Funciona
igual que el bit C, pero para operaciones de 4 bits.
Las restas se realizan sumando el complemento a dos del segundo operando, por
ejemplo, para los datos 4FH y 25H:
Suma:
4FH
+25H
Resultado: 74 H
Bits C,DC:
0100 1111
+ 0100 0101
0 0111 0100
C=0, DC=1
Resta:
4FH
-25H
2AH
0100 1111
- 0100 0101
0100 1111
+ 1101 1011
1 0010 1010
C=0, DC=0
10
Descripcin
Ciclos
Cdigo de Mquina
Suma f + W
W AND f
Limpia f
Limpia W
Complementa los bits de f
Decrementa f en 1
Decrementa f, escapa si 0
Incrementa f en 1
Incrementa f, escapa si 0
W OR f
Copia el contenido de f
Copia contenido de W en f
No operacin
Rota f a la izquierda
Rota f a la derecha
Resta f W
Intercambia nibbles de f
W EXOR f
1
1
1
1
1
1(2)
1
1(2)
1
1
1
1
1
1
1
1
1
Banderas
afectadas
C,DC,Z
Z
Z
Z
Z
Z
Z
Z
C
C
C,DC,Z
Pone bit b en f
Prueba bit b en f, escapa si 0
Prueba bit b en f, escapa si 1
1
1(2)
1(2)
Suma literal k + W W
k AND W W
Llamado a subrutina
Limpia timer del watchdog
Salto a la direccin k
k OR W W
Copia literal a W
Retorna de interrupcin
Retorna con literal k en W
Retorna de subrutina
Activa Modo standby
Resta k W W
k EXOR W W
1
2
1
2
1
1
2
2
2
1
1
1
C,DC,Z
Z
____
____
TO , PD
____
____
TO , PD
C,CD,Z
Z
d = 0 destino W
Notacin: d= destino del resultado
d = 1 destino registro
f =direccin del registro (memoria RAM), b= nmero de bit (0 a 7), k= dato de 8 bits
11
MOVLW 0x4F
ADDLW 0x25
MOVLW 0x25
SUBLW 0x4F
;carga el sustraendo en W
;Resta 4Fh-W y guarda el resultado en W
MOVLW 0xF4
;W=F4h, 0x20= ??, C=?, DC=?, Z=?
ADDLW 0x0B
;W=FFh, 0x20= ??, C=0, DC=0, Z=0
MOVWF 0X20
;W=FFh, 0x20=FFh, C=0, DC=0, Z=0
INCF 0x20,1
;W=FFh, 0X20=00h, C=0, DC=0, Z=1
INCF 0X20,0
;W=01h, 0x20=00h, C=0, DC=0, Z=0
COMF 0X20,1
;W=01h, 0x20=FFh, C=0, DC=0, Z=0
XORWF 0x20,1
;W=01h, 0x20=FEh, C=0, DC=0, Z=0
MOVF 0x20,0
;W=FEh, 0x20=FEh, C=0, DC=0, Z=0
;(El ensamblador permite escribir esta ltima como MOVFW 0x20)
DECF 0x20,1
;W=FEh, 0x20=FDh, C=0, DC=0, Z=0
ANDWF 0x20,1
;W=FEh, 0x20=FCh, C=0, DC=0, Z=0
RLF 0x20,1
;W=FEh, 0x20=F8h, C=1, DC=0, Z=0
SWAPF 0x20,1
;W=FEh, 0x20=8Fh, C=1, DC=0, Z=0
BCF 0x20,3
;W=FEh, 0x20=87h, C=1, DC=0, Z=0
BSF 0x20,5
;W=FEh, 0x20=A7h, C=1, DC=0, Z=0
Opcode
10
Opcode
7 6
b (bit #)
8 7
Opcode
k (Literal)
11 10
Opcode
k (Literal)
13
0000h
...
0004h
0005h
...
07FFh
Vector de Reset
...
Vector de interrupcin
Pgina 0
0800h
...
0FFFh
Pgina 1
1000h
...
17FFh
Pgina 2
1800h
...
1FFFh
Pgina 3
14
PCL
8
PC
El byte de orden bajo es llamado el registro PCL, mientras que el byte de orden
alto es llamado registro PCH. Este ltimo contiene los bits PC<12:8> y no se
puede leer o escribir directamente Todas las actualizaciones al registro PCH
deben ser hechas a travs del registro PCLATH.
En la siguiente figura se ilustran las cuatro situaciones y las maneras
correspondientes en que el PC puede ser actualizado.
15
16
RP1:RP0
00
01
10
11
0
1
Banco
0
1
2
3
Cada banco consta de 128 bytes (de 00h a 7Fh). En las posiciones ms bajas de
cada banco se encuentran los SFR, y arriba de stos se encuentran los GPR.
Toda la memoria de datos est implementada en Ram esttica.
Direccionamiento Directo
Para acceder una posicin de memoria mediante direccionamiento directo, la CPU
simplemente usa la direccin indicada en los 7 bits menos significativos del cdigo
de operacin y la seleccin de banco de los bits RP1:RP0 como se ilustra en la
siguiente figura.
17
BSF STATUS,5
BSF STATUS,6
BCF STATUS,5
El Archivo de Registros
Aunque el archivo de registros en RAM puede variar de un PIC a otro, la familia
del PIC16F87x coincide casi en su totalidad. En la siguiente figura se muestra a
18
registro
INDF(*)
TMR0
PCL
STATUS
FSR
PORTA
PORTB
PORTC
PORTD(1)
PORTE(1)
PCLATH
INTCON
PIR1
PIR2
TMR1L
TMR1H
T1CON
TMR2
T2CON
SSPBUF
SSPCON
CCPR1L
CCPR1H
CCP1CON
RCSTA
TXREG
RCREG
CCPR2L
CCPR2H
CCP2CON
ADRESH
ADCON0
Direccin
registro
Direccin
registro
Direccin
registro
80h
INDF(*)
100h
INDF(*)
180h
INDF(*)
81h OPTION_REG
101h
TMR0
181h OPTION_REG
82h
PCL
102h
PCL
182h
PCL
83h
STATUS
103h STATUS
183h
STATUS
84h
FSR
104h
FSR
184h
FSR
85h
TRISA
105h
185h
86h
TRISB
106h
PORTB
186h
TRISB
87h
TRISC
107h
187h
88h
TRISD(1)
108h
188h
89h
TRISE(1)
109h
189h
8Ah
PCLATH
10Ah PCLATH
18Ah
PCLATH
8Bh
INTCON
10Bh
INTCON
18Bh
INTCON
8Ch
PIE1
10Ch EEDATA
18Ch
EECON1
8Dh
PIE2
10Dh
EEADR
18Dh
EECON2
8Eh
PCON
10Eh EEDATH
18Eh RESERVADO(2)
8Fh
10Fh EEADRH
18Fh RESERVADO(2)
90h
110h
190h
91h
SSPCON2
111h
191h
92h
PR2
112h
192h
93h
SSPADD
113h
193h
94h
SSPSTAT
114h
194h
95h
115h
195h
Registros
96h
116h
196h
Registros de
de
97h
117h
197h
propsito
propsito
general (16
98h
TXSTA
118h
198h
general (16
bytes)
99h
SPBRG
119h
199h
bytes)
9Ah
11Ah
19Ah
9Bh
11Bh
19Bh
9Ch
11Ch
19Ch
9Dh
11Dh
19Dh
9Eh
ADRESL
11Eh
19Eh
9Fh
ADCON1
11Fh
19Fh
A0h
120h
1A0h
Registros
Registros de
Registros de
de
Registros de
propsito
propsito
propsito
propsito
General
General
General
General
(80 bytes)
(80 bytes)
(80 bytes)
(96 bytes)
EFh
16Fh
1EFh
Acceso a
Acceso a regs
Acceso a regs
F0h
170h regs 70h
1F0h
70h7Fh
70h7Fh
7Fh
7Fh
FFh
17Fh
1FFh
Banco 0
Banco 1
Banco 2
Banco 3
19
33..-- D
Deessccrriip
pcciin
nD
Deettaallllaad
daa d
deell PPIIC
C1166FF887777
3.1.- Los Puertos Paralelos de Entrada / Salida
Los integrados PIC16F874 y PIC16F877 poseen 5 puertos de entrada / salida
denominados PORTA, PORTB,...,PORTE, mientras que el PIC16F873 y PIC16F876.
Estos puertos son totalmente programables, es decir, sus lneas pueden ser
configuradas para trabajar como entradas o como salidas a seleccin del programador.
3.1.1.- El Puerto A (PORTA).
El puerto A posee 6 lneas bidireccionales. Los 3 registros asociados a este puerto son:
Registro PORTA (05H).- Registro de estado del Puerto A. Cada uno de los 6 bits
menos significativos (RA5,...,RA0) de este registro estn asociados a la lnea fsica
correspondiente del puerto. Al hacer una lectura este registro se lee el estado de todas
las patitas del puerto. Todas las escrituras al registro son operaciones del tipo leemodifica-escribe, es decir, toda escritura al puerto implica que el estado de las patitas
es ledo, luego es modificado y posteriormente se escribe al latch de datos del puerto.
POR, BOR
otros Reset
0
0
x
u
0
0
0
0
0
0
0
0
05h
RA5
RA4
RA3
RA2
RA1
RA0
Bit
85h
Bit
1
1
1
1
1
1
1
1
1
1
1
1
Patita RA4
PIC
RA2
RA3
RA4
RA5
PIC
Enciende
RA2
+V
RA3
RA4
RA5
V1
Circuito
V2
Lgico
V1
V2
Se suelta el botn
Se suelta el botn
Se presiona el botn
Se presiona el botn
Hardware necesario.- El hardware es igual al del ejemplo 2, pero usando slo el botn
conectado a RA0.
;(1)
;(1)
;(1 si no escapa, 2 si escapa)
;(2)
;(2)
Observacin. La mxima duracin que se puede lograr con esta rutina (Para N=0 el
ciclo se ejecuta 256 veces) es de 30.92 mseg (con la frecuencia del reloj de 100 Khz
supuesta). As, si la frecuencia del reloj es mayor, por ejemplo, en el modo de
oscilador interno se tienen 4 Mhz y Tcy=1seg esta rutina no podr proporcionar
nunca los 20 mseg y habr que realizar una pausa ms larga anidando dos ciclos.
Patitas RB0,...RB3
Patitas RB4,...,RB7
PIC
RB2
RB3
RB4
RB5
RB6
RB7
Observacin. Si se usa el mdulo ICD (In Circuit Debuger) para probar este
programa se debe tomar en cuenta que este mdulo usa las lneas RB3, RB6 y RB7
del puerto B para comunicacin y programacin del PIC.
10
RB7
RB6
PIC
RB5
RB4
RB3
RB2
RB1
En la figura tambin se ilustra una conexin tpica con tres lneas de salida del puerto B
que controlan las columnas y cuatro lneas de salida del mismo puerto que recogen la
informacin de los renglones.
12
PORTB,5
7
PORTB,4
*
0xFB
PORTB
PORTB,7
2
PORTB,6
5
PORTB,5
8
PORTB,4
0
0xFD
PORTB
PORTB,7
3
PORTB,6
6
PORTB,5
9
PORTB,4
#
0x00
;Es la tecla 7?
;retorna cdigo del 7
;Es la tecla *?
;Retorna cdigo del *
;desactiva todas las columnas
;y activa la columna 2,5,8,0
;Es la tecla 2?
;retorna cdigo del 2
;Es la tecla 5?
;retorna cdigo del 5
;Es la tecla 8?
;retorna cdigo del 8
;Es la tecla 0?
;Retorna cdigo del 0
;desactiva todas las columnas
;y activa la columna 3,6,9,#
;Es la tecla 3?
;retorna cdigo del 3
;Es la tecla 6?
;retorna cdigo del 6
;Es la tecla 9?
;retorna cdigo del 9
;Es la tecla #?
;Retorna cdigo del #
;falsa alarma, no hay tecla presionada
En la siguiente tabla se resumen las lneas del puerto C y las de los perifricos que
estn multiplexadas con ellas.
Nombre
Funcin multiplexada
RC0/T1OSO/T1CKI Salida oscilatoria del Timer1/reloj de entrada del Timer 1
RC1/T1OSI/CCP2 Entrada oscilatoria del Timer1/entrada de captura2 o salida de
comparacin2 o salida PWM2
RC2/CCP1
Entrada de captura1 o salida de comparacin1 o salida PWM1
RC3/SCK/SCL
Reloj para los modos de comunicacin serie sncrona SPI e I2C
RC4/SDI/SDA
Dato de entrada (en modo SPI)/ Dato de entrada-salida (modo I2C)
RC5/SDO
Dato de salida (en modo SPI)
RC6/TX/CK
Linea de transmisin asncrona de la USART/reloj sncrono
RC7/RX/DT
Linea de recepcin asncrona de la USART/dato sncrono
14
a b c d e f
g ctodo
comn
d
arreglo de
segmentos
siete
a b c d e f
g nodo
comn
Para este ejemplo se supone un display de nodo comn conectado al puerto C como
se muestra a continuacin
RC1
RC2
PIC
Vdd
RC0
RC3
RC4
RC5
RC6
Inc
RC7
a b c d e
Cdigo
0
1
0
0
1
0
0
0
0
0
0
1
1
1
0
0
1
1
0
0
1
1
0
0
0
0
1
1
0
0
01
4F
12
06
4C
24
3F
0F
00
04
0
0
0
0
0
1
1
0
0
0
0
0
1
0
0
0
1
0
0
0
0
1
0
0
1
0
1
1
0
0
0
1
0
1
1
1
1
1
0
1
Dato
A
b
C
d
E
F
Cdigo
0
1
0
1
0
0
0
1
1
0
1
1
0
0
1
0
1
1
1
0
0
0
0
1
0
0
0
0
0
0
0
0
0
1
0
0
0
0
1
0
0
0
08
60
31
42
30
38
15
16
Econmica.- Utiliza pocas lneas de transmisin inclusive puede usar slo una
lnea.
Confiable.- Los estndares actuales permiten transmitir datos con bits de paridad y
a niveles de voltaje o corriente que los hacen poco sensibles a ruido externo.
Adems por tratarse de informacin digital, los cambios en amplitud de la seales
(normalmente causados por ruido) afectan muy poco o nada a la informacin.
Verstil.- No est limitada a usar conductores elctricos como medio de
transmisin, pudiendo usarse tambin: fibra ptica, aire, vaco, etc. Adems el tipo
de energa utilizada puede ser diferente: luz visible, infrarroja, ultrasonido, pulsos
elctricos, radio frecuencia, microondas, etc.
17
Transmisor
1
0
0
1
0
1
1
1
Receptor
10010111
Transmisor
Receptor
18
RZ
NRZ
NRZI
19
PE
FSC
F M
M FM
M 2F M
M arca
D0
D1
D2
D3
D4
D5 D6
D7 (D8)
21
En esta tabla X=valor de 8 bits en el registro del divisor, SPBRG. El bit BRGH corresponde a TXSTA<2>.
24
Si se detecta un bit nivel bajo en la posicin del bit de stop se pone el indicador de error
de encuadre (frame error) FERR RCSTA<2>. Tanto este indicador como el noveno bit
RX9D de los datos estn en una cola de dos posiciones al igual que los datos recibidos,
de manera que al leer RCREG se actualizan FERR y RX9D con nuevos valores, por lo
cual stos bits debern ser ledos antes de leer RCREG para no perder su informacin.
De acuerdo a lo anterior, la inicializacin del mdulo de recepcin es como sigue:
1. Inicializar el baud rate escribiendo al registro SPBRG el divisor adecuado y
opcionalmente al bit BRGH .
2. Habilitar el puerto serie asncrono limpiando el bit SYNC y poniendo el bit SPEN.
3. Si se van a usar interrupciones, poner el bit RCIE (PIE<5>).
25
;* Este programa recibe datos a travs del puerto serie asncrono USART
;* La cadena de caracteres recibidos deber terminar con un carcter <CR>
;* Si la cadena recibida es "enciende" se encender un led conectado a RC0
;* si no, se apagar. Se supone un oscilador Fosc=14.7456 Mhz
;************************************************************************
Include "p16f877.inc"
apun EQU 0x20
dato EQU 0x21
org 0x0000
trans BSF STATUS,RP0
;banco 1
BCF TRISC,0
;pone RC0 como salida
BCF TXSTA,BRGH
;pone bit BRGH=0 (velocidad baja)
MOVLW 0x17
;valor para configurar 9600 Bauds
MOVWF SPBRG
;configura 9600 Bauds
BCF TXSTA,SYNC
;limpia bit SYNC (modo asncrono)
BCF STATUS,RP0
;regresa al banco 0
BSF RCSTA,SPEN
;pone bit SPEN=1 (habilita puerto serie)
BSF RCSTA,CREN
;Habilita recepcin
ciclo CLRF apun
;inicializa apuntador
26
CALL recibe
;recibe un caracter del puerto serie
MOVLW 0x0D
;carga caracter de fin de cadena
SUBWF dato,W
;compara
BTFSC STATUS,Z
;ya es fin de cadena?
GOTO longi
;si es, checa longitud de cadena recibida
CALL letrero
;si no es, obtiene un caracter a comparar
SUBWF dato,W
;son iguales?
BTFSS STATUS,Z
;
GOTO noes
;si no son iguales sale del ciclo
INCF apun,1
;si son iguales incrementa apuntador
GOTO sig
;repite para el siguiente caracter
longi MOVLW 0x08
;carga longitud de la palabra clave
SUBWF apun,W
;compara con nmero de caracteres iguales
BTFSC STATUS,Z
BSF PORTC,0
;si coincide Enciende Led
GOTO ciclo
;si no reinicia ciclo
noes CALL recibe
;recibe un caracter del puerto serie
MOVLW 0x0D
;carga caracter de fin de cadena
SUBWF dato,W
;compara
BTFSC STATUS,Z
;ya es fin de cadena?
GOTO apaga
;si es, apaga led
GOTO noes
;si no es, repite
apaga BCF PORTC,0
;apaga el Led
GOTO ciclo
;regresa a esperar nueva cadena
;**************************************************
;subrutina de recepcin de un dato del puerto serie
;**************************************************
recibe BTFSS PIR1,RCIF
;checa el buffer de recepcin
GOTO recibe
;si no hay dato listo espera
MOVF RCREG,W
;si hay dato, lo lee
MOVWF dato
;lo almacena en dato
RETURN
letrero:
MOVF apun,W
;carga apuntador en W
ADDWF PCL,1
;Salta W instrucciones adelante
DT "enciende"
end
27
28
Vin
GO
(Inicia conversin)
ADIF
(fin de conversin)
Convertidor
Analgico / Digital
DONE
(fin de conversin)
1 1 1
RE2/AN7
1 1 0
RE1/AN6
1 0 1
RE0/AN5
1 0 0
RA5/AN4
0 1 1
RA3/AN3/VREF+
0 1 0
RA2/AN2/VREF0 0 1
Vdd
0 0 0
RA1/AN1
RA0/AN0
Vref+
ADRESH:ADRESL
VrefVss
PCFG3:PCFG0
29
2 n 1
Vi n VREF
VREF+ VREF
Con la eleccin ms comn: VREF+ = VDD = 5v, VREF- = VSS= 0v, y como n=10,
obtenemos:
D=
1023
5 V in
= 204.6V in
De donde se ve que cuando Vin vara en todo su rango, desde 0 hasta 5v, el valor
obtenido D vara tambin en todo su rango, de 0 a 1023.
Si a la inversa, obtenemos un valor D y deseamos saber que voltaje representa, basta
con despejar:
5
V in = ( 1023
)D = (0.004887585533)D
TAD
Reloj del
Convertidor
bit9 bit8 bit7
Seleccin
de canal,
reloj,
encendido y
tiempo de
adquisicin
Inicia
conversin
Poner bit
GO=1
Termina conversin:
Actualiza ADRESH:ADRESL
Pone bit G O /D O N E =0
Pone bit ADIF =1
Conecta capacitor
bit1 bit0
2)
3)
4)
5)
6)
7)
1Fh
Bit
R/W-0
ADCS1 ADCS0
7
R/W-0
R/W-0
R/W-0
R/W-0
CHS2
CHS1
CHS0
U-0
R/W-0
GO/DONE
ADON
ADCS0
0
1
0
1
Frec. seleccionada
FOSC/2
FOSC/8
FOSC/32
FRC (oscilador RC interno)*
* El oscilador RC interno del convertidor tiene un TAD tpico de 4 seg, sin embargo,
puede variar entre 2 y 6 seg.. Este reloj es recomendable para operacin en modo
SLEEP, ya que este modo desconecta la frecuencia del reloj externo.
* Precaucin: El convertidor A/D no trabajar correctamente con un TAD menor que
TAD(mnimo) = 1.6seg. El usuario deber cuidar la eleccin del reloj adecuado para no violar
esta limitante.
bits 5-3
bit 0
U-0
R/W-0
U-0
R/W-0
R/W-0
9Fh
ADFM
PCFG3
PCFG2
Bit
U-0
R/W-0
PCFG1 PCFG0
1
Bits 3-0
VREF+ VREFVDD
RA3
VDD
RA3
VDD
VDD
VDD
RA3
VDD
RA3
RA3
RA3
RA3
VDD
RA3
VSS
VSS
VSS
VSS
VSS
VSS
VSS
RA2
VSS
VSS
RA2
RA2
RA2
VSS
RA2
Can(2)
/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
32
ADFM=1
ADFM=0
0000 00
7
0000 00
1
07
ASDRESH
ADRESL
07
ASDRESH
ADRESL
mnimo
2v
VDD-2.5v
VSS-0.3v
VSS-0.3v
-
ZAIN
Estndar
Extendido
tpico
220A
90A
mximo
VDD+0.3v
VDD+0.3v
VREF+-2v
VREF++0.3v
10 K
-
33
;Banco 1
;configura 8 canales analgicos, VREF+=VDD y VREF-=VSS
;Elije resultado con justificacin a la derecha
;configura como entrada el canal digital RA0
;Banco 0
;Selecciona el canal AN0, reloj de conversin Fosc/2
;y enciende el convertidor
;espera 30 seg a que pase el tiempo de adquisicin
;inicia conversin
;Espera a que termine la conversin
;Carga en W el Byte alto del resultado
;enva el byte por el puerto serie
;banco 1
;Carga en W el Byte bajo del resultado
;enva el byte por el puerto serie
;carga cdigo de retorno de lnea <CR>
;lo enva
;carga cdigo de avance de lnea <LF>
;lo enva
;repite
;***************************************************************
; Subrutina que enva el byte en W por el puerto serie, separado
; en los cdigos ASCII de sus dos nibbles hexadecimales
;***************************************************************
Envbyte:
MOVWF msnib
MOVWF lsnib
SWAPF msnib,1
MOVLW 0x0F
ANDWF msnib,1
ANDWF lsnib,1
MOVF msnib,W
CALL asc
CALL envia
MOVF lsnib,W
CALL asc
CALL envia
RETURN
asc
ADDWF PCL,1
;************************************************************
; Subrutina de pausa de aprox. 30 seg (con Fosc=14.7456 MHZ)
;************************************************************
pausa MOVLW 0x23
;Carga dato para 30 seg.
MOVWF cont
;inicializa contador con el dato
rep
DECFSZ cont,1
;Decrementa contador y escapa si cero
GOTO rep
;si no es cero, repite
esc
RETURN
;regresa de esta subrutina
;****************************************************************
;Subrutina para inicializar el puerto serie USART como transmisor
;a 9600 Bauds, considerando un cristal de reloj de 14.7456 MHZ
;****************************************************************
initrans:
BCF STATUS,RP1
BSF STATUS,RP0
;banco 1
BCF TXSTA,BRGH
;pone bit BRGH=0 (velocidad baja)
MOVLW 0x17
;valor para 9600 Bauds (Fosc=14.7456 Mhz)
MOVWF SPBRG
;configura 9600 Bauds
BCF TXSTA,SYNC
;limpia bit SYNC (modo asncrono)
BSF TXSTA,TXEN
;pone bit TXEN=1 (habilita transmisin)
34
;regresa al banco 0
;pone bit SPEN=1 (habilita puerto serie)
;***************************************************************
;Subrutina para enviar el byte guardado en W por el puerto serie
;***************************************************************
envia BSF STATUS,RP0
;banco 1
esp
BTFSS TXSTA,TRMT
;checa si el buffer de transmisin
GOTO esp
;si est ocupado espera
BCF STATUS,RP0
;regresa al banco 0
MOVWF TXREG
;enva dato guardado en W
RETURN
end
5K
AN0
PIC
Vss
35
TMR0
TMR1
TMR2
CCP1 y
CCP2
Caractersticas
Bus de datos
0
RA4/T0CKI
M
U
X
1
T0SE
1
0
T0CS
M
U
X
Preescalador
PSA
PS2,PS1,PS0
TMR0
PSA
T0IF
1
Timer del
Watchdog
M
U
X
M
U
X
Time out
del
watchdog
PSA
37
0
0
0
0
1
1
1
1
0
0
1
1
0
0
1
1
0
1
0
1
0
1
0
1
Divisor
(timer 0)
Divisor
(Watchdog)
1/2
1/4
1/8
1/16
1/32
1/64
1/128
1/256
1/1
1/2
1/4
1/8
1/16
1/32
1/64
1/128
Observacin: Cuando el preescalador est asignado al timer 0, cualquier escritura al registro TMR0
(cualquier BCF, BSF, MOVWF, CLRF, etc) limpiar el preescalador. En forma similar,
cuando est asignado al watchdog, una instruccin CLRWDT limpiar no solo el timer del
watchdog, sino tambin el preescalador.
81h,181h RB PU
Bit:
R/W-1
R/W-1
R/W-1
R/W-1
R/W-1
R/W-1
R/W-1
INTEDG
T0CS
T0SE
PSA
PS2
PS1
PS0
bit 3
bits 2:0
PS2:PS0.- Bits de seleccin del valor del preescaler (ver tabla anterior).
;***************************************************************
; Subrutina que enva el byte en W por el puerto serie, separado
; en los cdigos ASCII de sus dos nibbles hexadecimales
;***************************************************************
msnib EQU 0x22
lsnib EQU 0x23
Envbyte:
MOVWF msnib
MOVWF lsnib
SWAPF msnib,1
MOVLW 0x0F
ANDWF msnib,1
ANDWF lsnib,1
MOVF msnib,W
CALL asc
39
asc
CALL envia
MOVF lsnib,W
CALL asc
CALL envia
RETURN
ADDWF PCL,1
40
rep
Include "p16f877.inc"
org 0x0000
BSF STATUS,RP0
;Banco1
BCF TRISC,0
;patita RC0 como salida
BCF STATUS,RP0
;Banco 0
BSF PORTC,0
;enciende LED
CALL pausa
;pausa de 17.77 mseg
BCF PORTC,0
;apaga LED
CALL pausa
;pausa de 17.77 mseg
GOTO rep
Observacin: La rutina de pausa se puede modificar para una duracin de N ciclos en general,
simplemente definiendo como N1 lo que le falta a N para ser 256, es decir:
N1 = 256-N
42
U-0
10h
Bit:
R/W-0
R/W-0
R/W-0
R/W-0
R/W-0
R/W-0
TMR1CS TMR1ON
1
bit 1
bit 0
43
rep
Include "p16f877.inc"
org 0x0000
BSF STATUS,RP0
;Banco1
BCF TRISC,0
;patita RC0 como salida
BCF STATUS,RP0
;Banco 0
BSF PORTC,0
;enciende LED
CALL pausa
;pausa de 71.11 mseg
BCF PORTC,0
;apaga LED
CALL pausa
;pausa de 71.11 mseg
GOTO rep
Observacin 1: El programa es idntico al ejemplo 15, lo nico que cambia es la subrutina de pausa, la
cual ahora se ha realizado con el timer 1 y no con el Timer 0
Observacin 2: La rutina de pausa se puede adaptar para una duracin de N ciclos en general,
simplemente definiendo como N1:N0 lo que le falta a N para ser 65536, es decir:
N1:N0 = 65536-N
44
Fosc/4
Preescalador
1/1, 1/4, 1/16
T2CKPS1:T2CKPS0
Postescalador
1:1 a 1/16
Registro TMR2
Comparador
Activa
TMR2IF
T2OUPS3:T2OUPS0
Registro PR2
3.4.4.1.- El preescalador
La frecuencia que incrementa al registro TMR2 puede ser dividida por un preescalador
por un factor de 1/1, 1/4 o 1/16, seleccionable por los bits T2CKPS1:T2CKPS0
(T2CON<1:0>)
3.4.4.2.- El Registro de comparacin o de Periodo
En operacin, el contenido del registro TMR2 se compara continuamente con un
registro de periodo denominado PR2 (92h) cuyo valor podemos establecer por software.
Cada vez que la cuenta de TMR2 es igual a PR2, se reinicia el conteo en TMR2 desde
cero, y adems se genera una seal de salida, la cual es tratada por un postescalador,
para poder generar una seal TMR2IF (PIR1<1>) que puede ser usada para solicitar
una interrupcin, o para ser leda por poleo.
3.4.4.3.- El Postescalador
El postescalador divide la frecuencia con que ocurre una activacin de la bandera
TMR2IF, es decir, si el valor del postescalador es 1/1, esta bandera se activar cada
vez que TMR2 se reinicie, en cambio, si es 1/16 (por ejemplo), TMR2IF se activar cada
16 reinicios de TMR2. En forma similar a los otros dos Timers, esta bandera debe ser
limpiada previamente, si se quiere detectar su activacin, esto puede ser hecho en la
rutina de atencin a la interrupcin, o bien en la rutina que la detecta por poleo.
El valor de divisin del postescalador puede establecerse por software mediante los bits
T2OUPS3:T2OUPS0 (T2CON<6:3>).
45
12h
Bit:
R/W-0
R/W-0
R/W-0
R/W-0
R/W-0
R/W-0
R/W-0
1 1 1 1 = divisor 1/116
Observacin: La cuenta interna del postescalador y el preescalador es limpiada cuando
ocurre cualquiera de los siguientes eventos: Una escritura a alguno de los registros TMR2
o T2CON o bien, un Reset del sistema de cualquier tipo (POR, MCLR, WDT, o BOR).
bit 2
bits 1:0
Cada modo de operacin requiere como recurso uno de los timers del PIC. En la
siguiente tabla se muestran los timers usados por cada modo:
Modo de operacin Recurso
del CCP
utilizado
Captura
Timer 1
Comparacin
Timer 1
PWM
Timer 2
A continuacin se da un breve resumen de los registros relacionados con cada mdulo:
El Mdulo CCP1.
El registro principal de este mdulo (CCPR1) se compone de dos registros de 8 bits,
denominados CCPR1H (16h) (parte ms significativa) y CCPR1L (15h) (parte menos
significativa). La operacin del mdulo se controla mediante el registro CCP1CON y el
disparo de evento especial, el cual es generado al alcanzarse la igualdad en un registro
de comparacin resetear el Timer 1.
El Mdulo CCP2.
El registro principal de este mdulo (CCPR2) se compone de dos registros de 8 bits,
denominados CCPR2H (parte ms significativa) y CCPR2L (parte menos significativa).
La operacin del mdulo se controla mediante el registro CCP2CON y el disparo de
evento especial, el cual es generado al alcanzarse la igualdad en un registro de
comparacin resetear el Timer 1 e iniciar una conversin analgico/digital (si el
mdulo convertidor A/D est habilitado).
Seleccin del modo de operacin
47
0000
0100
0101
0110
0111
1000
1001
1010
1011
11xx
Modo seleccionado
Captura/Comparacin/PWM deshabilitados
Captura cada transicin de bajada
Captura cada transicin de subida
Captura cada cuarta transicin de subida
Captura cada 16 transiciones de subida
Comparacin, pone salida cada coinidencia
Comparacin, limpia salida cada coincidencia
Comparacin, genera interrupcin cada coincidencia (salida inalterada)
Comparacin, dispara evento espacial (CCP1 resetea TMR1; CCP2
resetea TMR1 y arranca una conversin A/D).
Modo PWM
Periodo
RC2/CCP1
Ciclo de Trabajo
(C.T.)
TMR2=PR2
TMR2=PR2
TMR2=C.T.
Debido a que la patita CCP1 est multiplexada con RC2, este bit del puerto C deber
ser configurado como salida (TRISC<2>=0) para poder usar la salida CCP1.
En la siguiente figura se muestra un diagrama de bloques simplificado que resume la
operacin bsica del PWM.
48
CCPR1L
Registros de
C.T. (Ciclo
de Trabajo)
CCPR1H
RC2/CCP1
Comparador
TMR2
(Nota 1)
TRISC<2>
Comparador
PR2
Limpia TMR2 y
pone patita
CCP1=1
(Nota 1): los 8 bits del registro TMR2 son concatenados con 2 bits del preescalador
para crear una base de tiempo de 10 bits
49
Adems, si se elige TPWM mayor que el periodo del PWM (PeriodoPWM) la patita
CCP1 no ser limpiada (y por lo tanto no funcionar el PWM).
Ejemplo: As, por ejemplo, suponiendo un cristal de 20 Mhz, si deseamos usar la
mxima resolucin r = 10 bits, el ciclo de trabajo mximo posible ser (para M=1):
TPWM = 1024*0.05x10-6 = 0.0128 mseg
O bien, la Frecuencia del PWM definida como FPWM = 1/ PeriodoPWM, tendr un valor
de:
FPWM = 1/0.0128x10-3 = 19.53125 Khz
O de lo contrario la patita CCP1 no podr ser limpiada. Para tener este valor de FPWM se
requiere un valor en PR2 que como ya se dijo, est dado por
PeriodoPWM = (PR2+1)*4*TOSC*M
Despejando:
50
1.22 Khz
16
FFh
10
4.88 Khz 19.53 Khz 78.12 Khz 156.3 Khz 208.3 Khz
4
1
1
1
1
FFh
FFh
3Fh
1Fh
17h
10
10
8
7
5.5
+V
Aumenta
RB0
PIC
Vdd
Disminuye
RB1
RC2/CC
P1
51
52
BTFSC PORTB,0
;Checa Botn RB0
CALL incre
;si est presionado incrementa CT
Esp1 BTFSC PORTB,1
;si no se ha presionado Checa botn RB1
CALL decre
;si est presionado Decrementa CT
MOVF CTL,W
;si no se ha presionado obtiene copia de CT parte baja
MOVWF CCPR1L
;actualiza parte baja del CT real
;**** a continuacin actualiza la parte alta del CT real
MOVLW 0xCF
;mscara
ANDWF CCP1CON,1
;limpia los dos msbits del CT real
MOVLW 0x03
;mscara
ANDWF CTH,1
;limpia los 6 bits altos en CTH
SWAPF CTH,W
;copia los 2 bits bajos de CTH en el nibble alto de W
IORWF CCP1CON,1 ;pone bits que deben ser 1 en los dos msb del CT real
;**** con esto queda actualizada la parte alta del CT real
CALL pau
;pausa para moderar la velocidad de incremento/decremento
GOTO Esp0
;repite
;************************************************************************************
incre INCF CTL,1
;incrementa parte baja de la copia de CT
BTFSS STATUS,Z
;checa si se recicl a cero
RETURN
;si no, retorna
INCF CTH,1
;si se hizo cero incrementa parte alta de CT
RETURN
decre DECF CTL,1
;decrementa parte baja de la copia de CT
COMF CTL,W
;copia negado de CTL a W (para ver si CTL=0xFF)
BTFSS STATUS,Z
;checa si W es cero
RETURN
;si no, retorna
DECF CTH,1
;si s, Decrementa parte alta de CT
RETURN
;** pausa de 50 miliseg. aproximadamente
pau
CLRF cont1
CLRF cont
p1
DECFSZ cont,1
GOTO p1
DECFSZ cont1,1
GOTO p1
RETURN
end
La accin que ocurra en esta patita se configura mediante los bits de control
CCP1M3:CCP1M0 (CCP1CON<3:0>). En la figura siguiente se muestra un diagrama
de bloques en donde se ilustra la manera en que trabaja el mdulo CCP en modo
comparador
53
CCPR1L
Dispara evento
especial
RC2/CCP1
Lgica
de
salida
Comparador
TMR1H
TMR1L
CCP1CON<3:0>
TRISC<2>
Pone CCP1IF=1
Include "p16f877.inc"
org 0x0000
BSF STATUS,RP0
;Banco1
BSF TRISB,0
;Configura RB0 como entrada
BSF TRISB,1
;Configura RB1 como entrada
BCF TRISC,2
;patita RC2/CCP1 como salida
BCF STATUS,RP0
;Banco 0
MOVLW 0x01
MOVWF T1CON
;Configura Timer1 modo temporizador, preesc 1/1
CLRF TMR1H
;Inicializa en cero el timer 1
CLRF TMR1L
CLRF CCPR1H
;inicializa periodo de comparacin
54
55
CCPR1L
RC2/CCP1
Preescalador
1/1, 1/4,1/16
TMR1H
Detector de
transicin
TMR1L
CCP1CON<3:0>
TRISC<2>
Pone CCP1IF=1
;***************************************************************
; Subrutina que enva el byte en W por el puerto serie, separado
; en los cdigos ASCII de sus dos nibbles hexadecimales
;***************************************************************
Envbyte:
MOVWF msnib
MOVWF lsnib
SWAPF msnib,1
MOVLW 0x0F
ANDWF msnib,1
ANDWF lsnib,1
MOVF msnib,W
CALL asc
CALL envia
MOVF lsnib,W
CALL asc
CALL envia
RETURN
asc
ADDWF PCL,1
57
En el ejemplo anterior, el valor del dato (N) de 16 bits desplegado se puede convertir a
segundos (T) de acuerdo a la relacin
T = 4*N/Fosc = (2.712673611*10-7) N seg.
O bien, como frecuencia: F= 1/T= 3,686,400 / N Hertz.
Observacin. El programa debera leer sin problemas periodos entre Tmx= 17.777
mseg (Fmin = 56.25 hertz) y un Tmin=0.271seg (Fmx =3.6864 Mhz), sin embargo
debido al retardo de la rutina de transmisin del dato, (en la realidad el programa no
puede detectar ninguna transicin de subida durante la transmisin del dato) el
programa slo puede procesar correctamente la transicin hasta una frecuencia Fmx
=160Hz (Tmin = 6.25 mseg)
Despierta si est
en modo SLEEP
T0IF
T0IE
INTF
INTE
RBIF
RBIE
SSPIF
SSPIE
CCP1IF
CCP1IE
TMR2IF
TMR2IE
PEIE
(INTCON<6>)
GIE
(INTCON<7>)
TMR1IF
TMR1IE
CCP2IF
CCP2IE
BCLIF
BCLIE
59
Interrupcin
60
61
62