Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
; 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
goto Loop
goto Loop
;
; PRACTICA 4
;
; Autor: Mikel Etxebarria
; (c) Microsystems Engineering (Bilbao)
;
;Programa secuencial
;
;Mediante dos pulsadores conectados en RA0 y RA1 se controla la salida RB0 que gobierna un
;zumbador de alarma. Una transición a "1" en RA0 provoca su activación, una transición en RA0
;su desactivación.
;
; PRACTICA 5
;
; Autor: Mikel Etxebarria
; (c) Microsystems Engineering (Bilbao)
;
;Empleando el TMR0; juego de luces
;
;El programa activa secuencialmente, de una en una, las ocho salidas de la puerta B (RB0-RB7),
;provocacndo un efecto de desplazamiemto de dcha. a izda. Cada salida se mantiene activada
;durante un intervalo de 0.1" (100mS). Dicho intervalo se controla mediante el TMR0.
;
;El TMR0 se carga con el valor 195 y, trabajando a 4MHz, evoluciona cada 1 uS. Como a su vez
;se le asocia un preescaler de 256, el desbordamiento se prodicirá al de 49.9 ms
;
; PRACTICA 6
;
; Autor: Mikel Etxebarria
; (c) Microsystems Engineering (Bilbao)
;
;Usando el preescaler, más juego de luces
;
;El programa activa secuencialmente, de una en una, las ocho salidas de la puerta B (RB0-RB7),
;provocacndo un efecto de desplazamiemto de dcha. a izda. Cada salida se mantiene activada
;durante un intervalo de tiempo variable en función de las entradas RA0-RA2, que seleccionan
;los 8 valores posibles del preescaler comprendidos entre 1:2 y 1:256.
;
;El TMR0 realiza una cuenta de 50 eventos que se repite 200 veces. La temporización mínima es
;de 20mS (preesacler 1:2) y la máxima 2.5" (preescaler 1:256)
movlw b'00000001'
movwf Temp ;1er. valor a sacar
bcf STATUS,C
;
; PRACTICA 7
;
; Autor: Mikel Etxebarria
; (c) Microsystems Engineering (Bilbao)
;
;
; PRACTICA 8
;
; Autor: Mikel Etxebarria
; (c) Microsystems Engineering (Bilbao)
;
;
;El modo TMR0 como contador de eventos externos
;
;El ejemplo pretende mostrar el funcionamiento del TMR0 en el modo contador. Mediante las
;entradas RA0-RA3 se introduce el número de pulsos a contar. Por RA4 se aplican dichos pulsos
;Cuando se alcance el valor deseado se disparan dos salidas durante un tiempo. La salida RB1 se
;utiliza para desconectar la fuente de entrada de pulsos y RB0 para activar cualquier otro
;dispositivo (p.e. un relé, en led, etc.)
;El WDT se empleará a modo de temporizador para determinar el tiempo de disparo de ambas
;salidas
;
; PRACTICA 9
;
; Autor: Mikel Etxebarria
; (c) Microsystems Engineering (Bilbao)
;
;
;La interrupción del TMR0.
;
;Se trata de comprobar la interrupción provocada por el TMR0. El programa
;lee constantemente el estado de los interruptores conectados a RA0 y RA1 para reflejarlo en
;los leds conectados a RB0 y RB1 respectivamente. Al mismo tiempo el TMR0
;genera una interrupción cada 0.05 seg. (50 mS) que se repetirá 5 veces con objeto
;de hacer intermitencia de 250 mS sobre el led conectado a RB7.
;El TMR0 se incrementa cada 1 uS. Si se emplea un preescaler de 256, deberá sufrir 195
;incrementos para provocar una interrupción cada 50000 uS (50 mS). Si esta se repite 5
;veces, el tiempo total transcurrido es de 250000 uS (250 mS). Se debe usar el
;complemento de 195
movlw ~.195
movwf TMR0 ;Carga el TMR0 con el complemeto de 195
movlw 0x05
movwf Temp ;Nº de veces a repetir la interrupción
movlw b'10100000'
movwf INTCON ;Activa la interrupción del TMR0
;
; PRACTICA 10
;
; Autor: Mikel Etxebarria
; (c) Microsystems Engineering (Bilbao)
;
;
;Otras interrupciones
;
;Los dispositivos PIC pueden provocar interrupción por otras dos causas diferentes además de
;por la del TMR0. Una de ellas es por la detección de una señal de un determinado flanco por
;la entrada RB0/INT. La otra es por el cambio de estado lógico producido en cualquiera de las
;líneas de entrada RB4-RB7.
;
;El ejemplo pretende mostrar la detección y tratamiento de cada una de estas nuevas fuentes de
;interrupción. Cuando se produce la interrupción RB0/INT se activa la salida RA0 durante 1".
;Cuando se produce la interrupción por cambio de estado en RB4-RB7 se activa la salida RA1
;durante 1".
;Se hace un delay de 1 segundo antes de reponer los correspondientes flags de interrupción.
;De esta forma se evitan posibles rebotes que puediera haber en las entradas.
;
; PRACTICA 11
;
; Autor: Mikel Etxebarria
; (c) Microsystems Engineering (Bilbao)
;
;Decodificador BCD a 7 segmentos
;
;Mediante los cuatro interruptores conectador a RA0-RA3 se aplica el código BCD de los números
;comprendidos entre 0 y 9. El programa obtiene el código de 7 segmentos para representar dicho
;número sobre un display de ánodo común, en el que cada segmento particular se activa mediante
;nivel lógico "0"
movf Temp,W
call Tabla_7_seg ;Convierte el valor a código de 7 segmentos
movwf PORTB ;Lo deposita en la puerta de salida para visualizarlo
goto Loop
NULO movlw b'11111111' ;El valor de entrada no estaba comprendido entre 0 y 9
movwf PORTB ;El display permanece apagado
goto Loop
;
; PRACTICA 12
;
; Autor: Mikel Etxebarria
; (c) Microsystems Engineering (Bilbao)
;
;Contador UP/DOWN decimal de un dígito
;
;Sobre el display 7 segmentos conectado a la puerta B se visualizará el número de pulsos
;aplicados por la entrada RA0. RA1 determina si la cuenta es ascendente (a "1")
;o descendente
;**********************************************************************************
;Tabla_7_seg: Esta rutina convierte el código BCD presente en los 4 bits de menos peso
;del reg. W en su equivalente a 7 segmentos. El código 7 segmentos retorna también
;en el reg. W
;
; PRACTICA 13
;
; Autor: Mikel Etxebarria
; (c) Microsystems Engineering (Bilbao)
;
;
;Generación de números aleatorios. El dado electrónico
;
;Se trata de generar un número aleatorio entre 1 y 6. Cuando RA0 está a "1", sobre el
;dsiplay 7 segmentos conectado a la puerta B, se van visualizando de forma secuecial
;los números del 1 al 6, con intervalos de 0.05". Al pasar RA0 a nivel "0", se visualiza
;el número aleatorio obtenido, durante un tiempo de 3". Luego el display se apaga y la
;secuencia se repite.
;**********************************************************************************
;Tabla_7_seg: Esta rutina convierte el código BCD presente en los 4 bits de menos peso
;del reg. W en su equivalente a 7 segmentos. El código 7 segmentos retorna también
;en el reg. W
;*********************************************************************************
;Delay_var: Esta rutina de propósito general realiza una temporización variable
;entre 50 mS y 12.8". Se emplea un preescaler de 256 y al TMR0 se le carga con 195.
;La velocidad de trabajo es de 4Mhz y por tanto el TMR0 se incrementa cada uS. De
;esta forma, el TMR0 debe contar 195 eventos que, con un preescaler de 256 hace una
;intervalo total de 50000 uS/50 mS (195 * 256). Dicho intervalo de 50 mS se repite
;tantes veces como indique la variable "Delay_cont", es por ello que el delay mínimo
;es de 50 mS ("Delay_cont=1) y el máxima de 12.8" (Delay_cont=255).
;El número aleatorio es, mediante restas consecutivas, dividido entre 6. De esta forma
;el último resto será entre 0 y 5 que será incrementado en una unidad para que defini-
;tivamente de un número entre 1 y 6
Divide: movlw .6
subwf Numero,W ;Resta 6 al número aleatorio
movwf Numero ;lo guarda
sublw .5
btfss STATUS,C ;Mira si es menor de 5
goto Divide ;No
incf Numero,F ;El número queda entre 1 y 6
;Esta secuencia de instrucciones tiene por misión presentar sobre el display los números
;del 1 al 6 a intervalos de 0.05" con objeto de dar una sensación de movimiento del dado.
;Dicho movimiento se mantiene mientras RA0 esté a "1". Al ponerse a "0" se presenta el
;número aleatorio capturado previamente desde el TMR0
Dado: movlw .6
movwf Temporal ;Inicia el contador del dado
RA0_1 clrwdt ;Refresco del WDT
btfss PORTA,0 ;Mira si RA0 está a 1
goto Salida ;No, visualiza el aleatorio
movf Temporal,W ;Número a visualizar
call Tabla_7_seg ;Conversión a BCD
movwf PORTB ;Visualiza sobre el display
movlw .1
movwf Delay_Cont ;Variable de temporización
call Delay_var ;temporiza 0.05"
decfsz Temporal,F ;Siguiente número
goto RA0_1
goto Dado
goto Loop
;
; PRACTICA 14
;
; Autor: Mikel Etxebarria
; (c) Microsystems Engineering (Bilbao)
;
;Multiplexado de displays
;
;El ejemplo presenta un subrutina que realiza el multiplexado o barrido de 3 displays de
;ánodo común y que visualiza el valor actual de las variables D0, D1 y D2 a las que se
;supone previamente cargadas.
;**********************************************************************************
;Tabla_7_seg: Esta rutina convierte el código BCD presente en los 4 bits de menos peso
;del reg. W en su equivalente a 7 segmentos. El código 7 segmentos retorna también
;en el reg. W
;**********************************************************************************
;Display: Esta rutina activa secuencialmente cada uno de los dígitos D0, D1 y D2
;conectados a RA0, RA1 y RA2 respectivamente, a la vez que visualiza en cada uno de
;ellos el contenido de las variables DIG1, DIG2 y DIG3, previa conversión a 7 segmentos
;**********************************************************************************
;Delay: Rutina de temporización por software. Un bucle hace decermentar una variable hasta
;alcanzar 0. El tiempo que consume su ejecución es del orden de 1mS, dado que la ejecución de
;tres instrucciones que consumen 4 uS, se repite 255 veces
;
Delay clrf Delay_Fijo ;Se manda repetir el bucle 255 veces
Delay_1 nop ;Consume 1 uS
decfsz Delay_Fijo,F ;Consume 1 uS
goto Delay_1 ;Consume 2 uS
return
;*********************************************************************************
;Delay_var: Esta rutina de propósito general realiza una temporización variable
;entre 5 mS y 1.2". Se emplea un preescaler de 256 y al TMR0 se le carga con 19.
;La velocidad de trabajo es de 4Mhz y por tanto el TMR0 se incrementa cada uS. De
;esta forma, el TMR0 debe contar 19 eventos que, con un preescaler de 256 hace una
;intervalo total de 5000 uS/5 mS (19 * 256). Dicho intervalo de 5 mS se repite
;tantes veces como indique la variable "Delay_cont", es por ello que el delay mínimo
;es de 5 mS ("Delay_cont=1) y el máxima de 1.2" (Delay_cont=255).
movlw 1
movwf DIG2
movlw 2
movwf DIG1
movlw 3
movwf DIG0 ;Carga en las variables el valor a visualizar (123)
;
; PRACTICA 15
;
; Autor: Mikel Etxebarria
; (c) Microsystems Engineering (Bilbao)
;
;Contador UP/DOWN de 3 dígitos
;
;Se trata de un contador UP/DOWN de 3 dígitos que cuenta desde 000 hasta 999. La entrada de
;pulsos a contar se aplica por RA4 es sensible al flanco descendente. La entrada RA3 determina
;si la cuenta es ascendente "1" o descendente "0"
;**********************************************************************************
;Tabla_7_seg: Esta rutina convierte el código BCD presente en los 4 bits de menos peso
;del reg. W en su equivalente a 7 segmentos. El código 7 segmentos retorna también
;en el reg. W
;**********************************************************************************
;Display: Esta rutina activa secuencialmente cada uno de los dígitos D0, D1 y D2
;conectados a RA0, RA1 y RA2 respectivamente, a la vez que visualiza en cada uno de
;ellos el contenido de las variables DIG1, DIG2 y DIG3, previa conversión a 7 segmentos
;**********************************************************************************
;Delay: Rutina de temporización por software. Un bucle hace decermentar una variable hasta
;alcanzar 0. El tiempo que consume su ejecución es del orden de 1mS, dado que la ejecución de
;tres instrucciones que consumen 4 uS, se repite 255 veces
;
Delay clrf Delay_Fijo ;Se manda repetir el bucle 255 veces
Delay_1 nop ;Consume 1 uS
decfsz Delay_Fijo,F ;Consume 1 uS
goto Delay_1 ;Consume 2 uS
return
;****************************************************************************************
;Incrementa en una unidad las variables DIG0, DIG1 y DIG2 con el correspondiente ajuste BCD
;
Incrementa incf DIG0,F ;Incrementa DIG0 en una unidad
movlw 0x0a
subwf DIG0,W
btfss STATUS,Z ;Es mayor de 9 ??
return ;No
clrf DIG0 ;Si, ajusta a 0 variable DIG0
incf DIG1,F ;Incrementa DIG1
movlw 0x0a
subwf DIG1,W
btfss STATUS,Z ;Es mayor de 9 ??
return ;No
clrf DIG1 ;Si, ajusta a 0 variable DIG1
incf DIG2,F ;Incrementa DIG2
movlw 0x0a
subwf DIG2,W
btfss STATUS,Z ;Es mayor de 9 ??
return ;No
clrf DIG2 ;Si, agista a 0 variable DIG2
return
;*******************************************************************************************
;Decrementa en una unidad las variables DIG0, DIG1 y DIG2 con el correspondiente ajuste BCD
;
Decrementa decf DIG0,F ;Decrementa DIG0 en una unidad
movlw 0xff
subwf DIG0,W
btfss STATUS,Z ;Es menor de 0 ?
return ;No
movlw .9
movwf DIG0 ;Si ajuste de DIG0
decf DIG1,F ;Decrementa DIG1
movlw 0xff
subwf DIG1,W
btfss STATUS,Z ;Es menor de 0 ?
return ;No
movlw .9
movwf DIG1 ;Si, ajusta DIG1
decf DIG2,F ;Decrementa DIG2
movlw 0xff
subwf DIG2,W
btfss STATUS,Z ;Es menor de 0 ?
return ;No
movlw .9
movwf DIG2 ;Si, ajusta DIG2
return
clrf DIG0
clrf DIG1
clrf DIG2 ;Carga las variables con valor inicial 000
;
; PRACTICA 16
;
; Autor: Mikel Etxebarria
; (c) Microsystems Engineering (Bilbao)
;
;Cronómetro digital
;
;Se trata de un cronómetro capaz de medir lapsus de tiempo de hasta 99.9 segundos. El pulsador
;conectado a RA4 actúa de START/STOP mientras que RA3 actúa como puesta a 00.0
;**********************************************************************************
;Tabla_7_seg: Esta rutina convierte el código BCD presente en los 4 bits de menos peso
;del reg. W en su equivalente a 7 segmentos. El código 7 segmentos retorna también
;en el reg. W
;**********************************************************************************
;Display: Esta rutina activa secuencialmente cada uno de los dígitos D0, D1 y D2
;conectados a RA0, RA1 y RA2 respectivamente, a la vez que visualiza en cada uno de
;ellos el contenido de las variables DIG1, DIG2 y DIG3, previa conversión a 7 segmentos
;**********************************************************************************
;Delay: Rutina de temporización por software. Un bucle hace decermentar una variable hasta
;alcanzar 0. El tiempo que consume su ejecución es del orden de 1mS, dado que la ejecución de
;tres instrucciones que consumen 4 uS, se repite 255 veces
;
Delay clrf Delay_Fijo ;Se manda repetir el bucle 255 veces
Delay_1 nop ;Consume 1 uS
decfsz Delay_Fijo,F ;Consume 1 uS
goto Delay_1 ;Consume 2 uS
return
;****************************************************************************************
;Incrementa en una unidad las variables DIG0, DIG1 y DIG2 con el correspondiente ajuste BCD
;
Incrementa incf DIG0,F ;Incrementa DIG0 en una unidad
movlw 0x0a
subwf DIG0,W
btfss STATUS,Z ;Es mayor de 9 ??
return ;No
clrf DIG0 ;Si, ajusta a 0 variable DIG0
incf DIG1,F ;Incrementa DIG1
movlw 0x0a
subwf DIG1,W
btfss STATUS,Z ;Es mayor de 9 ??
return ;No
clrf DIG1 ;Si, ajusta a 0 variable DIG1
incf DIG2,F ;Incrementa DIG2
movlw 0x0a
subwf DIG2,W
btfss STATUS,Z ;Es mayor de 9 ??
return ;No
clrf DIG2 ;Si, agista a 0 variable DIG2
return
;***************************************************************************************
;Interrupción: Programa de tratamiento que se ejecuta cada vez que desborde el TMR0. Este
;se carga con 195 que junto con un preescaler de 256 genera interrupción cada 50mS. Cuando
;se producen dos interrupciones (0.1") se actualiza el valor de los contadores.
Crono_Fin clrwdt
btfsc PORTA,4 ;Flanco ascendente en RA4 ?
goto STOP ;Si, parada del cronómetro
call Display ;No, mantiene el refresco del display
goto Crono_Fin ;Sigue cronometrando
Fin_2 clrwdt
btfsc PORTA,3 ;Flanco ascendente en RA3 ?
goto Fin_3 ;Si
call Display ;No, mantiene el refresco del display
goto Fin_2 ;Esperar a que se active RA3
Fin_3 clrwdt
btfss PORTA,3 ;Flanco descendente en RA3 ?
goto Loop ;Si, ha habido pulso para puesta a 0 del cronómetro
call Display ;No, mantiene el refresco del display
goto Fin_3 ;Esperar a que se suelte RA3
;
; PRACTICA 17
;
; Autor: Mikel Etxebarria
; (c) Microsystems Engineering (Bilbao)
;
;La memoria EEPROM de datos. La máquina "Su Turno"
;
;Sobre los display D0 y D1 se visualiza el número de turno entre 00 y 99. Cada vez que se
;aplica un pulso por RA4 el contador se incrementa una unidad al tiempo que se activa una señal
;acústica conectada a RA2 durante 0.5". La entrada RA3 se emplea para cponer a 00 el contador.
;
;El valor de la cuenta es constantemente registrado en la EEPROM de datos. Si hubiera un fallo
;de alimentación, el contador visualiza el último estado.
;****************************************************************************************
;EE_Write: Graba n bytes a partir de la primera posición de la EEPROM de datos. El número
;de bytes a grabar está contenido en la variable N_Bytes.
EE_Write movlw .2
movwf N_Bytes ;Inicia Nº de bytes a leer
clrf EEADR ;Dirección 0 de EEPROM
movlw DIG0
movwf FSR ;Inicia índice con el 1er. byte a grabar
EE_Write_1 movf INDF,W
movwf EEDATA ;Carga dato a grabar
bsf STATUS,RP0 ;Selecciona banco 1
bsf EECON1,WREN ;Permiso de escritura
movlw b'01010101'
movwf EECON2
movlw b'10101010'
movwf EECON2 ;Secuencia establecida por Microchip
bsf EECON1,WR ;Orden de escritura
bcf EECON1,WREN ;Desconecta permiso de escritura
Wait btfss EECON1,EEIF ;Fin de escritura ??
goto Wait ;No, todavía no ha finalizado la escritura
bcf EECON1,EEIF ;Reponer flag de fin de escritura
bcf STATUS,RP0 ;Selección banco 0
incf FSR,F ;Si, siguiente byte a escribir
incf EEADR,F ;Siguiente posición de EEPROM
decfsz N_Bytes,F ;Decrementa el contador de bytes. Es 0 ??
goto EE_Write_1 ;No, faltan bytes por grabar
return ;Si, fin de escritura
;**************************************************************************************
;EE_Read: Leer tantos bytes de la EEPROM de datos como se indique en la variable N_Bytes.
;Se empieza a leer desde la posición 0 de la EEPROM y los datos leídos se depositan a partir
;de la posición indicada por FSR
EE_Read movlw .2
movwf N_Bytes ;Nº de bytes a leer
clrf EEADR ;1ª dirección EEPROM a leer
movlw DIG0
movwf FSR ;1ª direección a almacenar lo leído
EE_Read_1 bsf STATUS,RP0 ;Selección de banco 1
bsf EECON1,RD ;Orden de lectura
bcf STATUS,RP0 ;Selección de banco 0
movf EEDATA,W
movwf INDF ;Almacena dato recien leído
incf EEADR,F ;Siguiente dirección de EEPROM a leer
incf FSR,F ;Siguiente posición de almacenamiento
decfsz N_Bytes,F ;Se han leído todos los bytes deseados ??
goto EE_Read_1 ;No, nueva lectura
return ;Si
;**********************************************************************************
;Tabla_7_seg: Esta rutina convierte el código BCD presente en los 4 bits de menos peso
;del reg. W en su equivalente a 7 segmentos. El código 7 segmentos retorna también
;en el reg. W
;**********************************************************************************
;Display: Esta rutina activa secuencialmente cada uno de los dígitos D0 y D1
;conectados a RA0 y RA1 respectivamente, a la vez que visualiza en cada uno de
;ellos el contenido de las variables DIG0 y DIG1, previa conversión a 7 segmentos
;**********************************************************************************
;Delay: Rutina de temporización por software. Un bucle hace decermentar una variable hasta
;alcanzar 0. El tiempo que consume su ejecución es del orden de 1mS, dado que la ejecución de
;tres instrucciones que consumen 4 uS, se repite 255 veces
;
Delay clrf Delay_Fijo ;Se manda repetir el bucle 255 veces
Delay_1 nop ;Consume 1 uS
decfsz Delay_Fijo,F ;Consume 1 uS
goto Delay_1 ;Consume 2 uS
return
;****************************************************************************************
;Incrementa en una unidad las variables DIG0 y DIG1 con el correspondiente ajuste BCD
;
Incrementa incf DIG0,F ;Incrementa DIG0 en una unidad
movlw 0x0a
subwf DIG0,W
btfss STATUS,Z ;Es mayor de 9 ??
return ;No
clrf DIG0 ;Si, ajusta a 0 variable DIG0
incf DIG1,F ;Incrementa DIG1
movlw 0x0a
subwf DIG1,W
btfss STATUS,Z ;Es mayor de 9 ??
return ;No
clrf DIG1 ;Si, ajusta a 0 variable DIG1
return
Borrar clrwdt
call Display ;Refresca el display
btfsc PORTA,3 ;Flanco descendente en RA3 ?
goto Borrar ;No
clrf DIG0
clrf DIG1 ;Si, borrar el contador
call EE_Write
goto Loop