TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: joakinubeda en 05 de Agosto de 2009, 07:51:24
-
Hola! tengo el siguiente programa:
void main(void)
{
TRISAbits.TRISA1=1;//INPUT
TRISDbits.TRISD4=0;// OUTPUT
while(1)
{
if(PORTAbits.RA1 == 0)// si ese pin está a 0
{
PORTDbits.RD4 =0;
}
else //Ese pin se pondria a 1 cuando se conecta el conector usb, y por tanto en ese momento deberia ejecutar esta rama.
{
PORTDbits.RD4=1;
}
}
Mi objetivo con esto es que cuando el pin A1 detecte que le llega un 0 o 1 ( Por ejemplo en el PICDEM USB , RA1 esta definido como el USB_BUS_SENSE, que se pone a 1 cuando se conecta el conector usb, y a 0 cuando no esta conectado), se meta en una rama u otra. RD4 me sirve de testeo para ver si se introduce en una u otra.
De la forma que lo tengo puesta, no me funciona y no se por que.
Saludos y muchas gracias!
-
Hola!, ya he resuelto el problema . Debia configurar el registro ADCON1.
Ahora tengo una duda.por ejemplo,si uso un pin C3, que no es un pin analogico, ¿no puedo usar ese pin como entrada (TRISC3=1)???
Para poder usasr un pin como entrada (TRISXX=1) debe ser un pin analógico???
Gracias!
-
Siempre y cuando ese pin pueda comportarse como entrada digital, no tendrías que tener ningún problema en configurarlo como entrada y leer su estado digital.Tal vez ese pin esté asociado a algún módulo que está interifriendo con tus intenciones. Lee el datasheet y asegurate de que ese pin no este siendo utilizado o obstaculizado por otro modulo del uC.
-
Holaaa!!, como dije antes, resolvi el problema pero me he dado cuenta (mirando el datasheet) que en algunos pines de algunos puertos, que no son definidos como analógicos, sino digitales y ttl, no haria falta configurar ningun registro (tipo ADCON1) para configurarlos como entrada .Solo bastaria poner la sentencia TRISDbits.TRISD1= 1 (por ejemplo).
He probado a realizar eso con el siguiente codigo :
//Para pic18f4550
TRISDbits.TRISD7=1;//Definimos D7 como entrada (Ojoo en el pic18f4550 este pin no es analogico)!!
TRISCbits.TRISC6=0;//Definimos como salida, para testear en que rama se introduce.
while(1)
{
if(PORTDbits.RD7 == 0)//valor 0 en RD7
PORTCbits.RC6 =0;//PARA TESTEO;
if(PORTDbits.RD7 ==1)//Valor 1 (5v) en Rd7
PORTCbits.RC6 =1;//PARA TESTEO;
}
Sin embargo , no obtengo el comportamiento esperado. y cuando pongo 5v en RD7, RC6 vale 1, pero cuando los quito sigue Rc6 valiendo 1 ( cuando deberia valer 0)
Alguien sabe que se puede hacer para que funcione esto en los pines no definidos como analogicos ( ya que en los definidos como analogicos , he comprobado que esto funciona correctamente siempre que se configure bien el ADCON1 (Ver datasheet).
Yo creo que esto puede hacerse correctamente en estos pines , ya que en el datasheet pone que si pones el TRis = 1 debe poner ser definido como entrada (input)
Saludos y muchas gracias!
-
Cuando hablas de que le "quitas" los 5v, imagino que no dejarás el pin al aire, no? Sino que lo conectarás a 0V...