Configure un pin PIC para entrada y salida

Estoy trabajando en un proyecto que utiliza un mcu PIC24FJ64GA002. Estoy trabajando en una función de comunicación en serie de bit-banged que usará un cable para enviar datos y luego cambiará al modo de recepción para recibir datos en el mismo pin. Se usará un pin separado para el reloj, que siempre estará controlado por una placa diferente (siempre una entrada). Me pregunto si hay alguna manera de configurar el pin para la operación de colector abierto que pueda usarse como entrada y salida o tengo que cambiar la configuración del pin cada vez que paso de leer a escribir.

Parece que desea que su PIC actúe como un dispositivo I2C esclavo. Tal vez los consejos de Massmind sobre ese tema puedan ser útiles. techref.massmind.org/techref/microchip/i2c.htm

Respuestas (2)

Cambie la configuración del pin cada vez. Es el registro TRIS el que controla si es de entrada (1) o de salida (0). Y, cuando cambia de dirección, debe esperar un momento (consulte la hoja de datos) como un ciclo o dos antes de usar ese pin. un par Nop(); lo hará bien

Y asegúrese de escribir en el registro LAT y leer del registro R.

por ejemplo, para el puerto D, pin 0.

//output
_TRISD0 = 0;
Nop();
Nop();
_LATD0 = 1;
_LATD0 = 0;


//input
_TRISD0 = 1;
Nop();
Nop();
int i = _RD0;

Si desea simular un colector abierto, escriba un cero en el registro del pestillo. Luego haces el resto con el registro TRIS. Cuando un cero va al bit TRIS, esto convertirá el bit en una salida y la línea se reducirá. Luego, si escribe un uno en el bit TRIS, la línea se convertirá en una entrada y el pull up hará que la línea suba, a menos que un dispositivo externo la esté bajando. La línea también estará en un estado de entrada en ese momento. Puede leer el puerto en cualquier momento y mostrará el estado del bus correcto porque cuando el bit TRIS es 0, el bus estará bajo y eso es lo que se leerá y si el bit TRIS está alto, será una entrada y luego lo que sea. en el autobús también se leerá.

Algunos pines también tienen la capacidad de habilitar un pullup débil en ellos y también puede habilitar la interrupción de cambio de pin en algunos de los pines.

//init
_LATA0 = 0;


//drive low
_TRISA0 = 0;

// let pull up bring pin high.
_TRISA0 = 1;

// read bit
in = _RA0;