Você está na página 1de 18

Laboratorio pic16f628a

Este fue el primer laboratorio para poder conocer como un pic16f628a nos ayude a realizar varias
conexiones electrnicas, desde prender un led hasta que nos tenga la mejor ayuda del microchip.
Sus primeros cambios fue conectar con el pic16f84a, pero el costo es menor con el microcontrolador
pic16f628a con mejores actualizaciones, desde tener un cristal dentro del micro con muchsimo ms
memoria. Es decir: Flash programa 2048x14, ram dato 224x8, eeprom dato 128x8 y muy buen conexin
de 3V a 5,5V. Realiza infinidad de veces mejores que el pic16f84a; ademas no es fcil de encontrar este
pic anterior.

Lo mas sensillo en estos cambios son los siguientes:

LIST P = 16F84
#include <p16F84.inc>
__CONFIG 1Bh ;_CP_OFF & _PWRTE_ON & _WDT_OFF & _RC_OSC

;20h General
;21h General
;22h General
;23h General
;24h General
;25h General
;26h General
;27h General

;28h General
;29h General
;2Ah General
;2Fh General
;30h rutina delay etc
;31h rutina delay etc
;32h rutina delay etc
;33h para bajo delay etc
;3Eh para bits etc
;3Fh para bits etc

Empieza ORG 0 ;Cargue el cdigo a direccin 000


Empieza1 BSF 03,5 ;seleccionar Banko 1
MOVLW 03 ;Pone 0000 0011 en W
MOVWF 05 ;graba TrisA. RA0, RA1 entrada. Otros salidas
MOVLW 08 ;Pone 0000 1000 en W
MOVWF 06 ;graba TrisB. RB3 entrada. Otros salidas
BCF 03,5 ;Banko 0
CLRF 06 ;apagar Port B
GOTO Principal

Tabla1 ADDWF 02,1


RETLW 08
RETLW 01Ah
RETLW 0BEh
RETLW 0FFh

Delay1 XXX ;Mire una lnea de la entrada


XXX ;Input LOW
RETLW 00

Principal XXX
BTFSS 06,3 ;Test de linear entrada
XXX
XXX
CALL Delay1
XXX

BSF 06,0 ; realice la salida alta

XXX
CALL Tabla1

XXX

GOTO Principal

END ;Fin

LIST P=16F6280a ;f=inhx8m


#include "P16F628.inc"
__CONFIG _CP_OFF &_BODEN_OFF &_PWRTE_OFF &_WDT_OFF
&_LVP_OFF &_MCLRE_OFF &_INTRC_OSC_NOCLKOUT ;interno crystal 4MHz

;20h General
;21h General
;22h General
;23h General
;24h General
;25h General
;26h General
;27h General
;28h General
;29h General
;2Ah General
;2Fh General
;30h rutina delay etc
;31h rutina delay etc
;32h rutina delay etc
;33h para bajo delay etc
;3Eh para bits etc
;3Fh para bits etc

Empieza ORG 0 ;Cargue el cdigo a direccin 000


MOVLW 07 ;compartido
MOVWF 1Fh ;1F es el CMCON
BSF 03,5 ;Banko 1
CLRF 06 ;apagado port B salida
MOVLW 030h ;graba W con 0011 0000
MOVWF 05 ;RA0,1,2,3,6 salida RA4 y 5 entrada
BCF 03,5 ;Banko 0
CLRF 3F ;apaga el boton que presiona
CLRF 05 ;apagado la lneas de salida de porta A
CLRF 06 ;apagan las salidas de porta B
GOTO Main

Table1 ADDWF 02,1


RETLW 0A1h
RETLW 32h

Del1 NOP
DECFSZ 30h,1
GOTO Del1
DECFSZ 31h,1
GOTO Del1
RETURN

Principal MOVLW 020h


MOVWF 022h
BTFSC 2F,0 ;Boton A presiona el primer tiempo?
XXX
GOTO Principal

END ;Fin

Luego de esta forma, encontraremos que el cambio del pic16f84a al 16f628a se puede y no ser muy
difcil.

Circuito de Laboratorio
Mostramos el primer experimento

Este experimento enciende un Led cuando el botn A se presiona.


El botn se presionar en el puerto A (bit 0) donde la lnea que entra ser alta. Esto se llama lgica
positiva. El Led es conectado del puerto B (bit 0). En este circuito, el puerto "A" realiza una entrada y
el puerto "B" en la salida. El puerto A y B tiene 8 lneas con el pic16f628a, pues en el pic16f84a el
puerto A llegan solamente 5 lneas.

El interruptor se conecta a RA0 y el led se conecta a RB0. Cualquier puerto puede cambiarse de una
entrada o salida en el programa. Si usted va a cambiar la direccin de un puerto, revise bien el circuito
pues si por ejemplo se conecta el puerto B a la tierra pero no al led, el chip se daar cuando el botn
se pulse.

;Proyecto1: Pulsando el boton, prende el LED

List P = 16F628a
#include <p16F628a.inc>

__CONFIG B'11110100111001';_CP_OFF &_BODEN_OFF &_PWRTE_OFF


&_WDT_OFF&_LVP_OFF &_MCLRE_ON &_INTRC_OSC_NOCLKOUT

Empezar ORG 0
MOVLW 0x07
MOVWF CMCON ;apaga el comparador
BSF 03,5 ;Banko 1
CLRF 06 ;apagado puerto B salida
MOVLW 01 ;grabando W con 0000 0001
MOVWF 05 ;Make RA0 input
BCF 03,5 ;Banko 0

CLRF 06 ;apagado puerto B salida

Principal BTFSS 05,0 ;Test de entrada en puerto A

GOTO Principal2 ;Boton no presionado


BSF 06,0 ;Boton presionado, prende el LED
GOTO Principal ;ir a Principal
Principal2 BCF 06,0 ;Button not pressed. Turn off LED
GOTO Principal ;ir a Principal

END ;Fin

De esta forma encontraran 24 formas especiales en el laboratorio, donde en m, a solucionado


muchsimas respuestas que pude resolver.

TERMOMETRO: pic16f877a y Lm35


El LM35 es un sensor de temperatura con una precisin calibrada de 1C. Puede medir temperaturas en el rango
que abarca desde -55 a + 150C. La salida es muy lineal y cada grado centgrado equivale a 10 mV en la salida.
Haremos un medidor de temperatura usando la conversion 10-bit del convertidor A/D del pic16f877a y Ra0 como
entrada analogica para mostrar el resultado sobre un LCD de 2*16

;Configuracion de pines del LCD hacia el PIC16f877a


Define LCD_DREG PORTB ;usamos puertoB como salida de datos
Define LCD_DBIT 4 ; solo usamos 4 bits altos (Rb4-RB7)
Define LCD_RSREG PORTB ;RS va conectado a puertoB
Define LCD_RSBIT 2 ; RS a Rb2
Define LCD_EREG PORTB ; E va conectado a puertoB
Define LCD_EBIT 3 ; E va a Rb3

;Definimos parametros del conversor A/D

Define ADC_BITS 10 ;Numero bits del resultado=10


Define ADC_CLOCK 3 ;fuente del Reloj 3 (3=rc)
Define ADC_SAMPLEUS 50 ;tiempo de muestreo del ADC en useg
Resultado var word ;Historia de la conversion
TRISA = %11111111 ; PORTA configurado como entradas
ADCON1 = %10000010 ; PORTA analog y justificacion del resultado
Pause 200 ;tiempo para el LCD

;Programa Principal
inicio:
ADCIN 0, Resultado ;lee Ra0 y guarda en resultado
Lcdout $fe,1 ;Limpia la pantalla
Lcdout "temperatura:",DEC Resultado ;muestra el resultado en decimal
LCDOUT $fe,$C0,"grados C" ; pasa a la siguiente linea y escribe
Pause 1000 ;espera 1 seg
Goto inicio ;vamos a inicio
End

Logico que al circuito hay que colocarle un cristal de 4 MHZ y conectar pines 11 y 32 a 5V. y pines 12 y 31 a Gnd.
Aqui tienen el archivo HEX listo para grabarlo, lo pueden bajar del siguiente link:
http://www.4shared.com/file/N96RlROQ/termometro.html
NOTA: El proyecto presenta un pequeo error en la medicion el cual se puede corregir de varia maneras, una
solucion rapida es utilizar un potenciometro de 5k y colocar sus extremos entre el pin2 del lm35 y tierra luego el
centro o terminal variable del potenciometro conectar a la entrada Ra0 del pic de tal manera que hacemos un
divisor de tension. Otra forma es usando amplificadores operacionales el cual veremos mas adelante.

Termometro con pic16F877A

Anuncios Google

Medio de Temperaturawww.italterm.com - Medio de Temperatura em Metais INDICMAX,


FORNERO, ITALTEMP
Esto es para los interesados en electronica y microcontroladores, es un termometro digital hecho con un pic16F877A, un
display de 16x2 y un LM35 (sensor de temperatura). El sensor manda la seal analogica al microcontrolador y despliega
en el display la temperatura que el sensor esta capturando. Tiene una varioacion como de 1 grado con la temperatura
real asi que es bastante exacto. Les dejo el circuito electrico, la simulacion la hice con el ISIS proteus:

====== Lista de materiales ======

U1 = Microcontrolador PIC16F877A
U2 = Sensor de temperatura LM35
LCD1 = Display de 16x2 (16 caracteres por 2 filas)
X1 = Cristal de cuarzo de 4Mhz
PB1 = pulsador o push button normalmente abierto
R1 = Resistencia de 100 ohm a 1/4 w
R2 = Resistencia de 10 kohm a 1/4 w
RV1 = Potenciometro de 10 kohm
C1, C2 = Capacitores ceramicos de 15pf (no polarizados)
C3 = Capacitor ceramico de 100nf (no polarizados)
D1 = Diodo 1N4148

NOTA: Si tu LCD tiene un led para la luz de fondo debes agregarle una resistencia de 220 o 330 ohm en el pin del anodo
o polo positivo de este led. Pera saber cuales son esos pines consulta el datasheet de tu LCD.
Tambien les dejo el codigo, esta hecho en lenguaje ensamblador, el codigo no lo hice, solo lo modifique del original por
que estaba hecho para el pic16f887, les dejo la info del autorIng. Miguel Angel Piedra
Angeles,http://www.cosasdeingenieria.com

dijo:
;*********************************************************************************** ; *
; programa: termometro.asm * ; *
; este programa muestra el funcionamiento del conversor analgico - digital que *
; contiene el pic16f877a. toma la seal analgica del sensor de temperatura y la *
; convierte a digital. una vez hecha la conversin la despliega en la pantalla lcd *
; dndonos como resultado la temperatura que hay en el ambiente. * ; *
; velocidad del reloj: 4mhz tipo de reloj: xt *
; perro guardin: deshabilitado proteccin del cdigo: off * ; *
;***********************************************************************************
list p=16f877a radix hex include "p16f877a.inc" ;declaracin de la librera ;*******************declaracin de los bits
de configuracin*******************
__config _cp_off&_cpd_off&_lvp_off&_wdt_off&_xt_osc
;************************** declaracin de registros **************************
cblock 0x20 num1,num2,num3 ;******************************************************************************
pointer ;registros utilizados en
unidades,decenas ;binbcd y en la adquisicin de
centenas,millares ;datos
datoh
unidadest,decenast
centenast,millarest
sample
shift
;******************************************************************************
promedio
contador
endc

cblock 0x70 ;se coloca a datol en una de las localidades de datol


;memoria que estn espejadas en banco0 y banco1
endc
;****************************************************************************** ;****************declaracin de los pines de
control de la lcd*****************
#define rs portc,2
#define en portc,1 ;****************************************************************************** ;**************puerto donde
estarn los pines de datos de la lcd***************
portlcd equ portd ;******************************************************************************
;******************************************************************************
;comandos de la pantalla
limpiar equ b'00000001' ;limpia toda la pantalla
renglon1 equ b'10000000' ;coloca en el rengln 1
renglon2 equ b'11000000' ;coloca en el rengln 2
dison equ b'00001100' ;enciende el display
home equ b'00000010' ;va a la direccin 0
shiftdl equ b'00011100' ;rota el lcd a la izquierda
shiftdr equ b'00011000' ;rota el lcd a la derecha
shiftcl equ b'00010100' ;rota el cursor a la izquierda
shiftcr equ b'00010000' ;rota el cursor a la derecha
;******************************************************************************
org 0x00 ;vector de reset
goto inicio ;salto al inicio del cdigo
org 0x04 ;vector de interrupcin
;*******************tablas de datos para la subrutina binbcd*******************
tablau ;tabla de unidades
movf pointer,w
addwf pcl,f
retlw d'2'
retlw d'6'
retlw d'8'
retlw d'4'
retlw d'2'
retlw d'6'
retlw d'8'
retlw d'4'
retlw d'2'
retlw d'1'

tablad ;tabla de decenas


movf pointer,w
addwf pcl,f
retlw d'1'
retlw d'5'
retlw d'2'
retlw d'6'
retlw d'3'
retlw d'1'
retlw d'0'
retlw d'0'
retlw d'0'
retlw d'0'

tablac ;tabla de centenas


movf pointer,w
addwf pcl,f
retlw d'5'
retlw d'2'
retlw d'1'
retlw d'0'
retlw d'0'
retlw d'0'
retlw d'0'
retlw d'0'
retlw d'0'
retlw d'0' ;******************************************************************************
inicio: bsf status,rp0 ;cambio a banco1
clrf trisd ;configuro todo portd como salida
bcf trisc,1 ;configuro portc,1 como salida(en)
bcf trisc,2 ;configuro portc,2 como salida(rs)
bcf status,rp0 ;cambio a banco0
clrf portd ;apago posible latchs en portd
clrf portc ;apago posible latchs en portc
call init_adqui ;llamo a la subrutina de configuracin de
;el modulo adc
call initlcd ;llamo a la subrutina de inicializacin
;de la pantalla lcd 16x2
start call d16x2 ;llamo a la subrutina que escribe el mensaje inicial ;****************************************
;codigo que hace que se ejecute el comando de rotacin a la derecha 46 veces
movlw .46
movwf shift

vuelta call retardo


movlw shiftdr ;comando de rotacin
call cmd
decfsz shift,f
goto vuelta
;****************************************
movlw limpiar ;comando de limpieza de pantalla
call cmd
opera movlw renglon1 ;comando para empezar a escribir a partir
call cmd ;de la primera direccin del renglon1
clrf promedio ;se limpia al registro promedio
call adqui ;se llama a la subrutina de adquisicin de
;datos del adc
call binbcd ;llamo a la subrutina que convierte de binario
;a ascii
;****************************************
movf millares,w ;mando los datos adquiridos a la lcd
call dato
movf centenas,w
call dato
movf decenas,w
call dato
movf unidades,w
call dato
;****************************************
movlw b'11011111' ;dato para el smbolo de grado
call dato
movlw 'c' ;la c de celsius
call dato
goto opera ;regreso al inicio del programa principal
;**************************subrutina de los mensajes **************************
d16x2 movlw "p"
call dato
movlw "r"
call dato
movlw "o"
call dato
movlw "y"
call dato
movlw "e"
call dato
movlw "c"
call dato
movlw "t"
call dato
movlw "o"
call dato
movlw " "
call dato
movlw "p"
call dato
movlw "d"
call dato
movlw "m"
call dato
movlw renglon2
call cmd
movlw "t"
call dato
movlw "e"
call dato
movlw "r"
call dato
movlw "m"
call dato
movlw "o"
call dato
movlw "m"
call dato
movlw "e"
call dato
movlw "t"
call dato
movlw "r"
call dato
movlw "o"
call dato
movlw " "
call dato
movlw "a"
call dato
movlw "/"
call dato
movlw "d"
call dato
return
;**********************subrutina de adquisicin del adc**********************
adqui: call sampletime ;retardo de adquisicin
bsf adcon0,go ;inicia la conversin
btfsc adcon0,go ;ya se termino la conversin?
goto $-1 ;no? pregunta de nuevo
banksel adresh ;si, continua
movf adresh,w ;lee la parte ms significativa
movwf datoh ;gurdalo en datoh
banksel adresl ;cambio a banco1
movf adresl,w ;lee la parte menos significativa
movwf datol ;gurdalo en datol
banksel portb ;cambio a banco0
bcf status,c ;borra el bit de acarreo
rrf datoh,f ;elimino el bit menos significativo
rrf datol,f ;para ocupar solo 9 bits
return
sampletime:
movlw .225
movwf sample
espera_s:
nop
nop
decfsz sample,f
goto espera_s
return
;***********************subrutina de inicializacin lcd************************
initlcd:
movlw b'00110000' ;1
call cmd
movlw b'00110000' ;2
call cmd
movlw b'00110000' ;3
call cmd
movlw b'00111100' ;4
call cmd
movlw b'00001000' ;5
call cmd
movlw b'00000001' ;6
call cmd
movlw b'00000110' ;7
call cmd
movlw dison ;8
call cmd
movlw home
call cmd
return
;*****************subrutina que enva los caracteres a la lcd******************
dato movwf portlcd
bsf rs
nop
nop
nop
bsf en
call retardo5ms
bcf en
return
;******************subrutina que enva los comandos a la lcd*******************
cmd movwf portlcd
bcf rs
nop
nop
nop
bsf en
call retardo5ms
bcf en
return
;******************************************************************************
retardo5ms
movlw d'1'
movwf num3
otra25 movlw d'100'
movwf num2
otra15 movlw d'166'
movwf num1
otra5 decfsz num1,f
goto otra5
decfsz num2,f
goto otra15
decfsz num3,f
goto otra25
return
;******************************************************************************
retardo movlw d'3'
movwf num3
otra25a movlw d'200
' movwf num2
otra15a movlw d'166'
movwf num1
otra5a decfsz num1,f
goto otra5a
decfsz num2,f
goto otra15a
decfsz num3,f
goto otra25a
return
;******************subrutina de conversin de binario a ascii******************
binbcd clrf millares
clrf unidades
clrf decenas
clrf centenas
clrf pointer
otra btfss datoh,7
goto rota
call tablau
addwf unidades,f
call tablad
addwf decenas,f
call tablac
addwf centenas,f
;****************************************
movf unidades,w
sublw d'10'
btfss status,c
goto mayor
goto menor
mayor incf decenas,f
movlw d'10'
subwf unidades,f
goto dece
menor movlw d'10'
subwf unidades,w
btfss status,z
goto dece
goto mayor
;****************************************
dece movf decenas,w
sublw d'10'
btfss status,c
goto mayord
goto menord
mayord incf centenas,f
movlw d'10'
subwf decenas,f
goto cente
menord movlw d'10'
subwf decenas,w
btfss status,z
goto cente
goto mayord
;****************************************
cente movf centenas,w
sublw d'10'
btfss status,c
goto mayorc
goto menorc
mayorc incf millares,f
movlw d'10'
subwf centenas,f
goto milla
menorc movlw d'10'
subwf centenas,w
btfss status,z
goto milla
goto mayorc
;****************************************
milla movf millares,w
sublw d'10'
btfss status,c
goto mayorm
goto menorm
mayorm movlw d'10'
subwf millares,f
goto rota
menorm movlw d'10'
subwf millares,w
btfss status,z
goto rota
goto mayorm
;****************************************
rota rlf datol,f
rlf datoh,f
incf pointer,f
movf pointer,w
sublw d'10'
btfss status,z
goto otra
movlw 0x30
addwf unidades,f
movlw 0x30
addwf decenas,f
movlw 0x30
addwf centenas,f
movlw 0x30
addwf millares,f
return
;**********************subrutina de configuracin del cad**********************
init_adqui:
bsf status,rp0
bsf trisa,0
clrf adcon1
bcf status,rp0
movlw b'11000001'
movwf adcon0
return
end ;final del programa

Você também pode gostar