6 votos

¿Cómo manipular correctamente los pines de entrada/salida de los chips PIC?

Aprendí un concepto que al cambiar el valor de bit del pin de E/S de un PIC, la PC primero leería el valor del puerto de E/S, cambiaría el valor y escribiría el valor cambiado en el registro.

Validé este argumento usando este circuito:

introducir descripción de la imagen aquí

El código que escribí en mikroC para PIC:

void main() {
     TRISB = 0;
     PORTB.F0 = 1;
     PORTB.F1 = 1;

     while(1) ;
}

Aprendí que debido a que el LED D1 solo necesita 0.7 V, el voltaje de RB0 es de aproximadamente 0.7V. Cuando mi programa establece RB1 en 1, el PIC primero lee el valor del puerto B, obtiene 0000 0000. Y dado que RB0 está en 0.7V, se interpreta como bajo. Entonces después de cambiar el valor (establecer puerto B como 0000 0010), solo se enciende D2.

Así que conecté resistencias entre el LED y los pines de E/S, y cambié el código:

void main() {
     TRISB = 0;
     PORTB.F0 = 1;
     Delay_ms(500);
     PORTB.F1 = 1;

     while(1) ;
}

Al comienzo de la simulación, el circuito actuaba como yo esperaba, el voltaje de RB0 era de 4.5V.

introducir descripción de la imagen aquí

Sin embargo, después del retraso de 500ms, solo se enciende D2. Me parece extraño, pensé que D1 y D2 estarían encendidos al mismo tiempo. (La lectura debería obtener 0000 0001, entonces después de cambiar, el puerto B debería ser 0000 0011)

introducir descripción de la imagen aquí

4voto

Rob Lachlan Puntos 7880

Los PIC tienen la molesta trampa de tener ANSEL configurado por defecto en cero, lo que significa que los puertos que pueden actuar como entradas analógicas lo hacen por defecto. Esto obligará a las lecturas digitales a ser cero (ver el diagrama de puerto a continuación tomado de la hoja de datos del PIC16F833 para entender por qué), y probablemente por eso se borra RB0 al establecer RB1 con una operación de Leer-Modificar-Escribir.

introducir descripción de la imagen aquí

En el programa principal, borre ANSEL antes de acceder a PORTB e intente de nuevo.

Por cierto, por lo general, los LEDs suelen tener una caída de tensión de más de 0.7V, ~2V es común, por lo que es posible que el primer experimento tuviera éxito por la misma razón por la que falló el segundo.

2voto

minusSeven Puntos 118

Espera un momento. ¿No son RB0 y RB1 salidas TTL? Si se ponen en alto y solo miden 0.7 voltios, entonces estás sacando demasiada corriente de ellos y posiblemente dañando los controladores de salida.

Un escaneo rápido de las especificaciones muestra que RB0/RB1 tienen una salida máxima de 25mA. A 100 ohmios (asumiendo que la caída del diodo es de 0.6V), intentarás obtener 4.4V/100 = 44mA. ¡Ay! Intenta cambiar los 100 ohmios a 375 ohmios o más. Es posible que ya hayas dañado permanentemente los controladores, por lo que quizás necesites pasar a RB2 y RB3.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X