Salidas del GPIO del 12f675

#1
Hola a todos,

Estoy intentando ver cómo cuenta el temporizador TMR0 del PIC12f675. Para ello, incremento una variable y saco algunos de sus bits por la E/S.

Curiosamente, pinchando las salidas del osciloscopio sólo en GP5 encuentro una señal cuadrada y de la frecuencia esperada. Las demás, GP4, GP2, GP1 y GP0 permanecen a 0 y pegan un impulso muy rápido a 1 de forma periódica (de corta duración, algunos µs). Diría que ese impulso salta a la frecuencia correcta, pero al ser demasiado rápido no lo he conseguido medir.

Creo que algo está pisando esos bits bajándolos a 0 tan pronto termina la interrupción pero ando completamente perdido :unsure:. ¿ Alguien tiene alguna sugerencia? El PIC no está dañado porque he programado uno nuevo y hace lo mismo.

Este es el código:
PHP:
#include <htc.h>

        volatile unsigned char cuenta = 0;

void interrupt  interr ()
{
if ( T0IF )
        {
        T0IF = 0;
        cuenta++;

        GP0 = cuenta >> 1;
        GP1 = cuenta >> 2;
        GP2 = cuenta >> 3;
        GP4 = cuenta >> 4;
        GP5 = cuenta >> 5;
        }
}

main ()
{
// salidas: 0 (GP0, GP1, GP2, GP4, GP5)
// entrada: 1 (GP3)
TRISIO = 0b001000;

// salidas inicializadas
GP0 = 0;
GP1 = 0;
GP2 = 0;
GP4 = 0;
GP5 = 0;

// configuración de TMR0 con:
// T0CS:   0 (reloj interno de cuenta)
// PSA:    0 (prescalado asignado a TMR0)
// PS:   111 (prescalado de 256)
OPTION_REG = 0b00111;

// habilitar interrupción de TMR0 y global
T0IE = 1;
GIE = 1;

while ( 1 )
        _nop ();
}
¡¡ Gracias!!
 
#2
Ya lo he solucionado.

Resulta que tanto el módulo A/D como el comparador por defecto están activados al arrancar. Faltaría por añadir en main() para inhabilitarlos:

PHP:
ADCON0 = 0x00;
ANSEL  = 0x00;
CMCON  = 0x07;
Con este cambio en todas las E/S se vislumbra una maravillosa señal cuadrada.

¡ Un saludo!
 
Arriba