Autor Tema: Comparador 1 en 16f886  (Leído 2080 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado QIQE

  • PIC18
  • ****
  • Mensajes: 335
Comparador 1 en 16f886
« en: 01 de Enero de 2015, 16:47:20 »
Hola buenas tardes y feliz año a todos, necesito utilizar el comparador 1 de este pic, lo tengo configurado, para utilizar la referencia interna a 2,5V, esto lo leo por el pin RA2 y esta correcto, aunque para poder leer el valor, debo configurar el pin RA2 como entrada, no se si esto es normal. Ese es uno de los problemas.

Después configuro en C1CH  un '01' que deberia tener la entrada -Vin del comparador direccionada en RA1, pero no funciona, debo introducir el valor analógico por RA0, y en ese momento, solo me funciona una vez el comparador, y solo si la entrada esta a 0 y pasa a uno, tanto el pin de salida RA4, puesto a pull-up con un diodo para visualizaro, y por RB4 que es una salida implementada por software, me pasa lo mismo, adjunto el programa por si me podéis echar una mano muchas gracias.


Código: [Seleccionar]

#include <stdio.h>
#include <stdlib.h>
#include <xc.h>
#include <htc.h>
#include <p18cxxx.h>
#include <eeprom_routines.h>



// CONFIG1
#pragma config FOSC = INTRC_NOCLKOUT// Oscillator Selection bits (INTOSCIO oscillator: I/O function on RA6/OSC2/CLKOUT pin, I/O function on RA7/OSC1/CLKIN)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled and can be enabled by SWDTEN bit of the WDTCON register)
#pragma config PWRTE = OFF      // Power-up Timer Enable bit (PWRT disabled)
#pragma config MCLRE = OFF      // RE3/MCLR pin function select bit (RE3/MCLR pin function is digital input, MCLR internally tied to VDD)
#pragma config CP = OFF         // Code Protection bit (Program memory code protection is disabled)
#pragma config CPD = OFF        // Data Code Protection bit (Data memory code protection is disabled)
#pragma config BOREN = ON       // Brown Out Reset Selection bits (BOR enabled)
#pragma config IESO = ON        // Internal External Switchover bit (Internal/External Switchover mode is enabled)
#pragma config FCMEN = ON       // Fail-Safe Clock Monitor Enabled bit (Fail-Safe Clock Monitor is enabled)
#pragma config LVP = OFF        // Low Voltage Programming Enable bit (RB3 pin has digital I/O, HV on MCLR must be used for programming)

// CONFIG2
#pragma config BOR4V = BOR21V   // Brown-out Reset Selection bit (Brown-out Reset set to 4.0V)
#pragma config WRT = OFF        // Flash Program Memory Self Write Enable bits (Write protection off)

#define _XTAL_FREQ 8000000

#define __delay_ms(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000.0)))

int main(int argc, char** argv)
    {
    OSCCON=0b11110111;
    OPTION_REG=0b00000000;

    TRISA  = 0b00001111;
    //         76543210
    ANSEL  = 0b00000011; //Entrada RA1 Como Analógica
    ANSELH = 0b00000110;
     //        76543210
    CM1CON0|=0b10100110;
     //        ||||||||__ C1CH0
     //        |||||||___ C1CH1
     //        ||||||____ C1R   ---> 1 Referencia interna, 0 Pin C1+IN
     //        |||||_____ XXX
     //        ||||______ C1POL ---> 1 Invierta la salida del comparador
     //        |||_______ C1OE  ---> 1 Actua sobre la salida C1OUT
     //        ||________ C1OUT ---> Inversión salida comparador
     //        |_________ C1ON  ---> 1=Habilita Comparador

    //      76543210
    VRCON=0b11101100;
    //      ||||||||__ VR 4Bits
    //      |||||||___ VRR=1 CVREF=         ((VR)/24)*VDD
    //      ||||||____ VRR=0 CVREF= Vdd/4 + ((VR)/32)*VDD
    //      |||||_____
    //      ||||______ VRSS ---> 0=Referencia desde VDD-VSS
    //      |||_______ VRR  ---> 1=Rango bajo
    //      ||________ VROE ---> 1=Voltage en RA2
    //      |_________ VREN ---> 1=Circuito de referencia ON
    CM1CON0bits.C1ON=1;

    while (1)
    {
        if (PIR2bits.C1IF!=0)
            {   //          76543210
            PORTB ^= 0b00000100;
            PIR2=0b00000000;
            }
    }
    return (EXIT_SUCCESS);
}


Muchas gracias por vuestro tiempo.

Saludos desde valencia!!!

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Comparador 1 en 16f886
« Respuesta #1 en: 01 de Enero de 2015, 19:38:36 »
Citar
#include <p18cxxx.h>

Cuando tenes un 16f886 ? No deberias incluir el pic16f886.h

El htc.h deberia estar incluido en el xc.h

Ahora si con lo demas.

El comparador 1 usa RA3/AN3/VREF+/C1IN+
El comparador 2 usa RA2/AN2/VREF-/CVREF/C2IN+

Citar
To use CxIN+ and CxIN- pins as analog inputs, the appropriate bits must be set in the ANSEL and ANSELH registers and the corresponding TRIS bits must also be set to disable the output drivers.
Citar
debo configurar el pin RA2 como entrada, no se si esto es normal. Ese es uno de los problemas.

Exactamente es asi, para que funcionen como eso, hay que seleccionarlas como entrada en el TRIS y como entradas analogicas. Por que estos pines no esta multiplexados con el PPS como en otros pics. Es decir no hay una desconexion completa del driver digital con el analogico, si lo pones como salida y hay un 0 presente en la salida ese 0 estaria entrando a la parte del comparador tambien.

Los cambios serian, esto independiente de que comparador uses:
Citar
Después configuro en C1CH  un '01' que deberia tener la entrada -Vin del comparador direccionada en RA1, pero no funciona
Pero pusiste "10" en CM1CON0.

01 = C12IN1- pin of C2 connects to C2VIN-

RA0/AN0/ULPWU/C12IN0-  -> 00
RA1/AN1/C12IN1-             -> 01
RB3/AN9/PGM/C12IN2-      -> 10
RB1/AN10/P1C/C12IN3-     -> 11

Luego tenes que ajustar CM2CON1
Poner a 1 C1RSEL: Comparator C1 Reference Select bit  asi usa la CVref
1 = CVREF routed to C1VREF input of Comparator C2

Entonces tendriamos las 2 entradas ya definidas, ahora se define el voltaje de referencia que ya lo hiciste.

Luego de todo eso habilitaria el comparador. (fijate que lo estas activando cuando le das un valor a CM1CON0 )
« Última modificación: 01 de Enero de 2015, 19:48:10 por KILLERJC »

Desconectado QIQE

  • PIC18
  • ****
  • Mensajes: 335
Re: Comparador 1 en 16f886
« Respuesta #2 en: 01 de Enero de 2015, 20:47:25 »
Hola, gracias por tu respuesta, pero como explico en mi anterior mensaje, la entrada positiva la obtengo del generador interno de Vref, y la muestro el valor por RA2 (solo me muestra la VREF interna si lo configuro como entrada) , para asegurarme por el momento de que es correcto.

La entrada que quiero utilizar es RA1, y solo he llegado a hacer funcionar RA0 con el valor 10 en C1Ch, y solo me funciona tras reiniciar la simulación en proteus, una sola vez luego se queda con el valor anterior, y solo si cambia de 0 a 5 V por así decirlo, luego no logro que vuelva a entrar.

He realizado las modifciaciones de los includes, y sigue igual.


Código: [Seleccionar]

#include <stdio.h>
#include <stdlib.h>
#include <xc.h>
#include <pic16f886.h>
#include <eeprom_routines.h>



// CONFIG1
#pragma config FOSC = INTRC_NOCLKOUT// Oscillator Selection bits (INTOSCIO oscillator: I/O function on RA6/OSC2/CLKOUT pin, I/O function on RA7/OSC1/CLKIN)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled and can be enabled by SWDTEN bit of the WDTCON register)
#pragma config PWRTE = OFF      // Power-up Timer Enable bit (PWRT disabled)
#pragma config MCLRE = OFF      // RE3/MCLR pin function select bit (RE3/MCLR pin function is digital input, MCLR internally tied to VDD)
#pragma config CP = OFF         // Code Protection bit (Program memory code protection is disabled)
#pragma config CPD = OFF        // Data Code Protection bit (Data memory code protection is disabled)
#pragma config BOREN = ON       // Brown Out Reset Selection bits (BOR enabled)
#pragma config IESO = ON        // Internal External Switchover bit (Internal/External Switchover mode is enabled)
#pragma config FCMEN = ON       // Fail-Safe Clock Monitor Enabled bit (Fail-Safe Clock Monitor is enabled)
#pragma config LVP = OFF        // Low Voltage Programming Enable bit (RB3 pin has digital I/O, HV on MCLR must be used for programming)

// CONFIG2
#pragma config BOR4V = BOR21V   // Brown-out Reset Selection bit (Brown-out Reset set to 4.0V)
#pragma config WRT = OFF        // Flash Program Memory Self Write Enable bits (Write protection off)

#define _XTAL_FREQ 8000000

#define __delay_ms(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000.0)))

int main(int argc, char** argv)
    {
    OSCCON=0b11110111;
    OPTION_REG=0b00000000;

    TRISA  = 0b00000111;
    //         76543210
    TRISB  = 0b00001011;
    //         76543210
    ANSEL  = 0b00000111; //Entrada RA1 Como Analógica
    ANSELH = 0b00000110;
     //        76543210
    CM1CON0|=0b00100110;
     //        ||||||||__ C1CH0
     //        |||||||___ C1CH1
     //        ||||||____ C1R   ---> 1 Referencia interna, 0 Pin C1+IN
     //        |||||_____ XXX
     //        ||||______ C1POL ---> 1 Invierta la salida del comparador
     //        |||_______ C1OE  ---> 1 Actua sobre la salida C1OUT
     //        ||________ C1OUT ---> Inversión salida comparador
     //        |_________ C1ON  ---> 1=Habilita Comparador

    //      76543210
    VRCON=0b11101100;
    //      ||||||||__ VR 4Bits
    //      |||||||___ VRR=1 CVREF=         ((VR)/24)*VDD
    //      ||||||____ VRR=0 CVREF= Vdd/4 + ((VR)/32)*VDD
    //      |||||_____
    //      ||||______ VRSS ---> 0=Referencia desde VDD-VSS
    //      |||_______ VRR  ---> 1=Rango bajo
    //      ||________ VROE ---> 1=Voltage en RA2
    //      |_________ VREN ---> 1=Circuito de referencia ON
    CM1CON0|=0b10000000;

    while (1)
    {
        if (PIR2bits.C1IF!=0)
            {   //          76543210
            PORTB ^= 0b00000100;
           
            }
        PIR2bits.C1IF=0;
        __delay_ms(300);
    }
    return (EXIT_SUCCESS);
}


Muchas gracias por vuestro tiempo.

Saludos desde valencia!!!

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Comparador 1 en 16f886
« Respuesta #3 en: 01 de Enero de 2015, 22:52:05 »
Citar
pero como explico en mi anterior mensaje, la entrada positiva la obtengo del generador interno de Vref
Para definirla como entrada al comparador tenes que hacer lo que dije aca:

Citar
Luego tenes que ajustar CM2CON1
Poner a 1 C1RSEL: Comparator C1 Reference Select bit  asi usa la CVref
1 = CVREF routed to C1VREF input of Comparator C2

Asi la entrada de referencia es la del voltaje de referencia que ves en RA2 y no 0.6 o 1.2V segun tenga el micro.

Citar
(solo me muestra la VREF interna si lo configuro como entrada
Es correcto por lo que ya explique

Citar
La entrada que quiero utilizar es RA1, y solo he llegado a hacer funcionar RA0 con el valor 10 en C1Ch, y solo me funciona tras reiniciar la simulación en proteus

En si es raro que te ocurra eso, pero siendo una simulacion no me sorprende, si pudieras probarlo en fisico seria mucho mejor.

Código: [Seleccionar]
   while (1)
    {
        if (PIR2bits.C1IF!=0)
            {   //          76543210
            PORTB ^= 0b00000100;
            PIR2bits.C1IF=0;            
            }
        __delay_ms(300);
    }
    }

Deja el C1IF=0 adentro de la condicion, mientras se cumple que sea mayor RB2 estaria cambiando de 1 a 0 en un intervalo de 300ms. Si no se cumple quedaria fijo en 1 o en 0 segun como quedo.

Y no tengo mas nada para decirte, realmente deberia funcionar, si estas seleccionando la entrada correcta, configurando todo para que sea entrada y aun asi no funciona puede ser la simulacion

Desconectado QIQE

  • PIC18
  • ****
  • Mensajes: 335
Re: Comparador 1 en 16f886
« Respuesta #4 en: 02 de Enero de 2015, 07:23:05 »
Al activar el bit de CM2CON1 ya ha empezado a funcionar todo correctamente muchas gracias, no hice caso de ese registro pensando que solo hacia referencia al comparador 2 muchas gracias
Muchas gracias por vuestro tiempo.

Saludos desde valencia!!!