Informe de Reloj Digital Con Pic 16f84a
-
Upload
jesus-miguel-sinche-romero -
Category
Documents
-
view
2.545 -
download
19
Transcript of Informe de Reloj Digital Con Pic 16f84a
“AÑO DEL CENTENARIO DE MACHU PICCHU PARA
EL MUNDO”
PROFESOR:
CESAR QUISPE
CURSO:
MICROPROCESADORES Y MICROCONTROLADORES
PROYECTO:
RELOJ DIGITAL CON PIC 16F84A
ALUMNOS:
SINCHE ROMERO, Jesús Miguel
VASQUEZ QUINTANA
2011
INFORME DE RELOJ DIGITAL CON PIC 16f84a
1.- DESCRIPCION.-
El circuito es un sencillo reloj digital el cual utiliza muy pocos componentes.
Es bien sabido que existen muchas formas de llegar a algo en concreto, en este proyecto se ha utilizado un oscilador externo un cristal de 4MHz el cual fija la frecuencia base y entrega los pulsos de reloj, pero también podría haber utilizado el oscilador interno del pic (modificando el programa) para evitar utilizar este componente.
El pulsador se utiliza para ajustar la hora y poner el circuito en marcha, al hacer el programa para que solo funcione con el oscilador interno es más exacto.
2.-COMPONENTES:
PIC 16f84aResistores: 10k, 220Crystal 4 MHzCondensador 22pFPulsadoresLCD 1602bSwitch
3.-DIAGRAMA DEL CIRCUITO:
OSC1/CLKIN16
RB0/INT6
RB17
RB28
RB39
RB410
RB511
RB612
RB713
RA017
RA118
RA21
RA32
RA4/T0CKI3
OSC2/CLKOUT15
MCLR4
U1
PIC16F84A
X1CRYSTAL
C1
22pF
C2
22pF
1
D7
14D6
13D5
12D4
11D3
10D2
9D1
8D0
7
E6
RW
5RS
4
VSS
1
VDD
2
VEE
3
LCD1LM016L
R3
220
R1
10k R2
10k
EXP - MINUTO_INC
HORA_INC
MINUTO_INC
5.-CODIGO EMPLEADO:
List P=16f84aINCLUDE "P16F84A.INC"
__CONFIG _XT_OSC & _CP_OFF & _PWRTE_ON & _WDT_OFF#DEFINE BANCO0 BCF STATUS,RP0#DEFINE BANCO1 BSF STATUS,RP0#DEFINE LCD_CTRL PORTA#DEFINE LCD_DATA PORTB
RUTINAS EQU 0x0CSEGUNDO1 EQU 0x0FSEGUNDO2 EQU 0x10MINUTO1 EQU 0x11MINUTO2 EQU 0x12HORA1 EQU 0x13HORA2 EQU 0x14TIEMPO EQU 0x15CAMBIOHORA EQU 0X16LCD_LM EQU 0X17
ORG 0X00INICIOBANCO1
bsf TRISA,3bsf TRISA,4
BANCO0clrf PORTAclrf PORTBclrf SEGUNDO1clrf SEGUNDO2clrf MINUTO1clrf MINUTO2clrf HORA1clrf HORA2CALL LCD_UPCALL LCD_INI
movlw 0x05call LCD_SETDDADDRESS
MOVLW 'P' CALL LCD_WRITEDATO
MOVLW 'I'CALL LCD_WRITEDATO
MOVLW 'C'CALL LCD_WRITEDATO
MOVLW ':'CALL LCD_WRITEDATO
REPcall EXP
incf SEGUNDO1,Fmovlw .10xorwf SEGUNDO1,Wbtfss STATUS,Zgoto REPclrf SEGUNDO1
incf SEGUNDO2,Fmovlw .6xorwf SEGUNDO2,Wbtfss STATUS,Zgoto REPclrf SEGUNDO2
incf MINUTO1,Fmovlw .10xorwf MINUTO1,Wbtfss STATUS,Zgoto REPclrf MINUTO1
incf MINUTO2,Fmovlw .6xorwf MINUTO2,Wbtfss STATUS,Zgoto REPclrf MINUTO2
movlw .2xorwf HORA2,Wbtfsc STATUS,Zgoto X;;;;;;v
goto XX;;;;;;fX
incf HORA1,Fmovlw .4xorwf HORA1,Wbtfss STATUS,Zgoto REPclrf HORA1goto XXX
XXincf HORA1,Fmovlw .10xorwf HORA1,Wbtfss STATUS,Zgoto REPclrf HORA1
goto XXXXXX
incf HORA2,Fmovlw .3xorwf HORA2,Wbtfss STATUS,Zgoto REPclrf HORA2goto REP
EXPMOVLW .250MOVWF TIEMPO
EXP2movlw .4call RUTINA_Cbtfss PORTA,3GOTO HORA_INCbtfss PORTA,4GOTO MINUTO_INCdecfsz TIEMPO,Fgoto EXP2
EXP3movlw 0x45call LCD_SETDDADDRESSmovf HORA2,Wcall LCD_TABNUMCALL LCD_WRITEDATO
movf HORA1,Wcall LCD_TABNUMCALL LCD_WRITEDATO
movlw ':'CALL LCD_WRITEDATO
movf MINUTO2,Wcall LCD_TABNUMCALL LCD_WRITEDATO
movf MINUTO1,Wcall LCD_TABNUMCALL LCD_WRITEDATOmovlw ':'
CALL LCD_WRITEDATOmovf SEGUNDO2,W
call LCD_TABNUMCALL LCD_WRITEDATO
movf SEGUNDO1,W
call LCD_TABNUMCALL LCD_WRITEDATO
return
HORA_INCbtfss PORTA,3GOTO $-.1
movlw .2xorwf HORA2,Wbtfsc STATUS,Zgoto X1;;;;;;v
goto XX2;;;;;;fX1
incf HORA1,Fmovlw .4xorwf HORA1,Wbtfss STATUS,ZGOTO EXP3clrf HORA1goto XXX3
XX2incf HORA1,Fmovlw .10xorwf HORA1,Wbtfss STATUS,ZGOTO EXP3clrf HORA1goto XXX3
XXX3incf HORA2,Fmovlw .3xorwf HORA2,Wbtfss STATUS,ZGOTO EXP3clrf HORA2
GOTO EXP3
MINUTO_INCbtfss PORTA,4GOTO $-.1incf MINUTO1,Fmovlw .10xorwf MINUTO1,Wbtfss STATUS,ZGOTO EXP3
clrf MINUTO1incf MINUTO2,Fmovlw .6xorwf MINUTO2,Wbtfss STATUS,ZGOTO EXP3clrf MINUTO2GOTO EXP3
#define ENABLE bsf LCD_CTRL,2;Activa E
#define DISABLE bcf LCD_CTRL,2;Desactiva
#define LEER bsf LCD_CTRL,1;Pone LCD en Modo RD
#define ESCRIBIR bcf LCD_CTRL,1 ;Pone LCD en Modo WR#define DATO bsf LCD_CTRL,0
;Desactiva RS (modo comando)#define COMANDO bcf
LCD_CTRL,0 ;Activa RS (modo dato) cblock LCD_LMLCD_TEMP1 ;Registro temporal de posicion de la tablaLCD_TEMP2 ;Registro temporal del caracter ASCII Endc
SUBRUTINAS DEL LCD
LCD_UP BANCO1clrf LCD_DATA ;RB <0-7> salidas digitalesmovlw B'11111000'andwf LCD_CTRL,F ;RA0=RS RA1=R/W RA2=E salidas digitalesBANCO0bcf INTCON,GIE ;Desactivar interrupcionesCOMANDO ;RS=0ESCRIBIR ;R/W=0DISABLE ;E=0return
LCD_INI movlw 0x0Fcall RUTINA_C ;Espera un poco más de 15msmovlw B'00111000' ;Datos de 8 bits, 2 lineas y caracteres de 5x7call LCD_COMANDmovlw 0x05
call RUTINA_C ;5ms > 4.1ms.(Especificacion de Fabricante)movlw B'00111000' ;Datos de 8 bits, 2 lineas y caracteres de 5x8call LCD_COMAND
movlw .110call RUTINA_A ;110us > 100us.(Especificacion de Fabricante)movlw B'00111000' ;Datos de 8 bits, 2 lineas y caracteres de 5x8call LCD_COMANDmovlw B'00001000' ;b3 y b2 puedn ser cambiados para otra configuracióncall LCD_FUNCIONSET ;después de este punto no podran ser cambiados N ni Fmovlw B'00000100' ;Cursor apagado y Display prendidogoto LCD_DISPCURSCONT
LCD_MENSAJE movwf LCD_TEMP1;Salva posicion de la tabla
M_E_N_S movf LCD_TEMP1,0;Recupera posicion de la tabla
call LCD_TABLA ;Busca caracter de salida
movwf LCD_TEMP2;Guarda el caractermovf LCD_TEMP2,1btfsc STATUS,Z ;¿Hay más
caracteres?Return
call LCD_WRITEDATO ;Visualiza en el LCD el caracter
incf LCD_TEMP1,1 ;Siguiente caracter
goto M_E_N_S ;Repite con siguiente caracterLCD_TABLA movwf PCL
;Desplazamiento sobre la tabla
LCD_CLEAR movlw B'00000001';Borra LCD y cursor a Homegoto LCD_COMAND
LCD_HOME movlw B'00000010';Cursor a Homegoto LCD_COMAND
LCD_ENTRYMODE andlw 0x03 ;Nos quedamos con b1-b0iorlw 0x04 ;Incorporamos el bit de función
goto LCD_COMAND
-------------------------------------------------------------------------LCD_DISPCURSCONT andlw 0x07
;Nos quedamos con b2-b1-b0iorlw 0x08 ;Incorporamos el bit de función
goto LCD_COMAND
-------------------------------------------------------------------------LCD_DISPCURSSHIFT andlw 0x0C
;Nos quedamos con b3-b2iorlw 0x10 ;Incorporamos
el bit de funcióngoto LCD_COMAND
-------------------------------------------------------------------------LCD_SETCGADDRESS andlw 0x3F
;Nos quedamos con b5-b4-b3-b2-b1-b0iorlw 0x40 ;Incorporamos
el bit de funcióngoto LCD_COMAND
-------------------------------------------------------------------------LCD_SETDDADDRESS iorlw 0x80
;Incorporamos el bit de funcióngoto LCD_COMAND
-------------------------------------------------------------------------LCD_READAC call
LCD_BUSYLEERBANCO1comf LCD_DATA,1 ;Puerto B como
entradaBANCO0ENABLEnopmovf LCD_DATA,0andlw 0x7F ;Valor
de la dirección de la DDRAM o CGRAMDISABLEBANCO1clrf LCD_DATABANCO0ESCRIBIRreturn
-------------------------------------------------------------------------LCD_WRITEDATO movwf LCD_DATA
;Valor a escribir en la DDRAM o CGRAM
call LCD_BUSYDATO
goto LCD_E;Genera pulso de E
-------------------------------------------------------------------------LCD_READDATO call LCD_BUSY
DATOLEERBANCO1comf LCD_DATA,1
;Puerto B como entradaBANCO0ENABLEnopmovf LCD_DATA,0 ;Valor
leido de la DDRAM o CGRAMDISABLEBANCO1clrf LCD_DATABANCO0ESCRIBIRCOMANDOreturn
-------------------------------------------------------------------------LCD_TABNUM addwf PCL,1
dt "0123456789ABCDEF"
SUBRUTINAS INTERNAS DEL LCD
LCD_BUSY: Lectura del Flag Busy y la direccion.LCD_BUSY LEER
BANCO1comf LCD_DATA,1
;Puerto B como entradaBANCO0ENABLEnopbtfsc LCD_DATA,7
;Chequea bit de Busygoto $-1DISABLEBANCO1clrf LCD_DATA
;Puerto B como salidaBANCO0ESCRIBIRreturn
-------------------------------------------------------------------------;LCD_E: Pulso de EnableLCD_E ENABLE
nopDISABLE;Desactiva ECOMANDOReturn
-------------------------------------------------------------------------;LCD_COMAND: Escritura de comandos del LCDW = Codigo de comando para el LCDW ==> LCD_DATALCD_COMAND movwf LCD_DATA Codigo de comando.call LCD_BUSYgoto LCD_E ;Genera pulso de E
-------------------------------------------------------------------------;LCD_FUNCIONSET: Configura ela fuente del caracter y número de lineas. No se cambia DL; El modo de control deseado deberá cargarse en los 2 bits terceros de W:; x x x x b3 b2 x x; b2 : 0 = caracter de 5x7
1 = de 5x10; b3 : 0 = display de 1 linea
1 = de 2 lineas; b0,1,4-7 : sin importanciaLCD_FUNCIONSET andlw 0x0C ;Nos quedamos con b3-b2 (DL no se cambia)iorlw 0x30 ;Incorporamos el bit de función y 8 bitsgoto LCD_COMAND
; BLOQUE DE ETIQUETAS
CBLOCK RUTINAS ;Inicio de las variables. La primera dirección libre disponible
RUTINA_1RUTINA_2TEMPORIZACIONENDC
RUTINA_A movwf RUTINA_1bcf STATUS,Crrf RUTINA_1,1bcf STATUS,Crrf RUTINA_1,1
RUTINA_B nop
decfsz RUTINA_1,Fgoto RUTINA_Breturn
RUTINA_C movwf RUTINA_1BANCO1movf OPTION_REG,Wmovwf TEMPORIZACIONmovlw B'11010001'movwf OPTION_REGBANCO0
RUTINA_D clrwdtclrf TMR0bcf INTCON,T0IF
RUTINA_E btfss INTCON,T0IFgoto RUTINA_Edecfsz RUTINA_1,Fgoto RUTINA_DBANCO1movf TEMPORIZACION,Wmovwf OPTION_REGBANCO0return
RUTINA_F movwf RUTINA_1BANCO1movf OPTION_REG,Wmovwf RUTINA_Cmovlw B'11010011'movwf OPTION_REGBANCO0
RUTINA_G clrf RUTINA_2RUTINA_H clrwdt
bcf INTCON,T0IFclrf TMR0
RUTINA_I btfss INTCON,T0IFgoto RUTINA_Idecfsz RUTINA_2,Fgoto RUTINA_Hdecfsz RUTINA_1,Fgoto RUTINA_GBANCO1movf TEMPORIZACION,Wmovwf OPTION_REGBANCO0return
END
6.-FUNTE DE INFORMACION:
http://www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/mis-primeros-programas-pic16f84a-y-pic16f628a/15/
www.mmtelec.com/.../CA1602B-Datasheet-16x2-Character-LCD-module.pdf
http://rolandopalermo.blogspot.com/2010/04/reloj-digital-con-displays-de-7.html
http://members.fortunecity.es/electronico/reloj.html
electronicatuxtla.com/Download02.php
http://perso.wanadoo.es/pictob/ensamblador.htm