P. 1
codigo para el 16f84

codigo para el 16f84

|Views: 1.261|Likes:
Publicado porneoflash

More info:

Published by: neoflash on Feb 02, 2011
Copyright:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as DOCX, PDF, TXT or read online from Scribd
See more
See less

05/19/2013

pdf

text

original

; ; 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:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Refrescar el WDT .Desconecta la señal sonora Inc_Cont Inc_Cont_1 Borrar .Incrementa el contador .No. puesta a 00 del contador .Flanco ascendente en RA3 (borrado) ?? .3 Borrar Display Loop PORTA.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 .250 Delay_Cont Display Delay_Cont. mantiene el refresco del display .Flanco descendente en RA3 ? .Refresca el display (el refresco tarda 2 mS) . ha habido un pulso en RA4 .3 Borrar DIG0 DIG1 EE_Write Loop .Fin del programa fuente .Inicia variable de temporización .Esperar .Si.Actualiza el contador en la EEPROM .F Inc_Cont_1 PORTA.Activa señal sonora .No .Esperar .Repite el refresco 250 veces (500 mS) .Flanco descendente en RA4 .Si.2 Loop Display PORTA. borrar el contador .4 Inc_Cont Display Descendente Incrementa EE_Write .Si. mantiene el refresco del display .2 PORTA.

You're Reading a Free Preview

Descarga
scribd
/*********** DO NOT ALTER ANYTHING BELOW THIS LINE ! ************/ var s_code=s.t();if(s_code)document.write(s_code)//-->