¿Por qué no puedo configurar IO digital de PIC16F628?

Quiero agradecerle por leer esta pregunta, tenga en cuenta que puede parecer una tontería, pero me ha estado preocupando durante un par de horas.

Estoy usando un PIC16F628. Todo lo que estoy tratando de hacer por ahora es encender un LED simple. He creado el siguiente código usando MikroC:

void main()
{
  TRISA=0x00;
  PORTA=0xFF;
}

Han simulado el siguiente circuito con Proteus:Esquema de Proteo

Soy consciente de que solo se encenderían 4 leds.

Cargué el código en el PIC y lo verifiqué usando PICkit2 (Software y programador).

He leído que el pin de programación (RB4/PGM) debe configurarse en bajo, lo cual he hecho.

El PIC está cableado en la placa de prueba y no enciende ningún LED. Ninguno de los pines (RA0,RA1,RA2,RA3) dan suficiente voltaje (dan alrededor de 0.3V).

1) Estoy alimentando el circuito con 5V.

2) Estoy usando los pines correctos.

3) Lo he reprogramado un par de veces, sin éxito.

4)MCLR está conectado a través de una resistencia a Vdd.

5) El pin PGM está conectado a GND (Vss)

6) Los LED están conectados de la manera correcta (incluso traté de girarlos en caso de que me hubiera equivocado).

7)He probado el cableado, no está interrumpido.

No funciona, y no sé qué hacer. ¿Podría alguien, por favor, explicar lo que he hecho mal?

Si no está utilizando resistencias en serie para los LED, es posible que haya frito los pines de salida cuando intentó encenderlos por primera vez. ¡No se tarda mucho!
No sé mikroc y sin todo su código es difícil saberlo, pero... ¿Ha configurado los bits de configuración de acuerdo con su hardware o incluso en absoluto?

Respuestas (4)

Es difícil saber qué está pasando sin mostrarnos su código completo y un esquema de su implementación física.

Sin embargo, esto es lo que puedes investigar:

  1. Debe agregar un bucle para siempre al final de su código. Es posible que su microcontrolador se apague después de una ejecución. Añadir al final a while(1)ofor(;;)

  2. Intente agregar el siguiente código a su inicialización (o cualquier formato que el encabezado de su microcontrolador defina estos registros)

ANSEL = 0; /* Configure analog pins as digital*/

CMCON = 7; /* Disable comparators*/

  1. No he usado controladores de microchip en MikroC, pero ¿estás seguro de que es TRISAy PORTAen lugar de TRISOy GPIO?

  2. Asegúrese de haber configurado correctamente el oscilador interno (INTOSC). Puede configurarlo configurando los bits 0-2 (FOSC2:FOSC0) del CONFIGregistro en 101o 100para INTOSC

Agregué un bucle while, desactivé los comparadores, pero ANSEL, ni ANSELH, no existen para esta PIC en particular. Para MikroC el comando correcto es TRISA y PORTA, probé TRIS0 y GIP0 y no entiende los comandos. Cambié el PIC en caso de que estuviera dañado y todavía no hay resultado.
Deshabilitar el perro guardián
El temporizador de vigilancia (WDT) ya está deshabilitado. El oscilador de alta velocidad (HS) está habilitado y la programación de bajo voltaje (LVP) está deshabilitada.
Tengo resistencias de 100 ohmios para LED y resistencias de 10K ohmios para MCLR. Supongo que está bien.
Podemos omitir las preocupaciones de los LED eliminando el dobladillo por completo y simplemente probando la salida de voltaje de estos canales.
Desarrollo interesante, accidentalmente hice que los pines 15 y 16 se tocaran (RA7/OSC1/CLKIN y RA6/OSC2/CLKOUT) por un breve momento (alrededor de un segundo) y los LED ahora están encendidos. ¿Alguien podría explicarme esto?
parece que el oscilador interno no está seleccionado...
@ morty1993 HS (oscilador de alta velocidad) no es el oscilador interno. ¿Tienes un oscilador de cristal externo configurado? De lo contrario, debe configurar el modo INTRC, no el modo HS.

Además de lo que dijo lancovici:

  • ¿Sus LED tienen resistencias en serie?
  • ¿Cuál es el valor de la palabra de configuración que usa?

Un primer paso podría ser que verifique la configuración de su hardware con un archivo .hex que sepa que funciona. Hay algunos (incluidos dos (con y sin cristal) para el 628) en mi antigua página de parpadeo: http://www.voti.nl/blink

Desafortunadamente no tengo un programador Wisp628. Pero la información aún podría ser útil, gracias.
Un archivo .hex es 100% independiente del programador. Puede usar cualquier programador que desee para transferir un archivo .hex a su chip PIC.

Su esquema muestra ahora cristal u otra fuente de reloj. Esto me lleva a suponer que tiene la intención de utilizar el oscilador interno.

Sin embargo , según su comentario sobre otra respuesta, dice que tiene los bits de configuración configurados para usar HSel modo. HS significa Oscilador/Resonador de Cristal de Alta Velocidad. Para que este modo funcione, necesita un cristal o resonador de 8 MHz a 20 MHz conectado a los pines OSCIN/OSCOUT. Como no tiene esto en su esquema (y supongo que no tiene esta configuración), entonces no tendrá una fuente de reloj para que su PIC se ejecute, y como tal, parecerá que no hace nada en absoluto.

Para el oscilador interno de 4 MHz, la opción correcta es INTRCsegún la página 95 de la hoja de datos .

Intente cambiar la configuración a esto y vea si comienza a funcionar como se esperaba.

TRISAy PORTAestán en diferentes bancos, según la hoja de datos , por lo que es necesario configurar el STATUSregistro correctamente antes de cada acceso.

De la "FIGURA 3-2: MAPA DE MEMORIA DE DATOS DEL PIC16F627 Y PIC16F628", PORTAestá en el banco 0 , mientras que TRISAestá en el banco 1 .