utilizando los comparadores analogicos del pic16f877a

10
ALGUN EJEMPLO UTILIZANDO COMPARADORES ANALOGICOS DEL 16F877A qluis123 09 de Noviembre de 2009, 18:28:32 Hola a todos....Estoy intentado utilizar los comparadores analógicos que tiene el pic 16f877A, logre utili- zar los del 16f628A sin embargo en el intento de utilizar los comparadores del 16f877A no obtengo re- sultado alguno... básicamente la principal diferencia que encontré entre usar los comparadores del 628A y el 877A son las siguientes: 1) El flag q indica q se ha realizado una interrupción por comparación En el 16f628A es el PIR1, CMIF......... En el 16f877A es el PIR2, CMIF 2) El registro del modulo de referencia de tensión En el 16f628A es VRCON......... En el 16f877A es el CVRCON A pesar de haber realizado estos cambios no logre utilizar dichos módulos... Quisiera que me indiquen si me olvide hacer algún cambio o mejor aun si tuviesen un ejemplo donde hayan utilizado los comparado- res analógicos del 16f877A.... Gracias por adelantado KALLITOS Respuesta #1: 09 de Noviembre de 2009, 21:18:36 Hola qluis123, te comento que el pic16F877A no cuenta con comparadores analógicos, lo que si tiene son ADC (Conversor Analógico Digital que podrías usarlos como comparadores analógicos), pero compa- radores tal como lo que posee el pic16F628 no. En el datasheet de cada pic encontraras las característi- cas del dispositivo que utilices. Saludos. Suky Respuesta #2: 10 de Noviembre de 2009, 00:07:56 » Cita de: KALLITOS en 09 de Noviembre de 2009, 21:18:36 Hola qluis123, te comento que el pic16F877A no cuenta con comparadores analógicos, lo que si tiene son ADC (Conversor Analógico Digital que podrías usarlos como comparadores ana- lógicos), pero comparadores tal como lo que posee el pic16F628 no. En el datasheet de cada pic encontraras las características del dispositivo que utilices. Saludos. Un Bug, los 877A si tienen comparadores analógicos! qluis123, las pruebas que has realizado es en simu- lación o en hardware real? qluis123 Respuesta #3 : 10 de Noviembre de 2009, 03:08:19 Suky, todas las pruebas las he hecho solo en simulación en el Proteus.... Kallitos, claro q he revisado el datasheet del 16f877A e hice lo q allí indica para activar la interrupción por comparación... pero no me sale, pienso q algo me esta faltando... en el programa active lo q indica el datasheet es decir: ---------------------------------------------------------- bsf INTCON,GIE ; Habilita en forma general las interrupciones bsf PIE1,CMIE ; habilita interrupción por comparador analógico bsf INTCON,PEIE ; Habilita interrupción x periféricos Luego al registro CMCON lo cargue con b'000010' ES DECIR... Del bit 0 al bit 2 -- '010' Para usar los 2 comparadores independientemente el bit 3 --- '0' Aunque en mi caso este bit creo q no interesa del bit 4 al bit 5 -- '00' Para que no inviertan los COUT1 ni COUT2 --------------------------------------------------------------------------------------- Alguien no tiene un ejemplo donde le funciona los comparadores?? ... de antemano gracias por la ayuda nuevamente Suky Respuesta #5: 11 de Noviembre de 2009, 23:35:48 Mira por aquí como se configura el proteus para simular comparadores, y si no funciona a probarlo en hard real para sacarte la duda rápidamente. Saludos!

Upload: armando-cajahuaringa

Post on 07-Aug-2015

1.165 views

Category:

Documents


1 download

DESCRIPTION

Ejemplo de uso el moculo comparador del pic16f877a

TRANSCRIPT

ALGUN EJEMPLO UTILIZANDO COMPARADORES ANALOGICOS DEL 16F877A qluis123 09 de Noviembre de 2009, 18:28:32

Hola a todos....Estoy intentado utilizar los comparadores analógicos que tiene el pic 16f877A, logre utili-

zar los del 16f628A sin embargo en el intento de utilizar los comparadores del 16f877A no obtengo re-

sultado alguno... básicamente la principal diferencia que encontré entre usar los comparadores del 628A

y el 877A son las siguientes:

1) El flag q indica q se ha realizado una interrupción por comparación

En el 16f628A es el PIR1, CMIF......... En el 16f877A es el PIR2, CMIF

2) El registro del modulo de referencia de tensión

En el 16f628A es VRCON......... En el 16f877A es el CVRCON

A pesar de haber realizado estos cambios no logre utilizar dichos módulos... Quisiera que me indiquen si

me olvide hacer algún cambio o mejor aun si tuviesen un ejemplo donde hayan utilizado los comparado-

res analógicos del 16f877A.... Gracias por adelantado

KALLITOS Respuesta #1: 09 de Noviembre de 2009, 21:18:36 Hola qluis123, te comento que el pic16F877A no cuenta con comparadores analógicos, lo que si tiene

son ADC (Conversor Analógico Digital que podrías usarlos como comparadores analógicos), pero compa-

radores tal como lo que posee el pic16F628 no. En el datasheet de cada pic encontraras las característi-

cas del dispositivo que utilices.

Saludos.

Suky Respuesta #2: 10 de Noviembre de 2009, 00:07:56 »

Cita de: KALLITOS en 09 de Noviembre de 2009, 21:18:36

Hola qluis123, te comento que el pic16F877A no cuenta con comparadores analógicos, lo que

si tiene son ADC (Conversor Analógico Digital que podrías usarlos como comparadores ana-

lógicos), pero comparadores tal como lo que posee el pic16F628 no. En el datasheet de cada

pic encontraras las características del dispositivo que utilices.

Saludos.

Un Bug, los 877A si tienen comparadores analógicos! qluis123, las pruebas que has realizado es en simu-

lación o en hardware real?

qluis123 Respuesta #3 : 10 de Noviembre de 2009, 03:08:19

Suky, todas las pruebas las he hecho solo en simulación en el Proteus.... Kallitos, claro q he revisado el

datasheet del 16f877A e hice lo q allí indica para activar la interrupción por comparación... pero no me

sale, pienso q algo me esta faltando... en el programa active lo q indica el datasheet es decir:

----------------------------------------------------------

bsf INTCON,GIE ; Habilita en forma general las interrupciones

bsf PIE1,CMIE ; habilita interrupción por comparador analógico

bsf INTCON,PEIE ; Habilita interrupción x periféricos

Luego al registro CMCON lo cargue con b'000010' ES DECIR...

Del bit 0 al bit 2 -- '010' Para usar los 2 comparadores independientemente

el bit 3 --- '0' Aunque en mi caso este bit creo q no interesa

del bit 4 al bit 5 -- '00' Para que no inviertan los COUT1 ni COUT2

---------------------------------------------------------------------------------------

Alguien no tiene un ejemplo donde le funciona los comparadores?? ... de antemano gracias por la ayuda

nuevamente

Suky Respuesta #5: 11 de Noviembre de 2009, 23:35:48 Mira por aquí como se configura el proteus para simular comparadores, y si no funciona a probarlo en

hard real para sacarte la duda rápidamente.

Saludos!

Entradas Comparadoras, MikroC y Proteus

bigluis Entradas Comparadoras, MikroC y Proteus 27 de Septiembre de 2009, 02:34:31

Hola amigos, este es un pequeño tutorial acerca de como utilizar las entradas comparadoras de los

microcontroladores de la familia 16 ya que aun lo logro hacerlo con la familia 18. Si alguien lo logra por

favor realice alguna respuesta.

Para ello escogeremos el PIC16F876A, una vez hecho esto damos doble clic sobre el dispositivo y en las

propiedades avanzadas (Advanced Properties) escogemos que el retardo de subida de los pines (Port Pin

Low-High Delay) sea igual a 1n, lo mismo hacemos para el retardo de bajada (Port Pin High-Low Delay).

Esto lo realizamos para que el simulador no asuma que el dispositivo es ideal y lograr activar las salidas

de los comparadores, ya que si el cambio de las entradas ocurre antes que Q2 las salidas no se activaran.

Luego escogemos el archivo .hex que utilizaremos en el PIC y la frecuencia con la que trabajará.

Codigo de Ejemplo

A continuación se muestra un código de ejemplo hecho en MikroC que utiliza las entradas comparado-

ras del PIC. El ejemplo siguiente es un medidor del ángulo de desfase entre 2 señales, útil para medir

factor de Potencia.

Código:

char signo,CMP,angulo; //Declaramos las variables que utilizaremos en el programa.

//CMP guarda las banderas de utilización del comparador.

// F0=No. de entradas a la interrupcion

// F1=Signo del Angulo de desfase

void interrupt(){

if(CMCON.C2OUT)if(!CMCON.C1OUT)CMP.F1=1,CMP.F0=0;//CMCON es el registro para

configurar los comp.

if(CMP.F0) angulo=TMR0,CMP.F0=0;//Los Bits C1OUT y C2OUT guardan el estado

de los comp.

else TMR0=0,CMP.F0=1;//Para salir de la rutina es neceasrio leer o escribir

estos bits

PIR2.CMIF=0;}//Borramos el Flag del comparador para salir de la Interrupcion

void main(){

OPTION_REG=0b000101; //Preescaler Timer0=1:64

INTCON=0b11000000; //Habilita interrupciones Globales y Perifericas

ADCON1 = 0B111; //Configura AN0..5 como digitales

CMCON= 0b110011; //Configura 2 comparadores con salidas RA5 y RA6

TRISA = 0b001111; //configura RA0..3 como In y RA4,5 como salidas

trisb=0; //Configura Puerto B como salidas

trisc=0;

PIE2.CMIE=1; //Habilita interrupcion Comparador

ciclo:

PORTB=angulo;

Delay_ms(1000); //Este es un retardo opcional para visualizar el valor en pantalla.

goto ciclo;

Aun estoy trabajando en el código por tal razón solo muestro este, que es un poco rustico pero creo que

debería ser suficiente como ejemplo.

Circuito Final

Para obtener el ángulo de desfase el valor mostrados en los display debe ser convertido a decimal,

luego se debe dividir entre 3 (lo que me da el valor en microsegundos) y luego multiplicarlo por 360 y

por 60 (la frecuencia de la red). Las entradas positivas de los comparadores están conectadas a fuentes

de voltaje de 10mV. El pin RA4 Necesita una resistencia de Pull-up debido a que es una salida de colec-

tor abierto. La resistencia debe ser configurada como digital en la propiedad model type.

Para visualizar las salidas de los comparadores se utilizan los pines RA5 y RA4.

Bigluis Respuesta #1: 27 de Septiembre de 2009, 20:14:10

Configuracion del Modulo Comparador

Para los que aun no dominan muy bien el tema de como utilizar las entradas comparadoras del PIC

voy a explicarlo un poco con ayuda del datashet. El modulo comparador contiene 2 comparadores analó-

gicos. Las entradas de los comparadores son multiplexadas con los pines de I/O RA0 a RA3, mientras las

salidas son multiplexadas en los pines RA4 y RA5. El voltaje de referencia interno también puede ser

una entrada para los comparadores (lo que nos ahorra pines de entrada).

El primer paso es configurar el registro CMCON que es el encargado de manipular el funcionamiento

de los comparadores. Este registro consta de los siguientes Bits:

R-0 R-0 R/W-0 R/W-0 R/W-0 R/W-0

R/W-0 R/W-0 C2OUT C1OUT C2INV C1INV CIS CM2 CM1 CM0

A continuación muestro la descripción de cada registro:

C2OUT: Bit de salida del comparador 2.

Cuando C2INV=0:

1=C2 Vin+ > C2 Vin-

0=C2 Vin+ < C2 Vin-

Cuando C2INV=1:

1=C2 Vin+ < C2 Vin-

0=C2 Vin+ > C2 Vin-

C1OUT: Bit de salida del comparador 1.

Cuando C1INV=0:

1=C1 Vin+ > C1 Vin-

0=C1 Vin+ < C1 Vin-

Cuando C1INV=1:

1=C1 Vin+ < C1 Vin-

0=C1 Vin+ > C1 Vin-

C2INV: Bit de Inversion del Comparador 2

1=Salida invertida de C2

0=Salina no invetida de C2

C2INV: Bit de Inversion del Comparador 2

1=Salida invertida de C2

0=Salina no invetida de C2

CIS: Bit del Switch de Entrada:

Cuando CM2:CM0=110:

1=C1 Vin- conectado a RA3/AN3

C2 Vin- conectado a RA2/AN2

0=C1 Vin- conectado a RA0/AN0

C2 Vin- conectado a RA1/AN1

CM2:CM0: Bits de los modos de comparador

Hay ocho modos de operación para los comparadores a como muestra la siguiente figura.

Interrupciones del Comparador

El flag de interrupcion del comarador es seteado siempre que haya un cambio en los valores de salida de

cualquier comparador. El Software no necesitara mantener informacion acerca del estado de los bits de

salida para determinar el cambio ocurrido. El bit CMIF (Registro PIR) es le flag del comparador. Este debe

ser Reseteado a cero. Ya que es posible escribir 1 a su registro, una interrupcion simulada podria ser

iniciada.

El bit CMIE (registro PIE) y los bits PEIE y GIE (registro INTCON) deben setearse para habilitar la inte-

rrupción. Si cualquiera de estos bits son limpiados, la interrupción no se habilitara

Citar

Nota: Si un cambio en CMCON (C1OUT o C2OUT) ocurre cuando una operación de

lectura esta siendo ejecutada (inicio del ciclo Q2), el CMIF podría no activarse.

En la Rutina de Interrupcion, el usuario puede limpiarla de la siguiente manera:

Cualquier lectura o escritura de CMCON finalizara la condicion de error.

Limpiar el bit CMIF.

La mayoría de estos datos fueron sacados del datasheet por si necesitan más información.

bigluis Respuesta #4: 10 de Octubre de 2009, 19:03:27 » Modulo de Voltaje de Referencia Interna

Esta compuesto por una escalera de 16-pasos que provee una voltaje de referencia seleccionable. Ade-

más su propósito primario es proveer una referencia a los comparadores. Un diagrama en bloque es mos-

trado en la siguiente figura. La escalera de resistores es segmentada para proveer dos rangos de palores

para CVref y tiene función de apagado para conservar potencia cuando la referencia no esta siendo usa-

da. El suministro del modulo puede ser provisto tanto por Vdd/Vss o un voltaje de referencia externo

multiplexado en RA2 y RA3.

Configuracion

El modulo es controlado por el registro CVRCON. El modulo provee dos rangos de salida de voltaje,

cada cual con 16 niveles distintos. El rango a ser usado es seleccionado por el bit CVRR. La diferencia

primaria entre los rangos es el tamaño de los pasos seleccionados por los bits de selección CVR3:CVR0.

La fuente de voltaje es seleccionada por el bit CVRRS. A continuación se muestra esto.

Lo anterior es sacado de la hoja de datos del PIC18F4550

Como mencione antes en proteus solo he logrado simular los PIC16, la diferencia en estos es que no

puedes seleccionar el voltaje de suministro para el modulo. En el PIC16F877 parece que hay un error ya

que al poner CMCON.CIS=0 las entradas de los comparadores serán AN0 y AN2 y no como menciona el

datasheet AN0 y AN1. y para CMCON.CIS=1 las entradas a los comparadores serán AN1 y AN3 y no co-

mo menciona el datasheet AN2 y AN3.

giff Respuesta #5: 08 de Febrero de 2010, 02:40:39

Informo que, por lo menos en la versión 7.6 de Proteus no pude hacer funcionar los comparadores

análogos para el pic18f2550. Intente lo típico (utilicé el compilador CCS 4.104): usar

setup_comparator en todos sus modos para el uC antes mencionado, también use #asm código

#endasm para embeber el código en lenguaje maquina pero tampoco, no hubo caso.

Después de resignarme probé usar setup_comparator() en la realidad y funciona perfectamente,

así que por lo menos, para este modelo (no sé que pase para el 18f4550); el proteus no simula bien el

modo comparador análogo.

AngelGris Respuesta #6: 08 de Febrero de 2010, 16:38:43 »

Bigluis, gracias por este hilo. Sabía usar los comparadores del 16F628 y como tengo el datasheet del

16F87X no sabía que las versiones A de dichos microcontroladores tuvieran comparadores. Así que ahora

estoy cambiando unos archivos.h (headers) que estaba haciendo para poder usar el C de Hitech de una

manera muy similar al C de CCS. En lo que respecta a como se configuraba un dispositivo

(setup_timer1(x) por ejemplo...)

zonomo Respuesta #7: 10 de Julio de 2012, 16:56:10 »

Hola!

He estado trabajando en un proyecto como el tuyo, es decir, obtener el ángulo de desfase entre dos

señales para calcular el factor de potencia, claro, usando solamente el pic. Estuve revisando tu código

para usarlo en un 18F4550, ya hice algunos cambios para que funcione en el 4550, pero me es complica-

do usar los comparadores para este pic, espero continúes con este proyecto, si hago algún avance se los

comunicaré

Módulo Comparador del 16F628A y cualquier otro PIC.

Usar el módulo comparador es simple, aunque algo confuso y con poca información en Internet. Debe-

mos tener a mano la Datasheet.

Uso el Compilador CCS.

Compara una tensión que se coloca en el pin AN0 o AN1 con una tensión de referencia, que puede ser

externa o interna. Aquí usaremos la interna.

Tensión de Referencia

Está en el capítulo 11 y se maneja con la variable VRCON que está en la dirección 0x9F. Esta variable no

está en el CCS, por lo que la definiremos con:

#byte VRCON = 0x9F // Puede ser cualquier nombre, pero uso el mismo de la variable. La dirección está

en la Datasheet, sección 11.

Luego definimos la variable:

// 76543210 // Estos son los números de bits

VRCON = 0b11101100; // Variable ya definida

// 7 1 VREN Voltaje de Referencia habilitada (1 = SI, 0 = NO)

// 6 1 VRON salida VREF habilitada (1 = Conecta la salida a RA2)

// 5 1 VRR Selecciona rango del voltaje de referencia (1 = "Low Range", 0 =

“High Range”)

// 4 0 No se usa (0)

// 3 1 VR3 )

// 2 1 VR2 ) Conjunto para voltaje de referencia

// 1 0 VR1 ) 1100 para 2.5 v en "Low Range"

// 0 0 VR0 )

Con los bits 0 a 3 se selecciona la tensión de referencia con las siguientes fórmulas:

Para VRR=1 (Bajo); Vref= VR/24*5. VR es un valor binario, por lo que se lo convierte a decimal y se

calcula. En www.arossini.com.ar hay un convertidor de datos que se puede bajar.

Para VRR=0 (Alto); Vref= (VR/32+0,25)*5

Las fórmulas están en la datasheet y aquí las puse para VDD=5 Volt

Para VRR=1 y 1100, Vref = 2,5 Volt

Registro de configuración

Está en el capítulo 10. Con este registro se setea el comparador. Es la variable CMCON y está en la direc-

ción 1F. Esta variable no está en el CCS, por lo que la definiremos con:

#byte CMCON = 0x1F // Puede ser cualquier nombre, pero uso el mismo de la variable. La dirección está

en la Datasheet, sección 10.

Luego definimos la variable:

// 76543210 // Estos son los números de bits

CMCON = 0b00110011;

// CMCON7 0 C2OUT Comparator Output 2 (Siempre 0, No se programan, se leen).

// CMCON6 0 C1OUT Comparator Output 1 (Siempre 0, No se programan, se leen).

// CMCON5 1 C2INV Salida directa Comparador 2, 1 Sin invertir, 0 invertida

// CMCON4 1 C1INV Salida directa Comparador 1, 1 Sin invertir, 0 invertida

// CMCON3 0 Comparador Input Switch no se usa en este caso de modo 011.

// CMCON2 ) 1 Ver detalles en Datasheet figura 10-1.

// CMCON1 ) 1 Modo 110 para 2 comparadores con dos salidas.

// CMCON0 ) 0

Los bits 6 y 7 siempre van en 0. Son las salidas de los dos comparadores, que nos indican el estado de la

comparación. Luego los usaremos.

Los bits 4 y 5 indican si la salida va invertida o no. Aquí están sin invertir.

Los bits 3 y 4 se usan solo en los casos 001 o 010.

Los bits 0, 1 y 2 son los que crean confusión. En la figura 10.1 del datasheet se muestran las configuraciones

posibles del comparador.

Pareciera que estas serían las más usadas. La nuestra es la 011. Se usan dos comparadores con una sola

tensión de referencia.

La entrada del comparador 1 es por AN0.

La entrada del comparador 2 es por AN1.

La tensión de referencia es interna según lo definimos y se aplica al pin RA2, según también lo definimos.

Pero esta conexión es solo interna, pues no se conecta nada a RA2. Nuestras conexiones son solo AN0 y

AN1. La línea que une los dos Vin+ es interna. El pin RA3 se puede definir y usar como digital.

Si usaran la configuración 101, sería para un solo comparador, conectando por AN1. La puesta a tierra

del C1 es interna, y los pines RA0 y RA3 se pueden definir y usar como digitales.

Las salidas o sea el resultado de la comparación, son por el registro de la variable CMCON7, de nombre

C2OUT y CMCON6, de nombre C1OUT. Están en las direcciones 0x1F.7 y 0x1F.6.

Como el CCS no las tiene en su listado, las definimos como:

#bit INDICADOR2 = 0x1F.7 // Salida del comparador 2

#bit INDICADOR1 = 0x1F.6 // Salida del comparador 1

Y ya que estamos en definiciones agregamos:

#bit LEDB7 = 0x06.7 // Pin RB7, está en la dirección 0x06.7

#bit LEDB6 = 0x06.6 // Pin RB6, está en la dirección 0x06.6

#bit LEDB0 = 0x06.0 // Pin RB0, está en la dirección 0x06.0

Estas 3 últimas no son necesarias para el CCS… es para practicar… nada más. Este es el programa propia-

mente dicho:

while (TRUE) {

delay_ms( 500 ); // Retardo de un segundo

LEDB7 = INDICADOR2; // Si la salida del comparador2 es 1, se prende el led

LEDB6 = INDICADOR1; // Si la salida del comparador1 es 1, se prende el led

LEDB0 = 1; // Este led está puesto solo para ver si el programa funciona;

prende

delay_ms( 500 ); // Retardo de un segundo

LEDB0 = 0; // Apaga

}

El programa completo está en www.arossini.com.ar, al igual que la simulación en Proteus.