You are on page 1of 85

PIC 16F87X TRABAJO EXPLICACIN

Sebastin Martn Garca 2 DPE

TRABAJO Y EXPLICACIN PIC 16F87X

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

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

RECURSOS ESPECIALES __________________________________________________ 27 PALABRA DE CONFIGURACIN __________________________________________ 28 PALABRA DE IDENTIFICACIN __________________________________________ 29 REINICIALIZACIN O RESET ____________________________________________ 29 PERRO GUARDIAN (WDT: WATCHDOG TIMER) ___________________________ 30 MODO DE REPOSO O BAJO CONSUMO ____________________________________ 30 PROGRAMACIN DE LOS PIC 16F87X _____________________________________ 31 TEMPORIZADORES _______________________________________________________ 32 TIPOS Y CARACTERSTICAS GENERALES_________________________________ 33 ESTRUCTURA INTERNA Y FUNCIONAMIENTO DEL TMR1__________________ 34 REGISTRO DE CONTROL DEL TMR1 (T1CON)______________________________ 35 FUNCIONAMIENTO Y PROGRAMACION DEL TMR2 ________________________ 36 CAPTURA, COMPARACIN Y MODULACIN DE ANCHURA DE PULSOS______ 37 INTRODUCCIN A LOS MDULOS CCP ___________________________________ 38 MODO CAPTURA ________________________________________________________ 39 MODO COMPARACIN __________________________________________________ 40 MODO DE MODULACIN DE ANCHURA DE PULSOS (PWM)_________________ 41 EL CONVERSOR A/D ______________________________________________________ 42 PRESENTACIN DEL CONVERSOR ANALGICO / DIGITAL ________________ 43 REGISTROS DE TRABAJO ________________________________________________ 43 ESTRUCTURA INTERNA Y CONFIGURACIN DEL C A/D____________________ 45 PASOS A SEGUIR PARA REALIZAR UNA CONVERSIN CON EL MDULO C A/D__________ 46 MDULO DE COMUNICACIONES SERIE SNCRONA MSSP___________________ 47 INTRODUCCIN _________________________________________________________ 48 MODO SPI _______________________________________________________________ 49 MODO I2C _______________________________________________________________ 50 CONCEPTO DEL BUS I2C ___________________________________________________ 50 DIRECCIONAMIENTO DEL BUS I2C ___________________________________________ 51 BITS DE CONTROL DEL BUS I2C _____________________________________________ 51 USART (SCI) ______________________________________________________________ 54 COMUNICACIN SERIE ASNCRONA _____________________________________ 55 MODOS DE TRABAJO DEL USART ___________________________________________ 55 PROGRAMAS (ASM) _______________________________________________________ 56

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

DIFERENCIAS ENTRE PIC16F84 Y 16F87X

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

TRABAJO Y EXPLICACIN PIC 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

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

SENSORES ANALOGICOS MAS UTILIZADOS

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

Sensores Analgicos ms utilizados


Aunque el PIC 16F84 sirve para un sinfn de aplicaciones, hay varias para las que este microcontrolador no sirve. Un de ellas es la que vamos a tratar en este apartado, se trata de aplicaciones en las que sea necesario un conversor A/D para su tratamiento. Vamos a tratar un par de sensores analgicos, una LDR y un sensor de temperatura NTC. Sensor de Luminosidad LDR Un sensor de luminosidad LDR es un elemento cuya resistencia entre bornes vara en funcin de luz que incide sobre su superficie. Cuando no hay luz tiene una resistencia infinita y segn va aumentando la luz, va disminuyendo hasta 0. Es un elemento sin polaridad y se puede encontrar con diferentes dimetros segn el rango de valores de luminosidad que sea capaz de diferenciar. Sensor de Temperatura LM35 Otro sensor analgico ampliamente utilizado es el de temperatura. Existen muchos modelos de sensores de temperatura y su eleccin depende de varios parmetros, rango de temperaturas, precisin, el coste, resistencia, etc.,... Uno de los sensores ms utilizados es el LM35 tambin llamado estndar. Sus caractersticas son: 1. Su tensin de salida Vout es proporcional a la temperatura en una proporcin de 10mV/C 2. Su rango de funcionamiento esta comprendido entre 0 y 100 C. 3. Su tensin de funcionamiento Vs est entre +4 VDC y +30 VDC. 4. Su precisin es de 0.9 C.

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

ORGANIZACIN DE LA MEMORIA

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

TRABAJO Y EXPLICACIN PIC 16F87X

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

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

INSTRUCCIONES

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

10

TRABAJO Y EXPLICACIN PIC 16F87X

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.

INSTRUCCIONES QUE MANEJAN REGISTROS ADDWF ANDWF CLRF CLRW COMF DECF DECFSZ INCF INCFSZ IORWF MOVF MOVWF NOP RLF RRF SUBWF SWAPF XORWF 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

INSTRUCCIONES DE CONTROL Y DE OPERANDOS INMEDIATOS ADDLW ANDLW CALL CLRWDT GOTO IORLW MOVLW RETFIE RETLW RETURN SLEEP SUBLW XORLW 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

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

11

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

REGISTROS ESPECFICOS

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

12

TRABAJO Y EXPLICACIN PIC 16F87X

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 RP1 RP0 TO# PD# Z DC C

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

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

REGISTRO DE OPCIONES (OPTION) Tiene las mismas funciones que tena en el PIC 16F84: 1: Asigna el divisor de frecuencias al TIMER0 o al perro guardin. 2: Elige el rango en el que trabaja el divisor de frecuencia. 3: Selecciona el tipo de reloj del TIMER0, que puede ser interno o externo a travs de la pastilla TOCKI. Tambin selecciona el flanco activo. 4: Selecciona el flanco activo para la interrupcin externa por RB0/INT 5: Activa o desactiva las resistencias de pull-up de la Puerta B El registro OPTION toma el valor b11111111 (FF) en cualquier tipo de reinicializacin que se produzca. RBPU# PS2 0 0 0 0 1 1 1 1 INTEDG PS0 0 1 0 1 0 1 0 1 TOCS TOSE PSA PS2 PS1 PS0 Divisin del WDT 1:1 1:2 1:4 1:8 1:16 1:32 1:64 1:128

PS1 0 0 1 1 0 0 1 1

Divisin del TMR0 1:2 1:4 1:8 1:16 1:32 1:64 1:128 1:256

PSA:

Asignacin de divisor de frecuencias. 1 = El divisor de frecuencias se le asigna al WDT. 0 = El divisor de frecuencias se le asigna al TIMER0. Tipo de flanco en TOCKI. 1 = Incremento del TIMER0 cada flanco descendente. 0 = Incremento del TIMER0 cada flanco ascendente. Tipo de reloj para el TIMER0 1 = Pulsos introducidos a travs del TOCKI (contador) 0 = Pulsos de reloj internos FOSC/4 (Temporizador)

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

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

REGISTRO PARA CONTROLAR LAS INTERRUPCIONES Los PIC 16F87X tienen muchas causas que pueden originar una interrupcin, 13 posibles causas los de 28 patas y 14 los de 40. Al aceptarse una interrupcin se salva el valor del PC en la Pila y se carga aquel con el valor 0004h, que es el vector de interrupciones. El PIC 16F84 tena 4 causas que generaban interrupcin: desbordamiento del TMR0, activacin de la pata de interrupcin RB0/INT, cambio de estado de una de las cuatro patas de ms peso de la Puerta B y finalizacin de la escritura de un byte en la EEPROM. Los nuevos PIC, adems de las causas que producen interrupcin en el 16F84, tienen las siguientes: 1 Desbordamiento del Timer 1 2 Desbordamiento del Timer 2 3 Captura o comparacin del mdulo CCP1. 4 Captura o comparacin del mdulo CCP2. 5 Transferencia en la Puerta serie sncrona. 6 Colisin de bus en la Puerta serie sncrona. 7 Fin de transmisin en el USART. 8 Fin de recepcin en el USART. 9 Fin de la conversin en el conversor A/D 10 Transferencia en la puerta paralela esclava (solo en los de 40 patas)

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

15

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

1. REGISTRO DE CONTROL DE INTERRUPCIONES (INTCON) Se trata de un registro leble y escribible, para facilitar su acceso se ha duplicado en los cuatro bancos. Tiene la misin de controlar las interrupciones provocadas por TMR0, cambio de estado en las cuatro lneas de ms peso de la Puerta B y activacin en la patilla RB0/INT. Es muy parecido al registro que con el mismo nombre exist en el 16F84, solo cambia el bit 6 en los nuevos PIC que es el PIE (permiso de interrupcin de lo perifricos) en lugar del EEIE que tena de 16F84 para permitir la interrupcin cuando finalice la escritura de un byte en la EEPROM. El bit PEIE acta como una segunda llave parcial de permiso o prohibicin de las causas de interrupcin que no est complementadas en INTCON y que las provocan los restantes perifricos del microcontrolador. GIE es el bit de permiso global de todas las interrupciones. GIE PEIE TOIE INT RBIE TOIF INTF RBIF GIE: Bit de permiso global de interrupciones. 1 = Permitido 0 = Prohibido Bit de permiso de los perifricos que no se controlan con INTCON Bit de permiso de interrupcin del TMR0. Bit de permiso de la interrupcin externa por RB0/INT Bit de permiso de la interrupcin por cambio en RB4-RB7 Sealizador de desbordamiento en TMR0. Sealizador de activacin de la patilla RB0/INT Sealizador de cambio en RB4-RB7

PEIE: TOIE: INTE: RBIE: TOIFF: INTF: RBIF:

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

16

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

2. REGISTRO DE PERMISO DE INTERRUPCIONES 1 (PIE1) Contiene los bits que permiten o prohiben las interrupciones provocadas por los perifricos internos del microcontrolador y que no estaban contempladas en INTCON. Ocupa la direccin 8Ch y para que cumplan su funcin, los bits de PIE1, es necesario que el PIE sea igual a 1 en INTCON, 6. El bit PSPIE solo es vlido solo es vlido en los modelos de 40 patas, mantenindose a 0 en los de 28 patas. PSPIE ADIE RCIE TXIE SPIE CCP1IE TMR2IE TMR1IE

PSPIE: Permiso de interrupcin para la puerta paralela esclava al realizar una operacin de lectura/escritura. En modelos de 40 patas. ADIE: RCIE: TXIE: SSPIE: CCP1IE: Permiso de interrupcin para el conversor A/D al finalizar la conversin. Permiso de la interrupcin para el receptor de USART cuando el buffer se llena. Permiso de la interrupcin para el transmisor de USART cuando el buffer se vaca. Permiso de interrupcin para la puerta serie sncrona. Permiso de interrupcin para el mdulo CCP1 cuando se produce una captura o comparacin.

TMR2IE: Permiso de interrupcin para el TMR2 con su desbordamiento. TMR1IE: permiso de interrupcin para el TMR1 con su desbordamiento.

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

17

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

3. REGISTRO DE PERMISO DE INTERRUPCIONES 2 (PIE2) Contiene los bits de permiso de interrupcin de las tres causas que no figuraban en el PIE1. La de fin de escritura de la EEPROM, colisin de bus en el modo de SSP y produccin de una captura o comparacin en el mdulo CCP2. El bit 6 es un bit reservado y su valor es siempre 0. Cuando se leen los bit que no tienen asignada funcin, se obtiene 0. EEIE: BCLIE: 0 EEIE BCLIE CCP2IE

Permiso de interrupcin por fin de escritura en la EEPROM de datos. Permiso de interrupcin por colisin de bus en el SSP cuando dos o ms maestros tratan de transferir al mismo tiempo. Permiso de interrupcin el mdulo CCP2.

CCP2IE:

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

18

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

REGISTRO DE LOS SEALIZADORES DE INTERRUPCION 1 Y 2 (PIR1 y PIR2) En correspondencia con los bits de permiso/prohibicin de las causas de interrupcin recogidas en el registro PIE1 y PIE2, existen otros dos registros, el PIR1 y PIR2, cuyos bits actan de sealizadores del momento en el que se origina la causa que provoca la interrupcin, independientemente de si est permitida o prohibida. Ocupan las direcciones 0Ch y 0Dh. REGISTRO PIR1 PSPIF ADIF RCIF TXIF SSPIF CCPIF TMR2IF TMR1IF

REGISTRO PIR2 0 EEIF BCLIF CCP2IF

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

19

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

DISTRIBUCION MEMORIA RAM

INDF TMR0 PCL STATUS FSR PORTA PORTB PORTC PORTD PORTE PCLATH INTCON PIR1 PIR2 TMR1L TMR1H T1CON TMR2 T2CON SSPBUF SSPCON CCPR1L CCPR1H CCP1CON RCSTA TXREG RCREG CCPR2L CCPR2H CCP2CON ADRESH ADCON0

00h 01h 02h 03h 04h 05h 06h 07h 08h 09h 0Ah 0Bh 0Ch 0Dh 0Eh 0Fh 10h 11h 12h 13h 14h 15h 16h 17h 18h 19h 1Ah 1Bh 1Ch 1Dh 1Eh 1Fh 20h

INDF OPTION_REG PCL STATUS FSR TRISA TRISB TRISC TRISD TRISE PCLATH INTCON PIE1 PIE2 PCON

80h 81h 82h 83h 84h 85h 86h 87h 88h 89h 8Ah 8Bh 8Ch 8Dh 8Eh 8Fh 90h 91h 92h 93h 94h 95h 96h 97h 98h 99h 9Ah 9Bh 9Ch 9Dh 9Eh 9Fh A0h

INDF TMR0 PCL STATUS FSR PORTB

PCLATH INTCON EEDATA EEADR EEDATH EEADRH

100h 101h 102h 103h 104h 105h 106h 107h 108h 109h 10Ah 10Bh 10Ch 10Dh 10Eh 10Fh 110h 111h 112h 113h 114h 115h 116h 117h 118h 119h 11Ah 11Bh 11Ch 11Dh 11Eh 11Fh 120h

INDF OPTION_REG PCL STATUS FSR TRISB

PCLATH INTCON EECON1 EECON2 Reservado Reservado

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 19Fh 1A0h

SSPCON2 PR2 SSPADD SSPSTAT

TXSTA SPBRG

Propsito General 16 Bytes

Propsito General 16 Bytes

ADRESL ADCON1

Registros Propsito General 96 Bytes

Registros Propsito General 80 Bytes accesses 70h-7Fh 7Fh

EFh F0h FFh

Registros Propsito General 80 Bytes accesses 70h-7Fh Banco 2

16Fh 170h 17Fh

Registros Propsito General 80 Bytes accesses 70h - 7Fh Banco 3

1EFh 1F0h 1FFh

Banco 0

Banco 1

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

20

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

LECTURA Y ESCRITURA EEPROM Y FLASH

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

21

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

LECTURA Y ESCRITURA DE LAS MEMORIAS EEPROM Y FLASH En el PIC 16F84 se poda leer y escribir la memoria de datos EEPROM. En los PIC 16F87X tambin se puede leer y escribir la memoria de cdigo FLASH. Esto significa que un programa dinmicamente puede generar informacin que se puede grabar en la FLASH directamente sin necesidad de grabador externo. Para manejar la memoria EEPROM de 64 bytes del PIC 16F84, bastaban 2 registros, para proporcionar la direccin de la memoria a consultar y para grabar el dato de 8 bits, sin embargo, en los PIC 16F87X, no basta con un solo registro para proporcionar la direccin de memoria, ya que esta alcanza los 13 bits, y lo mismo sucede con el dato, que a su vez alcanza los 14bits. Para cubrir esta necesidad el registro EEADR se concatena con el EEADRH, que contiene los 5 bits de ms peso de la direccin. Por otra parte, el registro EEDATAH se concatena con EEDATA y tiene los 6 bits de ms peso de la palabra leda o a escribir en la FLASH. Para controlar la operacin lectura/escritura de las memorias EEPROM y FLASH hay dos registros denominados EECON1 Y EECON2. El EECON2, no esta implementado fsicamente y slo se utiliza en la delicada operacin de escritura, que tiene la elevada duracin de 2 milisegundos. Antes de iniciar la escritura de una palabra se escribe en EECON2 primero el dato 55h y luego el Aah. Para evitar escrituras indeseadas en la EEPROM, se controla el bit WREN, prohibiendo cualquier operacin de escritura mientras duran los 72 milisegundos que temporiza el Timer de Power-Up. Para realizar la misma proteccin en la memoria FLASH, se debe poner a 0 el bit WRT de la Palabra de Configuracin, que solo puede escribirse desde un grabador externo. Dependiendo del valor y los bits de proteccin de cdigo CP1 y CP0, ubicados en la palabra de configuracin, se consiguen varias alternativas de proteccin contra lectura y escritura de la FLASH. A continuacin:
CONFIGURACION DE BIT

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.

LECTURA ESCRIT. LECTURA ESCRIT. INTERNA INTERNA ICSP ICSP S S S S S S S S S S S 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

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

22

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

PUERTAS E/S

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

23

TRABAJO Y EXPLICACIN PIC 16F87X

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 05h 85h 9Fh

NOMBRE PORTA TRISA ADCON1

BIT 7 ADFM

BIT 6 -

BIT 5 RA5 -

BIT 4

BIT 3

BIT 2

BIT 1

BIT 0

RA4 RA3 RA2 RA1 RA0 Registro de configuracin de la Puerta A PCFG3 PCFG2 PCFG1 PCFG0

VALOR EN POR BOR -0x 000 -11 1111 -0- 0000

VALOR EN EL RESTO DE RESETS -0u 000 -11 1111 -0- 0000

x u -

significa desconocido significa que no cambia significa que no est implementado y se lee como 0

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

24

TRABAJO Y EXPLICACIN PIC 16F87X

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 06h 86h 81h

NOMBRE PORTB TRISB OPTION

BIT 7 RB7

BIT 6 RB6

BIT 5

BIT 4

BIT 3

BIT 2

BIT 1

BIT 0 RB0 PS0

RB5 RB4 RB3 RB2 RB1 Registro de configuracin de la Puerta B RBPU# INTEDG TOCS TOSE PSA PS2 PS1

VALOR VALOR EN EN POR EL RESTO BOR DE RESETS xxxx xxxx uuuu uuuu 1111 1111 1111 1111 1111 1111 1111 1111

x u -

significa desconocido significa que no cambia significa que no est implementado y se lee como 0

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

25

TRABAJO Y EXPLICACIN PIC 16F87X

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 RE0/RD#/AN5: E/S digital, Seal de lectura en modo puerta paralela esclava, Canal 5 de conversor A/D. RE1/WR#/AN6: E/S digital, Seal de escritura en modo PSP, Canal 6 de conversor A/D. - RE2/CS#/AN7: E/S digital, Seleccin de chip en modo PSP, Canal 7 de conversor A/D. RC0/T1OSO/T1CKI: Esta lnea puede actuar como E/S digital, como salida del Timer 1 o como entrada de impulsos para el Timer 1. RC1/T1OSI/CCP2: E/S digital, entrada al oscilador del Timer 1, entrada del modulo de Captura 2, Salida del comparador 2, salida del PWM2. RC2/CCP1: E/S digital, entrada Captura 1, Salida de comparador uno, salida del PWM1. RC3/SCK/SCL: E/S digital, Seal de reloj modo SPI, Seal de reloj modo I2C. RC4/SDI/SDA: E/S digital, Seal de datos modo SPI, Seal de datos modo I2C. RC5/SDO: E/S digital, Salida de datos en modo SPI. RC6/TX/CK: E/S digital, Lnea de transmisin en USART, Seal de reloj sncrona en transmisin serie. RC7/RX/DT: E/S digital, Lnea de recepcin USART, Lnea de datos en transmisin serie sncrona.

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

26

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

RECURSOS ESPECIALES

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

27

TRABAJO Y EXPLICACIN PIC 16F87X

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 WRT CPD LVP BODEN CP1 CP0 PWRTE# WDTE FOSC1 FOSC0

CP1:CP0

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

CP1 0 0 0 0 1 1 1 DEBUG

Modo Depurador en Circuito 1 = Desactivado. RB7:RB6 actan como lneas de E/S. 0 = Activado. RB7:RB6 actan en modo depurado. La depuracin se puede hacer desde el MPLAB. Permiso de escritura en la memoria FLASH 1 = Se puede escribir en la parte no protegida de la FLASH 0 = Prohibicin de escritura Cdigo de Proteccin de la Memoria EEPROM de Datos 1 = No hay proteccin en la EEPROM 0 = Proteccin del cdigo en la EEPROM Bit de Permiso para Programacin de Bajo Voltaje 1 = RB3/PGM tiene permitida la grabacin en bajo voltaje 0 = RB3/PGM funciona como E/S digital. La programacin se realiza en alto voltaje. Bit de Permiso para el Reset por Cada de Tensin 1 = BOR activada 0 = BOR desactivada Bit de permiso para el Timer de Conexin de Alimentacin 1 = PWRT desactivado 0 = PWRT activado Bit de Permiso del Timer de perro guardin 1 = WDT activado 0 = WDT desactivado Tipo de oscilador 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)

WRT

CPD

LVP

BODEN

PWRTE#

WDTE

FOSC1:0 FOSC1 0 0 1 1

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

28

TRABAJO Y EXPLICACIN PIC 16F87X

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

Tras un Reset, el contador de programa queda cargado con el valor 000h en todos los casos, menos cuando se produce el desbordamiento del WDT o cuando se despierta del modo SLEEP por una interrupcin, en cuyos casos, PC se carga con el valor PC+1.

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

29

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

PERRO GUARDIAN (WDT: WATCHDOG TIMER) El WDT de los PIC16F87X es similar al del 16F84. Se trata de un contador que funciona con los impulsos de su propio oscilador y que provoca un Reset cuando se desborda en funcionamiento normal. Si el desbordamiento se produce cuando el microcontrolador se halla en estado de Reposo, se despierta y sigue su comportamiento normal. Las instrucciones CLRWDT y SLEEP borran o ponen a cero el valor del WDT y el del Postdivisor. Si se ejecuta la instruccin CLRWDT y el Predivisor de Frecuencia est asignado al perro guardin, se borra, pero no cambia su configuracin. MODO DE REPOSO O BAJO CONSUMO Este funcionamiento se ejecuta con la instruccin SLEEP, igual que con el 16F84. Esta manera de trabajo se caracteriza por su bajo consumo, las lneas de E/S que se utilizaban mantienen su estado, las que no se empleaban reducen al mnimo su consumo, se detienen los temporizadores y tampoco opera el conversor A/D. Al entrar en modo de reposo, si estaba funcionando, el WDT se borra, pero sigue trabajando. Existen varias formas de despertar del modo SLEEP, y seguir ejecutando la instruccin PC+1: 1- Activacin externa de la pata MCLR#. 2- Desbordamiento del WDT, que sigue trabajando en reposo. 3- Generacin de interrupcin por activacin de la pata RB0/INT, o por cambio de estado en las cuatro patas de menos peso de la Puerta B. 4- Interrupcin originada por alguno de los nuevos perifricos de los PIC 16F87X tales como: a) Lectura o escritura en la puerta paralela PSP. b) Interrupcin del Timer 1. c) Interrupcin del mdulo CCP en modo captura. d) Disparo especial de Timer 1 funcionando en modo asncrono con reloj externo. e) Interrupcin en el mdulo de comunicacin SSP (Start/Stop). f) Transmisin o recepcin del MSSP modo esclavo (SPI/I2C). g) Transmisin o recepcin del USART. h) Fin de la conversin en el conversor A/D. i) Fin de operacin. j) Fin de escritura sobre EEPROM.

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

30

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

PROGRAMACIN DE LOS PIC 16F87X La posibilidad de programar a esta subfamilia de PIC en serie, permite grabar en la memoria de cdigo el programa de trabajo, estando colocado el Pic sobre el circuito o producto de aplicacin final. Esta caracterstica permite a los fabricantes construir y montar completamente la tarjeta de circuito impreso y dejar pendiente la grabacin del programa. La programacin en serie tpica, que se realiza con un Voltaje Alto de 12 a 14 V aplicado por la pata MCLR#/Vpp requiere el uso de 5 patas del PIC: a) b) c) d) e) 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.

Una gran aportacin esta gama de PIC es la programacin con Voltaje Bajo (LVP : Low Voltage Programming), que no requiere la tensin de 12 a 14V. Para grabar en este modo hay que poner el bit LVP = 1, que reside en la Palabra de Configuracin y la pata RB3/PGM se debe conectar a nivel alto. Entonces por la pata MCLR#/Vpp se aplica la tensin VDD de 5V mientras dura la operacin de grabado. Cuando no se opera en este modo de programacin se puede usar la pata RB3 como una lnea de E/S digital.

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

31

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

TEMPORIZADORES

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

32

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

TIPOS Y CARACTERSTICAS GENERALES En la familia de los PIC 16F87X, disponen de tres temporizadores. El TMR0, el TMR1 y el TMR2. En TMR0 es idntico al del 16F84, sus funciones ms representativas son: 1 TMR0 es un Contador/Temporizador de 8 bits. 2 Leble y escribible. 3 Reloj interno o externo. 4 Seleccin de flanco en el reloj externo. 5 Predivisor de la frecuencia del reloj programable. 6 Generacin de interrupcin opcional en el desbordamiento. El TMR1 se caracteriza por: 1 TMR1 es un Contador/Temporizador de 16 bits. 2 Leble y escribible. 3 Seleccin de reloj interno o externo. 4 Interrupcin opcional por desbordamiento de FFFFh a 0000h. 5 Posible reinicializacin desde los mdulos CCP. El TMR2 tiene las siguientes caractersticas fundamentales: 1 TMR2 es un Temporizador de 8 bits. 2 Dispone de un Registro de Perodo de 8 bits (PR2) 3 Leble y escribible. 4 Predivisor de Frecuencia programable. 5 Postdivisor de frecuencia programable. 6 Interrupcin opcional al coincidir TMR2 y PR2. 7 Posibilidad de generar impulsos al modo SSP.

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

33

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

ESTRUCTURA INTERNA Y FUNCIONAMIENTO DEL TMR1 El TMR1 es el nico Temporizador/Contador ascendente con un tamao de 16bits, lo que requiere el uso de 2 registros concatenados de 8 bits: TMR1h : TMR1L, que son los encargados de guardar el valor del montaje en cada momento, cuando el valor llega hasta FFFFh se activa el sealizador TMR1IF y se regresa al valor inicial 0000h. Tambin si se desea se puede provocar una peticin de interrupcin. El valor contenido en TMR1H: TMR1L puede ser ledo o escrito y los impulsos que originan el contaje pueden provenir del exterior o de la frecuencia de funcionamiento del microcontrolador: El TMR1 es capaz de funcionar de 3 formas: 1 Como temporizador 2 Como contador sncrono 3 Como contador asncrono

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

34

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

REGISTRO DE CONTROL DEL TMR1 (T1CON) T1CKPS1 T1CKPS0 T1OSCEN T1SYNC# TMR1CS TMR1ON

El funcionamiento del TMR1 esta gobernado por el valor con el que se programan los bits del registro T1CON que ocupa la direccin 10h de la memoria RAM. El bit TMR1ON gobierna el permiso o la prohibicin de funcionamiento del TMR1. Este bit es activo a nivel alto. El bit TMR1C selecciona la fuente de los impulsos de contage. Si vale 0 elige el reloj interno y si vale 1 elige el reloj externo que se aplica por las patas RC0 y RC1. Cuando los impulsos dependen de un reloj externo es preciso que el bit T1OSCEN tenga el valor 1, en cuyo caso las patas RC0 y RC1 actan como entradas del Oscilador externo. Si T1OSCEN vale = 0 los impulsos vendrn a travs de RC0.En ambos casos, el TIMER1 funciona como contados de elementos externos. El predivisor de frecuencia (preescaler) es un simple divisor de la frecuencia de los impulsos que se aplican al TMR1 por 1, 2, 4 u 8. El rango de divisin lo eligen los bits T1CKPS1 y T1CKS0: T2CKPS1 T2CKPS0 0 0 0 1 1 0 1 1 RANGO DEL PREDIVISOR 1:1 1:2 1:4 1:8

El bit T1SYNC# determina la posible sincronizacin o no de los impulsos del reloj externo con los del reloj interno, segn valga 0 o 1 respectivamente. El TMR1 Puede generar una peticin de interrupcin cuando se produce el sobrepasamiento del contaje. En esta situacin se pone automticamente a 1 el flag TMR1F, que es el bit 0 del registro especifico PIR1. El permiso de la prohibicin de interrupcin del TMR1 est controlada por el bit TMR1IE del PIE1. Cuando el modulo de CCP est configurado como comparador para generar un disparo especial, dicha seal resetea el TMR1. Para aprovechar esta caracterstica el TMR1 debe estar configurado en modo temporizador o contador sncrono. En otro caso no se produce el Reset.

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

35

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

FUNCIONAMIENTO Y PROGRAMACION DEL TMR2 Se trata de un temporizador ascendente de 8 bits, que leer y escribir, y que tambin puede realizar funciones especiales para la puerta serie sncrona (SPP) y para los mdulos de captura y comparacin (CCP) La seal de TMR2 es interna con valor de Fosc/4, y antes de ser aplicada pasa por un predivisor de frecuencia con rangos de 1:1, 1:4, 1:16. La salida pasa por un postdivisor con rangos de 1:1 a 1:16. Al entrar el microcontrolador en SLEEP, el TMR2 deja de funcionar porque no existe Fosc al pararse el oscilador. Para controlar el funcionamiento de TMR2 se utiliza el registro T2CON.
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 RANGO DEL PREDIVISOR 1:1 1:4 1:16

El bit TMR2CON sirve para permitir o prohibir el funcionamiento del TMR2. El bit de ms peso no es significativo y los cuatro bits restantes determinan el rango por el que divide la frecuencia el postdivisor: TOUTPS3-TOUTPS0 0000 0001 0010 .... 1111 RANGO DEL POSTDIVISOR 1:1 1:2 1:3 .... 1:16

El sealizador de desbordamiento del TMR2 es el bit 1 del registro PIR1. El predivisor y el postdivisor se ponen a 0 al escribir el T2CON o con un Reset. Sin embargo, al escribir en T2CON no se borra el TMR2, pasa a valer 0 al hacer un Reset. El TMR2 tiene asociado un registro de periodo PR2. Cuando el valor del contaje del TMR2 coincide con el valor cargado en PR2 se genera un impulso en la salida EQ y se resetea el TMR2.

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

36

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

CAPTURA, COMPARACIN Y MODULACIN DE ANCHURA DE PULSOS

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

37

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

INTRODUCCIN A LOS MDULOS CCP Los microcontroladores PIC 16F87X disponen de dos mdulos CCP, llamados CCP1 y CCP2, que solo se diferencian en el Disparo Especial. Realizan tres funciones especiales: 1 Modo captura: una pareja de registros de un mdulo CCPx captura el valor que tiene el TMR1 cuando ocurre un evento especial en la pata RC2/CCP1 o en la RC1/T1OSCI/CCP2. 2 Modo comparacin: se compara el valor de 16 bits del TMR1 con otro valor cargado en una pareja de registros de un mdulo CCPx y cuando coinciden se produce un evento en la pata RC2/CCP1 o en la RC1/T1OSCI/CCP2. 3 Modo modulacin de anchura de pulsos (PWM): dentro del intervalo del periodo de un impulso controla la seal en que la salida vale nivel alto. El mdulo CCP1 utiliza un registro de trabajo de 16 bits, que est formado con la concatenacin de los registros CCPR1H, CCPR1L. El registro de control del mdulo CCP1 es el CCP1CON. El modulo CCP2 tiene como registros de trabajo a CCPR2H-CCPR2L y como registro de control a CCP2CON. Las parejas de registros son las encargadas de capturar el valor del TMR1, de comparar el valor que tiene con el TMR1 o, en el PWM, de modular la anchura del impulso.
REGISTRO CCPxCON (x puede ser 1 0 2) CCPxX CCPxY CCPxM3 CCPxM2 CCPxM1 CCPxM0

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

38

TRABAJO Y EXPLICACIN PIC 16F87X

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

Los 4 bits CCP1M3-0 del registro CCP1CON seleccionan el evento adecuado en el mdulo CCP1 y o a su vez en el CCP2. Al efectuar la captura se activa el sealizador CCP1IF en el registro PIR1. Adems, si se pone a 1 el permiso de interrupcin PIE1 <CCP1IE>, se genera una peticin de interrupcin cuando se carga CCPR1H-L el valor del Timer1. Cuando se emplea el mdulo CCP1 en modo Captura, el Timer1 debe estar configurado para trabajar como temporizador o como contador sncrono. Nunca en modo asncrono. Si se fueran a cambiar las configuraciones del modulo de captura, convendra detener o desactiva este antes para as evitar que se produzcan falsas interrupciones durante la operacin. Cuando se desactiva el mdulo CCP o deja de funcionar en modo captura se borra la codificacin del predivisor de frecuencia que determinan los bits CCP1M3-0. Una aplicacin muy interesante del modo captura puede ser la medicin de los intervalos de tiempo que existen entre los impulsos que llegan a la pata RC2/CCP1, que se halla configurada como entrada. El TMR1 debe trabajar como entrada de reloj externo sincronizada.

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

39

TRABAJO Y EXPLICACIN PIC 16F87X

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:

1 Pasa a nivel alto 2 Pasa a nivel bajo 3 No cambia su estado pero se produce una interrupcin.

Al coincidir los valores TMR1 con la pareja de registros CCPR1H-L se pone a 1 el sealizador CCP1IF. El TMR1 debe trabajar en modo temporizador o contador sncrono, nunca en modo asncrono. Si el bit de permiso de interrupcin est a 1, cuando coinciden los valores mencionados, se origina una peticin de interrupcin. Si con los bits CCP1M3-0 se selecciona el modo de trabajado de Disparo especial, el mdulo CCP1 pone a 0 el TMR1 y el CCPR1 funciona como un registro de periodo capaz de provocar peridicamente interrupciones. En ese modo de disparo especial, el CCP2 se pone a 0 y el TMR1 y, adems, inicia una conversin en el conversor A/D, con lo que tambin y con carcter peridico, pueden realizarse conversiones A/D sin el control del programa de instrucciones.

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

40

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

MODO DE MODULACIN DE ANCHURA DE PULSOS (PWM) Con este modo de trabajo, se consiguen impulsos lgicos cuya anchura del nivel alto es de duracin variable, que son de enorme aplicacin en el control de dispositivos tan populares como los motores y los triacs. La pata RC2/CCP1 est configurada como salida y bascula entre los niveles lgicos 0 y 1 a intervalos variables de tiempo. Lo que se intenta es obtener un pulso cuyo nivel alto tenga una anchura variable dentro del intervalo del periodo de trabajo. Cuando se trabaja con una precisin de 10 bits, los 2 bits CCP1CON <5:4> se concatenan con los 8 de CCPR1L y, de la misma forma, los 8 bits de ms peso del TMR2 se concatenan con los 2 bits de menos peso del reloj interno. El tiempo que dura el perodo de la onda depende del valor cargado en PR2, segn la frmula siguiente: Perodo = [(PR2) + 1] 4 Tos Valor Predivisor TMR2 Cuando el valor del TMR2 coincide con el del PR2 suceden 3 acontecimientos: 1 Se borra el TMR2 2 La pata RC2/CCP1, se pone a 1. 3 El valor de CCPR1L, se carga en CCPR1H El tiempo que la pata de salida est a nivel alto, que es la anchura del impuso, depende del contenido cargado en CCP1R y de los 2 bits del CCP1CON <5:4>, cuando se trabaja con una precisin de 10 bits. Anchura de impulsos = (CCPR1L:CCP1CON<5:4>) Tosc Valor Predivisor TMR2 El valor CCPR1:CCP1CON<5:4> puede cargarse en cualquier momento, puesto que el mismo no se traspasa a CCPR1H y se compara hasta que coinciden PR2 con TMR2. En el modo PWM el registro CCPR1L solo puede ser ledo. Los pasos a seguir para realizar la configuracin del modo PWM son los siguientes: 1 Asignar el periodo cargando el oportuno valor en PR2. 2 Asignar la anchura del pulso cargando el registro CCP1R y CCP1CON<5:4> 3 Configurar la lnea RC2/CCP1 como salida. 4 Asignar el valor del predivisor y activar el TMR2 escribiendo el T2CON. 5 Configurar el Mdulo CCP1 en modo PWM

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

41

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

EL CONVERSOR A/D

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

42

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

PRESENTACIN DEL CONVERSOR ANALGICO / DIGITAL Los microcontroladores PIC 16F87x poseen un conversor A/D de 10 bits de resolucin y 5 canales de entrada en los modelos con 28 patas y 8 canales para los de 40 patas. La resolucin que tiene cada bit procedente de la conversin tiene un valor que es funcin de la tensin de referencia de acuerdo con la siguiente frmula: Resolucin = (Vref+ - Vref-) / 1.024 = Vref / 1.024 Por ejemplo, si Vref+ es 5V y Vref- es 0V, la resolucin ser de 4,8 mV por bit. La tensin de referencia determina los lmites mximo y mnimo de la tensin analgica que se puede convertir. El voltaje diferencial mnimo es de 2V A travs del canal de entrada seleccionado, se aplica la seal analgica a un condensador de captura y mantenimiento y luego se introduce al conversor, el cual proporciona un resultado digital de 10 bits de longitud usando la tcnica de aproximaciones sucesivas. El conversor A/D es el nico dispositivo que puede funcionar en reposo, para ello el reloj del conversor deber conectarse al oscilador RC interno. REGISTROS DE TRABAJO El funcionamiento del conversor A/D requiere la manipulacin de 4 registros: 1 ADRESH: Parte alta del resultado de la conversin. 2 ADRESL: Parte baja del resultado de la conversin. 3 ADCON0: Registro de control 0. 4 ADCON1: Registro de control 1. En la pareja ADRESH:ADRESL, se deposita el resultado de la conversin, que al estar compuesta por 10 bits, solo son significativos 10 de los bits de dicha pareja. El registro ADCON0 controla la operacin del C A/D, mientras el ADCON1 sirve para configurar las patas de la Puerta como entradas analgica o E/S digitales. REGISTRO ADCON0
ADCS1 ADCS0 CHS2 CHS1 CHS0 GO/DONE# ADON

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

43

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

REGISTRO ADCON1
ADFM PCFG3 PCFG2 PCFG1 PCFG0

Los bits ACON<7:6> sirven para seleccionar la frecuencia reloj que se emplea en la conversin, con la siguiente asignacin: ADCS1:0 00 01 10 11 FRECUENCIA Fosc/2 Fosc/8 Fosc/32 FRC (Procede del oscilador RC interno)

Se designa como TAD el tiempo que dura la conversin de cada bit en el caso de trabajar con valores digitales de 10 bits. Se requiere un tiempo mnimo de 12TAD. El valor de TAD se selecciona por software mediante los bits ADCS1:ADCS0 y en los PIC 16F87x nunca debe ser menor de 1,6 microsegundos. ADCS1:0 00 01 10 11 TAD 2 Tosc 8 Tosc 32 Tosc Oscilador RC interno en el C A/D

Los bits CHS2-0 seleccionan el canal por el que se introduce la seal a convertir, de acuerdo con el siguiente cdigo: CHS2-0 000 001 010 011 100 101 110 111 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

El bit GO/DONE# es el bit de estado de la conversin. Ponindolo a 1 se inicia la conversin y mientras est a 1 est realizndose la conversin. Cuando GO/DONE# pasa a 0 confirma el final de la conversin y la puesta del resultado en la pareja de registros ADRESH:L. El bit ADON sirve para activar el C A/D ponindolo a 1 y para desactivar su funcionamiento, ponindolo a 0.

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

44

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

ESTRUCTURA INTERNA Y CONFIGURACIN DEL C A/D El bit de menos peso (ADFM) del registro ADCON1 selecciona el formato del resultado de la conversin. Si vale 1, el resultado est justificado en el registro ADRESH, que tiene sus 6 bits de ms peso a 0; mientras que si vale 0 la justificacin se hace sobre el registro ADRESL, que tiene sus 6 bits de menos peso a 0. Esto significa que los 16 bits que forman la unin de los dos registros, unas veces tienen a 0 los 6 bits de ms peso y otras los 6 bits de menos peso.

ADFM=1

RESULTADO DE 10 BITS

ADMF=0

07

07

ADRESH

ADRESL

ADRESH

ADRESL

Los restantes 4 bits (PCFG3-0) de ADCON1 se usan para configurar las patitas de los canales de entrada al conversor como analgicas o como E/S digitales, de acuerdo con la siguiente tabla:
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 VREFAN1/ 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 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

PCFG3-0 0000 0001 0010 0011 0100 0101 011x 1000 1001 1010 1011 1100 1101 1110 1111

VREF+ VDD RA3 VDD RA3 VDD RA3 VDD RA3 VDD RA3 RA3 RA3 RA3 VDD RA3

VREFVSS VSS VSS VSS VSS VSS VSS RA2 VSS VSS RA2 RA2 RA2 VSS RA2

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

45

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

Pasos a seguir para realizar una conversin con el mdulo C A/D:

1. Configurar el mdulo C A/D 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)

2. Activar, si desea, la interrupcin escribiendo sobre PIE1 y PIR1 Borrar el sealizador ADIF. Poner a 1 el bit ADIE Poner a 1 los bits habilitadores GIE y PIE

3. Tiempo de espera para que transcurra el tiempo de adquisicin 4. Inicio de la conversin Poner a 1 el bit GO/DONE# (ADCON0)

5. Tiempo de espera para completar la conversin A/D que puede detectarse Por la exploracin del bit GO/DONE#, que al completarse la conversin pasa a valer 0. Esperando a que se produzca la interrupcin si se ha programado, al finalizar la conversin. Aunque no se permita interrupcin, el sealizador ADIF se pondr a 1 al finalizar la conversin.

6. Leer el resultado de los 10 bits vlidos de ADRSH:L y borrar el flag ADIF 7. Para una nueva conversin regresar al paso 1 o al 2. El tiempo de conversin por bit est definido por TAD. Se exige esperar un mnimo de 2 TAD para reiniciar una nueva conversin

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

46

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

MDULO DE COMUNICACIONES SERIE SNCRONA MSSP

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

47

TRABAJO Y EXPLICACIN PIC 16F87X

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.

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

48

TRABAJO Y EXPLICACIN PIC 16F87X

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.

Puede ser necesario utilizar una cuarta lnea de control ms cuando el PIC que se utiliza trabaja en modo esclavo. En este caso, la pata SS# (seleccin de esclavo) se debe activar a tierra. Las 4 lneas que utilizan se corresponden con las patas multifuncin RC3/SDO, RC4/SDI, RC5/SDK y RA5/SS#. La conexin habitual de PIC maestro se suele realizar con circuitos de memoria con el objeto de ampliar su capacidad. La lnea SDO del maestro se corresponde con las SDI de los esclavos y la lnea SCK por la que circulan los impulsos de reloj, siempre parten del maestro, que es el encargado de generar y controlar la sincronizacin. Si, por ejemplo, actuase como esclavo un chip de memoria RAM de 256x8 de tamao, la comunicacin SPI la iniciara el maestro enviando por la lnea SDO un byte con la direccin de la memoria a acceder, seguido de otro byte que especificara la operacin lectura/escritura y un tercero que contendra el dato a escribir en caso de que se tratase de una operacin de escritura. En caso de que se tratase de una de lectura, despus de enviar los dos bytes iniciales, quedara a la espera del byte que sacara el esclavo por su lnea SDO y que se introducira al maestro por su lnea SDI. Si fuese una memoria con ms posiciones, la direccin se tendra que especificar en ms de un byte. Cuando el PIC trabaja como maestro hay que programar la lnea RC3/SDO como salida, la lnea RC4/SDI como entrada y la lnea RC5/SCK tambin como salida. Si actuase como esclavo, la lnea RC5/SCK debera configurarse como entrada y la RA5/SS# debera conectarse a tierra.
SS PIC MAESTRO RA5/SS# PIC esclavo 1 SDI SDO CLK RA5/SS# PIC esclavo 1 SDI SDO CLK SS

PIC 16F87x

RC3/SDO RC4/SDI RC5/SCK

SDO SDI SCK

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

49

TRABAJO Y EXPLICACIN PIC 16F87X

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 PIC MAESTRO PIC esclavo 1 SDA SCL PIC esclavo 1 SDA SCL SS

PIC 16F87x

RC4/SDA RC3/SCL

SDA SCL

Concepto del bus I2C Dos lneas, SDA (datos) y SCL (reloj), transportan la informacin entre los diferentes dispositivos conectados al bus. Cada dispositivo se identifica por una nica direccin y puede transmitir o recibir dependiendo de la funcin que se vaya a realizar. Un controlador de LCD, por ejemplo, slo recibe mientras que una memoria de tipo RAM puede transmitir o recibir datos en funcin de que se vaya a leer o a escribir. Los dispositivos pueden clasificarse en Maestro (master o principal) o Esclavo (slave o secundario). El maestro es el que inicia la transferencia de datos y genera la seal de reloj. Cualquiera de los dispositivos direccionados por un maestro se considera esclavo. El I2C es un bus multi-maestro; puede haber ms de un maestro conectado y controlando el bus. Normalmente se trata de microcontroladores o microcomputadores.

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

50

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

Direccionamiento del bus I2C El primer byte que enva el maestro tras la condicin de inicio, es el cdigo que determina el esclavo (7 bit de mas peso) Cdigo 0000 0000 de llamada general Bit de menos peso (R/W#), determina si se realiza una operacin de lectura o escritura

Para activar el bus I2C, poner el bit SSPEN = 1, que es el bit 5 del registro SSPCON Previamente, configurar RC3/SCL y RC4/SDA como entradas

Bits de Control del bus I2C 1. 2. 3. 4. 5. 6. SSPCON SSPCON2 SSPSTAT SSPBUF SSPSR SSPADD Registro de control Registro de control 2 Registro de estado Buffer para los datos Registro de desplazamiento (no accesible) Registro de direccin

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

51

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

SSPCON WCOL SSPOV WCOL SSPOV SSPEN SSPEN CKP SSPM3 SSPM2 SSPM1 SSPM0

se pone a 1 si se intenta escribir en SSPBUF en condiciones no vlidas. se pone a 1 si hay desbordamiento en SSPBUF configuracin de la patas RC3/SCL y RC4/SDA 1 = la puerta serie queda configurada con SCL y SDA 0 = RC3 y RC4 como entradas y salidas digitales para activar el reloj en modo esclavo seleccin de la frecuencia del reloj FRECUENCIA DEL RELOJ Reloj = FOSC/4 Reloj = FOSC/16 Reloj = FOSC/61 Reloj = salida del TMR2/2 Reloj = (SSPADD + 1) FOSC

CKP SSPM3-0

SSPM3-0 0000 0001 0010 0011 1000 SSPCON2

GCEN ACKSTAT ACKDT ACKEN RCEN

PEN

RSEN

SEN

GCEN ACKSTAT ACKDT

solo se usa en modo esclavo si se pone a 1 indica que se ha recibido el bit ACK bit de reconocimiento de recepcin en modo maestro 1 = el maestro NO ha trasmitido el dato 0 = el maestro SI ha trasmitido el dato si vale 1 se inicia la secuencia de generacin de la condicin de reconocimiento si vale 1 se habilita el modo de recepcin del maestro si vale 1 se genera la condicin de parada de SCL y SDA si vale 1 se inicia la repeticin de la condicin de inicio si vale 1 se inicia la condicin de inicio

ACKEN RCEN PEN RSEN SEN

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

52

TRABAJO Y EXPLICACIN PIC 16F87X

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 nivel de SCL y SDA en modo multimaestro 1 = a nivel alto SCL y SDA en modo maestro y esclavo 0 = se configuran segn especificaciones del I2C indica si el dato recibido es de informacin o direccin 1 = de informacin 0 = de direccin se pone a 1 cuando detecta la llegada del bit STOP se pone a 1 cuando detecta la llegada del bit START bit de seleccin de lectura o escritura 1 = lectura (READ) 0 = escritura (WRITE) 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

CKE

D/A#

P S R/W#

UA BF

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

53

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

USART (SCI)

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

54

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

COMUNICACIN SERIE ASNCRONA Los PIC 16F87x contienen un mdulo MSSP con dos puertas para comunicacin serie sncrona, o sea, con seal de reloj. Tambin disponen de un mdulo USART, capaz de soportar la comunicacin serie sncrona y asncrona. El USART, llamado SCI (Serial Comunication Interface), puede funcionar como un sistema de comunicacin full-duplex o bidireccional asncrono, adaptndose a multitud de perifricos y dispositivos que transfieren informacin de esta forma, tales como el monitor CRT o el ordenador PC. Tambin puede trabajar en modo sncrono unidireccional o half-duplex para soportar perifricos como memorias, conversores, etc. Modos de trabajo del USART: 1. ASNCRONA (Full duplex, bidireccional). 2. SNCRONA-MAESTRO (Half duplex, unidireccional). 3. SNCRONA-ESCLAVO (Half duplex, unidireccional). En el modo asncrono las transferencias de informacin se realizan sobre dos lneas TX (transmisin) y RX (recepcin), saliendo y entrando los bits por dichas lneas al ritmo de una frecuencia controlada internamente por el USART. En el modo sncrono, la comunicacin se realiza sobre dos lneas, la DT que traslada en los dos sentidos los bits a la frecuencia de los impulsos de reloj que salen por la lnea CK desde el maestro. En ambos modos, las lneas de comunicacin son las dos de ms peso de la Puerta C: RC6/TX/CK y RC7/RX/DT. En esta forma de comunicacin serie, se usa la norma RS-232-C, donde cada palabra de informacin o datos se enva independientemente de los dems. Suele constar de 8 o 9 bits y van precedidos por un bit de START (inicio) y detrs de ellos se coloca un bit de STOP (parada), de acuerdo con las normas del formato estndar NRZ (NonReturn-to-Zero). Los bits se transfieren a una frecuencia fija y normalizada. Los cuatro bloques que configuran la arquitectura de USART en modo asncrono son: 1 Circuito de muestreo. 2 Generador de baudios. 3 Transmisor asncrono. 4 Receptor asncrono. El circuito de muestreo acta sobre la pata RC7/RX/DT, que es por donde se recibe el bit de informacin o control y se encarga de muestrear tres veces su valor, para decidir este por mayora.

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

55

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

PROGRAMAS (ASM)

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

56

TRABAJO Y EXPLICACIN PIC 16F87X

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 List include org Inicio clrf bsf clrf movlw movwf movlw movwf bcf movf movwf goto end p=16F876 "P16F876.INC" 0x05 PORTB STATUS,RP0 TRISB 0x06 ADCON1 b'00111111' TRISA STATUS,RP0 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

Aqui

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

57

TRABAJO Y EXPLICACIN PIC 16F87X

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 org Inicio clrf bsf clrf movlw movwf movlw movwf bcf btfsc goto bcf bsf goto bsf bcf goto end p=16F876 "P16F876.INC" 0x05 PORTB STATUS,RP0 TRISB 0x06 ADCON1 b'00011111' TRISA STATUS,RP0 PORTA,0 RA0_es_1 PORTB,0 PORTB,1 Aqui PORTB,0 PORTB,1 Aqui ;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 ;RA0 = 1 ?? ;Si ;No, desconecta RB0 ;Conecta RB1 ;Buble ;Activa RB0 ;Activa RB1 ;Bucle

Aqui

RA0_es_1

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

58

TRABAJO Y EXPLICACIN PIC 16F87X

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) List include Contador equ org goto p=16F876 ;Tipo de procesador "P16F876.INC" ;Definiciones de registros internos 0x20 0x05 Inicio ;Variable para la temporizacin

;-------------------------------------------------------------------------------------------------------------------;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 movlw movwf bcf movlw movwf btfss goto decfsz b10 Contador INTCON,T0IF b195 TMR0 INTCON,T0IF Delay_1 Contador,F ;Carga el contador con 10 ;Desconecta el flag del TMR0 ;carga el TMR0 con 195 ;Rebosamiento del TMR0 ?? ;No. Todava no han pasado los 1* mS ;Decrementa contador.

Delay_1

goto Delay_0 ;Todava no, temporiza otros 10 ms return ;Ahora si ;-------------------------------------------------------------------------------------------------------------------Inicio clrf bsf clrf movlw movwf movlw movwf movlw movwf bcf bsf call btfsc goto rlf goto rrf goto end PORTB STATUS,RP0 TRISB 0x06 ADCON1 b'00011111' TRISA b'00000111' OPTION_REG STATUS,RP0 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

Loop A_Izda A_Dcha

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

59

TRABAJO Y EXPLICACIN PIC 16F87X

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. List include Contador equ org goto org goto Inter bcf decfsz goto movlw movwf movlw xorwf movlw movwf retfie clrf bsf clrf movlw movwf movlw movwf movlw movwf bcf p=16F876 ;Tipo de procesador "P16F876.INC" ;Definiciones de registros internos 0x020 0x04 Inter 0x05 Inicio INTCON,T0IF Contador,F Seguir b50 Contador b'10000000' PORTB,F b195 TMR0 PORTB STATUS,RP0 TRISB 0x06 ADCON1 b'00111111' TRISA b'00000111' OPTION_REG STATUS,RP0 ;Repone flag del TMR0 ;Decrementa el contador. Ha habido 50 interrupciones ?? ;No, no han pasado los 500 mS ;Repone el contador nuevamente para ;contar 50 interrupciones ;RB0 cambia de estado ;Repone el TMR0 con 195 ;Retorno de interrupcin ;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 ;Variable para la temporizacin ;Vector de interrupcin

Con_si_0

Seguir

Inicio

;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 ;Carga el TMR0 con 195 ;N de veces a repetir la interrupcin ;Activa la interrupcin del TMR0

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

60

TRABAJO Y EXPLICACIN PIC 16F87X

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 btfsc goto bcf goto bsf btfsc goto bcf goto bsf goto end PORTA,0 RA0_ES_1 PORTB,0 TEST_RB1 PORTB,0 PORTA,1 RA1_ES_1 PORTB,1 Loop PORTB,1 Loop ;Testea el estado de RA0 ;Desactiva RB0 ;Activa RB0 ;Testea el estado de RA1 ;Desactiva RB1 ;Activa RB1

RA0_ES_1 TEST_RB1

RA1_ES_1

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

61

TRABAJO Y EXPLICACIN PIC 16F87X

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 Contador equ org goto org goto Inter bcf movlw movwf movlw movwf bcf movlw movwf btfss goto decfsz goto clrf retfie clrf bsf movlw movwf movlw movwf bcf movlw movwf p=16F876 ;Tipo de procesador "P16F876.INC" ;Definiciones de registros internos 0x20 0x04 Inter 0x05 Inicio INTCON,INTF ;Repone flag de la interrupcin exetrna b'11111110' PORTB ;Activa las salidas b100 Contador ;Inicia contador de temporizaciones de 10 ;ms con 100 (1") INTCON,T0IF ;Reponer flag del TMR0 b195 TMR0 ;Repone el TMR0 con 195 INTCON,T0IF ;Han transcurrido 10 mS ?? Delay_10ms ;No, esperar Contador,F ;Decrementa el contador. Seguir ;No PORTB ;Si, han pasado 1", se desconecta la salida ;Retorno de interrupcin PORTB STATUS,RP0 b'00000001' TRISB b'00000111' OPTION_REG STATUS,RP0 b'10010000' INTCON ;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 ;Variable para la temporizacin ;Vector de interrupcin

Seguir Delay_10ms

Inicio

;Este es el cuerpo del programa principal. Se mantiene en estado SLEEP hasta que se produce ;interrupcin Loop sleep nop goto end

Loop

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

62

TRABAJO Y EXPLICACIN PIC 16F87X

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 org goto p=16F876 ;Tipo de procesador "P16F876.INC" ;Definiciones de registros internos 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 clrf bsf clrf movlw movwf movlw movwf bcf Loop movf andlw call movwf goto end 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' PORTB STATUS,RP0 TRISB 0x06 ADCON1 b'00111111' TRISA STATUS,RP0 PORTA,W b'00001111' Tabla PORTB Loop ;Desplazamiento sobre la tabla ;Dgito 0 ;Dgito 1 ;Dgito 2 ;Dgito 3 ;Dgito 4 ;Dgito 5 ;Dgito 6 ;Dgito 7 ;Dgito 8 ;Dgito 9 ;Dgito A ;Dgito B ;Dgito C ;Dgito D ;Dgito E ;Dgito F ;Borra el Puerto B ;Selecciona banco 1 ;Puerta B se configura como salida ;Puerta A digital ;Puerta A se configura como entrada ;Selecciona banco 0 ;Lee el cdigo de RA0-RA3 ;Convierte a 7 segmentos ;Visualiza sobre el display

Inicio

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

63

TRABAJO Y EXPLICACIN PIC 16F87X

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 List p=16F876 include "P16F876.INC" Contador equ org goto 0x20 0x05 Inicio ;Tipo de procesador ;Definiciones de registros internos ;Variable para el contador

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

Wait

;Secuencia establecida por Microchip ;Orden de escritura ;Testear flag de fin de escritura ;Desconecta permiso de escritura ;Reponer flag de fin de escritura ;Selecciona banco 0

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

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

64

TRABAJO Y EXPLICACIN PIC 16F87X

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' ;Desplazamiento sobre la tabla ;Dgito 0 ;Dgito 1 ;Dgito 2 ;Dgito 3 ;Dgito 4 ;Dgito 5 ;Dgito 6 ;Dgito 7 ;Dgito 8 ;Dgito 9

;-----------------------------------------------------------------------------------------------------------------------------;Delay_10_ms: Esta rutina de temporizacin tiene por objeto eliminar rebote. Delay_10_ms: 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 clrf bsf clrf movlw movwf movlw movwf movlw movwf bcf bsf clrf call bsf movlw subwf btfsc goto goto bcf clrf goto movf bcf movwf PORTB STATUS,RP0 TRISB 0x06 ADCON1 b'00111111' TRISA b'00000111' OPTION_REG STATUS,RP0 STATUS,RP1 EEADR EE_Read STATUS,RP1 0x09 EEDATA,W STATUS,C Ini_0 Ini_1 STATUS,RP1 Contador Loop EEDATA,W STATUS,RP1 Contador ;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 ;Selecciona banco 2 ;Selecciona direccin 00 de EEPROM ;Lee byte de la EEPROM ;Selecciona banco 2 ;Mayor de 9 ?? ;Si, poner a 0 el contador ;No ;Banco 0 ;Poner a 0 el contador ;Banco 0 ;Iniciar contador

Ini_0 Ini_1

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

65

TRABAJO Y EXPLICACIN PIC 16F87X Loop movf Contador,W call Tabla movwf PORTB btfss goto call btfsc goto call incf movlw subwf btfsc clrf movf bsf movwf call goto end PORTA,0 Wait_0 Delay_10_ms PORTA,0 Wait_1 Delay_10_ms Contador,F b10 Contador,W STATUS,Z Contador Contador,W STATUS,RP1 EEDATA EE_Write Loop

2 DPE

;Convierte contador a 7 segmentos ;Visualiza sobre el display ;RA0 est a "1" ?? ;No, esperar ;Eliminar rebotes ;RA0 est a "0" ?? ;No, esperar ;Eliminar rebotes. Ha habido un pulso ;Incrementa contador ;Contador mayor de 9 ?? ;Si, vuelta a 00 ;Selecciona el Banco 2 ;Graba el nuevo valor del contador en la EEPROM

Wait_0

Wait_1

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

66

TRABAJO Y EXPLICACIN PIC 16F87X

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 org goto 0x20 0x22 0x23 0x24 0x05 Inicio ;Variables (2) de las rutinas de manejo del LCD ;Variable para la temporizacin ;Variable temporal ;Variable temporal

include "LCD_Cxx.inc" ;Incluye las rutinas de manejo del LCD ;-----------------------------------------------------------------------------------------------------------------------------;Segn el valor contenido en el registro W, se devuelve el carcter a visualizar Tabla_Mensajes movwf PCL ;Calcula el desplazamiento sobre la tabla

;-----------------------------------------------------------------------------------------------------------------------------;La directiva dt genera tantas intsrucciones retlw como bytes o caracteres contenga Mens_0 Mens_1 Mens_2 Mens_3 equ dt equ dt equ dt equ dt $ "Trabajo / Explic",0x00 $ "PIC 16F87x",0x00 $ "Sebastian Martin",0x00 $ " 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 ;Desconecta el flag de rebosamiento ;carga el TMR0 con 195 ;Rebasamiento del TMR0 ?? ;Todava no ;Decrementa contador de intervalos ;Repite el intervalo de 10 mS

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

67

TRABAJO Y EXPLICACIN PIC 16F87X

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 movwf movf call movwf movf btfss goto return call incf goto clrf bsf clrf movlw movwf movlw movwf movlw movwf bcf Temporal_1 Temporal_1,W Tabla_Mensajes Temporal_2 Temporal_2,F STATUS,Z No_es_ultimo LCD_DATO Temporal_1,F Mensaje_1 PORTB STATUS,RP0 TRISB 0x06 ADCON1 b'00110001' TRISA b'00000111' OPTION_REG STATUS,RP0 ;Salva posicin de la tabla ;Recupera posicin de la tabla ;Busca caracter de salida ;Guarda el caracter ;Mira si es el ltimo ;Visualiza en el LCD ;Siguiente caracter ;Borra el Puerto B ;Selecciona banco 1 ;Puerta B se configura como salida ;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

No_es_ultimo

Inicio

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

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

68

TRABAJO Y EXPLICACIN PIC 16F87X

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 equ org goto 0x20 0x26 0x05 Inicio ;Incluye rutinas de manejo del teclado ;Inicio de las 6 variables empleadas por las rutinas de manejo ;Variable para la temporizacin

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 clrf bsf clrf movlw movwf bcf call movlw subwf btfsc goto movf movwf movlw movwf call clrf goto end PORTB STATUS,RP0 TRISB b'00000111' OPTION_REG STATUS,RP0 Key_Scan 0x80 Tecla,W STATUS,Z Loop Tecla,W PORTB b200 Delay_Cont Delay_var PORTB Loop ;Borra los latch de salida ;Selecciona banco 1 ;Puerta B se configura como salida ;Preescaler de 256 para el TMR0 ;Selecciona banco 0 ;Explora el teclado ;Hay alguna pulsada ?? ;No ;Lee el cdigo de la tecla pulsada ;Lo visualiza sobre los leds de la Puerta B ;Temporiza 2 segundos ;Desactiva visualizacin

Loop

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

69

TRABAJO Y EXPLICACIN PIC 16F87X

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. List p=16F876 include "P16F876.INC" Lcd_var Key_var Temporal_1 Temporal_2 Temporal_3 equ equ equ equ equ org goto org goto 0x20 0x22 0x28 0x29 0x2a 0x04 Interrupcion 0x05 Inicio ;Tipo de procesador ;Definiciones de registros internos ;Inicio de las variables para el LCD ;Inicio de las variables del teclado ;Variable temporal n 1 ;Variable temporal n 2 ;Variable temporal n 3 ;Vector de interrupcin

include "LCD_CXX.INC" include "TECLADO.INC" Tabla_Mensajes movwf PCL Mens_0 equ dt $ "Se ha pulsado: ",0x00

;Incluir rutinas de manejo del LCD ;Incluir rutinas de manejo del teclado ;Desplazamiento sobre la tabla

;-----------------------------------------------------------------------------------------------------------------------------;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 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 ;Salva posicin de la tabla ;Recupera posicin de la tabla ;Busca caracter de salida ;Guarda el caracter ;Mira si es el ltimo ;Visualiza en el LCD ;Siguiente caracter

No_es_ultimo

;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 ;Desactiva flag del TMR0 ;Carga el TMR0 con 195 ;Han transcurrido 10mS ?? ;No, esperar

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

70

TRABAJO Y EXPLICACIN PIC 16F87X ;Programa de tratamiento de la interrupcin por cambio de estado Interrupcion bcf call movf movwf call call movlw subwf btfss goto call call del LCD movlw call movf sublw btfss goto movf addlw call goto Mayor_que_9 movf addlw call clrf bsf movlw movwf nop nop bcf bcf movf bcf bsf retfie Inicio: bsf movlw movwf movlw movwf bcf call call movlw call movlw 0x8f LCD_REG Temporal_3,W b9 STATUS,C Mayor_que_9 Temporal_3,W 0x30 LCD_DATO Inter_Fin Temporal_3,W 0x37 LCD_DATO clrf PORTA PORTB STATUS,RP0 b'11110000' TRISB STATUS,RP0 INTCON,RBIE PORTB,W INTCON,RBIF INTCON,RBIE STATUS,RP0 0x06 ADCON1 b'00000111' OPTION_REG STATUS,RP0 UP_LCD LCD_INI b'00001100' LCD_REG b'00000001' ;Posiciona el cursor del LCD ;Recupera la tecla que se puls ;Es mayor que 9 (A, B,C,D,E,F)? ;Si ;No ;Ajuste ASCII de los caracteres del 0 al 9 ;Visualizar sobre el LCD INTCON,RBIE Key_Scan Tecla,W Temporal_3 Delay_10ms Key_Scan 0x80 Tecla,W STATUS,Z Inter_1 Delay_10ms UP_LCD ;Desactiva mascara RBIE ;Explora el teclado ;Salva la tecla temporalmente ;Elimina rebotes ;Explora el teclado ;Se ha liberado la tecla pulsada ? ;No, esperar que se libere ;Eliminar rebotes

2 DPE

Inter_1

;Configura Puertas A y B como salidas para manejo

;Ajuste ASCII de los caracteres de la A a la F ;Visualiza sobre el LCD

Inter_Fin

;Selecciona banco 1 ;RB0-RB3 salidas, RB4-RB7 entradas ;Tiempo de espera para estabilizar la puerta B ;Selecciona banco 0 ;Desconecta mscara de interrupcin RBIE ;Lee estado actual de reposo de las entradas ;Reponer el flag de interrupcin ;Activa mscara de interrupcin RBIE ;Selecciona pgina 1 de datos ;Puerta A digital ;Activa Pull-Up para las entradas de la puerta B ;Selecciona pgina 0 de datos ;Configura Puerta A y B como salidas ;Rutina de inicializacin del LCD ;LCD en ON

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

71

TRABAJO Y EXPLICACIN PIC 16F87X call LCD_REG ;Borra LCD y HOME

2 DPE

;Salida del mensaje "Tecla pulsada:" movlw Mens_0 call Mensaje clrf clrf bsf movlw movwf nop nop bcf bcf movf bcf bsf bsf Loop sleep nop goto end PORTA PORTB STATUS,RP0 b'11110000' TRISB STATUS,RP0 INTCON,RBIE PORTB,W INTCON,RBIF INTCON,RBIE INTCON,GIE ;Visualiza el mensaje

;Selecciona banco 1 ;RB0-RB3 salidas, RB4-RB7 entradas ;Tiempo de espera para estabilizar la puerta B ;Selecciona banco 0 ;Desconecta mscara de interrupcin RBIE ;Lee estado actual de reposo de las entradas ;Reponer el flag de interrupcin ;Activa mscara de interrupcin RBIE ;Activa interrupciones

Loop

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

72

TRABAJO Y EXPLICACIN PIC 16F87X

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 org goto org goto 0x20 0x22 0x23 0x24 0x25 0x26 0x27 0x28 0x29 0x04 Inter 0x05 Inicio ;Incluye rutinas de manejo del LCD ;Inicio de variables de las rutinas LCD ;Parte baja del byte a convertir ;Parte alta del byte a convertir ;Byte 2 de conversin a BCD ;Byte 1 de conversin a BCD ;Byte 0 de conversin a BCD ;Variable de contaje ;Variable temporal ;Variable para la temporizacin ;Vector de interrupcin

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

Visual_loop

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

73

TRABAJO Y EXPLICACIN PIC 16F87X

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 bcf clrf bsf clrf clrf clrf rlf rlf rlf rlf rlf decfsz goto return movlw movwf call incf call incf call goto movf addlw movwf btfsc movwf movf addlw movwf btfsc movwf return STATUS,C Contador Contador,4 BCD_0 BCD_1 BCD_2 Byte_L,F Byte_H,F BCD_2,F BCD_1,F BCD_0,F Contador,F Ajuste BCD_2 FSR Ajuste_BCD FSR,F Ajuste_BCD FSR,F Ajuste_BCD Loop_16 INDF,W 0x03 Temporal Temporal,3 INDF INDF,W 0x30 Temporal Temporal,7 INDF

;Carga el contador con 16 ;Puesta a 0 inicial

Loop_16

;Desplaza a izda. (multiplica por 2)

Ajuste

;Inicia el ndice ;Ajusta el primer byte ;Ajusta el segundo byte

Ajuste_BCD

;Mayor de 7 el nibble de menos peso ?? ;Si, lo acumula

;Mayor de 7 el nibble de menos peso ?? ;Si, lo acumula

;Programa de tratamiento de la interrupcin que se provoca cuando el TMR0 temporice 10mS. ;Trabajando a 20MHz el TMR0 evoluciona cada 0.2 uS. Con un preescaler de 256, hay que cargar el ;valor 195 para provocar una interrupcin cada 10 mS. Esta se repite 100 veces para obtener una ;temporizacin total de 1" Inter Si_1000_mS 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 ;Ha pasado 1000mS (1") ?? ;No ;TMR1 en Off, cuenta de pulsos externos detenida ;Salva parte baja del contador ;Salva parta alta del contador ;Convierte a BCD el resultado de la cuenta ;Visualiza el resultado en el LCD ;Repone el TMR0 para temporizar 10 ms ;Repone variable para temporizar otro segundo

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

74

TRABAJO Y EXPLICACIN PIC 16F87X bcf clrf clrf bsf retfie No_1000_mS INTCON,2 TMR1L TMR1H T1CON,0 ;Repone flag del TMR0

2 DPE

;Borra el TMR1 ;TMR1 en On, se inicia la nueva cuenta de pulsos externos

movlw b195 movwf TMR0 bcf INTCON,2 retfie

;Repone para temporizar otros 10mS ;Repone el flag del TMR0

;-----------------------------------------------------------------------------------------------------------------------------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 ;Borra los latch de salida ;Borra los latch de salida ;Selecciona banco 1 ;Puerta A E/S digitales ;Puerta B se configura como salida ;Puerta A se configura como salida ;Preescaler de 256 asociado al TMR0 ;Puerta C como entrada ;Selecciona banco 0

;El TMR1 acta como contador externo asncrono y con un preescaler de 1:1 movlw b'00000010' movwf T1CON clrf clrf call call movlw call movlw movwf movlw movwf TMR1L TMR1H UP_LCD LCD_INI b'00001100' LCD_REG b100 Delay b195 TMR0 ;TMR1 Off ;Puesta a 0 del TMR1 ;Configura puerto para el LCD ;Inicia el LCD ;LCD On, cursor y blink Off ;Prepara temporizacin total de 1000mS (1") ;TMR0 comienza a temporizar 10 ms ;TMR1 en On, comienza la cuenta de pulsos externos ;Habilita interrupcin del TMR0 ;Bucle

bsf T1CON,0 movlw b'10100000' movwf INTCON Loop nop goto end Loop

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

75

TRABAJO Y EXPLICACIN PIC 16F87X

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 org goto org goto 0x20 0x21 0x04 Inter 0x05 Inicio ;Variable de temporizacin ;Variable del contador de segundos ;Vector de interrupcin

;-----------------------------------------------------------------------------------------------------------------------------;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' ;Desplazamiento sobre la tabla ;Dgito 0 ;Dgito 1 ;Dgito 2 ;Dgito 3 ;Dgito 4 ;Dgito 5 ;Dgito 6 ;Dgito 7 ;Dgito 8 ;Dgito 9

;Programa de tratamiento de la interrupcin que provoca el TMR2 cada 10mS. Inter 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 ;Ha pasado un segundo ?? ;No ;Si, incrementa el contador de segundos ;Contador > 9 ?? ;Si, ponerlo a 0 ;Convierte a 7 segmentos ;Visualiza sobre el display ;Reinicia variable delay ;Repone el flag del TMR2

No_es_1_seg

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

76

TRABAJO Y EXPLICACIN PIC 16F87X Inicio clrf bsf clrf bsf movlw movwf bcf PORTB STATUS,RP0 TRISB PIE1,TMR2IE b195 PR2 STATUS,RP0 ;Desconecta salidas ;Selecciona banco 1 ;Puerta B se configura como salida ;Habilita interrupcin del TMR2 ;Carga registro de periodos con 195 ;Selecciona banco 0

2 DPE

;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). movlw b'01111111' movwf T2CON clrf TMR2 movlw b100 movwf Delay movlw b'11000000' movwf INTCON clrf Loop nop goto end Contador Loop ;TMR2 On, preescaler/postcaler = 1:16 ;Inicia el TMR2 ;Inicia variable de delay ;Habilita interrupciones ;Inicia el contador de segundos ;Bucle

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

77

TRABAJO Y EXPLICACIN PIC 16F87X

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 org goto org goto 0x20 0x22 0x23 0x24 0x25 0x26 0x27 0x28 0x29 0x2a 0x2b 0x04 Inter 0x05 Inicio ;Incluye rutinas de manejo del LCD ;Variables para las rutinas de manejo del LCD ;Parte baja del byte a convertir ;Parte alta del byte a convertir ;Byte 2 de conversin a BCD ;Byte 1 de conversin a BCD ;Byte 0 de conversin a BCD ;Variable de contaje ;Variable temporal ;N de capturas ;Variables temporales para las capturas ;Vector de interrupcin

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

Visual_loop

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

78

TRABAJO Y EXPLICACIN PIC 16F87X call movlw call movlw call return LCD_DATO 0xe4 LCD_DATO 'S' LCD_DATO ;Visualiza ' ' ;Visualiza micro ;Visualiza 'S'

2 DPE

;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 bcf clrf bsf clrf clrf clrf rlf rlf rlf rlf rlf decfsz goto return movlw movwf call incf call incf call goto movf addlw movwf btfsc movwf movf addlw movwf btfsc movwf return STATUS,C Contador Contador,4 BCD_0 BCD_1 BCD_2 Byte_L,F Byte_H,F BCD_2,F BCD_1,F BCD_0,F Contador,F Ajuste BCD_2 FSR Ajuste_BCD FSR,F Ajuste_BCD FSR,F Ajuste_BCD Loop_16 INDF,W 0x03 Temporal Temporal,3 INDF INDF,W 0x30 Temporal Temporal,7 INDF

;Carga el contador con 16 ;Puesta a 0 inicial

Loop_16

;Desplaza a izda. (multiplica por 2)

Ajuste

;Inicia el ndice ;Ajusta el primer byte ;Ajusta el segundo byte

Ajuste_BCD

;Mayor de 7 el nibble de menos peso ?? ;Si, lo acumula

;Mayor de 7 el nibble de menos peso ?? ;Si, lo acumula

;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 ;Repone el flag del mdulo CCP1 ;Es la captura del flanco ascendente ?? ;Si, medir el tiempo transcurrido entre ambas ;No, ha sido la captura del flanco descendente

;Salvar, temporalmente, el 1er valor capturado ;Capturar al flanco ascendente

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

79

TRABAJO Y EXPLICACIN PIC 16F87X 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 ;Es la captura del flanco ascendente

2 DPE

;Restar el tiempo entre la 2 captura y la 1 ;Convertir a BCD ;Capturar el 1er. flanco ;Salida a pantalla LCD ;Captura al flanco descendente

;-----------------------------------------------------------------------------------------------------------------------------Inicio clrf clrf bsf movlw movwf clrf clrf movlw movwf bsf bcf call call movlw call PORTB PORTA STATUS,RP0 b'00000110' ADCON1 TRISB TRISA b'11111111' TRISC PIE1,CCP1IE STATUS,RP0 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 ;TMR1 en On, preescaler 1:8 ;Habilita interrupciones

;El mdulo CCP1 acta en modo de captura al flanco descendente movlw b'00000100' movwf CCP1CON clrf Loop nop goto end Captura Loop ;Mdulo CCP en On ;Inicia captura en el 1er. flaco descendente ;Bucle

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

80

TRABAJO Y EXPLICACIN PIC 16F87X

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 ;Repone el flag del mdulo CCP1 ;TMR1 en Off ;Puesta a 0 del TMR1 ;RB0 cambia de estado ;TMR1 en On

;-----------------------------------------------------------------------------------------------------------------------------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 movlw b'11000000' movwf INTCON ;TMR1 en Off ;Habilita interrupciones

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

81

TRABAJO Y EXPLICACIN PIC 16F87X ;El mdulo CCP1 acta en modo de comparacin e interrupcin al coincidir movlw b'00001010' movwf CCP1CON clrf clrf clrf bsf Loop clrf movf andlw movwf goto end CCPR1H TMR1L TMR1H T1CON,TMR1ON CCPR1H PORTA,W b'00111111' CCPR1L Loop ;Mdulo CCP en modo comparacin

2 DPE

;Puesta a 0 de la parte alta del valor a comparar ;Puesta a 0 del TMR1 ;TMR1 en On, comienza a contar ;Pone a 0 la parte alta del valor a comparar ;Lee las entradas RA5-RA0 ;Ajusta la parte baja del valor a comparar ;Bucle

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

82

TRABAJO Y EXPLICACIN PIC 16F87X

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 Periodo equ equ org 0x20 b200 0x05 ;Variable temporal ;Periodo 640uS (200*Preescaler de 16*0.2)

;-----------------------------------------------------------------------------------------------------------------------------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) movlw b'00000111' movwf T2CON Loop movf andlw movwf goto end PORTA,W b'00111111' CCPR1L Loop ;T2 en On

;Carga la anchura del pulso (n*8*Prescaler de 16) ;Bucle infinito

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

83

TRABAJO Y EXPLICACIN PIC 16F87X

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 org goto 0x20 0x22 0x05 Inicio ;Incluye rutinas de manejo del LCD ;Variables de las rutinas LCD ;Variable temporal

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: 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 ;Sita el cursor del LCD ;N de caracteres a visualizar

Visual_loop

;Rotacin del siguiente bit ;Testea el bit a visualizar ;Est a 1

Bit_1 Visu_1

;Visualiza el "0" o el "1" sobre el LCD ;Siguiente caracter

;-----------------------------------------------------------------------------------------------------------------------------Inicio clrf clrf bsf movlw movwf clrf clrf bcf call call movlw call PORTA PORTB STATUS,RP0 b'00000110' ADCON1 TRISB TRISA STATUS,RP0 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

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

84

TRABAJO Y EXPLICACIN PIC 16F87X ;Se activa el ADC y se selecciona el canal RA0/AN0. Frecuencia de trabajo Fosc/32 movlw b'10000001' movwf ADCON0 Loop bsf movlw movwf clrf bcf bcf nop bsf btfss goto STATUS,RP0 b'00111111' TRISA ADCON1 STATUS,RP0 PIR1,ADIF ADCON0,GO PIR1,ADIF ADC_Wait ;ADC en On, seleciona canal AN3 ;Selecciona pgina 1 ;Puerta A entradas ;Puerta A entradas analgicas ;Selecciona pgina 0 ;Restaura el flag del conversor AD ;Inicia la conversin ;Fin de conversin ?? ;Todava no

2 DPE

ADC_Wait

;Las lneas de la Puerta A se reconfiguran como salidas digitales para la visualizacin bsf movlw movwf bcf call call goto end 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

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

85

You might also like