Вы находитесь на странице: 1из 15

TEMPORIZADOR Objetivos: Construir un temporizador con 4 displays.

minutos y segundos Debe tener tres pulsadores, en un solo pin del pic. seleccin, incremento y decremento Tiene que contener un buzzer que emita sonidos antes de que termine el tiempo del temporizador MARCO TEORICO: Los temporizadores son dispositivos, que permite medir el tiempo. Los primeros fueron los relojes de arena, posteriormente los relojes convencionales mecnicos (de pndulo, de cuerda, etc.) y finalmente por un dispositivoelectrnico. DESARROLLO DEL PROGRAMA: Pulsadores en un solo puerto.Como el PIC tiene un mdulo conversor A/D (Analgico/Digital), y que tiene un rango de 0v y +5v. Usamos un canal AN0 (RA-0) donde conectamos unos pulsadores en paralelo como se muestra en la figura, para poder identificar cual pulsador se pulso, usamos unas resistencias de valores diferentes, las cuales nos permiten mandar valores de voltaje diferentes al puerto del conversor A/D.
VCC

R4
910

R5
2.7k

R6
6.8k

MODE R1
1k

UP

DOWN

R1 es de referencia, R2, R3 y R4 son los que generan diferentes valores para el puerto A/D. R2: 910 [] con un voltaje de 2,75[V] en ADRESL 10xxxxxx, ARESH 10001100 R3: 2.7k[] con un voltaje de 1.35[V] en ADRESL 00xxxxxx, ARESH 01000101 R4: 6.8k[] con un voltaje de 076[V] en ADRESL 11xxxxxx, ARESH 00100110 Entonces el programa se basa en la lectura de los bits 8,7,6 del ADRESH

; Se inicializa Mdulo de Conversin A/D BANCO_0 MOVLW B'11000001' MOVWF ADCON0 ADON:1 (A/D habilitado) AN0) BANCO_1 MOVLW B'00001110' MOVWF ADCON1 BANCO_0 Configuracin del TIMER

; ADCS1 ADCS0 CHS2 CHS1 CHS0 GO/_DONE - ADON ; ADCS1-ADCS0:11 (oscilador interno RC). ; CHS2 a CHS0:000 (canal 0:

; ADFM ADCS2 - - PCFG3 PCFG2 PCFG1 PCFG0

La carga para TMR1H y TMR1L se calcul de la siguiente manera:

PS

PS = 8

; Se configura el temporizador TMR1 BSF BSF BCF El Buzzer: Ver figura: T1CON,5 T1CON,4 T1CON,1 ; Prescaler 1:1 ; 1:8 ; Usamosfosc/4, TMR1 como temporizador

BUZ1(1)

BUZ1

BUZZER

R7
22k

Q1
2N2222

Los Displays:

Ver figura:
+5V +5V +5V +5V

U3
b4 b5 b6 b7 +5V +5V +5V 7 1 2 6 4 5 3 A B C D BI/RBO RBI LT 7447 QA QB QC QD QE QF QG 13 12 11 10 9 15 14 b0 b1 b2 b3 +5V +5V +5V 7 1 2 6 4 5 3

U2
A B C D BI/RBO RBI LT 7447 QA QB QC QD QE QF QG 13 12 11 10 9 15 14 c4 c5 c6 c7 +5V +5V +5V 7 1 2 6 4 5 3

U5
A B C D BI/RBO RBI LT 7447 QA QB QC QD QE QF QG 13 12 11 10 9 15 14 c0 c1 c2 c3 +5V +5V +5V 7 1 2 6 4 5 3

U4
A B C D BI/RBO RBI LT 7447 QA QB QC QD QE QF QG 13 12 11 10 9 15 14

DIAGRAMA DEL PROGRAMA:

Inicio

Configurar Conversor A/D Configurar TMR1 ConfigurarPuertos

Chekarmodo AN0

Modo=0

no
Mod Uno

ModoMinutos

no
Mod Dos ModoSegundos

no
Mod Tres IniciarConteo

no
CLR MODE

CODIGO FUENTE: ; TEMPORIZADOR LIST P=16F877A ; Tipo de microcontrolador INCLUDE P16F877A.INC ; Archivo de definiciones __CONFIG _CP_OFF & _WRT_OFF & _DEBUG_OFF & _CPD_OFF & _LVP_OFF & _BODEN_ON & _PWRTE_ON & _WDT_OFF & _XT_OSC ; Reserva de memoria RAM ORG 0X00 GOTO INICIO CBLOCK ENDC

; Inicio del cdigo

0x70 UNID_SEG,DECE_SEG,UNID_MIN,DECE_MIN,MODE,CONT,PDel0,PDel1,PDell0

;---------------------------------------------------------------------; *************************** MACROS *************************** ;---------------------------------------------------------------------BANCO_0 MACRO BCF STATUS,RP1 BCF STATUS,RP0 ENDM BANCO_1MACRO BCF BSF STATUS,RP1 STATUS,RP0

ENDM ;---------------------------------------------------------------------; ******************** PROGRAMA PRINCIPAL ********************* ;---------------------------------------------------------------------INICIO ; Se inicializa Puertos CLRF PORTA ; Inicializa PORTA CLRF PORTB ; Inicializa PORTB CLRF PORTC ; Inicializa PORTC CLRF PORTD ; Se configura Puertos BANCO_1 MOVLW B'00000001' MOVWF TRISA

; ; RA0 entrada

MOVLW MOVWF MOVLW MOVWF MOVLW MOVWF

B'00000000' TRISB B'00000000' TRISC B'11111100' TRISD

; ; ; ; ; ; PORTD : P0D Y P1D OUT

; Se inicializa Mdulo de Conversin A/D BANCO_0 MOVLW B'11000001' MOVWF ADCON0 ADON:1 (A/D habilitado) AN0) BANCO_1 MOVLW B'00001110' MOVWF ADCON1 BANCO_0 ; Se configura el temporizador TMR1 BSF T1CON,5 BSF BCF T1CON,4 T1CON,1 ; Prescaler 1:1 ; 1:8 ; Usamos fosc/4, TMR1 como temporizador ; ADFM ADCS2 - - PCFG3 PCFG2 PCFG1 PCFG0 ; ADCS1 ADCS0 CHS2 CHS1 CHS0 GO/_DONE - ADON ; ADCS1-ADCS0:11 (oscilador interno RC). ; CHS2 a CHS0:000 (canal 0:

; Resetamos los valores de las variables CLRF MODE CLRF CLRF CLRF CLRF UNID_SEG DECE_SEG UNID_MIN DECE_MIN

; **********************Inicio del programa********************************************************** MAIN CALL MOVFW cambio XORLW BTFSC 0x00 STATUS,Z VER_MODE MODE ; Chekamos el modo por el puerto AN0 ; Si no existe cambio esperamos que haya

GOTO

MAIN ; Si mode es distinto de 0 entonces se inicia

CALL SHOW_VAL la conf del Temporizador

CALL BUTTONS ; Empezamos con el seteo XX:XX GOTO MAIN ;*************************************************************************************** ************ ;-----------------------Sub-Rutinas----------------------------------------------------------; Subrutina de Conversion A/D ADConv BCF PIR1,ADIF CALL Delay20us BSF ADCON0,GO ESPERAR BTFSS PIR1,ADIF conversionanalogo digital GOTO ESPERAR return ; Subrutina de Conteo Regresivo CONT_REGRESIVO CLRF MODE nuevamente una vez terminada el conteo BSF PORTD,0 ; Reseteamos la variable MODE para empezar ; Mandamos una alta para confirmar el conteo

; Esperamos a que termine la

_SHOW_VAL ; Mostramos los valores XX:XX hacia los Displays SWAPF DECE_SEG,0 ADDWF UNID_SEG,0 MOVWF PORTC SWAPF ADDWF MOVWF DECE_MIN,0 UNID_MIN,0 PORTB ; Verificamos el valor total de los segundos

ADDWF PORTC,0 para ver si termino la temporizacion XORLW 0x00 BTFSS STATUS,Z

GOTO todavia

_SEG_CONT

; Continuamos el Conteo Regresivo si no acab ; En caso de terminar el conteo ; ;

BSF PORTD,1 entonces resteamos el puerto RD0 y RD1 CALL CLRF GOTO _SEG_CONT MOVFW XORLW BTFSS GOTO Delay1s PORTD _FIN PORTB 0x00 STATUS,Z _GO_CONTEO

; Comprobamos los minutos 00:XX

MOVFW MOVLW SUBWF BTFSC

PORTC 0x11 PORTC,0 STATUS,C

; Comprobamos los segundos 00:10

GOTO _GO_CONTEO BSF PORTD,1 seg junto con el conteo MOVLW MOVWF CALL MOVLW MOVWF BCF CALL GOTO _GO_CONTEO CALL _GO_10SEG call .1 CONT CICLO .1 CONT PORTD,1 CICLO _GO_10SEG

; Si todavia no ha llegado a 00:10 ; Emitimos el Sonido de los ultimos 10 ; del Temporizador de 1 seg del TMR0 ;

Delay1s Delay1s ; Decrementamos Segundos Siempre manteniendo ; El proceso es igual que el contador de ;

DECF UNID_SEG de 59:99 a 00:00 MOVFW UNID_SEG XORLW 0xFF BTFSS STATUS,Z GOTO _SHOW_VAL MOVLW 0x09 MOVWF UNID_SEG

DECF MOVFW XORLW BTFSS GOTO MOVLW MOVWF DECF MOVFW XORLW BTFSS GOTO MOVLW MOVWF DECF GOTO _FIN RETURN

DECE_SEG DECE_SEG 0xFF STATUS,Z _SHOW_VAL 0x05 DECE_SEG UNID_MIN UNID_MIN 0xFF STATUS,Z _SHOW_VAL 0x09 UNID_MIN DECE_MIN _SHOW_VAL

; Subrutina para encender y apagar los segundos PARPADEAR_SEG MOVLW MOVWF CALL B'11111111' PORTC Delay20ms ; No mostramos Seg

SWAPF DECE_SEG,0 ADDWF UNID_SEG,0 ;mostramos segundos MOVWF PORTC CALL Delay20ms return ; Mostramos seg

; Subrutina para encender y apagar los minutos PARPADEAR_MIN MOVLW B'11111111' ; No mostramos min MOVWF CALL SWAPF ADDWF MOVWF PORTB Delay20ms DECE_MIN,0 UNID_MIN,0 PORTB ; Mostramos min

CALL Delay20ms return ; Subrutina de Chekar el estado del bottonMode VER_MODE CALL CALL BTFSS GOTO CALL CALL BTFSS GOTO _RISE_MODE CALL CALL BTFSC GOTO CALL INCF MOVFW XORLW Delay20ms ADConv ADRESH,7 _MODE_00 Delay20ms ADConv ADRESH,7 _MODE_00 Delay20ms ADConv ADRESH,7 _RISE_MODE Delay20ms MODE MODE 0x03 ; Si MODE = 3 ; MODE=3 Inicio del conteo Regresivo

BTFSC STATUS,Z CALL CONT_REGRESIVO _MODE_00 RETURN ; Subrutina de mostrar en el Display el seteo delos valores XX:XX SHOW_VAL MOVFW MODE ; Si MODE = 1 XORLW 0x01 BTFSC STATUS,Z GOTO NO_PARPADEAR_SEG CALL PARPADEAR_SEG NO_PARPADEAR_SEG SWAPF ADDWF MOVWF MOVFW XORLW DECE_SEG,0 UNID_SEG,0 PORTC MODE 0x02 ; Mostramos los segundos en PORTC

; Si MODE = 2

BTFSC STATUS,Z GOTO NO_PARPADEAR_MIN CALL PARPADEAR_MIN NO_PARPADEAR_MIN SWAPF ADDWF DECE_MIN,0 UNID_MIN,0 ; Mostramos XX:00 los minutsos en PORTB

MOVWF PORTB RETURN ; Subrutina de Botones de Incremento y Decremento BUTTONS call call btfsc goto btfsc goto _fin return _BUTTON_MENOS RISE_DEC CALL CALL BTFSC GOTO CALL MOVFW XORLW BTFSC CALL MOVFW XORLW BTFSS CALL goto _BUTTON_MAS RISE_INC CALL Delay20ms ; Si el ADRESH = xx1xxxxx Delay20ms ADConv ADRESH,6 _BUTTON_MAS ADRESH,5 _BUTTON_MENOS

Delay20ms ADConv ADRESH,5 RISE_DEC Delay20ms MODE 0x01 STATUS,Z DEC_MIN MODE 0x01 STATUS,Z DEC_SEG _fin

; Si el ADRESH = xx0xxxxx ; En tiempo De bajada

; Reconfirmamos si decrementamos SOLO Min

; Reconfirmamos si decrementamos SOLO Seg

; Si el ADRESH = x1xxxxxx

CALL BTFSC GOTO CALL ; MOVFW XORLW BTFSC CALL MOVFW XORLW BTFSS CALL goto

ADConv ADRESH,6 RISE_INC Delay20ms MODE 0x01 STATUS,Z INC_MIN MODE 0x01 STATUS,Z INC_SEG _fin

; Si el ADRESH = x0xxxxxx ; En tiempo De bajada

; Reconfirmamos si incrementamos SOLO Min

; Reconfirmamos si incrementamos SOLO Seg

; Subrutina de decrementar minutos con parpadeo DEC_MIN DECF UNID_MIN MOVFW UNID_MIN ; para el caso de dec cuando x0:xx XORLW BTFSS GOTO MOVLW MOVWF x9:xx DECF (x-1)9:xx MOVFW XORLW BTFSS GOTO MOVLW MOVWF _MIN_OK RETURN ; Subrutina de decrementar segundos con parpadeo DEC_SEG DECF MOVFW XORLW UNID_SEG UNID_SEG 0xFF ; para el caso de que cuando dec xx:x0 DECE_MIN ; Cada vez que UNID_MIN decremente entonces 0xFF STATUS,Z _MIN_OK 0x09 UNID_MIN ; ; Si hay desborde por UNID_MIN entonces =

DECE_MIN 0xFF STATUS,Z _MIN_OK 0x05 DECE_MIN

; Para el caso de 0x:xx

BTFSS GOTO MOVLW xx:x9 MOVWF DECF

STATUS,Z _DSEG_OK 0x09

; Si hay desborde por UNID_SEG entonces =

UNID_SEG DECE_SEG

; Cada vez que UNID_SEG

decremente

entonces xx:(x-1)9 MOVFW XORLW BTFSS GOTO DECE_SEG 0xFF STATUS,Z _DSEG_OK

MOVLW 0x05 MOVWF DECE_SEG _DSEG_OK RETURN ; Subrutina de incrementar minutos con parpadeo INC_MIN INCF MOVFW XORLW BTFSS GOTO MOVLW MOVWF INCF MOVFW XORLW BTFSS UNID_MIN UNID_MIN 0x0A STATUS,Z _IMIN_OK 0x00 UNID_MIN DECE_MIN DECE_MIN 0x06 STATUS,Z

GOTO _IMIN_OK MOVLW 0x00 MOVWF DECE_MIN _IMIN_OK RETURN ; Subrutina de incrementar segundos con parpadeo INC_SEG INCF UNID_SEG

MOVFW XORLW BTFSS GOTO MOVLW MOVWF INCF MOVFW XORLW BTFSS GOTO

UNID_SEG 0x0A STATUS,Z _ISEG_OK 0x00 UNID_SEG DECE_SEG DECE_SEG 0x06 STATUS,Z _ISEG_OK

MOVLW 0x00 MOVWF DECE_SEG _ISEG_OK RETURN ;---------------------------------------------------------------------; ******************** RUTINA RETARDO 20us ******************** ;---------------------------------------------------------------------Delay20us movlw .3 ; 1 set numero de repeticion movwf PDell0 ; 1 | PLoop0 clrwdt ; 1 clear watchdog decfsz PDell0, 1 ; 1 + (1) es el tiempo 0 ? goto PLoop0 ; 2 no, loop PDelLL1 goto PDelLL2 ; 2 ciclos delay PDelLL2 clrwdt ; 1 ciclo delay return ; 2+2 Fin. ;------------------------------------------------------------; subrutina de retardo de 20 ms para antirebote ;------------------------------------------------------------Delay20ms movlw .21 ; 1 set numero de repeticion (B) movwf PDel0 ; 1 | PLoop1 movwf PLoop2 decfsz goto decfsz goto PDelL1 movlw .237 ; 1 set numero de repeticion (A) PDel1 ; 1 | clrwdt ; 1 clear watchdog PDel1, 1 ; 1 + (1) es el tiempo 0 ? (A) PLoop2 ; 2 no, loop PDel0, 1 ; 1 + (1) es el tiempo 0 ? (B) PLoop1 ; 2 no, loop goto PDelL2 ; 2 ciclos delay

PDelL2 clrwdt ; 1 ciclo delay return ; 2+2 Fin. ;---------------------------------------------------------------------; *********************** RETARDO DE 1 s *********************** ;---------------------------------------------------------------------Delay1s MOVLW .2 MOVWF CICLO BCF MOVLW MOVWF MOVLW MOVWF BSF FLAG BTFSS PIR1,TMR1IF GOTO FLAG BCF PIR1,TMR1IF DECFSZ CONT,F GOTO CICLO cargar TMR1 RETURN END CIRCUITO COMPLETO: ; FIN PROGRAMA ; TMR1IF=1? Hay desbordamiento? ; Si no hay, esperar ; Si hay, borrar bandera ; si CONTA lleg a 0, salir de la subrutina ; si CONTA no lleg a cero, se vuelve a T1CON,TMR1ON 0x0B TMR1H 0xDC TMR1L T1CON,TMR1ON ; TMR1 OFF paraPrecarga ; TMR1H = Ox0B ; TMR1L = OxDC ; TMR1 ON despus de la Precarga CONT ; CONT = 2

+5V

+5V

U3
b4 b5 b6 b7 +5V +5V +5V 7 1 2 6 4 5 3 A B C D BI/RBO RBI LT 7447 QA QB QC QD QE QF QG 13 12 11 10 9 15 14 b0 b1 b2 b3 +5V +5V +5V 7 1 2 6 4 5 3

U2
A B C D BI/RBO RBI LT 7447 QA QB QC QD QE QF QG 13 12 11 10 9 15 14 c4 c5 c6 c7 +5V +5V +5V 7 1 2 6 4 5 3

+5V

U5
A B C D BI/RBO RBI LT 7447 QA QB QC QD QE QF QG 13 12 11 10 9 15 14 c0 c1 c2 c3 +5V +5V +5V 7 1 2 6 4 5 3

U4
A B C D BI/RBO RBI LT 7447 QA QB QC QD QE QF QG 13 12 11 10 9 15 14

+5V

+5V 13 14 15pF 2 3 4 5 10k 6 7 8 9 10 1N4148 1

Pin 32 al positivo Pin 31 al negativo


OSC1/CLKIN OSC2/CLKOUT RB0/INT RB1 RB2 RA0/AN0 RB3/PGM RA1/AN1 RB4 RA2/AN2/VREF-/CVREF RB5 RA3/AN3/VREF+ RB6/PGC RA4/T0CKI/C1OUT RB7/PGD RA5/AN4/SS/C2OUT RC0/T1OSO/T1CKI RE0/AN5/RD RC1/T1OSI/CCP2 RE1/AN6/WR RC2/CCP1 RE2/AN7/CS RC3/SCK/SCL RC4/SDI/SDA MCLR/Vpp/THV RC5/SDO RC6/TX/CK RC7/RX/DT RD0/PSP0 RD1/PSP1 RD2/PSP2 RD3/PSP3 RD4/PSP4 RD5/PSP5 RD6/PSP6 RD7/PSP7 PIC16F877A 33 34 35 36 37 38 39 40 15 16 17 18 23 24 25 26 19 20 21 22 27 28 29 30 b0 b1 b2 b3 b4 b5 b6 b7 c0 c1 c2 c3 c4 c5 c6 c7

VCC

R4
910

R5
2.7k

R6
6.8k

15pF

8MHz

MODE R1
1k

UP

DOWN

R8
BUZ1(1)

D2
LED-RED

BUZ1

220

BUZZER

R7
22k

Q1
2N2222

CONCLUSIONES: En esta prctica se hizo un temporizador haciendo uso de los conocimientos adquiridos en las anteriores prcticas. Uso del conversor A/D para manipular varios pulsadores en un solo puerto del pic. Uso del TMR1 para obtener un segundo con un cristal de 4Mhz.

+5V

Вам также может понравиться