Los pines de salida PIC12F funcionan de manera diferente a la programada

3

Estoy tratando de manejar un registro de desplazamiento usando un PIC12F683 , así que escribí esto código para una prueba simple:

#include <pic.h>
#include <pic12f683.h>

#define _XTAL_FREQ 4000000

// GP0 -> data
// GP1 -> latch
// GP2 -> clock

void clear_shift_register() {
    GPIObits.GP1 = 0;
    GPIObits.GP0 = 0;

    GPIObits.GP2 = 1;
    GPIObits.GP2 = 0;
    GPIObits.GP2 = 1;
    GPIObits.GP2 = 0;
    GPIObits.GP2 = 1;
    GPIObits.GP2 = 0;
    GPIObits.GP2 = 1;
    GPIObits.GP2 = 0;
    GPIObits.GP2 = 1;
    GPIObits.GP2 = 0;
    GPIObits.GP2 = 1;
    GPIObits.GP2 = 0;
    GPIObits.GP2 = 1;
    GPIObits.GP2 = 0;
    GPIObits.GP2 = 1;
    GPIObits.GP2 = 0;

    GPIObits.GP1 = 1;
}

void main(void) {
    TRISIO = 0x00;
    clear_shift_register();

    while(1) {
        GPIObits.GP1 = 0;

        GPIObits.GP0 = 1;
        GPIObits.GP2 = 0;
        GPIObits.GP2 = 1;
        GPIObits.GP0 = 0;

        //GPIObits.GP0 = 1;
        GPIObits.GP2 = 0;
        GPIObits.GP2 = 1;
        GPIObits.GP0 = 0;

        GPIObits.GP0 = 1;
        GPIObits.GP2 = 0;
        GPIObits.GP2 = 1;
        GPIObits.GP0 = 0;

        //GPIObits.GP0 = 1;
        GPIObits.GP2 = 0;
        GPIObits.GP2 = 1;
        GPIObits.GP0 = 0;

        GPIObits.GP1 = 1;

        __delay_ms(500);
    }
}

Cuando programé el PIC y lo encendí, no pasó nada. Así que decidí conectar algunos LED directamente a los pines del PIC para saber qué estaba haciendo:

  • GP0 está APAGADO todo el tiempo
  • GP1 está ENCENDIDO todo el tiempo, pero periódicamente hace un parpadeo de una sola vez muy rápido
  • GP2 está APAGADO todo el tiempo

¿Por qué obtengo estos resultados extraños y cómo corregirlos?

    
pregunta Nathan Campos

2 respuestas

2

Primero, lo segundo La observación de Leon: NUNCA use los pines de salida directamente, SIEMPRE use un registro sombra (a menos que cuando sepa qué está haciendo, piense en el nivel de Olin). Para obtener una explicación del problema de lectura-modificación-escritura, consulte mi respuesta en Interconectando un teclado con un microcontrolador

Segundo, ¿qué esperas? Los cambios que realice en los pines de E / S no tienen retraso, por lo que incluso si aparecen en los pines, necesitará un osciloscopio configurado en el rango de MHz para ver cualquier cosa, los LED serán demasiado lentos (y su ojo incluso más lento).

    
respondido por el Wouter van Ooijen
4

Se parece al problema de lectura-modificación-escritura (vea la hoja de datos). Use un registro en la sombra, manipule los bits en eso y escríbalo en el puerto, en lugar de manipular directamente los bits del puerto.

    
respondido por el Leon Heller

Lea otras preguntas en las etiquetas