Puerto de salida PIC 24F no borrable

Estoy trabajando en un controlador VGA para un microcontrolador PIC 24F. Configuré todos los puertos B y C para SALIDA con TRISB = 0 y TRISC = 0. Después del alcance, noté que uno de mis pines siempre permanece alto después de configurarse solo una vez, mientras que los otros pines reaccionan correctamente.

Más específicamente, PORTCbits.RC3 = 0 y PORTCbits.RC3 = 1 funcionan perfectamente bien, PORTCbits.RC4 = 1 funciona pero permanece alto después del primer cambio y PORTCbits.RC4 = 0 no hace nada.

El procesador que estoy usando es un PIC 24FJ64GA004, si esto es relevante. Todos los puertos se configuran de la misma manera a través de los registros tris y se borran de antemano.

Lo siento si esta pregunta no es lo suficientemente general, es la primera vez que pregunto algo en este sitio.

Parece que ese pin específico en ese PIC específico está defectuoso. ¿Has probado a cambiarlo por otro del mismo tipo? ¿Es el problema reproducible allí?
¿Qué sucede si escribe en LATCbits en lugar de PORTCbits? No he usado PIC24 específicamente, pero esto parece un posible problema de lectura, modificación y escritura.
Ya intenté usar los bits LATC, pero eso no ayudó. Cambiar el pin probablemente ayudaría porque los otros pines parecen funcionar (aunque no los medí todos), pero la placa estaba presoldada con convertidores de señal y estos son los únicos pines disponibles, así que no puedo usar otros.
Ok ... no es la solución, pero aún así recomiendo encarecidamente que use los registros LAT al generar. Para eso están ahí. Mantiene la porción de lectura de lectura-modificación-escritura interna en el chip... más confiable.
Me refiero a reemplazar todo el PIC, no el pin. Solo para eliminar un defecto de hardware como causa raíz.
Gracias por leer, lo tendré en cuenta. Editar: @Mels Reemplazar el PIC no es posible en este momento, el tablero no lo hice yo mismo. Me pondré en contacto con ellos y les haré saber que puede haber problemas de hardware, pero la experiencia me ha enseñado que, en general, cuando algo anda mal como este, el problema está en el software, no en el hardware.
Muy cierto. Pero después de pasar muchas horas depurando S/W que no estaba roto en primer lugar, aprendí de la manera difícil a excluir problemas de H/W si es posible.
Tut: Si bien es recomendable usar el registro LAT en lugar del registro PORT, creo que es posible una descripción más precisa de por qué. Esto no puede ser un problema de lectura-modificación-escritura. Los registros LAT aún SON susceptibles a un problema de lectura-modificación-escritura si hay interrupciones o subprocesos preventivos. Por otro lado, el único peligro adicional de lectura, modificación y escritura asociado con un registro PORT sobre un registro LAT es cuando algo fuerza el voltaje del pin RC4 en contra de la voluntad del registro LAT e intenta modificar otro bit, pero en este caso, PORTCbits.RC4 = 0 aún establecería LATC4.
Problema similar en un PIC24FJ647GA002 en RB11. usando LATB=0x0000 como salida pero RB11 se mantiene en 1,3V cuando todo debería estar en 0.

Respuestas (2)

Le recomiendo que revise la hoja de datos y vea si hay alguna errata asociada con ese micro en particular.

Por lo que sé (en el pasado), el caso solía ser en el que tenía que leer/modificar/escribir y luego (en algunos casos) escribir dos veces en un puerto para asegurarme de que funcionaba.

Aparte de eso, ¿puede aislar el puerto para asegurarse de que nada más influya en ese pin del puerto? Si tiene una placa de desarrollo con NADA conectado a ese puerto, podría valer la pena intentar ejecutar el código allí y ver si está influenciado externamente o no.

Los pines PIC son 'multiusos' y pueden ser (predeterminados) asignados a USART OSC I2C, etc., etc... si no es eso, entonces a menudo la razón por la cual los bits del puerto de E/S se 'atascan' se debe a la carga en el pin ...

Sin embargo, el truco es reconocer que no tiene tiempo durante la línea visible de 640 píxeles de VGA para 'contar' o 'bucle' en absoluto... ¡y seguro que no tiene tiempo suficiente para 'golpear' un pin de E/S! !

Sin embargo, agregue un registro de desplazamiento externo (74HC166) y configúrelo para 'cargar' 1 byte a la vez desde 8 pines PIC i/o y será posible mostrar 80 FONT mapeados (8x8) caracteres ascii en cada una de las 48 líneas.

Registras el registro de turnos a 24 MHz (que está dentro de la mayoría de los límites de pantalla VGA) y ejecutas el PIC con un reloj de CPU (OSC/2) de 15 MHz (por lo que OSC es 30 MHz) y eso te da 'exactamente' 5 ciclos de CPU para actualizar los pines de E/S de byte.

5 ciclos de CPU significa que no hay que contar, llamar, devolver o cualquier otra pérdida de tiempo inútil. En su lugar, 'construimos' la tabla de fuentes de caracteres de 8x8 a partir de 'conjuntos' de 5 instrucciones que envían un byte a los pines de E/S y luego 'saltan' a la siguiente ubicación de fuente que necesita generar.

Entonces, cada entrada en la tabla de fuentes contiene 8 conjuntos de 5 instrucciones que 'emiten un byte' y luego 'encuentran el siguiente byte' ... específicamente: -

Cargue el byte literal en W, envíe el byte W al PUERTO (2)

Cargue la palabra W de Index++, agregue la palabra W a PCL (3)

Para 'controlar' esta secuencia, carga 80 registros de índice con los desplazamientos que llevan la ejecución de una ubicación de fuente a la siguiente. El último registro de índice contiene un desplazamiento que lo lleva al código de sincronización de línea, tiempo durante el cual debe cargar los registros de índice para que se emita la siguiente línea, es decir, modifique el contenido de los 80 registros de índice con 80 nuevos desplazamientos.

Dentro de una línea de caracteres, 'modificar los registros de índice' significa restablecer el PRIMERO para que 'apunte' al siguiente 'inicio de tabla de línea de fuente' (es decir, el siguiente escaneo 'línea hacia abajo en la fuente) - todos los demás saltos son ' relativo' así que sigue igual.

Si está mostrando fuentes de caracteres de 8x8, normalmente tendrá una "brecha" entre líneas de caracteres de 2 líneas de exploración de trama (por lo que 480 líneas de exploración mostrarán 48 líneas de texto de 80 caracteres) y 2 líneas es mucho tiempo para resolver el "relativo". compensaciones' para el siguiente conjunto de 80 caracteres.

Tenga en cuenta que esto es para texto en blanco y negro de un solo color == no puede hacer ni siquiera gráficos de mapa de bits de 'marco de alambre' en blanco y negro sin la ayuda de RAM externa (8kb no es suficiente espacio para almacenar todos los datos de mapa de bits, necesita en menos 640*480/8 = 38.400 bytes)