Hola tengo un problemilla que no se por donde coger, defino RB8 como entrada poniendo su TRISB a 1, la configuro como digital poniendo a cero AD1CPFG, pero cuando la pongo físicamente parece como si leyera siempre un cero, he implementado una función asociada a ese pin que por ejemplo cuando este !_RB8, aumente el duty de mi pwm, alimento el pic, compruebo que le llegan 3.3V a ese pin, y sin embargo veo como el led se va aumentado su brillo, es decir, hace lo que haría si estuviera a cero, pero ese pin lo tengo con una R puesto a VDD,he estado mirando y en el Datasheet no he visto nada que no se pueda configurar como entrada ni nada parecido,
Podría cambiar el pin, ya lo se, pero me gustaría saber el motivo, y también es porque tengo ya diseñada una placa con muchas pistas y me resultado complicado ahora cambiar el trazado de pistas, he revisado el código una y otra vez, pero no lo encuentro,..
Muchas gracias a toda la comunidad y un saludo....
#include <p24fj16ga002.h>
_CONFIG2(FNOSC_FRC & OSCIOFNC_ON)
_CONFIG1(FWDTEN_OFF & WINDIS_OFF & POSCMOD_NONE)
#define FCY 8000000UL
#include <libpic30.h>
void _ISRFAST _T2Interrupt( void)
{
_T2IF = 0; // clear interrupt flag
} //T3Interrupt
void main(void)
{
TRISB=0xFFF8; //B0-B2 salidas, resto entradas.
ODCA=0X0000;
ODCB=0X0000;
OC1CONbits.OCM=0;
OC2CONbits.OCM=0;
OC3CONbits.OCM=0;
OC1R=0X0000;
OC2R=0X0000;
OC3R=0X0000;
OC1RS=0X000; //ROJO
OC2RS=0X0000; //VERDE;
OC3RS=0X0000; //AZUL
OC1CONbits.OCTSEL=0;
OC2CONbits.OCTSEL=0;
OC2CONbits.OCTSEL=0;
OC1R=0X0000;
OC2R=0X0000;
OC3R=0X0000;
CLKDIVbits.RCDIV=0;
CLKDIVbits.DOZE=0;
OC1CONbits.OCM=6; //OC1 como pwm, pin por defecto desactivado;
//hay que configurar RPORx para definir OC1
OC2CONbits.OCM=6; //Idem arriba pero de distinta forma
OC3CONbits.OCM=6; //IDEM
T2CONbits.TON=0;
T2CONbits.T32=0; //QUE TIMER2 SEA DE 16 BITS UNICAMENTE
T2CONbits.TCKPS=0;
T2CONbits.TCS=0;
T2CONbits.TGATE=0;
TMR2=0X00;
PR2=0x9c40; //para conseguir periodo 100Hz, 9C40
IPC1bits.T2IP = 0x01; // Set Timer 2 Interrupt Priority Level
IFS0bits.T2IF = 0; // Clear Timer 2 Interrupt Flag
IEC0bits.T2IE = 1; // Enable Timer 2 interrupt
T2CONbits.TON = 1; // Start Timer
RPOR0bits.RP0R=18;
RPOR0bits.RP1R=19;
RPOR1bits.RP2R=20;
AD1PCFG=0XFFFF; //CONFIGURAR I/0 COMO DIGITALES
AD1CON1bits.ADON=0; //ADC OFF
__delay_ms(5000);
while (1)
{
if(!_RB7 & (OC1RS<0X9C77)) //MAS ROJO
OC1RS=0x0000;
if(!_RB8 & (OC1RS>0)) //------------AUNQUE ESTE A VDD FISICAMENTE REALIZA LO DE DENTRO DEL IF----------
OC1RS++;
if(!_RB6 & (OC2RS<0Xffff)) //MAS VERDE
OC2RS++;
if(!_RB5 & (OC2RS>0)) //MENOS VERDE
OC2RS--;
if(!_RB4 & (OC3RS < 0X9C77)) //MAS AZUL
OC3RS++;
if(!_RB3 & (OC3RS>0)) //MENOS AZUL
OC3RS--;
__delay_us(500);
} //WHILE
}//MAIN
Solo ocurre con RB8, el resto hacen lo que tienen que hacer...