98075531 Cronometro en PIC16F874A Assembler

15
CIRCUITOS DIGITALES Cronometro con PIC16F874A Lipuma Daniel F.

Transcript of 98075531 Cronometro en PIC16F874A Assembler

Page 1: 98075531 Cronometro en PIC16F874A Assembler

CIRCUITOS DIGITALES

Cronometro con PIC16F874A

Lipuma Daniel F.

Page 2: 98075531 Cronometro en PIC16F874A Assembler

TMR0

RESUMEN

En este practico estudiamos la implementación de un cronometro mediante programación realizada en lenguaje Assembler sobre el PIC 16F84A, compilado en MPLAB 8.1, mediante 4 displays de siete segmentos ánodo común con pulsador de stop/reset.

Cronometro - Digitales III

Página

2

Page 3: 98075531 Cronometro en PIC16F874A Assembler

TMR0

INTRODUCCION

A continuación se mostrara como se realizara el cronometro con pulsador de stop/reset, para ello se emplearán 4 displays de siete segmentos para centésimas, décimas, unidades y decenas de segundos respectivamente

El problema planteado es que al encender el cronometro se visualicen los displays en cero, luego al presionar por primera vez que comience a contar, al presionar por segunda vez se detenga la cuenta mostrando estáticamente la misma llevada a cabo, y que al pulsar nuevamente se vuelva a cero y arranque

El programa se logra bajo la utilización básicamente de interrupciones para realizar el mismo, la programación en MPLAB 8.1, en lenguaje Assembler , la grabación del programa mediante Pickit2 y la implementación del mismo sobre el PIC 16F84A.

Cronometro - Digitales III

Página

3

Page 4: 98075531 Cronometro en PIC16F874A Assembler

Inicialización de variables

Inicio

Defino Puertos

Configuro OPTIONREG e

INTCON

Borro Bandera de Control de 1ms

Interrupción

TMR0

RB0

Testeo si es por RB0 o TMR0

Cargo TMR0=0x82Seteo Bandera de Control de

1ms

Cargo contador de 10ms para

displays

Muestro displays y decremento contadores

Testeo bandera

del pulsador

Incremento cent, dec, seg, y seg2

Decremento contadores

1 0

Borro displays

Bucle de control de 1ms

DIAGRAMA EN BLOQUE

Cronometro - Digitales III

Página

4

Page 5: 98075531 Cronometro en PIC16F874A Assembler

IMPLEMENTACION

En un principio, se muestran todos los displays en cero, al presionar el botón por primera vez comienza a contar, al presionar por segunda vez se detiene quedando el numero al que se llego, luego se presiona y se pone en cero y cuenta, así continua sucesivamente, para ello el programa se basa en las interrupciones y el botón se logra con interrupción por RBO.

La multiplexación de los 4 displays se hará por puerto A que tiene 5 pines, configurado con todos sus pines como salidas. La información de tabla que forma los números en los displays de siete segmentos se hará por puerto B que tiene 8 pines, que configuraremos de 7 salidas y una de entrada que es RB0

Al iniciar el programa definimos de los distintos registros, cuatro de ellos son cent, dec, seg y seg 2 que son los utilizados para almacenar los números del cronometro, cent representa a las centésimas, dec representa a las décimas, seg a los segundos y seg2 a las decenas de segundos.

Se define la interrupción y se testea si es por RB0 o TMR0, si fuese por RB0 que es el pin 7 del PIC o bit 0 del puerto B, vamos a la subrutina botón donde vemos si la cuenta debe parar y mostrar el tiempo exacto en el que fue parado o borrar los registros y comenzar a contar si se presiono por segunda vez, para ello se testea al comenzar a incrementar si la bandera controlada por RB0 esta activada o no.

En el programa principal definimos el inicio, donde se ingresa al banco uno y se define puerto A, B y C, luego se define los bits del OPTION_REG se asigna prescaler al timer 0, el numero elegido para el prescaler es 1:8.

Al tener 1:8, significa que si el tiempo es de 1 ms, eso equivale a 1000 µs, al dividir por 8 se tiene 125 µs, ahora el TMRO debe llegar a 255, la diferencia entre 255 y 125, es 130, ósea cargamos 0x82 al TMR0

Al pasar al banco 0 vemos TMR0 cargado con 0x82 y los puertos configurados

Se configura el registro INTCON, donde Habilitamos GIE e interrupciones por overflow del TMR0

Asignamos 10 para cont, que se decrementa dentro de la interrupción, la idea es que dada la forma en que se definió el TMRO para tener 1 milisegundo, poder lograr 10 milisegundo para mantener encendido cada display. Y

Cronometro - Digitales III

Página

5

Page 6: 98075531 Cronometro en PIC16F874A Assembler

logramos la multiplexación de los displays mediante la asignación de un puntero llamado display

Siempre primero multiplexamos los displays por puerto A cada 10ms, y luego incrementamos los registros cent, dec, seg y seg2 mostrándolos por puerto B

Si la bandera del pulsador esta borrada, no llega a incrementar sino que vuelve al bucle de multiplexación dejando estática la cuenta para poder mostrar de todas formas los números que hay en el cronometro y no permite que avance la cuenta

Ahora se supone que no se apretó el botón, entonces decrementa los registros

Dentro de botón lo primero limpiar el bit1 de INTCON, que indica la interrupción por RBO. Se testea el bit 0 de bandera, si esta en 1 borro la bandera para que no cuente mas, sino la Seteo y borro los registros para que vuelva a contar

La cuenta consiste en incrementar definiendo cent con 10 y comparando con XOR y testeando status,z si esta en 1,si llega a 10 status,z esta seteado entonces pasa a incrementar el registro siguiente que en este caso es dec que se le asigna 10, si no llega a 10 vuelve a la interrupción y no incrementa los otros registros, luego seg de igual manera y seg2 que se le asigna 6 para contar hasta 59:99 segundos entonces, al saltar entre registro y registro se limpia el ultimo para volver a

El valor de W que corresponde a la ubicación del registro, luego se suma al PCL de esa forma se puede ingresar a la tabla que muestra los números en los displays de siete segmentos siguiendo esta secuencia A, B, C, D, E, F, G, RB0

0000-0011 "0"1001-1111 "1"0010-0101 "2"0000-1101 "3"1001-1001 "4"0100-1001 "5"0100-0001 "6"0001-1111 "7"0000-0001 "8"0000-1011 "9"

A, B, C, D, E, F, G representan los 7 segmentos usados en el display, y el ultimo bit es RB0, como es de ánodo común, prendemos por 0 y apagamos por 1. Al devolverla tabla el número se muestra a través del puerto B representando cada pata del mismo un bit del número.

Cronometro - Digitales III

Página

6

Page 7: 98075531 Cronometro en PIC16F874A Assembler

El display será mostrado la misma posición 10 ms, luego avanza y muestra otro y así sucesivamente, resultando imperceptible al ojo humano.

La multiplexación que se realiza por tabla se hace por puerto A 4 transistores PNP. Prendiendo por 0 el display a mostrar

0000-11100000-11010000-10110000-0111

Una vez obtenido el número sale de la tabla y se muestra a través del puerto A

DESCRIPCION DEL CIRCUITO

Micro controlador PIC16F84A

Viendo el diagrama de pines

En los pines 15 y 16 conectaremos el Cristal de 4 MHz en serie con capacitores de 22 pF los cuales van a masa.

En el pin 4 ponemos una resistencia de 10K Ω para el MCLR

Para los 4 displays de ánodo común, las resistencias empleadas son de 220Ω en el colector del transistor que serán colocadas en serie entre puerto B de pin 7 a 13 y diodos led de los displays y de 2kΩ para la base en serie entre el puerto A de pin 1,2,3,17,18 y pata de ánodo común de cada display, por lo que la corriente en los LED del display está en el orden de los 15mA, los transistores son del tipo PNP 32725.

Cronometro - Digitales III

Página

7

Page 8: 98075531 Cronometro en PIC16F874A Assembler

Para el pulsador se emplea una resistencia de 1K Ω, y un capacitor de 10nF para lograr un anti rebote por hardware en el pin RB0

Calculo de resistencias

En corte: Resistencia de Colector

En saturación: Resistencia de Base

Cronometro - Digitales III

Página

8

Page 9: 98075531 Cronometro en PIC16F874A Assembler

DIAGRAMA DEL CIRCUITO

Diagrama del circuito para simulacion

Diagrama esquemático para realización del PCB

Cronometro - Digitales III

Página

9

Page 10: 98075531 Cronometro en PIC16F874A Assembler

Diagrama para realización del PCB PCB terminado (Vista inferior)

Circuito terminado (Vista superior)

Cronometro - Digitales III

Página

10

Page 11: 98075531 Cronometro en PIC16F874A Assembler

Circuito completo con 4 displays 7 segmentos a su salida

Figura A - Cronometro corriendo, se puede ver claramente el efecto de numero fantasma en los posiciones que corren rápidamente por que la foto no es instantánea

Figura A

Figura B - Cronometro parado, se puede ver claramente que los números se ven bien porque no está incrementando el contador por presionar el botón de stop/reset

Figura B

Cronometro - Digitales III

Página

11

Page 12: 98075531 Cronometro en PIC16F874A Assembler

HARDWARE UTILIZADO

Resistencias 7x 220Ω / 4x 2K Ω/ 1x 560 Ω/ 8x120 Ω

Micro controlador PIC16F84A

Cristal 4 MHz

Capacitores 2x 22pF/ 1x 100uF/1x10nF/1x100nF

Programador THOR

Displays 4 x Ánodo Común 5121BG-N

Transistores 4x 32725 PNP.

Pulsador 2 Tipo Araña

Regulador 7805

CONCLUSION

Aprendimos a usar, y comprender el uso de los puertos como salidas y entradas, el uso de las interrupciones externas e internas, conjugándolo con el uso de tablas y subrutinas para lograr satisfactoriamente un proyecto que funciona. Los problemas y los obstáculos que presento la implementación fueron muchos, pero fueron sobrellevados y fueron útiles para conocer más nuestro PIC, no se obtiene un error perceptible por minuto del cronometro, sería interesante poder incrementar un puntero y poder mostrar minutos para poder ver si existe algún error grosero al pasar el tiempo. El botón de stop, reset presentaba un rebote pero fue eliminado por prueba y error cambiando la configuración de capacitor y resistencia hasta lograr un buen pulsador.

Cronometro - Digitales III

Página

12

Page 13: 98075531 Cronometro en PIC16F874A Assembler

PROGRAMA

LIST P=PIC16F84A #INCLUDE P16F84A.INCRADIX HEX

; DEFINICIÓN DE VARIABLESCONT EQU 0X23 ; CONTADOR PARA RETARDO DE 10MSCENT EQU 0X27 ; CENT PARA CENTÉSIMAS DE SEGUNDOSDEC EQU 0X26 ; DEC PARA LAS DÉCIMAS DE SEGUNDOSSEG EQU 0X25 ; SEG PARA LOS SEGUNDOSSEG2 EQU 0X24 ; SEG2 PARA LAS DECENAS DE SEGUNDOSFLAG EQU 0X28 ; BANDERA PARA EL CONTROL DEL TIEMPOW_AUX EQU 0X29 ; AUXILIAR PARA GUARDAR WST_AUX EQU 0X30 ; AUXILIAR PARA GUARDAR STATUS BANDERA EQU 0X32 ; BANDERA QUE TESTEA RB0DISPLAY EQU 0X31 ; AUXILIAR QUE INDICA DISPLAY

ORG 0X00GOTO INICIOORG 0X04

****************************************************INTERRUPCION 1MS********************************************

MOVWF W_AUXMOVF STATUS,WMOVWF ST_AUX

BTFSC INTCON,INTF ;TESTEO SI INTERRUPCION VIENE POR RBOCALL BOTON ;SI ES POR RB0 VOY A BOTONBTFSS INTCON,T0IF ;TESTEO SI VIENE POR TMR0RETFIEMOVLW 0X82 ;CARGO TMR0 255-125=130 MOVWF TMR0BCF INTCON,T0IF ;LIMPIAMOS BIT QUE INDICA INTERRUPCION X TMR0BSF FLAG,0 ;SETEO BANDERA DE CONTROL DE TIEMPO

MOVF ST_AUX,WMOVWF STATUSMOVF W_AUX,WRETFIE

******************************************************* BOTON ********************************************************

BOTON BCF INTCON,INTF ;LIMPIAMOS BIT DE INTERRUPCION X RBOBTFSC BANDERA,0GOTO LOOP ;SI ES = 1 BORRO BANDERA PARA QUE NO CUENTE BSF BANDERA,0 ;ENCIENDE EL CRONOMETRO Y BORRA REGISTROSCLRF CENTCLRF DECCLRF SEGCLRF SEG2BCF BANDERA,1

RETURNLOOP BCF BANDERA,0

RETURN

********************************************** PROGRAMA PRINCIPAL******************************************************

INICIO BCF STATUS,6 ; INGRESO AL BANCO 1BSF STATUS, 5MOVLW 0X01MOVWF TRISB ;PUERTO B 7 0UT/ 1 IN

Cronometro - Digitales III

Página

13

Page 14: 98075531 Cronometro en PIC16F874A Assembler

CLRF TRISA ;PUERTO A 5 OUT MOVLW 0X92

MOVWF OPTION_REGBCF STATUS,5 MOVLW 0XB0MOVWF INTCONBCF FLAG,0 CLRF DISPLAY

****************************************************DEMORAS *************************************************************

BUCLE1 MOVLW 0X0A ;CARGO CONT CON 10 PARA RETARDO DE 10MSMOVWF CONT

BUCLE BTFSS FLAG,0 ;RETARDO DE 1MS (TESTEO BANDERA DE PASO 1 MS) GOTO BUCLE

BCF FLAG,0

***********************************************BARRIDO DE DISPLAYS********************************************************

MOVF DISPLAY,0 CALL POSICION ;SACO POR PUERTO A LA POSICION DEL DISPLAY

MOVWF PORTA MOVLW SEG2 ADDWF DISPLAY,0 ;SUMO SEG2 CON DISPLAY

MOVWF FSR MOVF INDF,0

CALL TABLA ;SACO POR PUERTO B LOS DIGITOS A REPRESENTAR MOVWF PORTB

INCF DISPLAY,0 ANDLW 0X03 MOVWF DISPLAY

DECFSZ CONT GOTO BUCLE

*************************************INCREMENTO DE CENT,DEC,SEG1 Y SEG2************************************

BTFSS BANDERA,0 ;TESTEO LA BANDERA DEL BOTON, SI ESTA EN 1 INCREMENTA

GOTO BUCLE1 ;SINO, NO INCREMENTA MAS DEJANDO ESTATICO TODO

INCF CENT,F ;INCREMENTA CENTESIMA DE SEGUNDOMOVLW 0X0AXORWF CENT,WBTFSS STATUS,ZGOTO BUCLE1CLRF CENTINCF DEC,F ;INCREMENTA DECIMAS DE SEGUNDOSMOVLW 0X0AXORWF DEC,WBTFSS STATUS,ZGOTO BUCLE1CLRF DEC

INCF SEG,F ;INCREMENTA SEGUNDOSMOVLW 0X0AXORWF SEG,WBTFSS STATUS,ZGOTO BUCLE1

CLRF SEG

INCF SEG2,F ;INCREMENTA DECENAS DE SEGUNDOSMOVLW 0X06XORWF SEG2,W

Cronometro - Digitales III

Página

14

Page 15: 98075531 Cronometro en PIC16F874A Assembler

BTFSC STATUS,ZCLRF SEG2

GOTO BUCLE1

**************************************************TABLA DE LEDS******************************************************

TABLA ADDWF PCL,F

RETLW B'10000001' ; RETLW B'11110011' ; RETLW B'01001001' ; RETLW B'01100001' ; RETLW B'00110011' ; RETLW B'00100101' ; RETLW B'00000101' ; RETLW B'11110001' ; RETLW B'00000001' ; RETLW B'00100001' ;

****************************************TABLA DE POSICION DE DISPLAYS****************************************

POSICION ADDWF PCL,F

RETLW B'0111'RETLW B'1110'

RETLW B'1101' RETLW B'1011'

END

Cronometro - Digitales III

Página

15