Temporizador Programable de 0 a 99.9 segundos, en pasos de 0.1 segundo. Circuito de Simulación en ISIS U1 RESET 9 10 1 OSC1/CLKIN OSC2/CLKOUT MCLR/Vpp/THV 2 3 4 5 6 7 INICIO DECENAS RA0/AN0 RA1/AN1 RA2/AN2/VREFRA3/AN3/VREF+ RA4/T0CKI RA5/AN4/SS UNIDADES DECIMAS RB0/INT RB1 RB2 RB3/PGM RB4 RB5 RB6/PGC RB7/PGD RC0/T1OSO/T1CKI RC1/T1OSI/CCP2 RC2/CCP1 RC3/SCK/SCL RC4/SDI/SDA RC5/SDO RC6/TX/CK RC7/RX/DT PIC16F873 GUARDAR 21 22 23 24 25 26 27 28 11 12 13 14 15 16 17 18 R1 100 D1 LED-RED R2 10k R3 10k R4 10k R5 10k R6 10k R7 10k R8 10k FOSC = 4 MHz En este circuito no se muestra la interfase que permite detectar una orden de inicio desde otra fuente que no sea el botón INICIO, como desde el arrancador de un motor. Tampoco se muestra la interfase para controlar una carga como la bobina de un contactor. Una variación a este proyecto es disponer de más de un temporizador en el mismo microcontrolador para que sea usado en un arrancador a pasos de tiempo definido, por ejemplo. Se tendrían que usar más terminales que detecten cuando debe iniciar cada temporizador, así como más salidas para el control de las bobinas de los contactores del arrancador. Existe la opción de un microcontrolador de 40 terminales, como los PIC16F874/877. Se puede desarrollar también un reloj que dé la hora con el formato HH:MM donde HH son las horas y MM los minutos. Se requiere para esto de 16 terminales o dos puertos de 8 bits como el puerto B y el C del PIC16F874. Debe ser posible ponerlo a la hora en cualquier momento, así como disponer de una alarma programable, a la que se accede con un interruptor de modo TIEMPO/ALARMA para poderla programar. Este reloj puede ser útil en el control de procesos que requieren que ciertas tareas se lleven a cabo a ciertas horas durante un cierto tiempo, como en invernaderos, en sistemas de calefacción, en alumbrado público, etc. Estas son algunas propuestas para empezar a definir que proyecto van a desarrollar durante el curso. Recuerden que deben estar ya trabajando en ello. No esperen a que el semestre esté por terminar. Enseguida se incluye el diagrama de flujo del programa y el código fuente en ensamblador del temporizador diseñado, que les servirá como referencia para sus propios proyectos. DIAGRAMA DE FLUJO DEL PROGRAMA DEL MICROCONTROLADOR ;tempo.ASM ;Programa de un temporizador programable ;de 0 a 99.9 segundos, en pasos de 0.1 segundo ;Por: Gustavo Velazquez G. Septiembre,2005 list p=16f873 include "p16f873.inc" goto btfss goto btfss goto goto ;................................ DECENAS equ UNIDADES equ DECIMAS equ CONTA equ TEMP equ CONTB equ 0x20 0x21 0x22 0x23 0x24 0x25 INI DECE UNI DECI GUAR 0x00 0x01 0x02 0x03 0x04 equ equ equ equ equ Temporizado movf btfss goto movf btfss goto movf btfss goto ActivarCarga bsf goto AjusteUnidades PORTA,DECI ;No ;Esta sin oprimir ;el boton DECI ? AjusteDecimas ;No PORTA,GUAR ;Esta sin oprimir ;el boton GUAR ? GuardarAjuste ;No RevisionDeBotones ;Si, volver a ;revisar botones DECENAS,F STATUS,Z DescontarTiempo UNIDADES,F STATUS,Z DescontarTiempo DECIMAS,F STATUS,Z DescontarTiempo PORTC,7 $ ;.............................. org goto 0x00 Inicio org 0x05 clrf clrf clrf bsf movlw PORTA PORTB PORTC STATUS,RP0 B'00000110' movwf movlw movwf movlw movwf movwf movlw ADCON1 B'111111' TRISA B'00000000' TRISB TRISC B'11010100' movwf bcf OPTION_REG STATUS,RP0 movlw movwf movlw movwf DECENAS-1 FSR 0xFF CONTA incf incf movf call movwf sublw btfss clrf movlw xorwf btfss goto call FSR,F CONTA,F CONTA,W LeerEEPROM INDF 9 ;W=9-W STATUS,C ;Es W <= 9 ? INDF ;No, limpiar INDF DECENAS+2 FSR,W STATUS,Z DirLeer VisualizarTIEMPO Inicio ;Banco 1 ;RA5:RA0 = E/S ;digitales ;RA5:RA0 = entradas ;RB7:RB0 = salidas ;RC7:RC0 = salidas ;El TMR0 se ;incrementa con el ;reloj interno/32 ;Banco 0 DirLeer RevisionDeBotones btfss PORTA,INI goto btfss goto btfss ;Esta sin oprimir el ;boton INI ? Temporizado ;No PORTA,DECE ;Esta sin oprimir el ;boton DECE ? AjusteDecenas ;No PORTA,UNI ;Esta sin oprimir el ;boton UNI ? DescontarTiempo movf TMR0,W movwf TEMP DecimaDeSegundo movlw D'25' movwf CONTB CuatroMS movlw D'125' addwf TEMP,F movf TMR0,W xorwf TEMP,W btfss STATUS,Z goto $-3 decfsz CONTB,F goto CuatroMS movlw 1 subwf DECIMAS,F ;DECIMAS=DECIMAS - 1 btfsc STATUS,C ;DECIMAS < 0 ? goto Display movlw 9 movwf DECIMAS movlw 1 subwf UNIDADES,F btfsc STATUS,C goto Display movlw 9 movwf UNIDADES movlw 1 subwf DECENAS,F btfss STATUS,C goto ActivarCarga Display call VisualizarTIEMPO goto DecimaDeSegundo AjusteDecenas call incf movf sublw btfss clrf call goto AjusteUnidades call incf movf sublw btfss clrf call goto Rebote DECENAS,F DECENAS,W 9 ;W = 9 - W STATUS,C ;Es DECENAS <= 9 ? DECENAS ;No VisualizarTiempo RevisionDeBotones Rebote UNIDADES,F UNIDADES,W 9 ;W = 9 - W STATUS,C ;Es UNIDADES <= 9 ? UNIDADES ;No VisualizarTIEMPO RevisionDeBotones AjusteDecimas call Rebote incf DECIMAS,F movf DECIMAS,W sublw 9 ;W = 9 - W btfss STATUS,C ;Es DECIMAS <= 9 ? clrf DECIMAS ;No call VisualizarTIEMPO goto RevisionDeBotones GuardarAjuste call Rebote movlw DECENAS-1 movwf FSR movlw 0xFF movwf CONTA DirEscribir incf FSR,F incf CONTA,F movf CONTA,W call EscribirEEPROM movlw DECENAS+2 xorwf FSR,W btfss STATUS,Z goto DirEscribir goto RevisionDeBotones ;................................... LeerEEPROM bsf STATUS,RP1 ;Banco 2 movwf EEADR bsf STATUS,RP0 ;Banco 3 bcf EECON1,EEPGD bsf EECON1,RD bcf STATUS,RP0 ;Banco 2 movf EEDATA,W bcf STATUS,RP1 ;Banco 0 return ;.................................... EscribirEEPROM bsf STATUS,RP1 ;Banco 2 movwf EEADR movf INDF,W movwf EEDATA bsf STATUS,RP0 ;Banco 3 bcf EECON1,EEPGD ;Se apunta a la ;EEPROM bsf EECON1,WREN ;Se habilita la escritura movlw 0x55 movwf EECON2 movlw movwf bsf btfsc goto bcf escritura bcf bcf retlw 0xAA EECON2 EECON1,WR EECON1,WR $-1 EECON1,WREN STATUS,RP0 STATUS,RP1 0 ;Inicia la escritura ;Espera a que termine ;la escritura ;Se deshabilita la ;Banco 2 ;Banco 0 ;.................................... VisualizarTIEMPO swapf UNIDADES,W addwf DECENAS,W movwf PORTB movlw 0xF0 andwf PORTC,W addwf DECIMAS,W movwf PORTC retlw 0 ;.................................... Rebote call cienMS movf PORTA,W xorlw B'00111111' btfsc STATUS,Z ;Termino el rebote ;del boton oprimido? goto Rebote ;No movf PORTA,W ;Si xorlw B'00111111' btfss STATUS,Z ;Se solto el boton ? goto $-3 ;No call cienMS ;Si retlw 0 ;..................................... cienMS movlw D'12' movwf CONTA clrf TMR0 bcf INTCON,T0IF btfss INTCON,T0IF goto $-1 decfsz CONTA,F goto $-4 retlw 0 ;..................................... end