Está en la página 1de 40

Seguidores de clase

Universidad Pontificia de Salamanca (Madrid) Microcontrolador PIC 16F877

Microcontroladores
INDICE

Versin 1.5

04 oct. 07

pg. 1

Caractersticas generales del PIC 16F877............................................................................................................ 2 Diagrama de bloques del PIC 16F877................................................................................................................. 3 Organizacin de la memoria RAM...................................................................................................................... 4 Tipos de direccionamiento de la RAM................................................................................................................ 5 Formas de modificar el Contador de Programa.................................................................................................... 5 Registro de estado .............................................................................................................................................. 6 ALU .................................................................................................................................................................. 6 Set de instrucciones............................................................................................................................................ 6 Instrucciones de transferencia ......................................................................................................................... 9 Instrucciones aritmticas................................................................................................................................. 9 Instrucciones lgicas .................................................................................................................................... 10 Incrementos/Decrementos............................................................................................................................. 10 Instrucciones de rotacin .............................................................................................................................. 10 Instrucciones de manipulacin de bits............................................................................................................... 10 Instrucciones de control ................................................................................................................................ 11 Instrucciones de salto incondicional .............................................................................................................. 11 Instrucciones de salto condicional................................................................................................................. 11 Proceso de ensamblado..................................................................................................................................... 13 Representacin de nmeros y cadenas .............................................................................................................. 15 Directivos del ensamblador .............................................................................................................................. 15 Operador $ ................................................................................................................................................... 16 Directivas para programas absolutos ............................................................................................................. 16 Directivas para programas reubicables .......................................................................................................... 17 Programa Display.ASM (Programa absoluto).................................................................................................... 18 Mdulo CONTAR.ASM (Programa reubicable)................................................................................................ 20 Mdulo Display.ASM ...................................................................................................................................... 21 Interrupciones. ................................................................................................................................................. 22 Proceso para atencin de interrupciones............................................................................................................ 23 Plantilla de programa absoluto con atencin a interrupciones. ........................................................................... 24 Reset................................................................................................................................................................ 25 Modo Sleep...................................................................................................................................................... 26 Reloj. ............................................................................................................................................................... 26 Modo Debug. ................................................................................................................................................... 27 Bits de Configuracin....................................................................................................................................... 27 Perifricos 16F877 ........................................................................................................................................... 28 Puertos programables de E/S. ........................................................................................................................... 29 Timers ............................................................................................................................................................. 30 Timer0 ......................................................................................................................................................... 30 Watch dog Timer.......................................................................................................................................... 30 Timer1 ......................................................................................................................................................... 31 Timer2 ......................................................................................................................................................... 32 CAPTURE/COMPARE/PWM ......................................................................................................................... 33 Master Synchronous Serial Port........................................................................................................................ 34 Addressable Universal Synchronous Asynchronous Receiver Transmitter (USART). ........................................ 34 Analog/Digital Converter. ................................................................................................................................ 35 Microcontrolador 16F876................................................................................................................................. 37 Microcontrolador 16F84.................................................................................................................................. 38

Microcontroladores
Microcontrolador circuito ubicuo.

Versin 1.5

04 oct. 07

pg. 1

Microcontroladores

Versin 1.5

04 oct. 07

pg. 2

Caractersticas generales del PIC 16F877


Procesador Descripcin Ncleo Interrupciones Reloj Reset Instrucciones M. de programa tipo FLASH M. de datos RAM M. de datos EEPROM Pila M. de datos ext. EEPROM Puertos programables de E/S Timers/Counters Puertos de captura/comparacin de datos Moduladores de ancho de pulso (PWM) Conversor Analgico/Digital de 10 bits Puerto serie sncrono USART Parallel Slave Port Caractersticas RISC, Arq. Harvard, 20 MHz. 5 MIPS 14 fuentes posibles de interrupcin 0-20 MHz. Master Clear, Brown Out, Watchdog, Power On 35 instrucciones de 14 bits 8 K palabras de 14 bits 368 registros de 8 bits 256 registros de 8 bits 8 palabras de 13 bits Hasta 256 KBytes Hasta 33 bits, pueden ser usados por otros perifricos Dos de 8 bits y uno de 16 bits Dos de 8 bits Dos de 8 bits Con un MPX de 8 canales para 8 entradas diferentes Configurable en modo SPI e I2C Para conexiones RS 232 8 bits + 3 bits de control

Memoria

Perifricos

Tabla 1 Caractersticas generales del PIC 16F877

Microcontroladores

Versin 1.5

04 oct. 07

pg. 3

Diagrama de bloques del PIC 16F877

Figura 1 Diagrama de bloques del PIC 16F877

Microcontroladores

Versin 1.5

04 oct. 07

pg. 4

Organizacin de la memoria RAM


Registro
Indirect. addr.(*) 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
Dir. 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

Registro
Indirect. addr.(*) OPTION_REG PCL STATUS FSR TRISA TRISB TRISC TRISD TRISE PCLATH INTCON PIE1 PIE2 PCON

SSPCON2 PR2 SSPADD SSPSTAT

TXSTA SPBRG

ADRESL ADCON1

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

Registro
Indirect. addr.(*) TMR0 PCL STATUS FSR PORTB

PCLATH INTCON EEDATA EEADR EEDATH EEADRH

Registros de propsito general 96 bytes

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

Registro
Indirect. addr.(*) OPTION_REG PCL STATUS FSR TRISB

PCLATH INTCON EECON1 EECON2

Registros de propsito general 96 bytes

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

Registros de propsito general 96 bytes

Registros de propsito general 80 bytes


EFH F0H 16FH 170H 1EFH 1F0H

Acceso a 70H-7FH
7FH FFH

Acceso a 70H-7FH
17FH

Acceso a 70H-7FH
1FFH

Banco 0

Banco 1

Banco 2

Banco 3

(*) No es un registro fsico, sino el indicador de acceso indirecto a memoria

Tabla 2 Organizacin de la memoria RAM

Microcontroladores

Versin 1.5

04 oct. 07

pg. 5

Tipos de direccionamiento de la RAM

Figura 2 Tipos de direccionamiento para apuntar a los registros de la RAM

Formas de modificar el Contador de Programa

Figura.3 Formas de modificar el Contador de Programa.

Microcontroladores

Versin 1.5

04 oct. 07

pg. 6

Registro de estado
Registro de estado
7 0

IRP

RP1

RP0

Direccionamiento

TO

Reset

PD

DC
Flags ALU

Tabla.3 Bits del registro de estado.


DC= Flag de acarreo intermedio, indica en las sumas y restas desbordamiento entre los bits tres y cuatro. C= Flag de Carry. Si vale 1 despus de una suma indica desbordamiento, Si vale 1 despus de una resta indica que NO ha habido desbordamiento.

ALU

Figura.4 ALU y elementos directamente conectados a ella.

Set de instrucciones.
Formato de una instruccin: [etiqueta] mnemnico [operando1[, operando2]] [; comentario] Tipos de operandos en una instruccin: f: Indica un n de registro dentro de un banco de la RAM. Es un valor de 7 bits. d: Operando destino. Es un bit que si vale 0 indica que el resultado debe almacenarse en W y si vale 1 en el registro usado como primer operando. b: Es usado en las instrucciones que afectan a un nico bit, y apunta al bit destino de la instruccin. k: Constante. Las instrucciones van a manejar dos tipos de constantes, si la instruccin es CALL o GOTO la constante es de 11 bits (k11) y hace referencia a la direccin a la que se va a saltar. En cualquier otro caso se trata de un valor de 8 bits (k8) que se usar como valor inmediato en una operacin que siempre involucra a la ALU y al acumulador.

Microcontroladores

Versin 1.5

04 oct. 07

pg. 7

El fichero p16f677.inc Usaremos ejemplos del uso de instrucciones. Es conveniente conocer que todos los nombres de registros de propsito especfico, y los bits de estos estn definidos en el fichero p16f877.inc y es muy til incluirlo en nuestros programas. Se definen smbolos como STATUS con el valor 3 (Direccin del registro STATUS en la memoria RAM), TRISB con el valor 86H (que es su direccin en la memoria RAM). Tambin se definen bits como RP0 y RP1 con los valores 5 y 6 que corresponden a las posiciones de esos bits en el registro de STATUS. Tambin se definen W con el valor 0 y F con el valor 1 para usarlos en el lugar del operando d de algunas instrucciones. Destacar que el ensamblador del PIC es CASE SENSITIVE.

Microcontroladores

Versin 1.5

04 oct. 07

pg. 8

Instruccin ADDLW ADDWF ANDLW ANDWF BCF BSF BTFSC BTFSS CALL CLRF CLRW CLRWDT COMF DECF DECFSZ GOTO INCF INCFSZ IORLW IORWF MOVF MOVLW MOVWF NOP RETFIE RETLW RETURN RLF RRF SLEEP SUBLW SUBWF SWAPF XORLW XORWF k8 f, d k8 f, d f, b f, b f, b f, b k11 f

Descripcin W+k8 W Si d=0, W+f W. si d=1 W+ff Wk8 W Si d=0, Wf W. si d=1 Wff 0 bit(b) de f 1 bit(b) de f Comprobar bit b en f, saltar si es 0 Comprobar bit b en f, saltar si es 1 PC pila, bits 4,3 de PCLATH + k11 PC 0f 0W Poner a 0 el Watch Dog Timer. f,d Si d=0, Ca1(f) W. si d=1 Ca1(f)f f, d Si d=0, f-- W. si d=1 f-- f f, d Si d=0, f-- W, si d=1 f-- f, saltar si cero k11 bits 4,3 de PCLATH + k11 PC f, d Si d=0, f++ W. si d=1 f ++f f, d Si d=0, f++ W, si d=1 f++ f, saltar si cero k8 Wk8 W f, d Si d=0, Wf W. si d=1 Wff f, d Si d=0, f W. si d=1 ff k8 k8 W f W f No operar pila PC, 1 GIE k8 pila PC; k8 W pila PC Rotacin a la izquierda a travs de carry de f, f, d dejando el resultado en W o f segn d Rotacin a la derecha a travs de carry de f, f, d dejando el resultado en W o f segn d Pasar a modo standby k8 k8 -W W f, d Si d=0, f-W W. si d=1 f-Wf Intercambia los dos nibbles (4 bits) de f, f, d dejando el resultado en W o f segn d k8 Wk8 W f, d Si d=0, Wf W. si d=1 Wff

Flags modif.. C, DC, Z C, DC, Z Z Z Ninguno Ninguno Ninguno Ninguno Ninguno Z Z TO , PD Z Z Ninguno Ninguno Z Ninguno Z Z Z Ninguno Ninguno Ninguno GIE Ninguno Ninguno C C TO , PD C, DC, Z C, DC, Z Ninguno Z Z

Tabla 4 Set de instrucciones del PIC 16F877 ordenadas alfabticamente.

Microcontroladores

Versin 1.5

04 oct. 07

pg. 9

Instrucciones de transferencia
CLRF CLRW MOVLW MOVWF MOVF SWAPF
Ejemplos clrf Var1 ;0 -> Var1

f k8 f f, d f, d

0f 0W k8 W W f Si d=0, f W. si d=1 ff Intercambia los dos nibbles (4 bits) de f, dejando el resultado en W o f segn d

Flags modif.. Z Z Ninguno Ninguno Z Ninguno

; Transferir un 7 a Var2 movlw 7 movwf Var2 ; Transferir Var1 -> Var2 movf Var1, W movwf Var2

Instrucciones aritmticas
ADDLW ADDWF SUBLW SUBWF k8 f, d k8 f, d W+k8 W Si d=0, W+f W. si d=1 W+ff k8-W W Si d=0, f-W W. si d=1 f-Wf Flags modif.. C, DC, Z C, DC, Z C, DC, Z C, DC, Z

; Sumar 5 a Var3 movlw 5 addwf Var3, F ; Saltar a Etiq1 si Var3 > 9 (Si var3-10 no es negativo, cumple la condicin) movlw 10 subwf Var3, W ; Saltar a Etiq1 si resultado no es negativo ; Equivale a saltar si no hay desbord. en la resta es decir si Fc=1

Microcontroladores

Versin 1.5

04 oct. 07

pg. 10

Instrucciones lgicas
ANDLW ANDWF COMF IORLW IORWF XORLW XORWF k8 f, d f,d k8 f, d k8 f, d Wk8 W Si d=0, Wf W. si d=1 Wff Si d=0, Ca1(f) W. si d=1 Ca1(f)f Wk8 W Si d=0, Wf W. si d=1 Wff Wk8 W Si d=0, Wf W. si d=1 Wff Flags modif.. Z Z Z Z Z Z Z

; Saltar a Etiq1 si Var3 = 9 (Si var39 es 0, cumple la condicin) movlw 9 xorwf Var3, W ; Saltar a Etiq1 si Fz=1

Incrementos/Decrementos
DECF INCF f, d f, d Si d=0, f-- W. si d=1 f-- f Si d=0, f++ W. si d=1 f ++f Flags modif.. Z Z

Instrucciones de rotacin
Flags modif.. RLF RRF f, d f, d Rotacin a la izquierda a travs de carry de f, dejando el resultado en W o f segn d Rotacin a la derecha a travs de carry de f, dejando el resultado en W o f segn d C C

Instrucciones de manipulacin de bits


BCF BSF f, b f, b 0 bit(b) de f 1 bit(b) de f Flags modif.. Ninguno Ninguno

; En la placa de la prctica, el diodo LED est conectado al pin 1 del PORTB ; Encender el LED BSF PORTB, 1 ; Apagar el LED BCF PORTB, 1

Microcontroladores

Versin 1.5

04 oct. 07

pg. 11

Instrucciones de control
Flags modif.. CLRWDT SLEEP Poner a 0 el Watch Dog Timer. Pasar a modo standby TO , PD TO , PD

Instrucciones de salto incondicional


CALL GOTO RETFIE RETLW RETURN Flags modif.. k11 PC pila, bits 4,3 de PCLATH + k11 PC Ninguno k11 bits 4,3 de PCLATH + k11 PC Ninguno GIE pila PC, 1 GIE k8 pila PC; k8 W Ninguno Ninguno pila PC

Instrucciones de salto condicional


BTFSC BTFSS DECFSZ INCFSZ f, b f, b f, d f, d Flags modif.. Comprobar bit b en f, saltar si es 0 Ninguno Comprobar bit b en f, saltar si es 1 Ninguno Ninguno Si d=0, f-- W, si d=1 f-- f, saltar si cero Ninguno Si d=0, f++ W, si d=1 f++ f, saltar si cero

; Saltar a Etiq1 si Var3 = 9 (Si var39 es 0, cumple la condicin) movlw 9 xorwf Var3, W ; Saltar a Etiq1 si Fz=1 btfsc STATUS, Z goto Etiq1 ; Saltar a Etiq1 si Var3 > 9 (Si var3-10 no es negativo, cumple la condicin) movlw 10 subwf Var3, W ; Saltar a Etiq1 si resultado no es negativo ; Equivale a saltar si no hay desbord. en la resta es decir si Fc=1 btfsc STATUS, C goto Etiq1 Dado que es incmodo manejar las condiciones de salto de esta forma, se dispone de unas macros predefinidas para manejar las condiciones ms frecuentes (Fz y Fc) BZ BNZ BC BNC Etiq Etiq Etiq Etiq ; ; ; ; Saltar Saltar Saltar Saltar a a a a Etiq Etiq Etiq Etiq si si si si Fz=1 Fz=0 Fc=1 Fc=0

Microcontroladores

Versin 1.5

04 oct. 07

pg. 12

Existe una tcnica para implementar una estructura similar al un CASE sumndole un valor al PCL. : ; ; ; Esta secuencia de instrucciones permite saltar a diferentes etiquetas en funcin del valor de Var3. Var3 debera ser menor o igual que 6. Si PCLATH=0 debemos estar seguros de que el bloque se encuentra en las primeras 256 posiciones de la memoria principal movf Var3, W addwf PCL, F goto Etiq1 goto Etiq2 goto Etiq3 goto Etiq4 goto Etiq5 goto Etiq6 Tambin se puede crear una tabla de conversin de cdigos:. : Esta secuencia de instrucciones permite convertir W en otro valor. W debera ser menor o igual que 8. ; Si PCLATH=0 debemos estar seguros de que el bloque se encuentra en las ; primeras 256 posiciones de la memoria principal addwf PCL, F retlw B'11111100' retlw B'01100000' retlw B'11011010' retlw B'11110010' retlw B'01100110' retlw B'10110110' retlw B'10111110' retlw B'11100000' retlw B'11111110' retlw B'11100110'

Microcontroladores

Versin 1.5

04 oct. 07

pg. 13

Proceso de ensamblado

Figura 5 Proceso de ensamblado de un programa absoluto.

Figura.6 Proceso de ensamblado de un programa con cdigo reubicable.

Microcontroladores

Versin 1.5

04 oct. 07

pg. 14

Figura 7 Entradas y salidas para las herramientas de desarrollo MPLAB

Microcontroladores

Versin 1.5

04 oct. 07

pg. 15

Representacin de nmeros y cadenas


Base Binario Octal Decimal Hexadecimal Carcter String Sintaxis B'dgitos binarios' O'dgitos octales' D'dgitos decimales' H'dgitos hexadecimales' 0xdgitos hexadecimales Finalizar la cadena con H Los caracteres se almacenan en cdigo ASCII de 7 bits Los caracteres se almacenan en cdigo ASCII de 7 bits Ejemplo B'101' O'123' D'123' H'12AB' 0x12AB 12ABH A'a' 'a' "cadena de caracteres"

Directivos del ensamblador


Veremos algunos de los directivos del ensamblador para programas absolutos.

#DEFINE
#define <nombre> [<cadena_de _caracteres>] #define TAM_NOMBRE 0x20 #define BitControl 0x19,7 ..... bsf BitControl ; Equivale a bsf 0x19, 7

END
Debe colocarse siempre al final del programa o del mdulo

#INCLUDE
#INCLUDE <Fichero_a_incluir>

LIST
LIST [<opcin>, ... , <Opcin>] Opcin n=nnn p=<tipo> r=<radix> ..... Valor por defecto 60 Ninguno hex LIST p=16F877, r=dec Descripcin Lneas por pgina de listado Selecciona procesador Selecciona radix (hex, dec, oct)

BANKSEL
Genera las instrucciones necesarias para seleccionar el banco de memoria adecuado. BANKSEL <NomSimb|Expres> BANKSEL TRISB BANKSEL 130H ; Selecciona el banco correspondiente a TRISB ; Selecciona el Banco 2

Microcontroladores

Versin 1.5

04 oct. 07

pg. 16

Operador $
Aunque no es una directiva, este puede ser un lugar oportuno para verlo. Se sustituye por la direccin de la lnea en la que se encuentra goto $ ; Bucle infinito

btfsc FILE, BIT goto $-1 ;No se sale de este bucle hasta que BIT=0

Directivas para programas absolutos


EQU
<NomSimb> EQU 0x20 Asigna un valor numrico a un nombre simblico. Se usa en el proceso de declaracin de variables. En el microcontrolador con Arq. Harvard no se reserva espacio para las variables (la memoria de datos tiene el mismo tamao independientemente de que se utilicen muchas variables o pocas), sino que se indica en que zona de la memoria de datos se almacenar una variable. Var1 Var2 Var3 EQU 0x20 EQU 0x21 EQU 0x22 movwf Var1 El ensamblador lo transforma en movwf 0x20 Esto transferir el contenido del acumulador a la posicin 20H del banco de memoria activo (debera ser el Banco 0) Si se hubiera querido transferir a W la direccin de Var1 usaramos: movlw Var1 El ensamblador lo transforma en movlw 0x20

CBLOCK
Como es frecuente en programas absolutos declarar muchas constantes, esta directiva lo permite hacer de forma ms eficiente. CBLOCK [<expresin>] <NomVar>[:<incremento>][,<NomVar>[:<incremento>][, ...]] ENDC CBLOCK 0x20 Var1, Var2, Var3 ENDC El bloque anterior equivale a: Var1 Var2 Var3 EQU 0x20 EQU 0x21 EQU 0x22

Microcontroladores

Versin 1.5

04 oct. 07

pg. 17

Se puede hacer una definicin ms sofisticada de datos: CBLOCK 0x30 DobleByte:0, DobleByteAlto, DobleByteBajo Nombre: TAM_NOMBRE Word1:2, Word2: 2 Var1, Var2, Var3 ENDC

ORG
Indica la posicin en la memoria de programa que ocupar la primera instruccin que aparezca [Etiqueta] ORG <expresin> ORG 0x20

Directivas para programas reubicables


Directivos de declaracin de secciones
Tipo CODE IDATA. UDATA UDATA_ACS. UDATA_OVR. UDATA_SHR. Nombre por defecto .code .idata .udata .udata_acs .udata_ovr .udata_shr Descripcin Esta seccin contendr cdigo. El resto de secciones slo datos. Esta seccin contendr variables inicializadas. Esta seccin contendr variables no inicializadas. Esta seccin contendr variables accesibles de forma ms rpida. Esta seccin contendr variables temporales sobreescribibles. Esta seccin contendr variables accesibles en varios bancos.

Tabla 5 Directivos de declaracin de secciones.


RES
Reserva espacio para variables sin forzar ninguna direccin [<NomVar>] RES <Unidades_de_memoria>. UDATA ValorActual RES 1 Aux1 RES 1 Aux2 RES 2 Aux3 RES 1

EXTERN
EXTERN <Etiqueta> [, <Etiqueta> ... ] EXTERN Var1 ....... MOVF Var1, W

GLOBAL
GLOBAL <Etiqueta> [, <Etiqueta> ... ] Var1 Var2 UDATA RES 1 RES 2 GLOBAL Var1, Var2

Microcontroladores

Versin 1.5

04 oct. 07

pg. 18

Programa Display.ASM (Programa absoluto)


; ; ; Programa: Disp1.ASM. Este programa cuenta desde 0 hasta F mostrando la cuenta en un display de 7 segmentos. los incrementos se producen a cada segundo si el reloj de la CPU es de 4 MHz. list p=16f877, r=dec ; Indicamos cual va a ser el procesador destino #include p16f877.inc ; Definicin de constantes relacionadas con el uC __CONFIG _CP_OFF & _WDT_ON & _BODEN_ON & _PWRTE_ON & _RC_OSC & _WRT_ENABLE_ON & _LVP_ON & _DEBUG_OFF & _CPD_OFF CBLOCK 0X20 ValorActual, Aux1, Aux2, Aux3 ENDC ORG 0 nop ; Si se utiliza el ICD se recomienda poner nop clrf PCLATH ; Algunos tipos de reset no inicializan este registro goto Inicio

Inicio ; En primer lugar inicializaremos el puerto C para que configure todas sus lneas ; como salidas. Se supone que a este puerto se han conectado los siete segmentos ;de un display ; Inicializamos las variables clrf ValorActual ; Configuramos los bits del puertoC como salidas BANKSEL TRISC clrf TRISC ; Configurar pines de PORTC como salidas clrf STATUS ; Apuntamos a la pgina 0 Bucle ; Comienzo del bucle principal movf ValorActual, W ; Muevo ValorActual a W call hex27seg ; Llamamos a rutina de conversin movwf PORTC ; ponemos resultado en PORTC (el display) incf ValorActual, F ; Incrementamos el valor para la siguiente btfsc ValorActual, 4 ; iteracin, y si se activa el bit 4, hemos clrf ValorActual ; llegado a 10H, y reseteamos la variable. movlw movwf call decfsz goto goto 8 Aux1 Espera1 Aux1, F Espera Bucle ; Inicializamos Aux1 a 8 para conseguir ; una espera algo mayor que 1 segundo. ; Rutina con un retardo de 0,13 seg. Aprox.

Espera

; Retornar al bucle principal Espera1 ; Realiza 256 llamadas a la rutina Espera2 movlw 0xff movwf Aux2 Bucle1 call Espera2 decfsz Aux2, F goto Bucle1 return Espera2 ; Recorre 256 veces el bucle Bucle2. movlw 0xff movwf Aux3 Bucle2 decfsz Aux3, F goto Bucle2 return

Microcontroladores

Versin 1.5

04 oct. 07

pg. 19

;**************************************** hex27seg ;**************************************** ; Subrutina hex27seg, que recibe un valor hexadecimal de un dgito en W, ; y devuelve en el mismo registro el valor correspondiente al de un ; display de 7 segmentos. ; A continuacin se muestra el nombre de cada segmento en un Display ; ----; | a | ; f| |b ; | | ; ----; | g | ; e| |c ; | | ; ----; d ; Se asignar el bit 7 al segmento 'a', el 6 al 'b', ... , el 1 al 'g' ; El bit 0 queda sin asignar. Se puede usar para el punto digital del display ; Los segmentos a iluminar para cada dgito son: ; Bits 7,6,5,4,3,2,1,0 Valor binario ; ==== =============== ============= ; 0 = a,b,c,d,e,f B'11111100' ; 1 = b,c B'01100000' ; 2 = a,b, d,e, g B'11011010' ; 3 = a,b,c,d, g B'11110010' ; 4 = b,c, f,g B'01100110' ; 5 = a, c,d, f,g B'10110110' ; 6 = a, c,d,e,f,g B'10111110' ; 7 = a,b,c B'11100000' ; 8 = a,b,c,d,e,f,g B'11111110' ; 9 = a,b,c, f,g B'11100110' ; A = a,b,c, e,f,g B'11101110' ; B = c,d,e,f,g B'00111110' ; C = a, d,e,f B'10011100' ; D = b,c,d,e, g B'01111010' ; E = a, d,e,f,g B'10011110' ; F = a, e,f,g B'10001110' ANDLW B'00001111' ADDWF PCL, F retlw B'11111100' retlw B'01100000' retlw B'11011010' retlw B'11110010' retlw B'01100110' retlw B'10110110' retlw B'10111110' retlw B'11100000' retlw B'11111110' retlw B'11100110' retlw B'11101110' retlw B'00111110' retlw B'10011100' retlw B'01111010' retlw B'10011110' retlw B'10001110' end

Microcontroladores

Versin 1.5

04 oct. 07

pg. 20

Mdulo CONTAR.ASM (Programa reubicable)


Igual que el programa anterior en formato reubicable. El programa se ha ; dividido en 2 mdulos. Aqu est el que contiene el programa principal. list p=16f877, r=dec ; Indicamos cual va a ser el procesador destino #include p16f877.inc ; Definicin de constantes relacionadas con el uC __CONFIG _CP_OFF & _WDT_ON & _BODEN_ON & _PWRTE_ON & _RC_OSC & _WRT_ENABLE_ON & _LVP_ON & _DEBUG_OFF & _CPD_OFF UDATA ValorActual RES 1 Aux1 RES 1 Aux2 RES 1 Aux3 RES 1 extern hex27seg STARTUP CODE ; Selecciona la direccin de reset desde el script 16F877.lkr nop ; Si se utiliza el ICD se recomienda poner nop clrf PCLATH ; Algunos tipos de reset no inicializan este registro goto Inicio PROG1 CODE ; Selecc la dir inic del programa desde el script 16F877.lkr Inicio ; En primer lugar inicializaremos el puerto C para que configure todas sus lneas ; como salidas. Se supone que a este puerto se han conectado los siete segmentos ;de un display ; Inicializamos las variables clrf ValorActual ; Configuramos los bits del puertoC como salidas BANKSEL TRISC clrf TRISC ; Configurar pines de PORTC como salidas clrf STATUS ; Apuntamos a la pgina 0 Bucle ; Comienzo del bucle principal movf ValorActual, W ; Muevo ValorActual a W call hex27seg ; Llamamos a rutina de conversin movwf PORTC ; ponemos resultado en PORTC (el display) incf ValorActual, F ; Incrementamos el valor para la siguiente btfsc ValorActual, 4 ; iteracin, y si se activa el bit 4, hemos clrf ValorActual ; llegado a 10H, y reseteamos la variable. movlw 8 ; Inicializamos Aux1 a 8 para conseguir movwf Aux1 ; una espera algo mayor que 1 segundo. Espera call Espera1 ; Rutina con un retardo de 0,13 seg. Aprox. decfsz Aux1, F goto Espera goto Bucle ; Retornar al bucle principal Espera1 ; Realiza 256 llamadas a la rutina Espera2 movlw 0xff movwf Aux2 Bucle1 call Espera2 decfsz Aux2, F goto Bucle1 return Espera2 ; Recorre 256 veces el bucle Bucle2. movlw 0xff movwf Aux3 Bucle2 decfsz Aux3, F goto Bucle2 return end ;

Microcontroladores

Versin 1.5

04 oct. 07

pg. 21

Mdulo Display.ASM
; Mdulo Display.asm. Contiene la subrutina hex27seg, que recibe un valor ; hexadecimal en W y devuelve el valor correspondiente al de un display de 7 segm. ; A continuacin se muestra el nombre de cada segmento en un Display ; ----; | a | ; f| |b ; | | ; ----; | g | ; e| |c ; | | ; ----; d ; Se asignar el bit 7 al segmento 'a', el 6 al 'b', ... , el 1 al 'g' ; El bit 0 queda sin asignar. Se puede usar para el punto digital del display ; Los segmentos a iluminar para cada dgito son: ; Bits 7,6,5,4,3,2,1,0 Valor binario ; ==== =============== ============= ; 0 = a,b,c,d,e,f B'11111100' ; 1 = b,c B'01100000' ; 2 = a,b, d,e, g B'11011010' ; 3 = a,b,c,d, g B'11110010' ; 4 = b,c, f,g B'01100110' ; 5 = a, c,d, f,g B'10110110' ; 6 = a, c,d,e,f,g B'10111110' ; 7 = a,b,c B'11100000' ; 8 = a,b,c,d,e,f,g B'11111110' ; 9 = a,b,c, f,g B'11100110' ; A = a,b,c, e,f,g B'11101110' ; B = c,d,e,f,g B'00111110' ; C = a, d,e,f B'10011100' ; D = b,c,d,e, g B'01111010' ; E = a, d,e,f,g B'10011110' ; F = a, e,f,g B'10001110' W EQU 0 ; Defino algunas constantes porque no se ha F EQU 1 ; includo el fichero p16f877.inc PCL EQU 2 global hex27seg PROG1 CODE hex27seg ANDLW B'00001111' ADDWF PCL, F retlw B'11111100' retlw B'01100000' retlw B'11011010' retlw B'11110010' retlw B'01100110' retlw B'10110110' retlw B'10111110' retlw B'11100000' retlw B'11111110' retlw B'11100110' retlw B'11101110' retlw B'00111110' retlw B'10011100' retlw B'01111010' retlw B'10011110' retlw B'10001110' end

Microcontroladores

Versin 1.5

04 oct. 07

pg. 22

Interrupciones.

Microcontroladores

Versin 1.5

04 oct. 07

pg. 23

GIE 0 1 1 1 1 1 1 1 1

PEIE X 0 1 X X X X X X

T0IE X X X 0 1 X X X X

INTE RBIE xxxIE Significado X X X Todas las interrupciones deshabilitadas X X X Deshabilitadas las interrupciones de los perifricos internos salvo Timer 0 X X X Permitidas las interrupciones de los perifricos internos. Hay un bit adicional para cada perifrico. X X X Deshabilitada Int. Timer 0 X X X Habilitada Int. Timer 0 0 X X Deshabilitada Int. externa 1 X X Habilitada Int. externa X 0 X Deshabilitada Int. cambio lneas RB4,..,RB7 X 1 X Habilitada Int. cambio lneas RB4,..,RB7

Tabla 6 Bits de habilitacin de interrupciones en INTCOM


Bit TMR1IE TMR2IE CCP1IE SSPIE TXIE RCIE ADIE PSPIE CCP2IE BCLIE EEIE Reg. bit Activar interrupcin si PIE1 0 Overflow en el Timer 1 PIE1 1 Overflow en el Timer 2 PIE1 2 Captura o Comparacin en CCP1 PIE1 3 Byte recibido o transmitido por el puerto serie sncrono PIE1 4 Byte transmitido por la USART PIE1 5 Byte recibido por la USART PIE1 6 Finalizada conversin por el conversor A/D PIE1 7 Byte recibido o transmitido por el puerto paralelo esclavo PIE2 0 Captura o Comparacin en CCP2 PIE2 3 Colisin en el bus I2C PIE2 4 Fin de operacin de escritura en la EEPROM Flag TMR1IF TMR2IF CCP1IF SSPIF TXIF RCIF ADIF PSPIF CCP2IF BCLIF EEIF Reg. bit PIR1 0 PIR1 1 PIR1 2 PIR1 3 PIR1 4 PIR1 5 PIR1 6 PIR1 7 PIR2 0 PIR2 3 PIR2 4

Tabla 7 Bits de habilitacin de interrupciones para perifricos y flags activados.

Proceso para atencin de interrupciones


1 Cuando se produce un evento susceptible de generar una interrupcin, se activa el xxIF correspondiente. Si dicho bit estaba a 0 y se produce la transicin a 1 se comprueba si su bit xxIE vale 1. Si es as y el bit GIE=1 (y el PEIE para los perifricos tambin) se lanza la peticin de interrupcin a la Unidad de Control que termina de ejecutar la instruccin en curso y realiza estas tres transferencias: 0 -->GIE Dir. retorno --> Pila 4--> Program Counter La rutina debe: 1 Salvar en algn registro reservado al efecto el contenido del registro de Status y el acumulador. 2 Haciendo polling se detecta cual ha sido la fuente de la interrupcin. 3 Ejecutar la rutina de atencin a la interrupcin. 4 Desactivar el flag correspondiente a esa interrupcin 5 Ejecutar la instruccin RETFIE de retorno de interrupcin y que reactiva GIE.

Microcontroladores

Versin 1.5

04 oct. 07

pg. 24

Plantilla de programa absoluto con atencin a interrupciones.


Programa: Disp1.ASM. Este programa cuenta desde 0 hasta F mostrando la cuenta en un display de 7 segmentos. los incrementos se producen a cada segundo si el reloj de la CPU es de 4 MHz. list p=16f877, r=dec ; Indicamos cual va a ser el procesador destino #include p16f877.inc ; Definicin de constantes relacionadas con el uC ;***** DEFINICION DE VARIABLES w_temp EQU 0x71 ; variable usada pora salvar el contexto status_temp EQU 0x72 ; variable usada pora salvar el contexto ;********************************************************************* __CONFIG _CP_OFF & _WDT_ON & _BODEN_ON & _PWRTE_ON & _RC_OSC & _WRT_ENABLE_ON & _LVP_ON & _DEBUG_OFF & _CPD_OFF ORG nop clrf goto ORG movwf movf movwf clrf btfsc goto btfsc goto : : btfsc goto INT_ERROR_LP1 goto END_ISR movf movwf swapf swapf retfie : bcf goto : bcf goto : : bcf goto 0 PCLATH Inicio ; Si se utiliza el ICD se recomienda poner nop ; Algunos tipos de reset no inicializan este registro ; ; ;

0x004 ; direccin del vector de interrupcin w_temp ; Salvar el contenido de W STATUS,w ; Salvar el contenido de STATUS status_temp STATUS ; PIR1, TMR1IF; T1_INT ; PIR1, ADIF ; AD_INT ; ; ; INTCON, RBIF; PORTB_INT ; Seleccin del Banco 0 Interrupcin Timer1 overflow? SI, atender interrupcin.T1 NO, inerrupcin A/D? SI, atender interrupcin conversor A/D NO, interrupcin por cambio en PORTB? SI, atender interrupcin cambio en PORTB

; NO, bloqueo por error de interrupcin INT_ERROR_LP1 ; Bucle infinito por la llegada de int. no esperada status_temp,W; Recuperar la copia del registro STATUS STATUS ; y restaurar su valor w_temp,F w_temp,W ; restaurar W sin modificar STATUS ; retorno de la interrupcin ; Rutina para la interrupcin de Timer1 overflow ; PIR1, TMR1IF; Poner a 0 el flag de la interrupcin del Timer1 END_ISR ; Fin de la rutina ; Rutina para la interrupcin del conversor A/D ; PIR1, ADIF ; Poner a 0 el flag de la interrupcin del conv. A/D END_ISR ; Fin de la rutina ; ; Rutina para la interrupcin de cambio en PORTB ; INTCON, RBIF; Poner a 0 el flag de interrupcin cambio en PORTB END_ISR ; Fin de la rutina

T1_INT

AD_INT

PORTB_INT

inicio ; el resto del programa va aqu. end ; El programa debe acabar con un 'end'

Microcontroladores

Versin 1.5

04 oct. 07

pg. 25

Reset.
Coloca a la CPU en un estado conocido. Causas: Power On Reset POR. Brown-out Reset. MCLR en estado normal. WDT en estado normal. MCLR en estado SLEEP. WDT en estado SLEEP.

Power On Reset

Power-up Timer (PWRT) Oscillator Start-up Timer (OST)

Microcontroladores
PCON STATUS

Versin 1.5

04 oct. 07

pg. 26

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

Significado Power-on Reset Estado incorrecto Estado incorrecto Brown-out Reset WDT reset during normal operation WDT Wake-up. No reinicia el PC MCLR reset during normal operation MCLR reset during SLEEP

Tabla 8 Bits indicativos de la ltima reinicializacin


Necesidad de la puesta a '1' de todos los bits al arrancar. Brown-out reset: Se produce al bajar la tensin de alimentacin por debajo de un umbral (~4V.) WDT: Timer que genera un reset al desbordarse. Usa una fuente de reloj interna. Puede definirse un valor para un postscaler, que permite definir diferentes tiempos. Instrucciones CLRWDT y SLEEP.

Existen tablas indicando como se inicializan los registros de la RAM con un reset, pero se distinguen bsicamente tres situaciones: Reset generado por POR / BOR : Se inicializan prcticamente todos los registros. Reset generado por MCLR /WDT: Se inicializan los registros de algunos perifricos y algunos bsicos como el contador de programa y parte del registro de flags. Reset generado por MCLR /WDT mientras se estaba en modo SLEEP: Prcticamente ningn registro cambia su contenido.

Modo Sleep
Detiene a la CPU. Principal ventaja: el consumo de la CPU se reduce a niveles muy bajos. Se despierta mediante: Activacin de MCLR Activacin de INT, RB4..RB7 y algunas interrupciones asociadas a perifricos internos. Desbordamiento del WDT

Reloj.
Los circuitos para generar la seal de reloj se encuentran dentro de la CPU. Estos circuitos necesitan algn componente externo para fijar su frecuencia y modo de trabajo. El oscilador interno se tiene que configurar para controlar adecuadamente los componentes externos, existiendo 4 posibilidades: LP: Low Power Crystal (32KHz. - 400 KHz.) XT: Crystal/Resonator (400 KHz. - 4 MHz.) HS: High Speed Crystal Resonator (2 MHz. - 20 MHz.) RC: Resistor/Capacitor (hasta 4 MHz.)

Microcontroladores

Versin 1.5

04 oct. 07

pg. 27

Modo Debug.
Algunos circuitos permiten la depuracin del programa sobre el propio chip (ICD In Circuit Debugging). Cuando esta capacidad est desactivada el microcontrolador funciona de forma autnoma como cualquier MCU estndar. Cuando esta capacidad est activada el microcontrolador debe estar conectado a un dispositivo (con las lneas RB6 y RB7) que controla e inspecciona la evolucin del programa. En este caso podemos ejecutar el programa paso a paso, insertar un breakpoint, inspeccionar o modificar el contenido de la memoria, ... Tambin se reservan algunos recursos. Para el 16F877 se reserva: - Las lneas RB6 y RB7 a travs de las cuales se comunica con el host. - 1 nivel de la pila. - Direccin 0 del programa debera contener la instrciin NOP. - ltimas 100H direcciones de la memoria de programa. - Direcciones 0x70 y 0x1EB a 0x1EF de la memoria de datos.

Bits de Configuracin.
A partir de la direccin 0x1FFF de la memoria de programa, se dispone de 8 palabras extras. Estas direcciones no son accesibles desde el programa o la aplicacin, pero si pueden ser accedidas en el proceso de grabacin. Las 4 primeras words (0x2000 a 0x2003) se denominan ID Location, sirve para almacenar un n de serie, o un n de versin de software instalada, etc. La direccin 0x2006 es de slo lectura y tiene un identificador del modelo de microcontrolador. La siguiente word (0x2007) , es la palabra de configuracin, sus bits tiene los siguiente significados: Bits 13-12 y 5-4: Estn relacionados con varios niveles de proteccin de nuestro SW. Bit 11: DEBUG. Si vale 0 se desactiva el modo ICD, y RB6 y RB/ quedan como lneas I/O estndar. Bit 9: WRT. Permite o no, escribir en la memoria Flash de programa. Bit 8. CPD Proteccin de los datos de la EEPROM. Bit 7: LVP. Permite la grabacin a bajo voltaje. Bit 6: BODEN. Habilita el control del Brown-out. Bit 3. PWRT . Permite activar o desactivar el Power-up Timer. Bit 2: WDTE. Permite activar o desactivar el Watch Dog. Bit 1- 0. Seleccin de tipo de generador de reloj: Uso de directivos de configuracin: __CONFIG _CP_OFF & _WDT_ON & _BODEN_ON & _PWRTE_ON & _RC_OSC & _WRT_ENABLE_ON & _LVP_ON & _DEBUG_OFF & _CPD_OFF __IDLOCS H'1234', H'3456' Constantes predefinidas en el fichero 16F877.INC _CP_ALL _CP_HALF _CP_UPPER_256 _CP_OFF _DEBUG_ON _DEBUG_OFF _WRT_ENABLE_ON _WRT_ENABLE_OFF _CPD_ON _CPD_OFF _LVP_ON _LVP_OFF EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU H'0FCF' H'1FDF' H'2FEF' H'3FFF' H'37FF' H'3FFF' H'3FFF' H'3DFF' H'3EFF' H'3FFF' H'3FFF' H'3F7F' _BODEN_ON _BODEN_OFF _PWRTE_OFF _PWRTE_ON _WDT_ON _WDT_OFF _LP_OSC _XT_OSC _HS_OSC _RC_OSC EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU H'3FFF' H'3FBF' H'3FFF' H'3FF7' H'3FFF' H'3FFB' H'3FFC' H'3FFD' H'3FFE' H'3FFF'

Microcontroladores

Versin 1.5

04 oct. 07

pg. 28

Perifricos 16F877
Puertos programables de E/S Timers/Counters Puertos de captura/comparacin de datos Moduladores de ancho de pulso (PWM) Conversor Analgico/Digital de 10 bits Puerto serie sncrono USART Parallel Slave Port

Circuito de 40 pines en formato. Salvo 7 pines, todos los dems estn asociados al menos con los puertos de E/S. Los 7 pines son: 4 pines para alimentacin, estn duplicados. 1 pin para MCLR y Vpp que es una tensin de 12 a 14 V. usada cuando est en modo programacin. 2 pines relacionados con entradas o salidas de reloj, en funcin del tipo de reloj utilizado.

Microcontroladores

Versin 1.5

04 oct. 07

pg. 29

Puertos programables de E/S.


Disponemos de hasta 33 pines. A medida que se usan otros perifricos internos se detraen pines de E/S Las principales caractersticas son: Programables como entradas o salidas individualmente. Capaces de trabajar con corrientes de 25 mA. en cada lnea. No obstante la corriente total en los puertos A, B y E no puede superar los 200 mA. y en los puertos C y D otros 200 mA. Entradas tipo TTL o ST (Schmitt Trigger). Resistencias Pull-up (habilitables por programa) en el puerto B

Las lneas de E/S estn agrupadas en 5 puertos: A (6 bits), B (8 bits), C (8 bits), D (8 bits) y E (3 bits). Cada puerto de E/S tiene asociados dos registros TRISX y PORTX. El primer registro dispone de un bit por cada lnea del puerto, y controlar si funciona como entrada (Input, 1) o como salida (Output, 0). El segundo registro nos permite acceder al puerto. Con una escritura se modifican los bits configurados como salida, y con una lectura accedemos tanto a los de entrada como a los de salida. Si se realiza una escritura y de forma inmediata una lectura, puede que la salida no haya alcanzado el nivel adecuado generando incoherencias. El puerto A tiene todas sus salidas Totem pole, excepto la RA4 que es del tipo Open collector (open drain de forma ms exacta) lo que obliga a poner una resistencia de Pull Up para poder obtener '1'. Adems despus de un reset las lneas del puerto A estn configuradas como entradas analgicas (como digitales devuelven '0'). Escribiendo el valor 6 en el registro ADCON1 se pueden convertir en entradas digitales. El puerto B dispone de resistencias Pull-up que pueden activarse por software cuando funcionan como entradas. La activacin se realiza con el bit RBPU (bit 7) del registro OPTION_REG (direcciones 81h y 181h). Adems la lnea RB0 puede funcionar como entrada de peticin de interrupcin. Para ello se debe activar el bit INTE (bit 4) del registro INTCON (direcciones 0Bh, 8Bh, 10Bh y 18Bh). Con el bit INTDEG (bit 6) de OPTION_REG (direcciones 81h y 181h) se selecciona si se activa la interrupcin con flanco de subida (1) o de bajada (0). Los puertos A y B cuando se configuran como entradas, trabaja con niveles TTL (salvo la lnea RA4) y los puertos C, D y E como Schmitt Trigger (tambin RA4). TTL: VIL = 0,8 V., VIH = 2 V. ST: VIL = 1 V., VIH = 4 V. Permite cambios de tensin lentos en su entrada.

Microcontroladores

Versin 1.5

04 oct. 07

pg. 30

Timers
Disponemos de 3 timers numerados del 0 al 2 y del Watch Dog Timer.

Timer0
Timer de 8 bits Puede ser ledo y escrito a travs del registro TMR0 (direcciones 1 y 101h) La entrada de reloj del temporizador puede seleccionarse que sea interna o externa. Interna: Frecuencia de reloj CPU dividida por 4. Externa: Entrada RA4/T0CKI Bit T0CS (bit 5) del OPTION_REG (direcciones 81h y 181h). 0 = reloj interno, 1 = reloj externo. Si se usa un reloj externo, su frecuencia como mximo ser la mitad de la frecuencia de la entrada de reloj de la CPU. Si se selecciona el reloj externo, se puede utilizar como contador de pulsos en dicha entrada. En este caso se puede seleccionar si se activa la entrada por flanco de subida o de bajada: T0SE (bit 5) del OPTION_REG (direcciones 81h y 181h). 0 = flanco de subida, 1 = flanco de bajada. A este timer se le puede asociar un circuito divisor de la frecuencia de la entrada de reloj. Se le denomina Prescaler. Este circuito puede ser utilizado tambin por el Watch dog. En cualquier caso debe ser asignado a uno u otro. esto es seleccionado por el bit PSA (bit 3) del OPTION_REG (direcciones 81h y 181h). 0 = Timer 0, 1 = Watch dog. Tambin es posible seleccionar el factor de divisin. Se dispone de tres bits: PS2, PS1 y PS0, (bits 2, 1 y 0) del OPTION_REG (direcciones 81h y 181h) que introducen los factores de divisin que se muestran en la siguiente tabla: Bits PS 000 001 010 011 100 101 110 111 Timer0 1:2 1:4 1:8 1:16 1:32 1:64 1:128 1:256 Watch dog 1:1 1:2 1:4 1:8 1:16 1:32 1:64 1:128

Finalmente existen los dos bits mencionados en las interrupciones que permiten generar una interrupcin cada vez que se desborda el Timer0 cuando pasa de FFH a 0. Son los bits T0IE y T0IF del registro INTCON.

Watch dog Timer


Este mdulo permite inicializar la CPU cuando se rebasa el contador. Se activa por medio de los bits de configuracin del microcontrolador (en tiempo de programacin del chip) y permite recupera el sistema cuando se pierde el control del programa. El perodo con un valor de prescaler 1:1 oscila entre 7 y 33 mS. con un valor tpico de 18 mS. Esta tolerancia es debida a la imprecisin del oscilador interno que depende de la temperatura y la tensin de alimentacin bsicamente. Este perodo se puede ampliar con el prescaler hasta un factor de 1:128.

Microcontroladores

Versin 1.5

04 oct. 07

pg. 31

Timer1
Timer de 16 bits Puede ser ledo y escrito a travs de los registros TMR1H y TMR1L. La entrada de reloj del temporizador puede seleccionarse que sea interna o externa. Interna: Frecuencia de reloj CPU dividida por 4. Externa: Entradas RC1/T1OSICCP2 y RC0/T1OSO/T1CKI Bit TMR1CS (T1CON<1>). 0 = reloj interno, 1 = reloj externo. Si se usa un reloj externo, su frecuencia como mximo ser la mitad de la frecuencia de la entrada de reloj de la CPU. Tambin con reloj externo existen dos alternativas, colocar un cristal como fuente de reloj (hasta 200 KHz) o utilizar una seal digital. En el segundo caso solo se utiliza la lnea de entrada RC0/T1OSO/T1CKI. Para seleccionar una alternativa u otra, se dispone del bit T1OSCEN (T1CON<3>). Si vale 1 se usar el cristal activando el oscilador interno, si vale 0 se usan pulsos generados externamente. En este caso puede funcionar como contador de pulsos. Adems se dispone de un bit que permite activar y desactivar el Timer: TMR1ON (T1CON<0>) El timer dispone de un prescaler controlado por los bits T1CKPS1 y T1CKPS0 (T1CON<5:4>) cuyos factores de divisin que se muestran en la siguiente tabla: Bits T1CKPS 00 01 10 11 Timer1 1:1 1:2 1:4 1:8

Finalmente existen los dos bits mencionados en las interrupciones que permiten generar una interrupcin cada vez que se desborda el Timer1 cuando pasa de FFFFH a 0. Son los bits TMR1IE y TMR1IF necesitando adems que estn activados los bits que habilitan las interrupciones de los perifricos (PEIE) y el general (GIE).

Microcontroladores

Versin 1.5

04 oct. 07

pg. 32

Timer2
Timer de 8 bits Puede ser ledo y escrito a travs del registro TMR2. La entrada de reloj del temporizador es interna, concretamente la frecuencia de reloj CPU dividida por 4. Se dispone de un bit que permite activar y desactivar el Timer: TMR2ON (T2CON<2>) El timer dispone de un prescaler controlado por los bits T2CKPS1 y T2CKPS0 (T2CON<1:0>) cuyos factores de divisin que se muestran en la siguiente tabla: Bits T2CKPS 00 01 1x Timer2 1:1 1:4 1:16

La salida del contador puede ser conectada a un postscaler, que dispone de 4 bits de control T2OUTPS3:T2OUTPS0 cuya salida pasa a controlar el flag de interrupcin asociado a este Timer. Los factores de divisin se muestran en la siguiente tabla: Bits T2OUTPS 0000 0001 0010 . . . 1101 1110 1111 Salida de interrupcin 1:1 1:2 1:3 . . . 1:14 1:15 1:16

Finalmente existen los dos bits mencionados en las interrupciones que permiten generar una interrupcin cada vez que se desborda el Timer2 cuando pasa de FFH a 0. Son los bits TMR2IE y TMR2IF necesitando adems que estn activados los bits que habilitan las interrupciones de los perifricos (PEIE) y el general (GIE).

Microcontroladores

Versin 1.5

04 oct. 07

pg. 33

CAPTURE/COMPARE/PWM
Mdulos de captura, comparacin y modulacin por ancho de pulso. Existen dos mdulos de este tipo: CCP1 y CCP2 cuyo funcionamiento es prcticamente idntico diferencindose en que el CCP2 podr comenzar una conversin en el mdulo A/D. Ambos mdulos son de 16 bits, y estn estrechamente relacionados con el Timer1. Modo captura. En este modo, el mdulo CCPx captura el contenido del Timer1 cuando se produce un evento. Los eventos posibles, se refieren a los cambios en las entradas RC1/T1OSI/CCP2 RC2/CCP1 y se distinguen las siguientes situaciones: Un flanco de bajada. Un flanco de subida. Cada 4 flancos de subida. Cada 16 flancos de subida.

En este modo se pueden calcular intervalos de tiempo entre dos sucesos de forma muy exacta. Si se han activado las interrupciones, se generar una por cada captura realizada. Modo comparacin. En este modo, el mdulo CCPx comparar el contenido de los registros de 16 bits del mdulo con el Timer1, de tal manera que cuando se produzca una coincidencia, se producir la interrupcin correspondiente cuando las interrupciones estn activadas y podr hacerse que las lneas asociadas RC1/T1OSI/CCP2 RC2/CCP1 se pongan a nivel alto, bajo o no cambien. Finalmente resetearn el Timer1 y en el caso del CCP2 adems se lanzar una conversin A/D si el conversor est activado (permite hacer muestreos peridicos) Modo PWM. En este caso se produce una salida PWM en el puerto CCPx, con una resolucin de 10 bits. Una seal PWM seal con onda rectangular de frecuencia fija, en la que se puede variar el tiempo en el que la misma permanece a 0 o a 1. Sustituye en la mayora de los casos a un conversor D/A. La frecuencia de la seal se establece por medio del Timer2 y el tiempo que permanece a 1 (Duty cycle) se controla por medio de los registros del CCP que se est utilizando.

Microcontroladores

Versin 1.5

04 oct. 07

pg. 34

Master Synchronous Serial Port


Este mdulo implementa un interfaz de comunicaciones en serie. Existen multitud de dispositivos que permiten este tipo de comunicacin, tales como memorias EEPROM, conversores A/D, sensores de diferentes tipos (temperatura, posicin, distancia, ...), displays, otros microcontroladores, ... El mdulo puede operar en dos modos: SPI e I2C. SPI: Serial Peripheral Interface. Este interface suele ser utilizado para comunicar dos dispositivos entre si, uno se configura como master y el otro como esclavo. En este interface se definen las lneas: Serial Data Out (SDO) Serial Date In (SDI) Serial Clock (SCK) Adicionalmente se puede usar un cuarto pin en modo esclavo. Slave Select ( SS )

Permite velocidades de hasta 8 Mbps con reloj a 20 MHz. El master inicia las transferencias activando la lnea SCK, el esclavo recibe y transmite informacin cuando detecta que la lnea SCK se activa. Cada vez que recibe un byte, en modo esclavo, se puede activar la interrupcin correspondiente. I2C: Inter-Integrated Circuit. Permite la interconexin de mltiples dispositivos formando un bus. A cada dispositivo se le asigna una direccin y las tramas que se envan por el bus llevan direccionamiento para identificar los actores de la misma. En general se configura un dispositivo como master y el resto como esclavos, no obstante, se permiten buses multi-master, en este caso se dispone de mecanismos de deteccin de colisiones y gestin (arbitration) del Bus. se pueden alcanzar velocidades de 1 Mbps, y conectar hasta 128 o 1.024 dispositivos en funcin del tipo de direccionamiento utilizado..

Addressable Universal Synchronous Asynchronous Receiver Transmitter (USART).


Este mdulo implementa el popular interface de comunicaciones serie que tienen incluido gran cantidad de ordenadores. Permite comunicacin serie entre dos dispositivos, y en algunos modos de funcionamiento, permite la conexin de ms de dos dispositivos incluyendo 9 bits de direccionamiento (512 dispositivos).

Microcontroladores

Versin 1.5

04 oct. 07

pg. 35

Analog/Digital Converter.
Este mdulo permite la conexin de entradas analgicas para convertirlas en valores discretos obteniendo su valor. El valor mnimo de una entrada es 0 y aparece si la tensin de esa entrada es menor o igual a VREF-. El valor mximo es 1.023 (3FFH) si la tensin es mayor o igual que VREF+. Cualquier voltaje intermedio producir un valor proporcional al mism0 en el rango de 1 a 1.022. Aunque se dispone de un nico conversor, el microcontrolador tiene un multiplexor analgico que permite la conexin de hasta ocho entradas.

Para su uso se dispone de 4 registros de 8 bits: ADRESH, ADRESL, ADCON0 y ADCON1. Los dos primeros son: ADRESH y ADRESL (parte alta y parte baja del resultado de la conversin AD) contendrn el resultado de la ltima conversin. Se usan dos registros porque el conversor tiene una resolucin de 10 bits. Si ocho bits fueran suficientes para una aplicacin determinada, se puede indicar al conversor que entregue el resultado justificado a la izquierda y nos quedamos con el contenido de ADRESH. Registros ADCON0 y ADCON1 (Registros de control del conversor). ADCON1 suele usarse en la parte de inicializacin del programa para asignar la funcin que debe corresponder a cada una de las posibles entradas analgicas. ADCON0 debe ser accedido antes de cada conversin. El bit de mayor peso de ADCON1 (ADFM) permite decidir si el resultado queda alineado a la izquierda (0) o a la derecha (1). 0 0 ADRESH 0 0 0 0 b9 b8 b7 b6 ADRESL b5 b4 b3 b2 b1 b0

Registros ADRESH y ADRESL con el resultado justificado a la derecha b9 b8 ADRESH b7 b6 b5 b4 b3 b2 b1 b0 ADRESL 0 0 0 0 0 0

Registros ADRESH y ADRESL con el resultado justificado a la izquierda

Microcontroladores

Versin 1.5

04 oct. 07

pg. 36

Los cuatro de menor peso (PCFG3 al PCFG0) se usan segn la siguiente tabla:
PCFG3: PCFG0 0000 0001 0010 0011 0100 0101 011x 1000 1001 1010 1011 1100 1101 1110 1111 AN7 RE2 AN6 RE1 AN5 RE0 AN4 RA5 AN3 RA3 AN2 RA2 AN1 RA1 AN0 RA0 VREF+ VREFCHAN/ Refs

A A D D D D D A D D D D D D D

A A D D D D D A D D D D D D D

A A D D D D D A A A A D D D D

A A A A D D D A A A A A D D D

A VREF+ A VREF+ A VREF+ D VREF+ A VREF+ VREF+ VREF+ VREF+ D VREF+

A A A A D D D VREFA A VREFVREFVREFD VREF-

A A A A A A D A A A A A A D D

A A A A A A D A A A A A A A A

VDD RA3 VDD RA3 VDD RA3 VDD RA3 VDD RA3 RA3 RA3 RA3 VDD RA3

VSS VSS VSS VSS VSS VSS VSS RA2 VSS VSS RA2 RA2 RA2 VSS RA2

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

Esto permite que todas las entradas sean analgicas o digitales o algunas combinaciones de analgicas y digitales. Tambin permite definir que valores se usarn como VREF+ y VREF-. Los dos bits de mayor peso de ADCON0 (ADCS1 y ADCS0) permiten seleccionar la fuente de reloj a utilizar. En general este parmetro no es crtico. Seleccionar los valores 01 10 permiten realizar conversiones rpidas y precisas. Los bits 3 .. 5 se corresponde con CHS0 .. CHS2. Con esas tres lneas se gobierna el MPX analgico, y por tanto la entrada sobre la que se quiere hacer la conversin. El bit de menos peso (ADON) permite conectar o desconectar el conversor. Tenerlo desconectado permite reducir el consumo del microcontrolador. Finalmente el bit 2 GO/ DONE permite lanzar el proceso de conversin poniendo esta lnea a 1, y comprobar si la conversin ha finalizado. Existen bsicamente dos maneras de detectar cuando ha finalizado. Por interrupciones o por sondeo (polling). Si se activan los bits de interrupcin correspondientes (ADIE, PIE y GIE y se pone a 0 ADIF), se producir una interrupcin cuando acabe la conversin en marcha, activando el ADIF. Por sondeo el mtodo es el siguiente: Activar el bit GO/ DONE y entrar en un bucle en el que se comprueba este mismo bit. Mientras valga 1 la conversin est en curso. Cuando pasa a 0 la conversin finaliz y el resultado se encuentra en los registros ADRESH y L.

Microcontroladores

Versin 1.5

04 oct. 07

pg. 37

Microcontrolador 16F876
El 16F876 contiene el mismo ncleo que el 16F877, pero dispone de 28 pines, lo cual supone eliminar algunos de los perifricos de los presentes en su hermano mayor.

Tal y como se muestra en la figura, se puede observar que carece de los puertos D (8 bits) y E (3 bits), y en cuanto a perifricos, no existe el SPP (Slave Parallel Port) y el conversor A/D dispone de 5 entradas (frente a 8 del 16F877). Tambin se dispone de una entrada menos de alimentacin (un nico pin para VDD).

Microcontroladores

Versin 1.5

04 oct. 07

pg. 38

Microcontrolador 16F84
El 16F84 es un microcontrolador de la gama media al igual que el 16F877 pero que carece de varios de los perifricos de ste a cambio de ser un circuito ms econmico y ms pequeo. Carece de conversor A/D, y dispone de slo 11 lneas de entrada salida.

Pines en el 16F84

También podría gustarte