Академический Документы
Профессиональный Документы
Культура Документы
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:
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
Inicio
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
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
; 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
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
_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
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
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 = 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
; 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 =
UNID_SEG DECE_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
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