• No se han encontrado resultados

UNIVERSIDAD DE EL SALVADOR FACULTAD DE INGENIERIA Y ARQUITECTURA ESCUELA DE INGENIERIA ELECTRICA MICROCONTROLADORES - MCS115 Práctica sobre el uC PIC16F877 - Conversión AD con muestreo periódico mediante módulo CCP2 2.1 Objetivos

N/A
N/A
Protected

Academic year: 2019

Share "UNIVERSIDAD DE EL SALVADOR FACULTAD DE INGENIERIA Y ARQUITECTURA ESCUELA DE INGENIERIA ELECTRICA MICROCONTROLADORES - MCS115 Práctica sobre el uC PIC16F877 - Conversión AD con muestreo periódico mediante módulo CCP2 2.1 Objetivos"

Copied!
11
0
0

Texto completo

(1)

UNIVERSIDAD DE EL SALVADOR

FACULTAD DE INGENIERIA Y ARQUITECTURA

ESCUELA DE INGENIERIA ELECTRICA

MICROCONTROLADORES - MCS115

Práctica sobre el uC PIC16F877 -

Conversión A/D con muestreo periódico mediante módulo CCP2

2.1

Objetivos

Familiarizarse con la tarjeta entrenadora del uC PIC16F877.

Practicar el conjunto de instrucciones del microcontrolador.

Configurar los módulos A/D y CCP2 en modo de disparo especial.

Desarrollar un instrumento básico que mida el periodo y la amplitud de una señal senoidal.

2.2

Introducción

Se pretende realizar el fragmento de programa encargado de realizar la medida del periodo y la

amplitud de una señal senoidal cuya frecuencia es variable entre 10 y 50Hz y cuya amplitud puede

tomar una valor máximo de 2V.

Se empleará un microcontrolador PIC16F877 con un oscilador de frecuencia de 4MHz.

2.3

Conexionado

Será necesaria una etapa de adaptación de niveles para aprovechar el rango de 0 a 5V de

conversión del módulo A/D

Se seleccionan los siguientes valores:

R1 = R2 = R3 = 10K

(2)

V1 = 2V

con lo que se consigue un desplazamiento de la tensión senoidal Vs entre

2V y 2V al margen de 0 a

5V en la tensión Ve de entrada al conversor A/D.

2.4

Planteamiento

Se va a utilizar el módulo CCP2 para lanzar las conversiones del módulo A/D a intervalos regulares

(periodo de muestreo). Se selecciona un periodo de muestreo de 200 µs que permitiría obtener

hasta 100 muestras en el caso más desfavorable de máxima frecuencia (fmax=50Hz -> Tmin=20ms).

Se almacenan de manera permanente los valores de las 3 últimas conversiones en 3 registros

auxiliares (P0, P1 y P2 de mayor a menor antigüedad). Empleamos esos 3 valores para buscar los

máximos locales de la onda:

Si P0 < P1 y además P2 < P1 entonces P1 es un valor de máximo temporal P1

El valor de tensión asociado al valor digital conseguido se deduce así:

P0

P2

Relación entre el valor digital n y la tensión analógica de entrada al conversor (Ve):

n = (Ve * 256) / 5

relación entre la tensión analógica de entrada al conversor A/D (Ve) y la tensión senoidal de

partida (Vs)

Vs = (Ve / 1.25) - 2

luego la relación entre el valor digital (n) y la tensión senoidal (Vs) será :

Vs = 0.0156 * n

2

Para medir el periodo de la señal contabilizamos el número de conversiones entre la localización de

un máximo y el siguiente. Cada vez que se encuentra un máximo se “resetea” un

contador de

conversiones que se utiliza como unidad de medida. Cada conversión se obtiene cada 200µs, en el

caso del periodo máximo de 100ms, el contador podría alcanzar un valor de 500, por tanto se

precisan utilizar 2 bytes

2.5

Algoritmo sugerido

INICIALIZACIÓN

CONVERSOR A/D:

)

Entradas RA0, RA1 y RA3 como analógicas y referencia de 5V, resto entradas

digitales

(3)

)

Canal analógico de entrada RA0

)

Flag ADIF a 0

TMR1:

)

Como temporizador, prescaler de 8 y parado al principio

)

Reset de TMR1

CCP2:

)

Modo comparación, disparo interno y reset de TMR1

VARIABLES:

)

MAXIMO, P2, P1 y P0 a cero

)

Habilitamos interrupciones (GIE=1 y PEIE=1)

)

Ponemos en marcha TMR1

BUCLE PRINCIPAL INFINITO

TRATAMIENTO DE INTERRUPCIÓN POR FIN DE CONVERSIÓN

Se comprueba que ADIF=1 si no salimos de inmediato

Salvamos el contexto del programa ppal. (W y STATUS)

Incrementamos CONTADOR conversiones: CUENTA_H + CUENTA_L

Actualizamos valores de las 3 últimas conversiones:

P1 -> P0

P2 -> P1

ADRES -> P2

Llamamos a BUSCA_MAX para determinar si hay máximo en P1

Ponemos flag ADIF a cero

Recuperamos contexto

Retorno de programa de tratamiento de interrupción

BUSCA_MAX

Se comparan P1 y P2 mediante resta (P2-P1), si C=0 resultado negativo y si C=1 el resultado es

positivo o nulo

Si P2 > P1 no es máximo y salimos de subprograma

Si P2 < P1 entonces

Si P0 < P1 entonces

P1 es máximo local: MAXIMO = P1

Registramos periodo: PERIODO_H_L = CUENTA_H_L

Reseteamos CUENTA_H y CUENTA_L

si no

Salimos del subprograma

(4)

TRATA_MAX

Se parte de un byte resultante de la conversión (MAXIMO) y nos proporciona en dos bytes:

BIN_ALTO

BIN_BAJO el valor de la amplitud en binario y expresado en diezmilésimas de voltio:

Uamp = 0.0156 * MAXIMO

2 [V]

Uamp = 156 * MAXIMO

20000 [1e-4V]

Realizamos el producto de 156 por el byte MAXIMO y al resultado de dos bytes, le restamos

20000 (0x4E20)

TRATA_PERIODO

Se parte de 2 bytes: PERIODO_H

PERIODO_L , donde está contabilizado el nº de conversiones

(cada 200 µs)

Para pasarlo a unidades de tiempo, empleamos diezmilésimas de segundo, multiplicando los dos

bytes por 2

T = (PERIODO_H

PERIODO_L) * 2 = T [en 1e-4 s]

El procesado posterior al calculo de la amplitud y el periodo queda abierto para que el alumno

decida si transfiere los resultados al LCD, Terminal RS-232 o realiza otro tipo de análisis.

Como una guía para la realización de esta practica se presenta el siguiente código fuente el cual

debe ser adaptado por el alumno para utilizarlo con el uC PIC16F877.

;******************************************************************* ;

; Ejemplo de manejo del conversor A/D, disparando la conversión ; mediante el módulo CCP2 trabajando en modo comparación ;

; Se determina la amplitud y el periodo de una señal senoidal ; cuya amplitud máxima es de 2V y cuya frecuencia puede estar ; comprendida entre 10Hz y 50Hz, la señal senoidal se "desplaza" ; al margen de 0 a 5V mediante la expresión:

;

; Useno (en V) = 0.0156 * n - 2

;

; se consigue con un circuito de adaptación con un Operacional ;

; Archivo: SENO.ASM ;

; Versión que determina máximo (amplitud) y distancia entre máximos (periodo) ;

; Programa pensado para oscilador de 8MHz.

(5)

;

LIST P=16C73

include "p16c73.inc" ;

; ***************************** ; ** DEFINICIÓN DE ETIQUETAS ** ; ***************************** ; MAXIMO PERIODO_H PERIODO_L EQU EQU EQU 0x21 0x22

0x20 ; Valor digital máximo actualizado ; Parte alta del periodo medido

; y parte baja, medido en periodos de muestreo

CUENTA_H EQU 0x23 ; Contador de capturas

CUENTA_L EQU 0x24 ; en 2 bytes

; En estos 3 bytes almacenamos 3 capturas consecutivas, y se usan para ; detectar el máximo: P2 será el valor más reciente y P0 el más antiguo

P0 EQU

P1 EQU

P2 EQU

0x25 0x26 0x27

W_TEMP EQU 0x28

STATUS_TEMP EQU 0x29

FACTOR1 EQU 0x2A

FACTOR2 EQU 0x2B

BIN_BAJO EQU

BIN_ALTO EQU

0x2C 0x2D

CONTADOR EQU 0x2E

;

;************** ;** COMIENZO ** ;**************

ORG 0x00 goto START ;

; ;

; ---

; LOCALIZACIÓN DE LA SUBRUTINA DE INTERRUPCIÓN POR FIN DE CONVERSIÓN ; ---

ORG 0x04 goto INTER ;

(6)

; INICIO DEL PROGRAMA ; ---

START bsf

movlw STATUS,RP0 b'00000100' ; Pasamos al Banco 1 ; Definimos entradas analógicas en

movwf ADCON1 ; RA<0,1,3> (el resto son digitales)

movlw movwf bcf b'01000000' PIE1 STATUS,RP0

; Se habilita la interrupción (ADIE=1) ; por fin de conversión del A/D ; Banco 0

INIC movlw movwf

b'10000001' ADCON0

; Oscilador: Tad=32*Tosc=4us, A/D encendido ; entrada RA<0> (canal CH0)

clrf PIR1 ; Se baja el flag del conversor (entre otros)

movlw movwf

b'00110000' T1CON

; Se prepara TMR1 para contar

; con reloj interno y prescaler (1:8) ; de momento está parado

; El periodo de entrada al TMR1 será pues de 4us

clrf TMR1H ; Reseteo el TMR1: parte alta

clrf TMR1L ; y parte baja

; La carga de CCPR2H y CCPR2L determina el periodo de muestreo que queremos de 200us

clrf CCPR2H ; Precarga de los registros de comparación

movlw 0x32 ; con 0x32 =50d para lanzar conversión

movwf CCPR2L ; cada 50*4us=200us

movlw b'00001011' ; Se programa el modo de comparación para

movwf CCP2CON ; lanzar la conversión A/D automáticamente

;

clrf MAXIMO ; Se inicializa el registro de máximo

clrf P0 ; Los valores consecutivos de conversión

clrf P1 ; también se inicializan

clrf P2

movlw b'11000000' ; Se habilitan las interrupciones

movwf INTCON ; por periféricos (para conversor A/D)

bsf T1CON,TMR1ON ; Se ponde en marcha el TMR1

;********* PROGRAMA PRINCIPAL ***********************

B_PPAL goto B_PPAL ;Ponemos una espera infinita

; ********************************* ; ** SERVICIO DE LA INTERRUPCIÓN ** ; ********************************* ;

(7)

; IDENTIFICACIÓN DE LA INTERRUPCIÓN ; ---

;

INTER btfsc PIR1,ADIF ; ¿Fin de conversión A/D?

goto FIN_AD

retfie ; lo comprobamos

; ;

FIN_AD movwf W_TEMP ; Salvo el contexto

swapf STATUS,W ; en caso afirmativo de ADIF=1 movwf STATUS_TEMP

incfsz CUENTA_L ; Incremento contador de conversiones

goto CAMBIO ; si no desbordó la parte baja sigo

incf CUENTA_H ; si desbordó incremento parte alta

; Ahora actualizo los 3 últimos valores

CAMBIO movf P1,W ; Le paso P1 a P0

movwf P0

movf P2,W ; P2 a P1

movwf P1

movf ADRES,W ; Y ahora cargo el nuevo dato en P2

movwf P2

call BUSCA_MAX

SALGO bcf PIR1,ADIF ; Se baja el flag del conversor

swapf STATUS_TEMP,W ; Recupero el contexto movwf STATUS

swapf W_TEMP,F swapf W_TEMP,W

retfie ; y regreso al programa principal

;********************************************************************** ; BUSCA_MAX

;

; Subprograma que carga MAXIMO con un máximo local si lo encuentra ; comparando los valores almacenados en P2, P1 y P0

;**********************************************************************

BUSCA_MAX

movf P1,W ; Hago P2-P1

subwf P2,W

btfsc STATUS,C ; Si C=0, resultado negativo (luego P1>P2)

return ; si no me salgo del subprograma: P1 no es máximo

movf P1,W ; Si P1>P2 ahora hago P0-P1

subwf P0,W

btfsc STATUS,C ; si C=0 resultado negativo (luego P0<P1 y P1 es máximo)

(8)

movf P1,W ; Si llego aquí, en P1 tengo un máximo local

movwf MAXIMO ; que almaceno en la posición MAXIMO

movf CUENTA_L,W ; Contabilizo el periodo desde el último máximo movwf PERIODO_L ; medido en periodos de muestreo

movf CUENTA_H,W ; que es de 200us

movwf PERIODO_H ; lo mismo con la parte alta

clrf CUENTA_L ; Reseteo el contador de conversiones

clrf CUENTA_H ; para la siguiente búsqueda de máximo

call Trata_MAX

call Trata_Periodo

return

;************************************************************************* ; Trata_MAX

;

; Calcula el valor de la amplitud en voltios y lo almacena en dos bytes ; BIN_ALTO - BIN_BAJO en diezmilésimas de voltio

;

; Se calcula: Umax = 0,0156 * MAXIMO - 2 (en V) ;

; Operamos en diezmilésimas de Voltio

;************************************************************************* Trata_MAX

movf MAXIMO,W ; Tengo en FACTOR1 el MAXIMO obtenido movwf FACTOR1

movlw d'156' ; Cargo en FACTOR2 el valor 156

movwf FACTOR2

call PRODUCTO ; Obtengo en BIN_ALTO & BIN_BAJO el resultado

; de la operación 156*MAXIMO (en diezmilésimas de V) ; le tengo que restar 20000 diezmilésimas

; d'20000' = 0x4E20

;operación de resta de 2 bytes: (BIN_ALTO & BIN_BAJO) - 0x4E20

movlw 0x20 ; Primero resto bytes bajos

subwf BIN_BAJO,F

btfss STATUS,C ; Si el carry está a 1 resta positiva

decf BIN_ALTO ; si era 0 era negativa y "debo una"

; que resto a la parte alta

movlw 0x4E ; Ahora resto bytes altos

subwf BIN_ALTO

(9)

call SACA_MAX ; Llamamos a subprograma que lo muestra

return

;************************************************************************* ; Trata_Periodo

;

; Calcula el valor del periodo y lo almacena en dos bytes en décimas de milisegundo ; el valor más alto almacenado en PERIODO_H - PERIODO_L sería de 500 (0x01F4) ;

; Periodo = (PERIODO_H - PERIODO_L) * 200us ;

; Operamos en diezmilésimas de segundo si multiplico por 2 el valor almacenado ;************************************************************************* Trata_Periodo

bcf STATUS,C ; Pongo a cero el carry

rlf PERIODO_L ; para a continuación, rotar a la izquierda

rlf PERIODO_H ; ambos bytes

call SACA_PERIODO ; Llamada al subprograma que lo muestra

return

;*************************************************************************** ; PRODUCTO

;

; Subprograma de multiplicación de dos bytes ;

; Recibe los valores en posiciones FACTOR1 y FACTOR2

; y entrega el resultado en dos bytes: BIN_ALTO & BIN_BAJO

;***************************************************************************

PRODUCTO

clrf BIN_ALTO ;Limpio el byte alto

clrf BIN_BAJO ;y el byte bajo también

movlw 0x8 ;Cargamos 8 en CONTADOR

movwf CONTADOR

movf FACTOR1,W ;Paso FACTOR1 a W para ir haciendo sumas

bcf STATUS,C ;Pongo a 0 el carry para empezar rotaciones

BUCLE rrf FACTOR2 ;Roto a dcha FACTOR2 para ver bit a la dcha

btfsc STATUS,C

addwf BIN_ALTO,F ;Si era 1 el bit le sumo FACTOR1 a parte alta ;es FACTOR1 00000000

;Al llegar aquí el carry tendrá el acarreo de la operación anterior suma o cero si saltó suma

rrf BIN_ALTO ;Roto en conjunto BIN_ALTO y BIN_BAJO

rrf BIN_BAJO ;Carry -> BIN_ALTO -> BIN_BAJO

(10)

goto BUCLE ;si no llegamos a 0 repetimos

return ;si ya llegamos a cero salimos

;****************************************************************** ; SACA_MAX

;

; Subprograma encargado de mostrar o enviar el valor del máximo ; en |BIN_ALTO|BIN_BAJO| se dispone de la amplitud expresada en ; diez milésimas de Voltio y en binario

; Se deja abierto el tema

;****************************************************************** SACA_MAX

; A COMPLETAR

return

;****************************************************************** ; SACA_PERIODO

;

; Subprograma encargado de mostrar o enviar el valor del periodo ; en |PERIOD_H|PERIODO_L| se dispone del periodo expresado en ; diez milésimas de segundo y en binario

; Se deja abierto el tema

;****************************************************************** SACA_PERIODO

; A COMPLETAR

return

(11)

Referencias

Documento similar

The 'On-boarding of users to Substance, Product, Organisation and Referentials (SPOR) data services' document must be considered the reference guidance, as this document includes the

In medicinal products containing more than one manufactured item (e.g., contraceptive having different strengths and fixed dose combination as part of the same medicinal

Products Management Services (PMS) - Implementation of International Organization for Standardization (ISO) standards for the identification of medicinal products (IDMP) in

Products Management Services (PMS) - Implementation of International Organization for Standardization (ISO) standards for the identification of medicinal products (IDMP) in

This section provides guidance with examples on encoding medicinal product packaging information, together with the relationship between Pack Size, Package Item (container)

El nuevo Decreto reforzaba el poder militar al asumir el Comandante General del Reino Tserclaes de Tilly todos los poderes –militar, político, económico y gubernativo–; ampliaba

De acuerdo con Harold Bloom en The Anxiety of Influence (1973), el Libro de buen amor reescribe (y modifica) el Pamphihis, pero el Pamphilus era también una reescritura y

E Clamades andaua sienpre sobre el caua- 11o de madera, y en poco tienpo fue tan lexos, que el no sabia en donde estaña; pero el tomo muy gran esfuergo en si, y pensó yendo assi