; ; PRACTICA 1 ; ; Autor: Mikel Etxebarria ; (c) Microsystems Engineering (Bilbao) ; ; ;Leer el estado de los 5 interruptores E0-E4 conectados a RA0-RA4 y reflejar

el nivel lógico de ;los mismos sobre los leds S0-S4 conectados en RB0-RB4 List p=16F84 include "P16F84.INC" con los nombres ;Tipo de procesador ;Incluye el fichero P16F84.INC que contiene la definición ;de los registros internos org goto org Inicio clrf bsf clrf movlw movwf bcf movf movwf goto end 0x00 Inicio 0x05 PORTB STATUS,RP0 TRISB b'00011111' TRISA STATUS,RP0 PORTA,W PORTB Loop ;Vector de Reset ;Salva el vector de interrupción ;Borra los latch de salida ;Selecciona banco 1 de la memoria de datos ;Puerta B se configura como salida ;Puerta A se configura como entrada ;Selecciona banco 0 de la memoria de datos ;Leer las entradas RA0-RA4 ;Reflejar en las salidas ;Bucle sin fin ;Fin del programa fuente

Loop

; ; PRACTICA 2 ; ; Autor: Mikel Etxebarria ; (c) Microsystems Engineering (Bilbao) ; ;Una lámpara conectada en RB0 se controla mediante dos interruptores conectados en RA0 y RA1. ;Cuando cualquiera de los interruptores cambie de estado, la lámpara también lo hará. List p=16F84 include "P16F84.INC" Temp equ org goto org Inicio clrf bsf clrf movlw movwf bcf clrf Loop de RA0 y RA1 movf andlw movwf btfsc goto movlw subwf btfsc goto movlw subwf btfsc goto Apagar bcf goto Encender bsf goto end 0x0c 0x00 Inicio 0x05 PORTB STATUS,RP0 TRISB b'00000011' TRISA STATUS,RP0 Temp PORTA,W b'00000011' Temp STATUS,Z Apagar b'00000001' Temp,W STATUS,Z Encender b'00000010' Temp,W STATUS,Z Encender PORTB,0 Loop PORTB,0 Loop ;Fin del programa fuente ;La lámpara se enciende ;Tipo de procesador ;Incluye el fichero P16F84.INC que contiene la definición ;con los nombres de los registros internos ;Variable temporal que se almacena en la posición 0x0c ;Vector de Reset ;Salva el vector de interrupción ;Borra los latch de salida ;Selecciona banco 1 de la memoria de datos ;Puerta B se configura como salida ;RA0 y RA1 se configuran como entrada ;Selecciona banco 0 de la memoria de datos ;Pone a 0 el registo o variable temporal ;Leer el estado de la puerta A ;Filtra la información leída y nos quedamos con el estado ;Almacena temporalmente ;RA0=0 y RA1=0 ?? ;Si, la lámpara se apaga ;RA0=1 y RA1=0 ?? ;Si, la lámpara se enciende ;RA0=0 y RA1=1 ?? ;Si, la lámpara se enciende ;No, la lámpara se apaga

; ; PRACTICA 3 ; ; Autor: Mikel Etxebarria ; (c) Microsystems Engineering (Bilbao) ; ;Programa combinacional ; ;Según el estado de los interruptores RA0 y RA1, activar los ;puerta B, conforme a la siguiente tabla de la verdad: ; ; RA1 RA0 RB7 RB6 RB5 RB4 ; ------; 0 0 1 0 1 0 ; 0 1 0 1 0 1 ; 1 0 0 0 0 0 ; 1 1 1 1 1 1 List p=16F84 include "P16F84.INC" equ 0x0c org goto org Inicio clrf bsf clrf movlw movwf movlw movwf bcf clrwdt movf andlw movwf btfsc goto movlw 0x00 Inicio 0x05 PORTB STATUS,RP0 TRISB b'00001001' OPTION_REG b'00000011' TRISA STATUS,RP0 PORTA,W b'00000011' Temp STATUS,Z Secuencia_00 b'00000001'

leds RB0-RB7 conectados a la RB3 -1 0 1 0 RB2 -0 1 1 0 RB1 -1 0 1 0 RB0 -0 1 1 0

Temp

;Tipo de procesador ;Incluir la definición de los registros internos ;Variable temporal ;Vector de Reset ;Salva el vector de interrupción ;Borra los latch de salida ;Selecciona banco 1 ;Puerta B se configura como salida ;Preescaler de 1:2 asociado al WDT ;RA0 y RA1 se configuran como entrada ;Selecciona banco 0 ;Refrescar el WDT ;Carga el valor de la PUERTA A ;Filtra el estado de RA0 y RA1 ;Almacena temporalmente ;Están a 00 ? ;Si

Loop:

Salva el vector de interrupción . .Z Secuencia_10 b'11110000' PORTB Loop b'10101010' PORTB Loop b'01010101' PORTB Loop b'00001111' PORTB Loop .INC" org goto org Inicio clrf bsf clrf movlw movwf 0x00 Inicio 0x05 PORTB STATUS. .Están a 01 ? .Z Secuencia_01 b'00000010' Temp.Incluir la definición de los registros internos . .Selecciona banco 1 .W STATUS.Salida de la secuencia 01 Secuencia_10 . Autor: Mikel Etxebarria .Preescaler de 1:2 asociado al WDT . PRACTICA 4 .Si . una transición en RA0 .Borra los latch de salida . (c) Microsystems Engineering (Bilbao) . List p=16F84 include "P16F84.Programa secuencial .RP0 TRISB b'00001001' OPTION_REG .Mediante dos pulsadores conectados en RA0 y RA1 se controla la salida RB0 que gobierna un .Salida de la secuencia 10 .Si .Tipo de procesador .subwf btfsc goto movlw subwf btfsc goto Secuencia_11 movlw movwf goto movlw movwf goto movlw movwf goto movlw movwf goto end Temp.Puerta B se configura como salida .Fin del programa fuente .Salida de la secuencia 00 Secuencia_01 .Salida de la secuencia 11 Secuencia_00 . .W STATUS. Una transición a "1" en RA0 provoca su activación.su desactivación.Vector de Reset .Están a 10 ? .zumbador de alarma.

Como a su vez .Borra los latch de salida .durante un intervalo de 0. a izda.No .0 Loop PORTA. el desbordamiento se prodicirá al de 49.Salva el vector de interrupción .0 Alarma_On PORTA. evoluciona cada 1 uS.Empleando el TMR0. Dicho intervalo se controla mediante el TMR0.1" (100mS).Vector de Reset . . desconectar alarma . trabajando a 4MHz.Variable para temporización .RA0 y RA1 se configuran como entrada .Variable temporal .El programa activa secuencialmente.RA0=1 ?? .Selecciona banco 0 .INC" Temp Delay equ equ org goto org Inicio clrf bsf clrf movlw movwf bcf 0x0c 0x0d 0x00 Inicio 0x05 PORTB STATUS. Autor: Mikel Etxebarria . . . .RA1 también en ON ?? .RP0 TRISB b'00000111' OPTION_REG STATUS. juego de luces . PRACTICA 5 .Si.RA1=1 ?? .Si . Cada salida se mantiene activada . .0 Loop .RP0 PORTA.Fin del programa fuente Alarma_Off Alarma_On . las ocho salidas de la puerta B (RB0-RB7).Selecciona banco 1 .Preescaler de 1:256 asociado al TMR0 .movlw movwf bcf Loop: clrwdt btfsc goto btfss goto bcf goto btfsc goto bsf goto end b'00000011' TRISA STATUS. conecta la alarma . .1 Alarma_Off PORTB.Tipo de procesador . (c) Microsystems Engineering (Bilbao) .se le asocia un preescaler de 256.No.1 Loop PORTB.Si. .Selecciona banco 0 . activar alarma .Refrescar el WDT .9 ms List p=16F84 include "P16F84.provocacndo un efecto de desplazamiemto de dcha. de una en una.El TMR0 se carga con el valor 195 y.Incluir la definición de los registros internos .Puerta B se configura como salida .RP0 .

Si. todavía no han transcurrido los 50 mS .5" (preescaler 1:256) List p=16F84 . de una en una.W Loop .F Loop_0 Temp. .2 Delay ~. Autor: Mikel Etxebarria .Refrescar el WDT .Se ha repetido 2 veces la temporización de 50 mS (0.Salida del valor correspondiente . . La temporización mínima es .El programa activa secuencialmente.Tipo de procesador .1") .No . .1er.195 TMR0 INTCON.movlw movwf bcf Loop Loop_0 Loop_1 movwf movlw movwf movlw movwf bcf clrwdt btfss goto decfsz goto rlf movf goto end b'00000001' Temp STATUS.provocacndo un efecto de desplazamiemto de dcha. (c) Microsystems Engineering (Bilbao) . .C PORTB . las ocho salidas de la puerta B (RB0-RB7).T0IF Loop_1 Delay. . PRACTICA 6 . valor a sacar . . Cada salida se mantiene activada . a izda. Desplaza a la izquierda para obtener el siguiente .T0IF INTCON.No.Fin del programa fuente .El TMR0 realiza una cuenta de 50 eventos que se repite 200 veces.Se ha desbordado el TMR0 ?? .Restaura el flag de desbordamiento del TMR0 .F Temp.los 8 valores posibles del preescaler comprendidos entre 1:2 y 1:256. más juego de luces . que seleccionan .Usando el preescaler.Carga el TMR0 con el complemento del valor 195 .durante un intervalo de tiempo variable en función de las entradas RA0-RA2. .Una temporización de 50 mS se repetirá 2 veces .valor a sacar por la puerta B .de 20mS (preesacler 1:2) y la máxima 2.

El modo "sleep" y el "wake-up" (despertar) mediante el watch-dog Timer (WDT) .Se ha repetido 200 veces la temporización de 50 eventos ? .Ajusta valor del preescaler según las entradas .F Loop .Variable para temporización .Puerta B se configura como salida .Si.Borra los latch de salida .Incluir la definición de los registros internos .Selecciona banco 1 . .No. 0x0c 0x0d 0x00 Inicio 0x05 PORTB STATUS.RP0 Temp.Fin del programa fuente Loop_0 Loop_1 PRACTICA 7 Autor: Mikel Etxebarria (c) Microsystems Engineering (Bilbao) .1er.50 TMR0 INTCON.200 Delay ~.Selecciona el banco 0 .include "P16F84.Salida del valor correspondiente . valor a sacar . .Carga el TMR0 con el complemento del valor 50 . .Salva el vector de interrupción . . .Se ha desbordado el TMR0 ?? .T0IF INTCON.Selecciona banco 0 .F Loop_0 Temp.En ese momento se producirá un incremento del valor de la puerta B que actuará como contador .W PORTB .modo standby de bajo consumo.T0IF Loop_1 Delay.Refrescar el WDT .Variable temporal . .INC" Temp Delay equ equ org goto org Inicio clrf bsf movlw movwf clrf bcf movlw movwf bcf Loop movf andlw bsf movwf bcf movf movwf movlw movwf movlw movwf bcf clrwdt btfss goto decfsz goto rlf goto end .RP0 b'00000111' TRISA TRISB STATUS.Selecciona banco 1 .binario y nuevamente se volverá a la situaciónd de standby. El despertar del mismo se producirá cada vez que el WDT rebase.RP0 OPTION_REG STATUS.RA0-RA2 actúan como entradas .Vector de Reset .W b'00000111' STATUS.Este ejemplo pretende mostrar el empleo de la instrucción SLEEP para poner al PIC en el .Lee las entradas RA0-RA2 .Una temporización de 50 eventos se repetirá 200 veces .No . . Desplaza a la izquierda para obtener el siguiente . todavía no han transcurrido los 50 mS .Restaura el flag de desbordamiento del TMR0 .RP0 b'00000001' Temp STATUS.C PORTA. .

Definiciones de registros internos .Preescaler de 1 para el WDT . el pic "despertará" .. . lo hará cada 2.Puerta B se configura como salida .RP0 . Autor: Mikel Etxebarria .cada 18mS.RA0-RA4 entradas . con un prrescaler de 128.F PORTA.Salva vector de interrupción .Volver al modo Standby .Selecciona banco 0 . List p=16F84 include "P16F84. .Borra los latch de salida .3 segundos.El valor nominal del WDT es de 18mS.Vector de Reset .W b'00000111' b'00001000' STATUS. .El preescaler se asociará al WDT y estará comprendido entre 1 y 128. dependiendo del estado .Modo Standby .lógico de los interruptores RA0-RA2.RP0 OPTION_REG STATUS.El modo TMR0 como contador de eventos externos . . Es decir.Incrementa el contador binario sobre la puerta B . .Selecciona el banco 1 . con un preescaler de 1.Selecciona el banco 1 .Selecciona banco 1 .RP0 TRISB b'00011111' TRISA b'00001000' OPTION_REG STATUS. (c) Microsystems Engineering (Bilbao) .Fin del programa fuente Loop . PRACTICA 8 .Tipo de procesador .INC" org goto org Inicio clrf bsf clrf movlw movwf movlw movwf bcf sleep incf movf andlw iorlw bsf movwf bcf goto end PORTB.RP0 Loop 0x00 Inicio 0x05 PORTB STATUS.Ajusta valor del preescaler . .Lee el estado de los interruptores RA0-RA2 . .

W b'00001111' b'11111111' .Desactiva la salida a relé. .dispositivo (p.Preescaler de 256 para el WDT.e.El WDT se refresca y comienza la temporización . La salida RB1 se .Refresca el WDT .Activa la salida a relé.RP0 PORTA.T0IF .El WDT se empleará a modo de temporizador para determinar el tiempo de disparo de ambas .Activa la entrada de pulsos a contar .Repone el flag del TMR0 . 2" (18mS*256 de preescaler) .1 INTCON. El TMR0 evoluciona a .cada flanco descendente aplicado por RA4 .Borra los latch de salida . un relé.INC" org goto org Inicio clrf bsf clrf movlw movwf movlw movwf bcf Loop movf andlw xorlw addlw movwf bsf bcf 0x00 Inicio 0x05 PORTB STATUS.. .Puerta B se configura como salida .Tipo de procesador .El ejemplo pretende mostrar el funcionamiento del TMR0 en el modo contador.entradas RA0-RA3 se introduce el número de pulsos a contar.RP0 TRISB b'00011111' TRISA b'00111111' OPTION_REG STATUS.Vector de Reset .Fin del programa fuente Espera clrwdt btfss INTCON.1 bsf PORTB. .Selecciona banco 1 .Complementa el valor leído (el TMR0 es ascendente) .Ha finalizado la cuenta ?? .0 Loop . etc.El modo standby se mantiene hasta que el WDT desborde .salidas List p=16F84 include "P16F84. en led. Mediante las . Por RA4 se aplican dichos pulsos .1 TMR0 PORTB.0 clrwdt sleep bcf goto end PORTB. etc.Selecciona banco 0 .Definiciones de registros internos . led. etc.Salva vector de interrupción . . PRACTICA 9 Autor: Mikel Etxebarria .Lee las entradas RA0-RA3 . .No .utiliza para desconectar la fuente de entrada de pulsos y RB0 para activar cualquier otro .Cuando se alcance el valor deseado se disparan dos salidas durante un tiempo.) .T0IF goto Espera bcf PORTB.Desconecta la entrada de pulsos a contar . led.transcurridos aprox.Carga el TMR0 con el valor leído .RA0-RA4 entradas . .

incrementos para provocar una interrupción cada 50000 uS (50 mS).los leds conectados a RB0 y RB1 respectivamente.genera una interrupción cada 0.Selecciona banco 1 .No 5 Temp . . List p=16F84 include "P16F84.Borra los latch de salida .F .05 seg..F .La interrupción del TMR0. deberá sufrir 195 .T0IF . (50 mS) que se repetirá 5 veces con objeto .Repone el TMR0 con el complemento de 195 .Se ha repetido la interrupción 5 veces ?? Seguir . el tiempo total transcurrido es de 250000 uS (250 mS).lee constantemente el estado de los interruptores conectados a RA0 y RA1 para reflejarlo en .Carga el TMR0 con el complemeto de 195 . .Variable para la temporización .RB7 cambia de estado ~.Registro temporal .Tipo de procesador .T0IF .Puerta A se configura como entrada .Programa de tratamiento de la interrupción Tratamiento btfss goto bcf decfsz goto Con_si_0 movlw movwf movlw xorwf Seguir movlw movwf Fin_Tratamiento retfie Inicio clrf bsf clrf movlw movwf movlw movwf bcf INTCON. .Definiciones de registros internos . Si se emplea un preescaler de 256. . Se debe usar el .195 TMR0 .INC" Temp Temp_2 equ equ org goto org 0x0c 0x0d 0x00 Inicio 0x04 .Si.Repone el contador nuevamente con 5 b'10000000' PORTB.El TMR0 se incrementa cada 1 uS.Nº de veces a repetir la interrupción .RP0 .Selecciona banco 0 .Vector de Reset . repone flag del TMR0 Temp.Ha sido el TMR0 ?? Fin_Tratamiento .Retorno de interrupción PORTB STATUS.No INTCON.Se trata de comprobar la interrupción provocada por el TMR0.Preescaler de 256 asignado al TMR0 .veces. (c) Microsystems Engineering (Bilbao) . El programa .RP0 TRISB b'00011111' TRISA b'00000111' OPTION_REG STATUS. Al mismo tiempo el TMR0 .Puerta B se configura como salida .195 TMR0 0x05 Temp b'10100000' .de hacer intermitencia de 250 mS sobre el led conectado a RB7.Vector de interrupción .complemento de 195 movlw movwf movlw movwf movlw ~. Si esta se repite 5 .

Programa de tratamiento de la interrupción Tratamiento btfsc goto btfss goto INTCON.W b'10000000' Temp_2.INC" Temp equ org goto org 0x0c 0x00 Inicio 0x04 .1 . Cuando se produce la interrupción RB0/INT se activa la salida RA0 durante 1".líneas de entrada RB4-RB7.Activa salida RB1 Cambio_RB4_RB7 bsf .Los dispositivos PIC pueden provocar interrupción por otras dos causas diferentes además de .interrupción. .RBIF . List p=16F84 include "P16F84. . . falsa interrupción PORTA.Tipo de procesador . Autor: Mikel Etxebarria . Una de ellas es por la detección de una señal de un determinado flanco por .No. .durante 1".El ejemplo pretende mostrar la detección y tratamiento de cada una de estas nuevas fuentes de .Fin del programa fuente .la entrada RB0/INT.Vector de interrupción .Si INTCON.Definiciones de registros internos . ha sido cambio en RB4-RB7 ? Fin_Tratamiento . .Vector de Reset .por la del TMR0. (c) Microsystems Engineering (Bilbao) .W b'00000011' Temp_2 PORTB.Salida por RB0 y RB1 respentando valor actual de RB7 . .INTF .W PORTB Loop .Activa la interrupción del TMR0 . . .Otras interrupciones .Ha sido el RB0/INT ?? Tratar_INTF .Cuando se produce la interrupción por cambio de estado en RB4-RB7 se activa la salida RA1 .Variable para la temporización .Lo salva temporalmente . PRACTICA 10 .movwf Loop clrwdt movf andlw movwf movf andlw iorwf movwf goto end INTCON PORTA.Refresca el WDT .Lee el estado de RA0 y RA1 .No. La otra es por el cambio de estado lógico producido en cualquiera de las .

.El dispositivo queda en standby Loop .Fin del programa fuente Fin_Tratamiento clrf movf bcf bcf INTCON.el flag de interrupción por cambio en RB4-RB7. PRACTICA 11 Autor: Mikel Etxebarria .Inicia una variable temporal .Selecciona banco 0 .Retorno de interrupción .RP0 PORTB.No .Repone el flag del TMR0 .Borra los latch de salida .De esta forma se evitan posibles rebotes que puediera haber en las entradas.hacerlo en este órden .Lee el estado inicial de las entradas RB4-RB7 .INTF retfie Inicio clrf bsf clrf movlw movwf movlw movwf bcf movf movlw movwf Loop sleep goto end PORTA STATUS.Repone el TMR0 con el complemento de 195 .T0IF ~.RB0/INT sensible al flanco ascendente .goto Tratar_INTF bsf Fin PORTA.Se hace un delay de 1 segundo antes de reponer los correspondientes flags de interrupción.Comienza una temporización de 1" .Puerta A se configura como salidas .Puerta B se configura como entrada .W INTCON. Desconecta las salidas .Si.20 Temp INTCON.F Seguir PORTA PORTB.Lee estado actual de las entradas RA4-RA7 para reponer .195 TMR0 INTCON.0 .RP0 TRISA b'11111111' TRISB b'01000111' OPTION_REG STATUS.Fin de los 50 mS ?? . Hay que .Activa la interrupcines INTF y RBIF .Selecciona banco 1 . ha pasado 1".RBIF . .Repone el flag de interrupción por RBO/INT .Activa salida RB0 .W b'10011000' INTCON . Fin Seguir Delay_50mS movlw movwf bcf movlw movwf clrwdt btfss goto nop decfsz goto .Comienza un bucle de temporización de 50mS . .Preescaler de 256 asignado al TMR0 y .T0IF Delay_50mS Temp.Se ha repetido 20 veces los 50mS ?? .Todavía no . .

RA0-RA3 se configuran como entrada .9 . .INC" Temp equ org goto org Tabla_7_seg addwf retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw Inicio clrf bsf clrf movlw movwf movlw movwf bcf clrwdt movf andlw movwf movlw subwf btfsc goto btfsc goto movf call movwf goto 0x0c 0x00 Inicio 0x05 PCL.Mediante los cuatro interruptores conectador a RA0-RA3 se aplica el código BCD de los números .del registro W .W STATUS. (c) Microsystems Engineering (Bilbao) . en el que cada segmento particular se activa mediante .nivel lógico "0" List p=16F84 include "P16F84.6 .Decodificador BCD a 7 segmentos .No.Si .Vector de Reset .7 .Preescaler de 1:2 asociado al WDT .número sobre un display de ánodo común.Desplaza al PC tantas posiciones como indique el valor .4 .C NULO Temp.Código del 1 .Refrescar el WDT .Convierte el valor a código de 7 segmentos . .2 .Variable temporal .Lee las entradas RA0-RA3 .Tipo de procesador .W b'00001111' Temp 0x0a Temp.Salva el vector de interrupción .RP0 TRISB b'00001001' OPTION_REG b'00001111' TRISA STATUS.Selecciona banco 0 .W Tabla_7_seg PORTB Loop . del dígito 0 .Puerta B se configura como salida .Borra los latch de salida .Selecciona banco 1 .Lo deposita en la puerta de salida para visualizarlo Loop: .comprendidos entre 0 y 9.Código 7 seg. el valor es mayor a 0x0A ?? .F b'11000000' b'11111001' b'10100100' b'10110000' b'10011001' b'10010010' b'10000010' b'11111000' b'10000000' b'10011000' PORTB STATUS.8 . El programa obtiene el código de 7 segmentos para representar dicho .RP0 PORTA.Z NULO STATUS..Incluir la definición de los registros internos .Almacena valor leído .5 .3 .El valor es igual a 0x0A ?? .Si .

Puerta A se configura como entrada .El valor de entrada no estaba comprendido entre 0 y 9 .INC" Contador equ org goto org 0x0c 0x00 Inicio 0x05 .o descendente List p=16F84 include "P16F84.NULO movlw movwf goto end b'11111111' PORTB Loop . . (c) Microsystems Engineering (Bilbao) . . del dígito 0 .7 .Selecciona banco 1 .5 .El display permanece apagado .9 . .en el reg.Definiciones de registros internos .Desplaza al PC tantas posiciones como indique el valor .4 .Vector de Reset .F b'11000000' b'11111001' b'10100100' b'10110000' b'10011001' b'10010010' b'10000010' b'11111000' b'10000000' b'10011000' PORTB STATUS.Contador UP/DOWN decimal de un dígito .Tabla_7_seg: Esta rutina convierte el código BCD presente en los 4 bits de menos peso .6 .RP0 TRISB b'00011111' TRISA .********************************************************************************** . PRACTICA 12 . W en su equivalente a 7 segmentos.Código del 1 .Variable del contador .Sobre el display 7 segmentos conectado a la puerta B se visualizará el número de pulsos .Puerta B se configura como salida .del registro W . W Tabla_7_seg addwf retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw Inicio clrf bsf clrf movlw movwf PCL.3 .del reg.Fin del programa fuente .8 .Borra los latch de salida .Tipo de procesador . . El código 7 segmentos retorna también .aplicados por la entrada RA0.Código 7 seg.Salva el vector de interrupción . Autor: Mikel Etxebarria .2 . RA1 determina si la cuenta es ascendente (a "1") .

Bajada de RA0 (pulso) ?? .Decrementa el contador .Z Loop Contador Loop Contador.F 0xff Contador.Refrescar el WDT . . PRACTICA 13 . List p=16F84 .W Tabla_7_seg PORTB .Puesta a 0 del contador .No. Autor: Mikel Etxebarria . Al pasar RA0 a nivel "0".Z Loop . puesta a 9 del contador . con intervalos de 0. (c) Microsystems Engineering (Bilbao) .Preescaler de 128 para el TMR0 . puesta a 0 del contador . Luego el display se apaga y la .Subida de la señal RA0 ? .Convierte BCD a 7 segmentos .0 goto Wait_1 sleep btfss goto PORTA.No . Elimina rebotes .Refrescar el WDT . El dado electrónico .Visualiza el valor del contador .No .No . cuenta descendente . sobre el . .movlw movwf bcf clrf Loop movf call movwf b'00000110' OPTION_REG STATUS.W STATUS.Es mayor de 9 ?? . .Si.Es menor de 0 ?? . . Elimina rebotes . durante un tiempo de 3".Tipo de procesador .Incrementa contador .Generación de números aleatorios.0 goto Wait_0 sleep clrwdt btfsc PORTA.05".dsiplay 7 segmentos conectado a la puerta B.Se trata de generar un número aleatorio entre 1 y 6.RP0 Contador Contador.1 Down Contador.Modo standby en espara de 18mS. se visualiza .Selecciona banco 0 .secuencia se repite.RA1 = 1 ?? .Modo standby en espara de 18mS.9 Contador Loop Wait_1 Up incf movlw subwf btfss goto clrf goto decf movlw subwf btfss goto movlw movwf goto end Down .10 Contador. Cuando RA0 está a "1".F .los números del 1 al 6.No . .Fin del programa fuente Wait_0 clrwdt btfss PORTA.W STATUS.Si. se van visualizando de forma secuecial .el número aleatorio obtenido.

intervalo total de 50000 uS/50 mS (195 * 256).5 . es por ello que el delay mínimo .La velocidad de trabajo es de 4Mhz y por tanto el TMR0 se incrementa cada uS.Refrescar el WDT .Desplaza al PC tantas posiciones como indique el valor .Preescaler de 256 para el TMR0 .Salva vector de interrupción .6 .9 .INC" Numero Delay_Cont Temporal equ equ equ org goto org 0x0c 0x0d 0x0e 0x00 Inicio 0x05 .es de 50 mS ("Delay_cont=1) y el máxima de 12.del reg.Desconecta el flag de rebosamiento .Repite el intervalo de 50 mS Inicio .F b'11000000' b'11111001' b'10100100' b'10110000' b'10011001' b'10010010' b'10000010' b'11111000' b'10000000' b'10011000' .Puerta B se configura como salida .en el reg.Pone a "1" los latch de salida . Se emplea un preescaler de 256 y al TMR0 se le carga con 195. con un preescaler de 256 hace una .include "P16F84.T0IF ~.Variable temporal .Todavía no .tantes veces como indique la variable "Delay_cont".7 .esta forma.8 .T0IF Intervalo Delay_Cont.Rebasamiento del TMR0 al de 50mS ?? .Tabla_7_seg: Esta rutina convierte el código BCD presente en los 4 bits de menos peso . De .Contador de intervalos .Puerta A se configura como entrada .Código 7 seg. el TMR0 debe contar 195 eventos que.Definiciones de registros internos .del registro W . Dicho intervalo de 50 mS se repite . Delay_var: Intervalo bcf movlw movwf clrwdt btfss goto decfsz goto return movlw movwf bsf clrf movlw movwf movlw movwf bcf INTCON.8".195 TMR0 INTCON.Selecciona banco 0 . del dígito 0 .Código del 1 . W Tabla_7_seg addwf retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw PCL.4 . El código 7 segmentos retorna también .Número aleatorio .********************************************************************************** .8" (Delay_cont=255).F Delay_var b'11111111' PORTB STATUS.Selecciona banco 1 .carga el TMR0 con el complemento de 195 .Delay_var: Esta rutina de propósito general realiza una temporización variable .RP0 . . W en su equivalente a 7 segmentos.RP0 TRISB b'00011111' TRISA b'00000111' OPTION_REG STATUS.********************************************************************************* .entre 50 mS y 12.2 .Vector de Reset .Decrementa contador de intervalos .3 .

0 Loop TMR0.Variable de temporización .W Numero .Dicho movimiento se mantiene mientras RA0 esté a "1".Inicia el contador del dado .Lo convierte en 7 segmentos .El número queda entre 1 y 6 .Elimina rebotes .Salida a Display .Inicia variable de temporización . Al ponerse a "0" se presenta el .Conversión a BCD .Temporiza 3" .Siguiente número Salida: .tivamente de un número entre 1 y 6 Divide: movlw subwf movwf sublw btfss goto incf .F .Número a visualizar .Captura el valor del TMR0 (Nº aleatorio) .C Divide Numero.F RA0_1 Dado Numero.W Numero .Recoge el aleatorio .El número aleatorio es. .W Tabla_7_seg PORTB .0 Salida Temporal. mediante restas consecutivas.No .Loop clrwdt btfss goto movf movwf PORTA.1 Delay_Cont Delay_var Temporal. .del 1 al 6 a intervalos de 0.Apaga el display .temporiza 0. .5 STATUS.05" con objeto de dar una sensación de movimiento del dado.6 Temporal PORTA.número aleatorio capturado previamente desde el TMR0 Dado: RA0_1 movlw movwf clrwdt btfss goto movf call movwf movlw movwf call decfsz goto goto sleep movf call movwf movlw movwf call movlw movwf goto end .Refresco del WDT . dividido entre 6.el último resto será entre 0 y 5 que será incrementado en una unidad para que defini.W Tabla_7_seg PORTB d'60' Delay_Cont Delay_var b'11111111' PORTB Loop . . De esta forma .Esta secuencia de instrucciones tiene por misión presentar sobre el display los números .Resta 6 al número aleatorio .Activado RA0 ?? . .lo guarda . .Mira si RA0 está a 1 .Refrescar el WDT .6 Numero.Fin del programa fuente PRACTICA 14 Autor: Mikel Etxebarria .Mira si es menor de 5 .Ahora si.Todavía No .05" . visualiza el aleatorio .Visualiza sobre el display .No.

Variable . D1 y D2 a las que se .en el reg.6 . El código 7 segmentos retorna también .Definiciones de registros internos . del dígito 0 .Activa dígito 1 .Visualiza DIG0 sobre el dígito 0 .3 .Vector de Reset .W Tabla_7_seg PORTB Delay . D1 y D2 .supone previamente cargadas.Variable .Código 7 seg.Salva vector de interrupción . W Tabla_7_seg addwf retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw PCL.INC" DIG0 DIG1 DIG2 Delay_Fijo Delay_Cont equ equ equ equ equ org goto org 0x0c 0x0d 0x0e 0x0f 0x10 0x00 Inicio 0x05 .El ejemplo presenta un subrutina que realiza el multiplexado o barrido de 3 displays de .Variable para para para para para el dígito 0 el dígito 1 el dígito 2 temporización fija temporización variable .Variable .Temporiza 1mS .Tipo de procesador .Tabla_7_seg: Esta rutina convierte el código BCD presente en los 4 bits de menos peso .8 .0 DIG0.Desactiva segmentos .Convierte a 7 segmentos .1 DIG1.del reg. (c) Microsystems Engineering (Bilbao) .Desplaza al PC tantas posiciones como indique el valor .********************************************************************************** .Temporiza 1mS .Carga variable DIG1 . previa conversión a 7 segmentos Display bsf movf call movwf call bcf movlw movwf bsf movf call movwf call PORTA. .7 .Código del 1 ..Visualiza DIG1 sobre el dígito 1 .W Tabla_7_seg PORTB Delay PORTA.0 b'11111111' PORTB PORTA.Convierte a 7 segmentos .Activa dígito 0 .Carga variable DIG0 .5 . List p=16F84 include "P16F84.Display: Esta rutina activa secuencialmente cada uno de los dígitos D0.del registro W .Multiplexado de displays .********************************************************************************** .ellos el contenido de las variables DIG1.2 .ánodo común y que visualiza el valor actual de las variables D0. RA1 y RA2 respectivamente.4 .Variable . a la vez que visualiza en cada uno de .F b'11000000' b'11111001' b'10100100' b'10110000' b'10011001' b'10010010' b'10000010' b'11111000' b'10000000' b'10011000' .9 .Desactiva dígito 0 .conectados a RA0. W en su equivalente a 7 segmentos. . DIG2 y DIG3.

Delay_var: Esta rutina de propósito general realiza una temporización variable .es de 5 mS ("Delay_cont=1) y el máxima de 1.2".Repite el intervalo de 50 mS Inicio .Activa dígito 2 .********************************************************************************** . es por ello que el delay mínimo .2 DIG2. con un preescaler de 256 hace una . el TMR0 debe contar 19 eventos que.La velocidad de trabajo es de 4Mhz y por tanto el TMR0 se incrementa cada uS.19 TMR0 INTCON.Puerta B se configura como salida .tantes veces como indique la variable "Delay_cont". Delay_var: Intervalo bcf movlw movwf clrwdt btfss goto decfsz goto return movlw movwf clrf bsf clrf movlw movwf movlw movwf bcf movlw movwf INTCON. Delay clrf Delay_Fijo .Selecciona banco 0 .Delay: Rutina de temporización por software.Decrementa contador de intervalos .alcanzar 0.carga el TMR0 con el complemento de 195 .bcf movlw movwf bsf movf call movwf call bcf movlw movwf return PORTA.Consume 1 uS goto Delay_1 . .Convierte a 7 segmentos .Consume 2 uS return .esta forma.Todavía no .intervalo total de 5000 uS/5 mS (19 * 256). dado que la ejecución de .Desactiva dígito 1 . Dicho intervalo de 5 mS se repite .Selecciona banco 1 .Consume 1 uS decfsz Delay_Fijo.2" (Delay_cont=255). Se emplea un preescaler de 256 y al TMR0 se le carga con 19. De .T0IF Intervalo Delay_Cont.2 b'11111111' PORTB .W Tabla_7_seg PORTB Delay PORTA.Fin del multiplexado .Pone a "1" los latch de salida .1 b'11111111' PORTB PORTA.entre 5 mS y 1.RA0-RA2 se configuran como salidas .tres instrucciones que consumen 4 uS.Carga variable DIG2 .RP0 1 DIG2 .RP0 TRISB b'00011000' TRISA b'00000111' OPTION_REG STATUS.Preescaler de 256 para el TMR0 .Visualiza DIG2 sobre el dígito 2 .Desactiva segmentos .Desactiva dígito 2 . El tiempo que consume su ejecución es del orden de 1mS. Un bucle hace decermentar una variable hasta .Se manda repetir el bucle 255 veces Delay_1 nop .F Delay_var b'11111111' PORTB PORTA STATUS.Desactiva segmentos .Desconecta el flag de rebosamiento .T0IF ~.********************************************************************************* .F .Temporiza 1mS . se repite 255 veces .Rebasamiento del TMR0 al de 50mS ?? .Desconecta los dígitos .Refrescar el WDT .

F b'11000000' b'11111001' b'10100100' b'10110000' b'10011001' b'10010010' b'10000010' b'11111000' b'10000000' b'10011000' . .7 .en el reg.Definiciones de registros internos .********************************************************************************** . La entrada RA3 determina . (c) Microsystems Engineering (Bilbao) .9 .Desplaza al PC tantas posiciones como indique el valor .INC" DIG0 DIG1 DIG2 Delay_Fijo equ equ equ equ org goto org 0x0c 0x0d 0x0e 0x0f 0x00 Inicio 0x05 . .pulsos a contar se aplica por RA4 es sensible al flanco descendente.Variable .Tipo de procesador .1 Delay_Cont Delay_var Loop .movlw movwf movlw movwf Loop clrwdt call movlw movwf call goto end 2 DIG1 3 DIG0 Display . W en su equivalente a 7 segmentos.Código 7 seg. del dígito 0 .Refrescar el WDT .********************************************************************************** .Carga en las variables el valor a visualizar (123) .Variable para para para para el dígito 0 el dígito 1 el dígito 2 temporización fija . El código 7 segmentos retorna también .del registro W .si la cuenta es ascendente "1" o descendente "0" List p=16F84 include "P16F84.Código del 1 .6 . Autor: Mikel Etxebarria .8 .Variable .Variable .Vector de Reset .Fin del programa fuente .Se trata de un contador UP/DOWN de 3 dígitos que cuenta desde 000 hasta 999. W Tabla_7_seg addwf retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw PCL. .Tabla_7_seg: Esta rutina convierte el código BCD presente en los 4 bits de menos peso .Salva vector de interrupción . .del reg.4 . .5 .Contador UP/DOWN de 3 dígitos . PRACTICA 15 .3 .2 . La entrada de .

Consume 2 uS return .Desactiva dígito 1 .Carga variable DIG2 .Incrementa DIG2 .Z .W Tabla_7_seg PORTB Delay PORTA.Temporiza 1mS .F . ajusta a 0 variable DIG0 incf DIG1.F .Desactiva dígito 2 . El tiempo que consume su ejecución es del orden de 1mS. Un bucle hace decermentar una variable hasta . previa conversión a 7 segmentos Display bsf movf call movwf call bcf movlw movwf bsf movf call movwf call bcf movlw movwf bsf movf call movwf call bcf movlw movwf return PORTA.Convierte a 7 segmentos . RA1 y RA2 respectivamente.Desactiva segmentos .Es mayor de 9 ?? return .tres instrucciones que consumen 4 uS.W Tabla_7_seg PORTB Delay PORTA.0 b'11111111' PORTB PORTA.Desactiva dígito 0 .Delay: Rutina de temporización por software.0 DIG0.**************************************************************************************** .No clrf DIG1 .1 DIG1.Desactiva segmentos .Convierte a 7 segmentos .********************************************************************************** .Si.W Tabla_7_seg PORTB Delay PORTA.Convierte a 7 segmentos .Fin del multiplexado . DIG1 y DIG2 con el correspondiente ajuste BCD .Activa dígito 0 . DIG2 y DIG3. a la vez que visualiza en cada uno de .conectados a RA0.Incrementa DIG1 movlw 0x0a subwf DIG1.1 b'11111111' PORTB PORTA.F .2 b'11111111' PORTB .Visualiza DIG1 sobre el dígito 1 . D1 y D2 .Visualiza DIG2 sobre el dígito 2 .W btfss STATUS.Visualiza DIG0 sobre el dígito 0 .Display: Esta rutina activa secuencialmente cada uno de los dígitos D0.Carga variable DIG1 .Es mayor de 9 ?? return .Consume 1 uS decfsz Delay_Fijo.2 DIG2. Incrementa incf DIG0. Delay clrf Delay_Fijo .Incrementa DIG0 en una unidad movlw 0x0a subwf DIG0.Activa dígito 1 . ajusta a 0 variable DIG1 incf DIG2.Se manda repetir el bucle 255 veces Delay_1 nop .Consume 1 uS goto Delay_1 .Temporiza 1mS . se repite 255 veces .Desactiva segmentos .Carga variable DIG0 .No clrf DIG0 ..Activa dígito 2 . dado que la ejecución de .ellos el contenido de las variables DIG1.W btfss STATUS.Si.Incrementa en una unidad las variables DIG0.F .Temporiza 1mS .alcanzar 0.Z .

DIG1 y DIG2 con el correspondiente ajuste BCD .No movlw .Puerta B se configura como salida .Selecciona banco 0 . ajusta DIG2 return Inicio movlw movwf clrf bsf clrf movlw movwf movlw movwf bcf clrf clrf clrf Loop clrwdt btfsc goto call goto b'11111111' PORTB PORTA STATUS. ajusta DIG1 decf DIG2.Es mayor de 9 ?? .movlw subwf btfss return clrf return 0x0a DIG2.Si.Si .Si.Z DIG2 .Refrescar el WDT .F .9 movwf DIG2 .4 .Si.RA0-RA2 se configuran como salidas .9 movwf DIG0 .Decrementa DIG0 en una unidad movlw 0xff subwf DIG0.Z .F .Es menor de 0 ? return .Decrementa DIG2 movlw 0xff subwf DIG2.Preescaler de 256 para el TMR0 .Es menor de 0 ? return . mantiene el refresco del display .No movlw .Flanco descendente en RA4 Descendente clrwdt btfss PORTA.Z .F .Si ajuste de DIG0 decf DIG1.RP0 DIG0 DIG1 DIG2 PORTA.Desconecta los dígitos .Refrescar el WDT .Esperar .Carga las variables con valor inicial 000 .Es menor de 0 ? return .RP0 TRISB b'00011000' TRISA b'00000111' OPTION_REG STATUS.W STATUS.******************************************************************************************* .Selecciona banco 1 .Z .4 Descendente Display Loop .Pone a "1" los latch de salida .W btfss STATUS.W btfss STATUS. Decrementa decf DIG0.No movlw .9 movwf DIG1 .Decrementa DIG1 movlw 0xff subwf DIG1. agista a 0 variable DIG2 .W btfss STATUS.No.No .Decrementa en una unidad las variables DIG0.Flanco ascendente en RA4 ?? .

3 Dec_Cont Incrementa Loop Decrementa Loop .********************************************************************************** .9 segundos. .Esperar .Tabla_7_seg: Esta rutina convierte el código BCD presente en los 4 bits de menos peso .del registro W .Decrementar el contador .Variable .Registro . El pulsador .8 .Si.Código 7 seg. ha habido un pulso en RA4 .Definiciones de registros internos .Esperar el siguiente pulso .Se trata de un cronómetro capaz de medir lapsus de tiempo de hasta 99.Variable .3 . El código 7 segmentos retorna también .INC" DIG0 DIG1 DIG2 Delay_Fijo W_Temp STATUS_Temp Delay_Cont equ equ equ equ equ equ equ org goto org goto org 0x0c 0x0d 0x0e 0x0f 0x10 0x11 0x12 0x00 Inicio 0x04 Interrupcion 0x05 .Esperar al siguiente pulso .Vector de Reset .6 .Cronómetro digital .en el reg. mantiene el refresco del display .No .Variable .7 .RA3 está a "1" ?? . Autor: Mikel Etxebarria . W en su equivalente a 7 segmentos.F b'11000000' b'11111001' b'10100100' b'10110000' b'10011001' b'10010010' b'10000010' b'11111000' b'10000000' .conectado a RA4 actúa de START/STOP mientras que RA3 actúa como puesta a 00.Vector de interrupción .Variable . del dígito 0 . incrementa el contador .goto call goto Pulso btfss goto call goto call goto end Pulso Display Descendente PORTA.Tipo de procesador .5 .del reg.Fin del programa fuente Dec_Cont .0 List p=16F84 include "P16F84. (c) Microsystems Engineering (Bilbao) .2 . .Salva vector de interrupción .Variable para el dígito 0 para el dígito 1 para el dígito 2 para temporización fija temporal para el W temporal para el registro de estado de temporización . . W Tabla_7_seg addwf retlw retlw retlw retlw retlw retlw retlw retlw retlw PCL.Registro .No. PRACTICA 16 .Código del 1 .Desplaza al PC tantas posiciones como indique el valor .Si.4 . .

tres instrucciones que consumen 4 uS.Activa dígito 1 .Carga variable DIG0 . Un bucle hace decermentar una variable hasta .Activa dígito 2 .2 DIG2.Incrementa en una unidad las variables DIG0.Es mayor de 9 ?? return .Visualiza DIG0 sobre el dígito 0 .Temporiza 1mS .retlw b'10011000' .Convierte a 7 segmentos .Desactiva dígito 0 .Consume 2 uS return .Desactiva segmentos .W Tabla_7_seg PORTB Delay PORTA.9 .Incrementa DIG1 movlw 0x0a subwf DIG1.W btfss STATUS.Desactiva segmentos .2 b'11111111' PORTB . RA1 y RA2 respectivamente.Display: Esta rutina activa secuencialmente cada uno de los dígitos D0.Convierte a 7 segmentos . ajusta a 0 variable DIG0 incf DIG1.Desactiva dígito 1 .Z . Incrementa incf DIG0.Si.F .Consume 1 uS decfsz Delay_Fijo. a la vez que visualiza en cada uno de .1 DIG1.W Tabla_7_seg b'01111111' PORTB Delay PORTA.F .Desactiva segmentos .alcanzar 0. dado que la ejecución de . se repite 255 veces .W Tabla_7_seg PORTB Delay PORTA.Incrementa DIG0 en una unidad movlw 0x0a subwf DIG0.Delay: Rutina de temporización por software.Carga variable DIG2 .0 DIG0. Delay clrf Delay_Fijo .No clrf DIG0 . previa conversión a 7 segmentos Display bsf movf call movwf call bcf movlw movwf bsf movf call andlw movwf call bcf movlw movwf bsf movf call movwf call bcf movlw movwf return PORTA.W .Carga variable DIG1 . DIG1 y DIG2 con el correspondiente ajuste BCD .Temporiza 1mS .0 b'11111111' PORTB PORTA.Consume 1 uS goto Delay_1 .Visualiza DIG1 sobre el dígito 1 .ellos el contenido de las variables DIG1.Visualiza DIG2 sobre el dígito 2 .Activa dígito 0 .Activa el punto decimal en el dígito 1 .1 b'11111111' PORTB PORTA. El tiempo que consume su ejecución es del orden de 1mS.Convierte a 7 segmentos .Temporiza 1mS .**************************************************************************************** .Se manda repetir el bucle 255 veces Delay_1 nop . D1 y D2 . DIG2 y DIG3.Fin del multiplexado .conectados a RA0.********************************************************************************** .Desactiva dígito 2 .********************************************************************************** .F .

RP0 DIG0 DIG1 DIG2 INTCON.Preescaler de 256 para el TMR0 .No.Recarga el TMR0 para la siguiente temporización .T0IF PORTA.2 Delay_Cont Incrementa STATUS_Temp.RA0-RA2 se configuran como salidas .btfss return clrf incf movlw subwf btfss return clrf return STATUS.Ha habido dos interrupciones ?? .4 Descendente Display Loop_1 .Refrescar el WDT . Interrupcion btfss retfie bcf movwf swapf movwf movlw movwf decfsz goto movlw movwf call swapf movwf swapf swapf retfie movlw movwf clrf bsf clrf movlw movwf movlw movwf bcf clrf clrf clrf bcf clrwdt btfsc goto call goto INTCON.Esperar Loop_1 .W STATUS.Salva el registro de estado .Recupera el registro W Inter_Fin Inicio .Desconecta los dígitos . falsa interrupción .Puesta a 000 del contador .*************************************************************************************** .F 0x0a DIG2.T0IF INTCON.Pone a "1" los latch de salida .Flanco ascendente en RA4 ?? .Si.Es mayor de 9 ?? .T0IF W_Temp STATUS.Si.RP0 TRISB b'00011000' TRISA b'00000111' OPTION_REG STATUS.Es mayor de 9 ?? .W b'11111111' PORTB PORTA STATUS.No .Salva el registro W .Si .Recupera el registro de estado .se producen dos interrupciones (0.Z DIG1 DIG2.W STATUS W_Temp.No . repone el contador de interrupciones con 2 . reponer flag del TMR0 .No .1") se actualiza el valor de los contadores.F Inter_Fin .Puerta B se configura como salida . agista a 0 variable DIG2 .No.Si. ajusta a 0 variable DIG1 .se carga con 195 que junto con un preescaler de 256 genera interrupción cada 50mS.Ha sido el TMR0 ?? . Cuando . mantiene el refresco del display .Incrementa DIG2 .Actualiza el contador del cronómetro .F W_Temp.W STATUS_Temp ~.Repone flag del TMR0 .Selecciona banco 1 .Si.Interrupción: Programa de tratamiento que se ejecuta cada vez que desborde el TMR0.Z DIG2 . Este .195 TMR0 Delay_Cont.Selecciona banco 0 Loop .

T0IE INTCON. parada del cronómetro .Esperar a que se suelte RA4 Fin_2 Fin_3 PORTA. refrescar el display .Refrescar el WDT .No.Esperar a que se suelte RA3 .Si. .Si .acústica conectada a RA2 durante 0. La máquina "Su Turno" .195 TMR0 . . ha habido un pulso en RA4 .5".Sobre los display D0 y D1 se visualiza el número de turno entre 00 y 99.La memoria EEPROM de datos. .Inicia variable de temporización .No.Esperar . mantiene el refresco del display . (c) Microsystems Engineering (Bilbao) .No.Fin del programa fuente . mantiene el refresco del display .Se detiene la interrupción del TMR0 .Si .GIE PORTA.Aún no se ha soltado RA4.3 Loop Display Fin_3 . ha habido pulso para puesta a 0 del cronómetro .aplica un pulso por RA4 el contador se incrementa una unidad al tiempo que se activa una señal . La entrada RA3 se emplea para cponer a 00 el contador. .2 Delay_Cont INTCON.Flanco descendente de RA4 ?? . Cada vez que se . mantiene el refresco del display . mantiene el refresco del display .Flanco descendente en RA4 .Flanco ascendente en RA4 ? .Sigue cronometrando Crono_Fin .3 Fin_3 Display Fin_2 PORTA. Autor: Mikel Etxebarria . .No.GIE PORTA.Secuencia de parada del cronómetro y puesta a 000 STOP Fin_1 bcf clrwdt btfss goto call goto clrwdt btfsc goto call goto clrwdt btfss goto call goto end INTCON.Permiso general de interrupciones .4 START Display Descendente .Descendente clrwdt btfss goto call goto PORTA.Esperar a que se active RA3 .Flanco descendente en RA3 ? .Habilita interrupción del TMR0 .Flanco ascendente en RA3 ? .Carga el TMR0 con 195 (interrupción cada 50mS) . PRACTICA 17 .Se comienza a cronometrar START movlw movwf movlw movwf bsf bsf clrwdt btfsc goto call goto ~.Si.4 STOP Display Crono_Fin .Si. .4 Fin_2 Display Fin_1 .

EEIF Wait EECON1. . todavía no ha finalizado la escritura .WR EECON1.F EE_Write_1 .de bytes a grabar está contenido en la variable N_Bytes.Reponer flag de fin de escritura .Secuencia establecida por Microchip .F N_Bytes.de alimentación.Fin de escritura ?? . Si hubiera un fallo .Selección de banco 1 EE_Read_1 .Desconecta permiso de escritura .**************************************************************************************** .Se empieza a leer desde la posición 0 de la EEPROM y los datos leídos se depositan a partir .No.Variable de temporización . Es 0 ?? .Tipo de procesador .Nº de bytes a grabar/leer en la EEPROM .Variable para el dígito 1 .1ª dirección EEPROM a leer ..Carga dato a grabar . el contador visualiza el último estado.1ª direección a almacenar lo leído .Permiso de escritura EE_Write_1 Wait . faltan bytes por grabar .El valor de la cuenta es constantemente registrado en la EEPROM de datos.Variable para temporización fija .Selección banco 0 .Si.EE_Read: Leer tantos bytes de la EEPROM de datos como se indique en la variable N_Bytes.2 N_Bytes EEADR DIG0 FSR INDF.RP0 EECON1.Vector de Reset .Si.No.Definiciones de registros internos .Variable para el dígito 0 . fin de escritura .Nº de bytes a leer .EEIF STATUS.Salva vector de interrupción .EE_Write: Graba n bytes a partir de la primera posición de la EEPROM de datos.Inicia Nº de bytes a leer .Decrementa el contador de bytes.Dirección 0 de EEPROM .RP0 .INC" DIG0 DIG1 Delay_Fijo Delay_Cont N_Bytes equ equ equ equ equ org goto org 0x0c 0x0d 0x0e 0x0f 0x10 0x00 Inicio 0x05 .WREN EECON1.************************************************************************************** .2 N_Bytes EEADR DIG0 FSR STATUS. EE_Write movlw movwf clrf movlw movwf movf movwf bsf bsf movlw movwf movlw movwf bsf bcf btfss goto bcf bcf incf incf decfsz goto return .Orden de escritura .RP0 FSR. List p=16F84 include "P16F84.F EEADR. byte a grabar . siguiente byte a escribir .W EEDATA STATUS.WREN b'01010101' EECON2 b'10101010' EECON2 EECON1.Selecciona banco 1 .de la posición indicada por FSR EE_Read movlw movwf clrf movlw movwf bsf .Inicia índice con el 1er.Siguiente posición de EEPROM . El número .

Activa dígito 0 .Desplaza al PC tantas posiciones como indique el valor .6 .1 b'11111111' PORTB .0 b'11111111' PORTB PORTA.5 .F FSR.Si .7 .Código del 1 . a la vez que visualiza en cada uno de .RD STATUS.Temporiza 1mS .W INDF EEADR. se repite 255 veces .del registro W . El tiempo que consume su ejecución es del orden de 1mS.Activa dígito 1 .W Tabla_7_seg PORTB Delay PORTA.4 .Convierte a 7 segmentos .Visualiza DIG0 sobre el dígito 0 .alcanzar 0.1 DIG1.Delay: Rutina de temporización por software. del dígito 0 . Delay clrf Delay_Fijo .Desactiva segmentos . previa conversión a 7 segmentos Display bsf movf call movwf call bcf movlw movwf bsf movf call movwf call bcf movlw movwf return PORTA.Siguiente posición de almacenamiento .F EE_Read_1 .Orden de lectura .8 .W Tabla_7_seg PORTB Delay PORTA.********************************************************************************** .conectados a RA0 y RA1 respectivamente.ellos el contenido de las variables DIG0 y DIG1.Se han leído todos los bytes deseados ?? .2 .F b'11000000' b'11111001' b'10100100' b'10110000' b'10011001' b'10010010' b'10000010' b'11111000' b'10000000' b'10011000' . Un bucle hace decermentar una variable hasta .Desactiva segmentos .Almacena dato recien leído .0 DIG0.No.Convierte a 7 segmentos .Carga variable DIG1 .bsf bcf movf movwf incf incf decfsz goto return EECON1.Desactiva dígito 1 .********************************************************************************** .3 .F N_Bytes.del reg.Fin del multiplexado . dado que la ejecución de .Tabla_7_seg: Esta rutina convierte el código BCD presente en los 4 bits de menos peso .9 .Desactiva dígito 0 .RP0 EEDATA. W Tabla_7_seg addwf retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw PCL.tres instrucciones que consumen 4 uS.Carga variable DIG0 .Código 7 seg. nueva lectura .Display: Esta rutina activa secuencialmente cada uno de los dígitos D0 y D1 .Temporiza 1mS .Visualiza DIG1 sobre el dígito 1 . El código 7 segmentos retorna también .en el reg.Selección de banco 0 .********************************************************************************** . W en su equivalente a 7 segmentos.Se manda repetir el bucle 255 veces .Siguiente dirección de EEPROM a leer .

Z .Consume 1 uS .Lee los dos primeros bytes y los deposita en .Refresca el WDT .W btfss STATUS.Si.Incrementa DIG1 movlw 0x0a subwf DIG1.memoria EEPROM de datos no ha sido utilizada o bien se empleó en otras aplicaciones.Es mayor de 9 ?? return . .Pone a "1" los latch de salida .Si.Consume 1 uS .Flanco ascendente en RA4 ?? .C Loop DIG0 DIG1 EE_Write .RA0-RA2 se configuran como salidas .Preescaler de 256 para el TMR0 .Esos valores deben estar comprendidos entre 00 y 09.Incrementa en una unidad las variables DIG0 y DIG1 con el correspondiente ajuste BCD . Incrementa incf DIG0.RP0 TRISB b'00011000' TRISA b'00000111' OPTION_REG STATUS. En caso contrario significa que la .No clrf DIG0 . DIG0 y DIG1 están entre los valores correctos .Pone le contador a 00 .W STATUS.Puerta B se configura como salida . esperar el descendente para incrementar contador Loop clrwdt btfsc PORTA.Delay_1 nop decfsz Delay_Fijo.W STATUS.W btfss STATUS.**************************************************************************************** .No.C Clear 0x09 DIG1.Selecciona banco 0 . ajusta a 0 variable DIG0 incf DIG1.las variable DIG0 y DIG1 .Es mayor de 9 ?? return .F . ajusta a 0 variable DIG1 return Inicio movlw movwf clrf bsf clrf movlw movwf movlw movwf bcf b'11111111' PORTB PORTA STATUS.DIG1 > 09 ?? .Desconecta los dígitos .F .F goto Delay_1 return .No clrf DIG1 .Si.Selecciona banco 1 .Si.Z .En la secuencia de inicio es necesario conocer si la EEPROM de datos contiene valores de .RP0 .DIG0 > 09 ?? .Incrementa DIG0 en una unidad movlw 0x0a subwf DIG0. el contador a de ponerse a 00 .Consume 2 uS .4 goto Descendente .contaje apropiados en sus dos primeras posiciones y que se corresponderán con DIG0 y DIG1. call movlw subwf btfsc goto movlw subwf btfss goto Clear clrf clrf call EE_Read 0x09 DIG0.

No .Repite el refresco 250 veces (500 mS) .Fin del programa fuente .250 Delay_Cont Display Delay_Cont. ha habido un pulso en RA4 .btfsc goto call goto Descendente bsf clrwdt btfss goto call goto call call movlw movwf clrwdt call decfsz goto bcf goto clrwdt call btfsc goto clrf clrf call goto end PORTA.No.Refresca el display .Refresca el display (el refresco tarda 2 mS) .Inicia variable de temporización .Actualiza el contador en la EEPROM .Refrescar el WDT .Si.Incrementa el contador .No.4 Inc_Cont Display Descendente Incrementa EE_Write .2 Loop Display PORTA. borrar el contador .2 PORTA.Desconecta la señal sonora Inc_Cont Inc_Cont_1 Borrar .Flanco descendente en RA3 ? .Flanco descendente en RA4 . mantiene el refresco del display .Activa señal sonora . puesta a 00 del contador .Si.Si.Esperar .F Inc_Cont_1 PORTA. mantiene el refresco del display .Esperar .Flanco ascendente en RA3 (borrado) ?? .3 Borrar Display Loop PORTA.3 Borrar DIG0 DIG1 EE_Write Loop .

Sign up to vote on this title
UsefulNot useful