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);
}