TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: QIQE 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.
#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);
}
-
#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+
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.
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:
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 )
-
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.
#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);
}
-
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:
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.
(solo me muestra la VREF interna si lo configuro como entrada
Es correcto por lo que ya explique
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.
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
-
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