Vous êtes sur la page 1sur 30

http://lonely113.blogspot.

com

PIC16F84A
I. CARACTERSTICAS CPU Slo 35 instrucciones Assembler. Instrucciones de 1 ciclo excepto las de salto (2 ciclos). Entrada de Reloj de hasta 20 MHz. Memoria de programa de 1024 palabras (14 bit). 68 bytes de RAM de datos. 64 bytes de EEPROM de datos. 15 registros de funcin especial. 8 niveles de Stack. Direccionamiento directo, indirecto y relativo. 4 fuentes de interrupcin. o o o o Externo por el pin RB0/INT. Desbordamiento de timer TMR0. Externo por cambio en los pines RB4-RB7. Escritura de EEPROM completa.

Perifricos 13 pines I/O con control de direccin individual. Corriente alta para control directo de LEDs. o Mx. 25mA como fuente. o Mx. 25mA como sumidero. TMR0: Contador de 8 bits configurable.

Microcontrolador 10000 ciclos de Lectura/Escritura de memora Flash de programa. 10000000 ciclos de Lectura/escritura de memoria EEPROM de datos. Retencin de datos de EEPROM > 40 aos. In Circuit Serial Programming (ICSP). Watchdog Timer con su propio oscilador RC. Proteccin de cdigo. Modo SLEEP de ahorro de energa. Opcin de seleccin de tipo de oscilador.

http://lonely113.blogspot.com

II. DIAGRAMA DE BLOQUES

http://lonely113.blogspot.com

III. PINES

Nombre de Pin OSC1/CLKIN OSC2/CLKOUT RA0 RA1 RA2 RA3 RA4/T0CKI RB0/INT RB1 RB2 RB3 RB4 RB5 RB6 RB7 VSS VDD

Pin N 16 15 4 17 18 1 2 3 6 7 8 9 10 11 12 13 5 14

Descripcin Entrada de oscilador de Cristal externo. Salida de oscilador. Master Clear. Entrada de Voltaje de Programacin. PORTA. Puerto I/O bidireccional de 5 bit.

RA4/T0CKI: Entrada de reloj para timer TMR0. RB0/INT: Entrada de Interrupcin externa. PORTB. Puerto I/O bidireccional de 8 bit. Puede ser configurado con resistores Pull-up. RB4-RB0: entradas de interrupcin externa. RB6: Entrada de RELOJ en programacin serial. RB7: Entrada de datos en programacin serial. GND Voltaje de alimentacin.

http://lonely113.blogspot.com

IV. ORGANIZACIN DE MEMORIA DE PROGRAMA

Contador de Programa de 13 bit. Stack de 8 niveles. Memoria de programa implementado fsicamente hasta la direccin 3FFh. Vector RESET en direccin 0000h (Direccin de Inicio de programa). Vector de Interrupcin en direccin 0004h (Direccin de inicio de rutina de interrupcin).

http://lonely113.blogspot.com

V. ORGANIZACIN DE MEMORIA DE DATOS

Memoria de datos dividido en 2 bancos (Banco 0 y Banco 1). Las primeras 12 localizaciones estn reservadas para los Registros de Funcin Especial. Controlan el funcionamiento del PIC. El resto de localizaciones corresponde a los Registros de Propsito General.

http://lonely113.blogspot.com

A. Registros de Propsito General 68 registros SRAM a partir de la direccin 0Ch hasta la direccin 7Fh (Banco 0). Las direcciones 8Ch CFh (Banco 1) apuntan a los mismos registros del Banco 0. Por ejemplo: Apuntar a la direccin 8Ch es igual que apuntar a la direccin 0Ch. Direcciones 50h a 7Fh no implementadas fsicamente.

B. Registros de Propsito Especial 1. Registro STATUS (0x03h y 0x83h) Contiene el estado aritmtico del ALU, el estado del RESET y el bit de seleccin de Banco para la memoria de datos. R/W IRP 7 R/W RP1 6 R/W RP0 5 R 4 R 3 R/W Z 2 R/W DC 1 R/W C 0

IRP: No implementado. Mantener en 0. RP1: No implementado. Mantener en 0. RP0: Bit de seleccin de Banco de registros. 0: Banco 0. 1: Banco 1. TO (Flag): Time-out 0: Tras conectar la alimentacin, luego de instrucciones CLRWDT o SLEEP. 1: Por desbordamiento del Watchdog timer WDT. PD (Flag): Power down (Apagado) 0: tras conectar la alimentacin o luego de ejecutar la instruccin CLRWDT. 1: Al ejecutar el comando SLEEP. Z (Flag): Cero 0: El resultado de una operacin aritmtica o lgica no es 0. 1: El resultado de una operacin aritmtica o lgica es 0. DC (Flag): Digit Carry. 0: No hay acarreo en el cuarto bit de menor peso. 1: Acarreo en el cuarto bit de menor peso. Importante en operaciones BCD. C (Flag): Acarreo 0: No hay acarreo en el bit ms significativo. 1: Acarreo en el bit ms significativo.

http://lonely113.blogspot.com

2. Registro OPTION (0x81h) Registro de Lectura/Escritura. R/W RBPU 7 R/W INTEDG 6 R/W T0CS 5 R/W T0SE 4 R/W PSA 3 R/W PS2 2 R/W PS1 1 R/W PS0 0

RBPU: Habilitacin de resistores Pull-up en el puerto B. 0: Pull-up deshabilitado. 1: Pull-up habilitado. INTEDG: Seleccin de flanco de interrupcin para el pin RB0/INT. 0: Interrupcin en flanco de bajada. 1: Interrupcin en flanco de subida. T0CS: Seleccin de fuente de reloj para TMR0. 0: Reloj interno de instruccin (Fosc/4). 1: Transicin en el pin RA4/T0CKI. T0SE: Tipo de flanco del pin RA4/T0CKI para incrementar TMR0. 0: Flanco de subida. 1: Flanco de bajada. PSA: Asignacin del divisor de frecuencia. 0: El divisor de frecuencia se asigna a WDT. 1: El divisor de frecuencia se asigna a TMR0. PS2-PS0: Razn de divisin: PS2-PS1-PS0 000 001 010 011 100 101 110 111 Razn TMR0 1:2 1:4 1:8 1:16 1:32 1:64 1:128 1:256 Razn WDT 1:1 1:2 1:4 1:8 1:16 1:32 1:64 1:128

http://lonely113.blogspot.com

3. Registro INTCON (0x0Bh) Registro de Lectura/Escritura para control de todas las fuentes de interrupciones. R/W GIE 7 R/W EEIE 6 R/W T0IE 5 R/W INTE 4 R/W RBIE 3 R/W T0IF 2 R/W INTF 1 R/W RBIF 0

GIE: Habilitacin global de interrupciones. 0: Todas las interrupciones deshabilitadas. 1: Todas las interrupciones habilitadas. EEIE: Habilitacin de interrupciones de escritura completa de EEPROM. 0: Interrupciones deshabilitadas. 1: Interrupciones habilitadas. T0IE: Habilitacin de interrupcin de desbordamiento de TMR0. 0: Interrupciones deshabilitadas 1: Interrupciones habilitadas. INTE: Habilitacin de interrupciones por RB0/INT. 0: Interrupciones deshabilitadas 1: Interrupciones Habilitadas. RBIE: Habilitacin de interrupciones por cambio en los pines RB4-RB7. 0: Interrupciones deshabilitadas. 1: Interrupciones habilitadas. T0IF (Flag): Interrupcin por desbordamiento de TMR0. 0: TMR0 no se ha desbordado. 1: TMR0 se ha desbordado (Debe ser borrado por software). INTF (Flag): Interrupcin por RB0/INT. 0: No ha ocurrido interrupcin por RB0/INT. 1: Ha ocurrido interrupcin por RB0/INT (Debe ser borrado por software). RBIF (Flag): Interrupcin por cambio en los pines RB4-RB7. 0: Ningn pin de RB4-RB7 ha cambiado. 1: Al menos un pin de RB4-RB7 ha cambiado (Se borra por software). 4. Registros PCL (0x02h) y PCLATH (0Ah) El contador de programa (PC) tiene una longitud de 13 bits. El byte menos significativo es denominado registro PCL y es un registro de lectura/escritura. El grupo de bits ms significativos del PC (bits 9-13) se denomina registro PCH. Este registro no se puede leer ni escribir directamente. Todos los cambios del registro PCH pasan a travs del registro PCLATH.

http://lonely113.blogspot.com

5. Registros INDF (0x00h) y FSR (0x04h) Registros utilizados para implementado fsicamente. 6. Registro TMR0 (0x01h) Registro que almacena el valor del contador TMR0 (Timer 0). 7. Registro EEDATA (0x08h) Guarda el contenido de una direccin de la memoria EEPROM antes de su escritura o despus de su lectura. La memoria EEPROM tarda aproximadamente 10 ms en completar un ciclo de lectura o escritura. 8. Registro EEADR (0x09h) Guarda la direccin de la memoria EEPROM que se quiere escribir o leer. Puede direccionar 256 bytes, pero slo los primeros 64 bytes estn disponibles en la EEPROM. 9. Registro EECON1 (0x88h) R/W EEIF 4 R/W WRERR 3 R/W WREN 2 R WR 1 R RD 0 direccionamiento indirecto. INDF no est

EEIF (Flag): Interrupcin de escritura de la memoria EEPROM. 0: No se ha completado la escritura. 1: Se ha completado la escritura (Se debe borrar por software). WRERR (Flag): Error de escritura. 0: Se ha completado la operacin de escritura sin error. 1: Se ha producido un error de escritura (MCLR o WDT reset). WREN: Habilitacin de escritura. 0: Escritura de EEPROM deshabilitada. 1: Escritura de EEPROM habilitada. WR: Control de escritura. 0: Se ha completado la escritura un dato. 1: Inicio de escritura de dato en EEPROM (Se borra automticamente). WD: Control de lectura. 0: No se ha iniciado la lectura de un dato. 1: Inicio de lectura de un dato de EEPROM (Se borra automticamente).

http://lonely113.blogspot.com

10. Registro EECON2 (0x89h) No implementado fsicamente. Se utiliza como dispositivo de seguridad durante la escritura de la memoria EEPROM. 11. Registros PORTA (0x05h) y TRISA (0x85h) PORTA es un puerto I/O bidireccional de 5 bit. El registro correspondiente de configuracin de direccin es TRISA. PORTA RA4 4 TRISA TRISA4 4 TRISAX=0: RAX como salida. TRISAX=1: RAX como entrada. Cuando se utiliza el Pin RA4/T0CKI como entrada de pulsos de reloj el bit TRISB4 de ponerse a 1 (RA4/T0CKI como entrada). 12. Registros PORTB (0x06h) y TRISB (0x86h) PORTB es un puerto I/O bidireccional de 8 bit. Dispone de resistencias Pull-up que se pueden habilitar o deshabilitar. El registro correspondiente de configuracin de direccin es TRISB. PORTB RB7 7 TRISB TRISB7 7 TRISA3 3 TRISA2 2 TRISA1 1 TRISA0 0 RA3 3 RA2 2 RA1 1 RA0 0

RB6 6

RB5 5

RB4 4

RB3 3

RB2 2

RB1 1

RB0 0

TRISB6 6

TRISB5 5

TRISB4 4

TRISB3 3

TRISB2 2

TRISB1 1

TRISB0 0

TRISBX=0: RBX como salida. TRISBX=1: RBX como entrada. Cuando se utilizan los pines de interrupcin stos deben configurarse como entradas.

http://lonely113.blogspot.com

VI. JUEGO DE INSTRUCCIONES 1. Orientadas a Registros (18 instrucciones)


Nemnico, operandos ADDWF f,d ANDWF f,d CLRF f CLRW COMF f,d DECF f,d DECFSZ f,d INCF INCFSZ IORWF MOVF MOVWF NOP RLF RRF SUBWF SWAPF XORWF f,d f,d f,d f,d f f,d f,d f,d f,d f,d Descripcin Sumar W y f. AND entre W y f. Borrar f. Borrar W. Complemento bit a bit de f. Disminuir f en 1. Disminuir f en 1. Saltar la siguiente instruccin si el resultado es 0. Incrementar f en 1. Incrementar f en 1. Saltar la siguiente instruccin si el resultado es 0. OR inclusivo entre W y f. Mover (copiar) f. Mover (copiar) W a f. No realizar ninguna operacin. Rotar f a la izquierda. Incluye bit Carry. Rotar f a la derecha. Incluye bit Carry. Restar W de f. Intercambio de nibles en f. OR exclusivo entre W y f. Flags C, DC, Z Z Z Z Z Z Ciclos 1 1 1 1 1 1 1(2) 1 1(2) 1 1 1 1 1 1 1 1 1

Z Z

C C C, DC, Z Z

2. Orientadas a Bit (4 instrucciones)


Nemnico, operandos BCF f,b BSF f,b BTFSC f,b BTFSS f,b Descripcin Poner bit a 0. Poner bit a 1. Verificar bit. Saltar la siguiente instruccin si es 0. Verificar bit. Saltar la siguiente instruccin si es 1. Flags Ciclos 1 1 1(2) 1(2)

http://lonely113.blogspot.com

3. Operaciones con literales y de control (13 instrucciones)


Nemnico, operandos ADDLW k ANDLW k CALL k CLRWDT GOTO k IORLW k MOVLW k RETFIE RETLW k RETURN SLEEP SUBLW k XORLW k Descripcin Sumar W y literal. Guarda en W. AND entre W y literal. Guarda en W. Llamada a subrutina. Borrar Watchdog timer. Ir a direccin. OR inclusivo entre W y literal. Guarda en W. Mover literal a W. Retorno de interrupcin. Retorno de subrutina con carga de literal en W. Retorno de subrutina. Entrar en modo de espera. Restar W de literal. Guarda en W. OR exclusivo entre W y literal. Guarda en W. Flags C, DC, Z Z , Z Ciclos 1 1 2 1 2 1 1 2 2 2 1 1 1

, C, DC, Z Z

Donde: f: Direccin de registro de memoria de datos. d: Ubicacin donde se guardar en resultado de una operacin. d=0: El resultado se guarda en el registro W. d=1: El resultado de guarda en la direccin f de la memoria de datos. k: Literal. b: Bit de registro (0 - 7)

http://lonely113.blogspot.com

VII. PROGRAMACION ASSEMBLER a) Directivas para el ensamblador Los siguientes cdigos son directivas para el ensamblador. No tienen traduccin al lenguaje de mquina. Directiva EQU La directiva EQUivalent permite definir direcciones o valores literales igualndolos con nombres descriptivos de la funcin que realizarn.
STATUS PORTA TEMP TIME equ equ equ equ 0x03 0x05 0x0C 0x0A ; ; ; ; ; ; ; Define STATUS igualndolo con la direccion 03h (Registro STATUS). Define PORTA que igualandolo con la direccion 05h (Puerto A). Define un registro TEMP en la direccion 0Ch. Asigna el nombre TIME al literal 0Ah.

Directiva ORG Indica al compilador a partir de qu posicin de memoria se situarn las instrucciones que le siguen a esta directiva en la memoria de programa.
ORG ORG 0x00 0x04 ; ; ; ; ; El codigo que sigue comenzara en la direccion 00h en la memoria de programa. El codigo que le sigue debe ser la rutina de interrupcin, pues el vector de interrupcion se ubica en la direccion 04h.

Directiva END Indica al compilador el final programa. Debe situarse al final de todo el programa.
ORG ; ; END 0x00 ; Inicio de programa

; Fin de programa

Directiva LIST Indica al ensamblador el tipo de dispositivo con el que se est trabajando.
LIST P=16f84a

http://lonely113.blogspot.com

Directiva INCLUDE Sirve para incluir libreras existentes que se usarn a la hora de compilar el programa.
INCLUDE p16f84a.inc

Esta directiva incluye el fichero p16f84a.inc que contiene definiciones de registros de propsito especial y sus bits as como bits de configuracin.
;------Register Definitions------W EQU H'0000' F EQU H'0001' ;----- Register Files------------INDF EQU H'0000' TMR0 EQU H'0001' PCL EQU H'0002' STATUS EQU H'0003' FSR EQU H'0004' PORTA EQU H'0005' PORTB EQU H'0006' EEDATA EQU H'0008' EEADR EQU H'0009' PCLATH EQU H'000A' INTCON EQU H'000B' OPTION_REG EQU H'0081' TRISA EQU H'0085' TRISB EQU H'0086' EECON1 EQU H'0088' EECON2 EQU H'0089' ;----- STATUS Bits --------------IRP EQU H'0007' RP1 EQU H'0006' RP0 EQU H'0005' NOT_TO EQU H'0004' NOT_PD EQU H'0003' Z EQU H'0002' DC EQU H'0001' C EQU H'0000' ;----- INTCON Bits -------------GIE EQU H'0007' EEIE EQU H'0006' T0IE EQU H'0005' INTE EQU H'0004' RBIE EQU H'0003' T0IF EQU H'0002' INTF EQU H'0001' RBIF EQU H'0000' ;----- OPTION_REG Bits ---------NOT_RBPU EQU H'0007' INTEDG EQU H'0006' T0CS EQU H'0005' T0SE EQU H'0004' PSA EQU H'0003' PS2 EQU H'0002' PS1 EQU H'0001' PS0 EQU H'0000' ;----- EECON1 Bits -------------EEIF EQU H'0004' WRERR EQU H'0003' WREN EQU H'0002' WR EQU H'0001' RD EQU H'0000' ;-------RAM Definition-----------__MAXRAM H'CF' __BADRAM H'07', H'50'-H'7F', H'87' ;---------Configuration Bits----_CP_ON EQU H'000F' _CP_OFF EQU H'3FFF' _PWRTE_ON EQU H'3FF7' _PWRTE_OFF EQU H'3FFF' _WDT_ON EQU H'3FFF' _WDT_OFF EQU H'3FFB' _LP_OSC EQU H'3FFC' _XT_OSC EQU H'3FFD' _HS_OSC EQU H'3FFE' _RC_OSC EQU H'3FFF'

Si se desea se puede crear un fichero *.INC que contenga definiciones o subrutinas para importarlo a programas que los requieran y as ahorrar tiempo.

http://lonely113.blogspot.com

b) Uso de Comentarios Escribir ; al inicio de cada lnea de comentario en el programa. Todo lo que se escriba a la derecha del ; hasta el final de lnea ser ignorado por el ensamblador.
movlw movwf call movlw movwf 0x05 PORTA DELAY 0x06 PORTB ;Mover 5h a W. ;Mover W al puerto A. ;Llamada a subrutina DELAY ;Mover 6h a W ;Mover W al Puerto B.

Es conveniente insertar una cabecera al inicio de cada programa con informacin del autor y el funcionamiento.
;-------------------------------------;Autor: ;Fecha: ;Titulo: ;Descripcion: ;--------------------------------------

c) Etiquetas (Label) Se sitan a la izquierda de las instrucciones y sirven para identificar con facilidad un segmento del cdigo o nombrar una subrutina. El compilador relaciona la etiqueta con la direccin de la instruccin que est a su derecha. Se utiliza principalmente para realizar saltos o llamar a subrutinas.
LABEL movlw movwf call movwf goto 0x05 PORTA MOVER PORTB BEGIN

;Llamada a subrutina MOVER

; Salta a la instruccion ; identificada con LABEL ;--------------------------------------------------------------;Subrutinas MOVER movlw return end 0xFF

http://lonely113.blogspot.com

d) Instrucciones 1) MOVLW, ADDLW, SUBLW Instrucciones de operaciones aritmticas entre el registro W y literales.
org movlw addlw sublw end 0x00 0x0C 0x03 0x1F ; ; ; ; Mover literal 0Ch al registro W Sumar 03h al registro W Sustraer W de 1Fh El resultado final es 10h en W

Dependiendo del resultado de estas operaciones los flags C, Z y DC podran activarse. 2) ANDLW, IORLW, XORLW Instrucciones de operaciones lgicas entre el registro W y literales.
org movlw andlw iorlw xorlw end 0x00 0x11 0x10 0x0F 0x10 ; ; ; ; ; Mover literal 11h al registro W AND entre W y 10h bit a bit OR entre W y 0Fh bit a bit XOR entre W y 10h bit a bit El resultado final es 0Fh en W

El resultado de estas operaciones puede hacer que el flag de cero Z se active. 3) MOVF, MOVWF, ADDWF, SUBWF Instrucciones de operaciones aritmticas entre W y la memoria de datos.
REG1 equ org movlw movwf movlw addwf 0x0D 0x00 0x0F 0x0C 0x10 0x0C,1

movf

0x0C,0

movwf REG1

; ; ; ; ; ; ; ; ; ; ;

Mover literal 0Fh al registro W Mover W a la direccion 0Ch. Mover 10h a W Sumar W con el dato en la direccion 0Ch. Guardar en direccion 0Ch. Mover el dato en direccion 0Ch. a W. Mover W a REG1 (direccion 0Dh) El resultado final es 1Fh en REG1 (direccion 0Dh)

end

Dependiendo del resultado de estas operaciones los flags C, Z y DC podran activarse.

http://lonely113.blogspot.com

4) ANDWF, IORWF, XORWF, COMF, SWAPF Instrucciones de operaciones lgicas entre W y la memoria de datos.
REG1 equ org movlw movwf movlw iorwf comf 0x0D 0x00 0x08 REG1 0x07 REG1,1 REG1,1

swapf REG1,0

; ; ; ; ; ; ; ; ; ;

Mover literal 08h al registro W Mover W a la direccion 0Ch. Mover 07h a W. OR entre W y REG1. Guardar en REG1 Complementa los bits de REG1 Guardar en REG1 Intercambio de nibles de REG1 Guardar en W El resultado final es 0Fh en W

end

El resultado de estas operaciones puede hacer que el flag de cero Z se active, menos la instruccin SWAPF. 5) CLRW, CLRF, CLRWDT CLRW: Borra el registro W CLRF: Borra una direccin de la memoria de datos. CLRWDT: Reinicia el contador del WDT (Watchdog timer)
REG1 equ org movlw movwf clrw clrf end 0x0D 0x00 0x0F REG1 REG1

; ; ; ; ;

Mover literal 0Fh al registro W Mover W a la direccion 0Ch. Borra W Borra REG1 W y REG1 finalmente con 00h.

CLRW y CLRF hacen que el flag Z se active. CLRWT hace que los flags TO y PD se activen (activos en bajo).

http://lonely113.blogspot.com

6) DECF, INCF DECF: Disminuye en 1 el dato en una direccin de la memoria de datos. INCF: Incrementa en 1 el dato en una direccin de la memoria de datos.
REG1 equ org movlw movwf incf incf decf 0x0D 0x00 0x01 REG1 REG1,1 REG1,1 REG1,0

; ; ; ;

Mover literal 01h al registro W Mover W a la direccion 0Ch. Incrementar REG1 en 1 Guardar en REG1

; Disminuir REG1 en 1 ; Guardar en W ; W queda finalmente con 02h.

end

El resultado de estas operaciones puede hacer que el flag de cero Z se active. 7) DECFSZ, INCFSZ De manera similar a las instrucciones anteriores, la diferencia es que saltan la siguiente instruccin si se activa el flag Z (Si el resultado de ejecutar la instruccin es 0).

REG1

equ org movlw movwf decfsz movlw

0x0D 0x00 0x01 REG1 REG1,0 0xFF

nop

; ; ; ; ; ; ; ;

Mover literal 01h al registro W Mover W a REG1 Disminuir REG en 1. Guardar en W No se ejecuta esta instruccin porque la operacion anterior hace que Z se active No realizar operacin El resultado final es 00h en W

end

El resultado de la instruccin INCFSZ ser 0 cuando se incremente 1 a FFh.

http://lonely113.blogspot.com

8) BCF, BSF BCF: Poner a 0 un bit de un registro. BSF: Poner a 1 un bit de un registro.
REG1 equ org movlw movwf bcf bsf end 0x0D 0x00 0x01 REG1 REG1,0 REG1,4

; ; ; ; ;

Mover literal 01h al registro W Mover W a REG1 Pone a 0 Bit 0 de REG1 Pone a 1 Bit 1 de REG1 Resultado final es 10h en REG1

9) RLF, RRF Rotar bits a la izquierda o a la derecha respectivamente. Incluyen el estado actual del bit carry C en la rotacin.

REG1 equ STATUS equ org movlw movwf bcf rlf rlf

0x0D 0x03 0x00 0x01 REG1 STATUS,0 REG1,1 REG1,1

; ; ; ; ; ; ;

Mover literal 01h al registro W Mover W a REG1 Pone a 0 Bit de carry C. Rotar a la izquierda Guardar en REG1 Rotar a la izquierda Guardar en REG1

rrf

REG1,0

; Rotar a la derecha ; Guardar en W ; El resultado final es 02h en W

end

http://lonely113.blogspot.com

10) BTFSC, BTFSS BTFSC: Verificar bit de registro, saltar la siguiente instruccin si es 0. BTFSS: Verificar bit de registro, saltar la siguiente instruccin si es 1.
REG1 equ org movlw movwf btfsc movlw btfss movlw end 0x0D 0x00 0x0F REG1 REG1,4 0xCC REG1,7 0xF0

; ; ; ; ; ; ;

Mover literal 0Fh al registro W Mover W a REG1 Verifica Bit 4 de REG1 No se ejecuta Verifica bit 7 de REG1 Se ejecuta El resultado final es F0h en W

11) GOTO, CALL GOTO: Instruccin de salto incondicional sin retorno. Carga en el PC la direccin que se encuentra a su derecha. CALL: Llamada a subrutina con retorno. Carga en el PC la direccin que se encuentra a su derecha y guarda en el Stack la direccin de retorno de subrutina. La instruccin de retorno es RETURN que carga en el PC la direccin de retorno almacenada en el Stack. 12) RETURN, RETLW, RETFIE RETURN: Retorno de subrutina. Carga la direccin de retorno del Stack al PC. RETLW k: Retorno de subrutina. Carga la direccin de retorno del Stack al PC y carga el literal k al registro W. RETFIE: Retorno de rutina de interrupcin. Carga la direccin de retorno del Stack al PC y pone a 1 el bit GIE (Habilitacin global de interrupciones) del registro INTCON. Este grupo de instrucciones y las anteriores se explicarn con mayor detalle en la siguiente seccin.

http://lonely113.blogspot.com

e) Establecimiento de direccin de puertos I/O Configuracin del modo de operacin de los puertos I/O (como salidas o entradas). Es posible configurarlos pin a pin. En el siguiente ejemplo se muestra la manera de hacerlo:
; Se asume que se incluye el fichero p16f84a.inc org bsf movlw movwf 0x00 STATUS,5 0x03 TRISA

movlw 0xF0 movwf TRISB

Bcf

STATUS,5

; ; ; ; ; ; ; ; ; ;

Cambio al banco 1 b00000011 a W b00000011 al registro TRISA RA0 y RA1 como entradas RA2-RA4 como salidas b11110000 a W b11110000 al registro TRISB RB0-RA3 como salidas RB4-RB7 como entradas Volver al banco 0

; Continua el programa

f) Estructura bsica de un programa


;-----------------------------------------------------------;Autor: ;Fecha: ;Titulo: ;Descripcion: ;-----------------------------------------------------------#INCLUDE LIST p16f84a.inc ; Usar la fichero de definiciones P=16f84a ; PIC16F84A

;-----------------------------------------------------------; Definiciones del usuario ;-----------------------------------------------------------ORG 0x00 ; Inicio de programa

;-----------------------------------------------------------; Modo de operacion de puertos I/O, interrupciones ;-----------------------------------------------------------;-----------------------------------------------------------; Codigo del programa ;-----------------------------------------------------------;-----------------------------------------------------------;Subrutinas ;-----------------------------------------------------------END ; Fin de programa

http://lonely113.blogspot.com

VIII. RUTINAS BASICAS a) Puertos Para leer o escribir en los puertos I/O primero se debe configurar los mismos como entradas o salidas en los registros TRISA y TRISB (revisar el apartado anterior). Luego se esto los registros PORTA y PORTB sern tratados como cualquier otro registro. El siguiente ejemplo lee el puerto A (entrada) y muestra el estado de los 4 primeros bit (RA3-RA0) en los 4 primeros bit del puerto B (RB3-RB0). Se podra conectar Leds en el puerto B para observar el comportamiento.
INCLUDE LIST org bsf movlw movwf movlw movwf bcf BEGIN: movf p16f84a.inc p=16f84a 0x00 STATUS,5 ; 0x1F ; TRISA ; 0xF0 ; TRISB ; ; STATUS,5 ; PORTA,0 ; ; ; ; ; ; ;

Cambio al banco 1 b00011111 a W PORTA como entrada b11110000 a W RB0-RA3 como salidas RB4-RB7 como entradas Volver al banco 0 Leer PORTA y mover a W AND entre W y literal. Borra el nible superior. Guarda en W Mover W a PORTB. Se escribe en el nible inferior (Salidas). Bucle infinito Fin de programa

andlw 0x0F movwf PORTB goto end BEGIN

b) Bucles de retardo El PIC ejecuta las instrucciones a muy alta frecuencia. En algunos casos es necesario retrasar la ejecucin de ciertas instrucciones para poder observar los cambios en los Pines de salida. Por ejemplo, si necesitramos un oscilador conectado a un Led la frecuencia de oscilacin estara sujeta a la frecuencia del Cristal (ciclo de instruccin=fosc/4).
#INCLUDE LIST org bsf clrf Bcf clrf BEGIN: bsf nop bcf goto End p16f84a.inc p=16f84a 0x00 STATUS,5 TRISA STATUS,5 PORTA PORTA,0 PORTA,0 BEGIN

; ; ; ; ; ; ; ; ;

Cambio al banco 1 PORTA como salida Volver al banco 0 Borrar PORTA Poner a 1 PA0 LED en PA0 Poner a 0 PA1 Bucle infinito Fin de programa

http://lonely113.blogspot.com

Si se trabaja con un oscilador de 10 MHz cada instruccin se ejecutara a 2.5 MHZ y dependiendo de la cantidad de instrucciones el led seguramente oscilara a cientos de KHz (imposible de ser percibidos por el ojo humano) En este caso es necesario colocar bucles de retardo para hacer que el encendido y apagado del Led sea a mucha menor frecuencia tal que pueda ser percibido por el ojo humano. Esto se consigue con el uso de contadores anidados como se muestra en el siguiente ejemplo:
INCLUDE LIST CONTA1 equ CONTA2 equ org bsf clrf Bcf clrf BEGIN: bsf movlw movwf movwf movwf LOOP1: decfsz goto movlw movwf decfsz goto p16f84a.inc p=16f84a 0x0C 0x0D 0x00 STATUS,5 ; TRISA ; STATUS,5 ; PORTA ; PORTA,0 ; 0xFA ; CONTA1 ; 0xFF ; CONTA2 CONTA1 ; LOOP1 ; 0xFA ; CONTA1 ; CONTA2 ; LOOP1 ; ; ; PORTA,0 ; 0xFA ; CONTA1 0xFF CONTA2 CONTA1 LOOP2 0xFA CONTA1 CONTA2 LOOP2 ; BEGIN ; ;

Cambio al banco 1 PORTA como salida Volver al banco 0 Borrar PORTA Poner a 1 PA0 Inicio de rutina de retardo Mueve valores de inicio de cuenta a CONTA1 y CONTA2 Disminuir CONTA1 Saltar a LOOP1 si CONTA1>0 Reiniciar CONTA1 cuando llegue a 0 Ademas disminuir CONTA2 Saltar a LOOP1 si CONTA2>0 Continuar si CONTA2=0 Fin de rutina de retardo Poner a 0 PA1 Inicio de rutina de retardo

bcf movlw movwf movwf movwf LOOP2: decfsz goto movlw movwf decfsz goto Goto End

Fin de rutina de retardo Bucle infinito Fin de programa

Es necesario colocar dos retardos entre el cambio de 1 a 0 y de 0 a 1. El bucle de retardo cuenta de 250 (FAh) ciclos de instruccin 255 (FFh) veces, es decir, 250x255= 63750 ciclos de instruccin antes de pasar a la siguiente instruccin. Se puede calcular el tiempo de retardo teniendo en cuenta la frecuencia del cristal y la cantidad de ciclos que toma cada instruccin para ser ejecutada.

http://lonely113.blogspot.com

c) Subrutinas Una subrutina es un fragmento de cdigo que puede ser llamado cuantas veces se necesite en el programa principal. Facilita la modificacin del cdigo y la reduccin de uso de memoria de programa. Las subrutinas deben ir al final del programa para evitar que se ejecuten junto con el programa principal pues el PIC no diferencia uno del otro. En el ejemplo anterior se observa que se requieren 2 bucles de retardo, incluirlos en el programa principal tiene varias desventajas, entre ellas: Anlisis engorroso, programa simple pero muy extenso, ocupa mucha memoria de programa, etc. Es conveniente crear una subrutina de retardo y llamarlo en el programa principal donde se requiera:
INCLUDE LIST CONTA1 equ CONTA2 equ org bsf clrf Bcf clrf BEGIN: bsf call bcf Call goto p16f84a.inc p=16f84a 0x0C 0x0D 0x00 STATUS,5 TRISA STATUS,5 PORTA PORTA,0 DELAY PORTA,0 DELAY BEGIN

; ; ; ; ; ; ; ; ; ;

Cambio al banco 1 Borrar el registro TRISA PORTA como salida Volver al banco 0 Borrar PORTA Poner a 1 PA0 Llamada a rutina de retardo Poner a 0 PA1 Llamada a rutina de retardo Bucle infinito

;Subrutinas ;-----------------------DELAY movlw 0xFA movwf CONTA1 movwf 0xFF movwf CONTA2 LOOP: decfsz CONTA1 goto LOOP movlw 0xFA movwf CONTA1 decfsz CONTA2 goto LOOP end

; Inicio de rutina de retardo

; Fin de rutina de retardo ; Fin de programa

El programa se ve mucho ms simple y ordenado.

http://lonely113.blogspot.com

d) Tablas de datos Las tablas de datos son subrutinas que agrupan una cierta cantidad de valores numricos ordenadamente y donde cada uno de ellos puede ser ledo dependiendo de algn criterio. El uso ms comn es la conversin de un formato de datos a otro, por ejemplo Hexadecimal a 7 segmentos (para un display ctodo comn), Hexadecimal a ASCII (Para un LCD), etc. El siguiente ejemplo convierte un valor hexadecimal, que se lee en el puerto A (RA3-RA0), a un cdigo para visualizar dicho valor en un display de 7 segmentos conectado al puerto B (RB7-RB1).
INCLUDE LIST org bsf movlw movwf clrf bcf BEGIN: movf call movwf goto p16f84a.inc p=16f84a 0x00 STATUS,5 0x0F TRISA TRISB STATUS,5 PORTA,0 CONV PORTB BEGIN ; ; ; ; ; ; ; ; ; ; Inicio de Programa Inicio configuracion E/S b'00001111' RA0-RA3 como entradas Puerto B como salida Fin configuracion E/s Mueve PORTA a W Llama a subrutina CONV Mueve W a PORTB Bucle infinito

;Subrutina ; Tabla de conversion Hexadecimal a 7 segmentos. CONV addwf retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw end PCL,1 0x7E 0x0C 0xB6 0x9E 0xCC 0xDA 0xFA 0x0E 0xFE 0xDE 0xEE 0xF8 0x72 0xBC 0xF2 0xE2

;0 ;1 ;2 ;3 ;4 ;5 ;6 ;7 ;8 ;9 ;A ;B ;C ;D ;E ;F

PC+0 PC+1 PC+2 PC+3

PC+F

;Fin de programa

http://lonely113.blogspot.com

La tabla es la subrutina CONV. Toma el valor hexadecimal que se encuentre en W (proveniente del puerto A) y la suma al registro PCL (PCL almacena el byte bajo del PC, la direccin de la siguiente instruccin a ejecutar). Automticamente Se apunta a la direccin actual en el PC. La instruccin RETLW retorna de la subrutina y mueve al registro W el valor presente a su derecha. Por ejemplo, suponiendo que inicialmente W=05h: 1. Se llama a la subrutina, entonces PC=PC+5h. 2. Se apunta a la instruccin: retlw 0xDA ;5 que convierte 05h al valor
correspondiente que mostrar 5 en el display. 3. Retorno de interrupcin y carga de 0xDA en el registro W.

e) Interrupciones Una interrupcin es un evento que hace que el microcontrolador deje de ejecutar la tarea principal para pasar a una rutina (de interrupcin). Finalizada sta el microcontrolador vuelve a la tarea principal. La rutina de interrupcin debe comenzar en la direccin 0x04h (Vector de interrupcin). Es conveniente que justo al inicio de la rutina de interrupcin se incluyan instrucciones para guardar el contenido del registro W y el estado de los flags del registro STATUS en ubicaciones temporales, pues stos cambiarn al ejecutarse la rutina de interrupcin. Tipos 1) Internas Por desbordamiento del registro TMR0. Cuando pasa de FFh a 00h. Escritura de datos en EEPROM completa.

2) Externas Por cambio de estado en el pin RB0/INT. Por cambio de estado en uno de los pines RB4-RB7.

Este tipo de interrupciones son aprovechables para implementar programas.

http://lonely113.blogspot.com

2.1. Por cambio de estado en alguno de los pines RB3-RB7 Para utilizar interrupciones por cambio de estado en uno de los pines RB3RB7 se debe tener en cuenta: Habilitar interrupciones Globales: poniendo a 1 el bit GIE del registro INTCON. Habilitar interrupciones por el puerto B: Poniendo a 1 el bit RBIE del registro INTCON. Permitir interrupciones por el puerto B: Cuando ocurre una interrupcin el bit RBIF del registro INTCON se pone a 1 para pasar a la rutina de interrupcin y no permitir ms interrupciones. Se debe poner a 0 con alguna instruccin antes del retorno de interrupcin. Caso contrario no se permitir ms interrupciones. No se dispone de ningn bit para especificar el tipo de flanco, por esto la rutina de interrupcin debe incluir algn mecanismo para que ejecute ciertas instrucciones para un determinado flanco.

2.2. Por cambio de estado en el pin RB0/INT Para utilizar interrupciones por el pin RB0/INT se debe tener en cuenta: Habilitar interrupciones Globales: poniendo a 1 el bit GIE del registro INTCON. Habilitar interrupciones por el pin RB0/INT: Poniendo a 1 el bit INTE del registro INTCON. Especificar el tipo de flanco: Cambiando el bit INTEDG del registro OPTION. 0: Flanco de bajada 1: Flanco de subida (por defecto) Permitir interrupciones por RB0/INT: Cuando ocurre una interrupcin el bit INTF del registro INTCON se pone a 1 para pasar a la rutina de interrupcin y no permitir ms interrupciones. Se debe poner a 0 con alguna instruccin antes del retorno de interrupcin. Caso contrario no se permitir ms interrupciones.

http://lonely113.blogspot.com

El siguiente ejemplo es un contador decimal (0-9) de pulsaciones. El pulsador se conecta al pin RB0/INT y produce una interrupcin cada vez que se pulsa. La cuenta se muestra en BCD mediante 4 led conectados al puerto A (RA0-RA3).
include LIST COUNT equ TEMP equ TEMP2 equ org goto org movwf movf movwf incf movlw subwf btfss goto goto RESUM: bcf movf movwf movf retfie CLEAR: clrf movf movwf movf bcf retfie p16f84a.inc P=16f84a 0x0C 0x0D 0x0E 0x00 ; Inicio de programa BEGIN 0x04 ; Inicio de rutina de interrupcion TEMP ; Mover registro W a memoria temporal TEMP STATUS,0 TEMP2 ; Salva el estado de flags COUNT,1 ; Incrementar COUNT y guardar en memoria 0x0A ; Mover d'10' a W COUNT,0 STATUS,0 ; Si COUNT=10 saltar a CLEAR RESUME ; Si COUNT<10 saltar a RESUM CLEAR INTCON,1 ; Habilita interrupciones por RB0 TEMP2,0 STATUS TEMP,0 ; Mover TEMP a W ; Retorno de interrupcion COUNT ; Borrar COUNT TEMP2,0 STATUS TEMP,0 INTCON,1 ;Permitir interrupciones ;Retorno de interrupcin

;Programa Principal BEGIN: bsf bsf bcf bsf movlw movwf clrf bcf LOOP: movf movwf goto end INTCON,7 INTCON,4 INTCON,1 STATUS,5 0x01 TRISB TRISA STATUS,5 COUNT,0 PORTA LOOP ; ; ; ; ; ; ; ; Habilitacion global de interrupciones Interrupciones por RB0 Permitir interrupciones por RB0 Configuracion E/S b'00000001' RB0 como entrada RB1-RB7 como salidas PORTA como salida Fin configuracion E/S

;Mueve COUNT a PORTA. Se muestra en BCD ;Bucle infinito ; Fin de programa

Ms ejemplos en http://lonely113.blogspot.com

http://lonely113.blogspot.com

IX. PROGRAMACIN DEL PIC Registro de configuracin Existe un registro CONFIG (direccin 2007h) que dispone de ciertas opciones a la hora de programar (escribir) el PIC. Slo se puede acceder a este registro en el momento de la programacin del dispositivo. CP 9 8 WDT FOSC1 FOSC0 3 2 1 0

13

12

11

10

CP: Bit de proteccin de cdigo. 1: Proteccin de cdigo deshabilitada. 0: Proteccin de cdigo habilitada. : Power-up timer o temporizador de encendido. 1: Power-up timer deshabilitado 2: Power-up timer habilitado FOSC1, FOSC0: Bit de seleccin de tipo de oscilador. 11: Oscilador RC 10: Oscilador HS 01: Oscilador XT 00: Oscilador LP Los bits del registro CONFIG se pueden modificar mediante directivas al compilador o directamente en el programa que se utiliza para programar el PIC. 1) Mediante directivas al compilador El fichero p16f84a.inc define directivas para modificar los bits del registro CONFIG.
;---------Configuration Bits----_CP_ON EQU H'000F' _CP_OFF EQU H'3FFF' _PWRTE_ON EQU H'3FF7' _PWRTE_OFF EQU H'3FFF' _WDT_ON EQU H'3FFF' _WDT_OFF EQU H'3FFB' _LP_OSC EQU H'3FFC' _XT_OSC EQU H'3FFD' _HS_OSC EQU H'3FFE' _RC_OSC EQU H'3FFF'

http://lonely113.blogspot.com

Estas directivas se escriben luego de importar el fichero. Por ejemplo: Se utilizar un oscilador XT (cristal) y se deshabilitar el WDT.
include LIST p16f84a.inc P=16f84a

__CONFIG _WDT_OFF & _XT_OSC

NOTA: __CONFIG (doble barra) 2) Directamente en el programa Por ejemplo el programa del Pickit 2 permite modificar estos bits: