You are on page 1of 17

Microcontrolador PIC 16F628A

Descripcin General: Microcontrolador CMOS de 8 bits de gama media de la firma Microchip, este dispositivo sale al mercado con la finalidad de reemplazar al clsico 16F84, incorporando ms funciones. Todos los microcontroladores PIC emplean una Arquitectura RISC avanzada. El PIC16F628A tiene caractersticas de ncleo mejoradas, ocho niveles de y mltiples fuentes de interrupcin internas y externas. Las instrucciones independientes y buses de datos arquitectura de Harvard permiten palabras de 14 bits separada de los 8 bits de datos. Las instrucciones de dos etapas permiten que todas se ejecuten en ciclos individuales, a excepcin de las bifurcaciones de programa (que requieren dos ciclos). Un total de 35 instrucciones (conjunto reducido de instrucciones) estn disponibles, complementado por un amplio conjunto de registros. Velocidades de operacin de hasta 20 MHz Capacidad de interrupciones Stack de 8-niveles de hardware Modos de direccionamiento Directo, Indirecto y Relativo 35 instrucciones Todas las instrucciones de ciclo individual excepto las bifurcaciones

Caractersticas especiales: Opciones de oscilador Interna y externa. Oscilador de precisin interno de 4 MHz calibrado de fbrica 1%. Oscilador interno de 37 kHz de bajo consumo. Son soportados osciladores externos tales como cristales y resonadores. Modo Sleep para ahorro de energa. Resistencias pull-ups programables para el PORTB Borrado maestro/pin de entrada multiplexado Temporizador Watchdog con oscilador independiente para una operacin confiable Programacin de bajo voltaje Programacin serial In-Circuit (via dos pines) Cdigo de proteccin programable. Brown-out Reset Power-on Reset Temporizador de encendido y Temporizador oscilador de puesta en marcha Amplio rango de voltaje de operacin. (2.0 - 5.5V) Rango de temperature industrial y extendido Clula Flash/EEPROM de alta resistencia. Escritura Flash de hasta 100,000 veces. Escritura EEPROM de hasta 1,000,000 de veces. Retencin de datos hasta 100 aos. Consumo de corriente en modo Standby:

100 nA @ 2.0V, tpico. Consumo de corriente en operacin 12A @ 32 kHz, 2.0V, tpico. 120A @ 1 MHz, 2.0V, tpico. Consumo de corriente en modo temporizador Watchdog 1A @ 2.0V, tpico. Consumo de corriente del Timer1: 1.2A @ 32 kHz, 2.0V, tpico Oscilador interno Dual Speed: Seleccionable entre 4 MHz y 37 kHz 4s al salir del modo Sleep, 3.0V, tpico.

Caractersticas de perifricos: 16 pines de entrada/salida con control individual de direccin. Alta corriente sumidero/fuente para control directo de LED Mdulo anlogo comparador con: Dos comparadores anlogos Mdulo de voltaje de referencia (VREF) programable on-chip Referencia seleccionable interna o externa Salidas de comparador accesible externamente Timer0: temporizador/contador de 8-bit con prescaler programable de 8-bit Timer1: temporizador/contador de 16-bit con capacidad cristal/reloj externo Timer2: temporizador/contador de 8-bit con registro de perodo, prescaler y postscaler de 8bits. Mdulo captura, comparacin y PWM (Modulacin por Ancho de Pulso) Captura/Comparacin de 16-bits. PWM de 10-bit. Transmisor/Receptor Universal Sncrono/Asncrono direccionable USART/SCI Diferentes encapsulados y distribucin de pines del microcontrolador:

Diagrama de Bloques de Arquitectura:

Dispositivo

16F628A

Memoria de programa Flash (Palabras) 2048

Memoria de datos E/S SRAM (bytes) 224 EEPROM (bytes) 128

CCP (PWM) 1

USART

Comparadores

Temporizadores 8/16-bits 2/1

16

Mapa de Memoria del 16F628A:

Se puede apreciar, que el microcontrolador consta de cuatro bancos de memoria desde el Bank 0 hasta el Bank 3. Cabe sealar, que en la memoria existen direcciones reservadas para los registros, por lo general si nos encontramos en el Bank 0 al programar podremos usar la memoria para datos que deseamos almacenar a partir de la direccin 20h hasta 6Fh, reservada como registros de

propsito general, si nos encontramos en el Bank 1, desde la direccin A0H hasta EFh. En el caso del Bank 2 solo se dispone desde la direccin 120h hasta 14Fh y en el caso del Bank 3 no est habilitada la memoria de propsito general. Para acceder a la informacin que hemos almacenado en cualquiera de estas direcciones, debemos asegurarnos de indicarle al microcontrolador que banco vamos a emplear. Las reas de memoria marcadas en color gris no han sido implementadas, por lo tanto no se encontraran disponibles. Asimismo, existen algunos registros que aparecen ms de una vez en diferentes bancos, esto quiere decir que la informacin contenida en dicho registro ser la misma en cada banco que aparezca. Por ejemplo, el registro STATUS y FSR aparecen en los cuatro bancos, por lo tanto si requerimos acceder a la informacin que contenga no ser necesario indicarle al microcontrolador el cambio de banco. Juego de instrucciones:
Mnemnico, Descripcin Ciclos Operando MSb REGISTROS ORIENTADOS A LAS OPERACIONES DE BYTES 00 ADDWF f, d Add W y f 1 00 ANDWF f, d AND W con f 1 00 CLRF f Limpiar f 1 CLRW COMF DECF DECFSZ INCF INCFSZ IORWF MOVF MOVWF NOP RLF f, d f, d f, d f, d f, d f, d f, d f f, d Limpiar W Complemento de f Decremento de f Decremento f, Saltar si es 0 Incrementar f Incrementar f, Saltar si es 0 OR Inclusive W con f Mover a f Mover de W a f No Operacin 1 1 1 1(2) 1 1(2) 1 1 1 1 00 00 00 00 00 00 00 00 00 00 00 Opcode 14-bits LSb 0111 0101 0001 0001 1001 0011 1011 1010 1111 0100 1000 0000 0000 1101 dfff dfff lfff 0000 dfff dfff dfff dfff dfff dfff dfff lfff 0xx0 dfff ffff ffff ffff 0011 ffff ffff ffff ffff ffff ffff ffff ffff 0000 ffff C 1,2 Z Afecta a STATUS C,DC,Z Z Z Z Z Z 1,2 1,2 1,2,3 1,2 1,2,3 1,2 1,2 Notas 1,2 1,2

Z Z

Rotar a la 1 izquierda f pasando por Carry RRF f, d Rotar a la 1 derecha f pasando por Carry SUBWF f, d Subtraccin de 1 W desde f SWAPF f, d Cambia nibbles 1 en f XORWF f, d OR Exclusivo 1 de W con f REGISTROS ORIENTADOS A LAS OPERACIONES DE BITS BCF f, b Bit f a 0 1

00

1100

dfff

ffff

1,2

00 00 00

0010 1110 0110

dfff dfff dfff

ffff Ffff ffff

C,DC,Z

1,2 1,2

1,2

01

00bb

bfff

ffff

1,2

BSF BTFSC

f, b f, b

Bit f a 1 Probar Bit f, Saltar si est en 0

1 1(2)

01 01

01bb 10bb

bfff bfff

ffff ffff

1,2 3

Probar Bit f, Saltar si est en 1 OPERACIONES LITERALES Y DE CONTROL ADDLW k Aadir literal a W ANDLW CALL CLRWDT k k AND literal con W Llamada a Subruttina Limpia Watchdog Timer Ir a una direccin OR Inclusivo literal con W Mover literal a W Retornar de una interrupcin Retornar un literal a W Retornar desde una Subrutina Ir al modo Standby Subtraccin de W desde un literal OR Exclusivo de un literal con W

BTFSS

f, b

1(2)

01

11bb

bfff

ffff

11

111x

kkkk

kkkk

C,DC,Z

1 2 1

11 10 00 10 11 11 00 11 00 00 11 11

1001 0kkk 0000 1kkk 1000 00xx 0000 01xx 0000 0000 110x 1010

kkkk kkkk 0110 kkkk kkkk kkkk 0000 kkkk 0000 0110 kkkk kkkk

kkkk kkkk 0100 kkkk kkkk kkkk 1001 kkkk 1000 0011 kkkk kkkk

TO,PD

GOTO IORLW MOVLW RETFIE

k k k

2 1 1 2

RETLW RETURN SLEEP SUBLW

k k

2 2 1 1

TO,PD C,DC,Z

XORLW

Nota: 1. Cuando un registro de E/S se ha modificado en funcin de s misma (por ejemplo, MOVF PORTB, 1), el valor utilizado ser el valor presente de los mismos pines. Por ejemplo, si el latch de los datos es '1' para un pin configurado como entrada y es conducido bajo por un dispositivo externo, los datos se escribir de nuevo con un '0'. 2. Si se ejecuta esta instruccin en el registro TMR0 (y, en su caso, d = 1), el prescaler se borrar si se ha asignado al mdulo del Timer0. 3. Si el Contador de Programa (PC) es modificado o una prueba condicional es verdadera, la instruccin requiere dos ciclos. El segundo ciclo se ejecuta como un NOP. Ejemplo de manejo de un LCD 2x16 caracteres con 16F628A: Haciendo uso del entorno de programacin MPLAB IDE v8.73a se crea el programa DDIGITAL.ASM, con la finalidad de controlar una pantalla LCD 2x16 caracteres, el cual incluye los archivos MACROPIC.INC (macros de operaciones bsicas), LCDPORTB.ASM (programa para controlar pantallas LCD de 2x16 caracteres compatibles con HD44780 de Hitachi) y RETARDO.ASM (programa que genera rutinas de retardo por software). Este programa presenta en la primera fila del display la frase Diseno Digital y luego de 600ms FIEE UNMSM 2011, despus de 600ms la pantalla se borra y el proceso se repite.

En la imagen siguiente de MPLAB se puede apreciar la correcta compilacin del cdigo listo para ser cargado en el microcontrolador, al haberse creado un archivo ddigital.hex.

A continuacin se encuentra el programa DDIGITAL.ASM y los archivos necesarios para la compilacin. DDIGITAL.ASM:
; Ejemplo de manejo de un LCD ; Calderon Vivanco, Victor ; 06190187 LIST P=16F628A INCLUDE <P16F628A.INC> INCLUDE <MACROPIC.INC> CBLOCK ENDC ORG BSF CLRF BCF call REPITE movlw call movlw call movlw call 0x20

0000H STATUS,RP0 TRISB STATUS,RP0 inicio_LCD DISP_CLEAR EnviaCmdLCD DISP_HOME EnviaCmdLCD DISP_LINEA1 EnviaCmdLCD

; Banco 1 ; PORTB como salida ; Banco 0

movlw call movlw call movlw call movlw call movlw call movlw call movlw call movlw call movlw call movlw call movlw call movlw call movlw call movlw call

'D' EnviaCarLCD 'i' EnviaCarLCD 'S' EnviaCarLCD 'e' EnviaCarLCD 'n' EnviaCarLCD 'o' EnviaCarLCD ' ' EnviaCarLCD 'D' EnviaCarLCD 'i' EnviaCarLCD 'g' EnviaCarLCD 'i' EnviaCarLCD 't' EnviaCarLCD 'a' EnviaCarLCD 'l' EnviaCarLCD

movlw DISP_HOME call EnviaCmdLCD call ret600ms movlw DISP_LINEA2 call EnviaCmdLCD movlw call movlw call movlw call movlw call movlw call movlw call movlw call movlw call movlw call movlw call movlw 'F' EnviaCarLCD 'I' EnviaCarLCD 'E' EnviaCarLCD 'E' EnviaCarLCD ' ' EnviaCarLCD 'U' EnviaCarLCD 'N' EnviaCarLCD 'M' EnviaCarLCD 'S' EnviaCarLCD 'M' EnviaCarLCD ' '

call movlw call movlw call movlw call movlw call

EnviaCarLCD '2' EnviaCarLCD '0' EnviaCarLCD '1' EnviaCarLCD '1' EnviaCarLCD

movlw DISP_HOME call EnviaCmdLCD call ret600ms goto REPITE

INCLUDE <LCDPORTB.ASM> INCLUDE <RETARDO.ASM> END

RETARDO.ASM:
cblock contador1 contador2 endc ;registro usado por retardo ;registro usado por retardo

;******************************************************************* t0 equ 0x82 ;constante para generar aprox. 25ms t4.6ms equ 0x06*4 ;constante para generar 4,6ms t15.4ms equ 0x14*4 ;constante para generar 15,4ms t200us equ 0x01 ;constante para generar aprox. 200us ;******************************************************************* retardo: clrf contador1 ;aclara contador1 ret decfsz contador1,F ; goto ret decfsz contador2,F goto ret return ret50ms: movlw t0 movwf contador2 call retardo call retardo return ret100ms: call ret50ms call ret50ms return ret300ms: call call call ret100ms ret100ms ret100ms ;RETARDO 50 ms

;RETARDO 100 ms

;RETARDO 300 ms

return ret600ms: call ret300ms call ret300ms return ;RETARDO 600 ms

LCDPORTB.ASM:
cblock CHAR TEMP NumCadena indice W_temp endc DATOS CNTRL E RW RS EQU PORTB EQU PORTB EQU EQU EQU 1 2 3 ;ubicacin del caracter ;almacenamiento temporal ;nmero de la cadena

;lineas de datos = PORTB ;lineas de control = PORTB ;linea de control E = bit1 ;linea de control RW = bit2 ;linea de control RS = bit3 EQU B'00001111' ;Display on, cursor on,blink B'00001100' ;Display on, cursor off B'00000001' ;Aclarar display B'00001000' ;apaga el display B'11000000' ;segunda linea B'10000000' ;primera linea B'00000010' ;cursor al inicio B'00010100' ;cursor a la derecha B'00010000' ;cursor a la izquierda B'00011100' ;mueve contenido del display a la B'00011000' ;mueve contenido del display a la

DISP_ON_CURSOR_BLINK DISP_ON_NOCURSOR EQU DISP_CLEAR EQU DISP_OFF EQU DISP_LINEA2 EQU DISP_LINEA1 EQU DISP_HOME EQU DISP_RIGHT EQU DISP_LEFT EQU DISP_CONTR EQU derecha DISP_CONTL EQU izquierda

;******************************************************************* ;EnviaCarLCD - Envia un caracter a la pantalla LCD * ;Esta rutina separa el caracter entre el nibble superior e inferior* ;y los envia a la pantalla LCD, nibble mas alto primero * ;******************************************************************* EnviaCarLCD movwf W_temp ;almacena temporal W movwf CHAR ;W contiene caracter a ser enviado call TestBusyLCD ;Esperar que LCD este listo movf CHAR,w andlw 0xF0 ;Obtener el nibble superior movwf DATOS ;Enviar datos al LCD bcf CNTRL,RW ;Poner al LCD en modo lectura bsf CNTRL,RS ;Poner al LCD en modo de datos nop bsf CNTRL,E ;Conmutar E nop bcf CNTRL,E swapf CHAR,w andlw 0xF0 ;Obtener el nibble inferior

movwf DATOS bcf CNTRL,RW bsf CNTRL,RS nop bsf CNTRL,E nop bcf CNTRL,E movf W_temp,W return

;Enviar datos al LCD ;Poner al LCD en modo lectura ;Poner al LCD en modo de datos ;Conmutar E ;restaura W

;******************************************************************* ;*EnviaCmdLCD - Envia comando a la pantalla LCD * ;*Esta rutina separa el comando en nibble superior y nibble * ;*inferior y los envia a la pantalla LCD, nibble mas alto primero * ;******************************************************************* EnviaCmdLCD movwf CHAR ;Caracter a ser enviado esta en reg. W call TestBusyLCD ;esperar LCD listo movf CHAR,w andlw 0xF0 ;Obtener nibble superior movwf DATOS ;enviar dato al LCD bcf CNTRL,RW ;Poner LCD en modo lectura bcf CNTRL,RS ;Poner LCD en modo comando nop bsf CNTRL,E ;conmutar E para LCD nop bcf CNTRL,E swapf CHAR,w andlw 0xF0 ;Obtener nibble inferior movwf DATOS ;enviar dato al LCD nop bsf CNTRL,E ;conmutar E para LCD nop bcf CNTRL,E return ;******************************************************************* ;* Esta rutina chequea el flag de busy de la pantalla LCD, * ;* retorna cuando no esta ocupado * ;* Afecta: * ;* TEMP - retorna con busy/address * ;******************************************************************* TestBusyLCD banco 1 movlw b'11110000' ;Seleccionar DATOS[4..7] movwf TRISB banco 0 bcf CNTRL,RS ;Porne LCD en modo comando bsf CNTRL,RW ;prepara para leer flag de busy nop bsf CNTRL,E ;E='1' nop movf DATOS,W ;Lee flag de busy del nibble sup., direccion DDRam bcf CNTRL,E ;conmuta E para tomar nibble inferior andlw 0F0h ;Enmascara el nibble movwf TEMP ;lo almacena

nop bsf CNTRL,E nop swapf DATOS,w ;Lee flag de busy del nibble inf., direccion DDRam bcf CNTRL,E ;Poner E='0' andlw 00Fh ;Enmascara nibble superior iorwf TEMP,1 ;Combina nibbles btfsc TEMP,7 ;Chequea flag de busy, alto = ocupado goto TestBusyLCD ;Si esta ocupado, chequear nueamente bcf CNTRL,RW banco 1 movlw 0x00 ;poner DATOS como salidas movwf TRISB banco 0 return ;************************************************************** ;* Esta rutina inicializa la pantalla LCD * ;* Afecta: * ;* TEMP - retornado con busy/address * ;************************************************************** inicio_LCD banco 0 bcf CNTRL,E ; aclara lineas de control bcf CNTRL,RW bcf CNTRL,RS movlw 0x0F ;aclara lineas de datos movwf DATOS ;Configurar puertos DATOS[4..7] y CNTRL[1..3] como salidas banco 1 movlw B'00001111' ;4 bits mas altos de DATOS movwf TRISB bcf TRISB,E ;bits de control como salidas bcf TRISB,RW bcf TRISB,RS banco 0 ;Inicializar la pantalla LCD movlw movwf call movlw movwf nop bsf nop bcf movlw movwf call movlw movwf nop bsf nop t15.4ms contador2 retardo B'00110000' DATOS CNTRL,E CNTRL,E t4.6ms contador2 retardo B'00110000' DATOS CNTRL,E ;guarda de 15 ms ;Configurar LCD para interfaz de 4 bits ;conmutar E para LCD

;Funcion escoger 2 lineas ;de caracteres de 5x7 bits ;conmutar E para LCD

bcf CNTRL,E movlw B'00110000' movwf DATOS nop bsf CNTRL,E nop bcf CNTRL,E movlw t200us movwf contador2 call retardo movlw B'00100000' movwf DATOS nop bsf CNTRL,E nop bcf CNTRL,E

;Parte de la secuencia de encendido ;conmutar E para LCD ;retardo ;Configurar modo 4 bits ; ;conmutar E para LCD

;El flag de ocupado estaria valido despues de este punto movlw B'00101000' ;Interfaz de 4 bits, 2 lineas call EnviaCmdLCD ; de caracteres de 5x7 movlw DISP_ON_CURSOR_BLINK ;Display on, cursor on,blink call EnviaCmdLCD movlw DISP_CLEAR ;Aclarar display call EnviaCmdLCD movlw B'00000110' ;Poner modo incremental, sin desplazamiento call EnviaCmdLCD movlw B'10000000' ;Address DDRam upper left call EnviaCmdLCD return

MACROPIC.INC:
;********************************************************************** ; Filename: macropic.inc * ; Date: 21-06-2003 * ; File Version: 1.0 * ; Author: Alfredo Granados Ly * ; Company: INICTEL * ;********************************************************************** ; Files required: * ; * ;********************************************************************** ; Notes: * ; Aplicaciones Avanzadas con PIC * ;********************************************************************** ;************************************************************** banco x banco macro x if x == 0 bcf STATUS,RP0 bcf STATUS,RP1 endif if x == 1 bsf STATUS,RP0 bcf STATUS,RP1 endif if x == 2

bcf bsf endif if x == 3 bsf bsf endif endm

STATUS,RP0 STATUS,RP1 STATUS,RP0 STATUS,RP1

;************************************************************** pagina pagina macro x if x == 0 bcf PCLATH,3 bcf PCLATH,4 endif if x == 1 bsf PCLATH,3 bcf PCLATH,4 endif if x == 2 bcf PCLATH,3 bsf PCLATH,4 endif if x == 3 bsf PCLATH,3 bsf PCLATH,4 endif endm ;************************************************************** mov mov macro registro,literal movlw literal movwf registro endm ;************************************************************** movr movr macro registro1,registro2 movf registro2,0 movwf registro1 endm ;************************************ compara y salta si no es igual cjne macro registro,dato,direcc movlw dato subwf registro,0 btfss STATUS,Z goto direcc endm ;************************************ compara y salta si es igual cje macro registro,dato,direcc movlw dato subwf registro,0 btfsc STATUS,Z goto direcc endm

;*************************** decrementa, compara y salta si no es igual dcjne macro registro,dato,direcc decf registro,1 movlw dato subwf registro,0 btfss STATUS,Z goto direcc endm ;*************************** compara y salta si es menor cjl macro registro,dato,direcc movlw dato subwf registro,0 ; W = REGISTRO - W btfss STATUS,C ; C='1'? goto direcc endm ;********************* compara y salta si es menor igual cjle macro registro,dato,direcc movlw dato subwf registro,0 ; W = REGISTRO - W btfss STATUS,C ; C='1'? goto direcc btfsc STATUS,Z ; Z='0'? goto direcc endm ;************************ compara y salta si no es menor cjnl macro registro,dato,direcc movlw dato subwf registro,0 ; W = REGISTRO - W btfsc STATUS,C ; C='0'? goto direcc endm ;********************** compara y salta si es mayor o igual cjge macro registro,dato,direcc movlw dato subwf registro,0 ; W = REGISTRO - W btfsc STATUS,C ; C='0'? goto direcc endm ;************************************************* esuno esuno MACRO REGISTRO,BIT local no_es_uno_1 no_es_uno_1 btfss REGISTRO,BIT goto no_es_uno_1 endm ;************************************************* escero escero MACRO REGISTRO,BIT local no_es_cero_1 no_es_cero_1 btfsc REGISTRO,BIT goto no_es_cero_1

endm ;************************************************* jmp MACRO Direccion goto Direccion endm ;************************************************* jz MACRO Direccion btfsc STATUS,Z goto Direccion endm ;************************************************* jnz MACRO Direccion btfss STATUS,Z goto Direccion endm ;************************************************* jc MACRO Direccion btfsc STATUS,C goto Direccion endm ;************************************************* jnc MACRO Direccion btfss STATUS,C goto Direccion endm ;************************************************* jbs MACRO Reg, Bit, Adr ;saltar si bit esta seteado btfsc Reg, Bit goto Adr endm ;************************************************* jbc MACRO Reg, Bit, Adr ;saltar si bit esta aclarado btfss Reg, Bit goto Adr endm ;************************************************* sbs macro Reg, Bit ;obviar si bit esta seteado btfss Reg, Bit endm ;************************************************* sbc macro Reg, Bit ;obviar si bit esta aclarado btfsc Reg, Bit endm ;************************************************* compara macro reg1, constante movlw constante xorwf reg1,W

endm

En la siguiente imagen se puede apreciar el funcionamiento del programa ddigital.asm en assembler simulado en el software Proteus Isis Profesional Release 7.7 SP2.

Bibliografa: [En lnea] ww1.microchip.com/downloads/en/devicedoc/40044f.pdf [Consulta: noviembre 2011]

You might also like