Estoy tratando de hacer un simple contador binario utilizando un PIC12F629 (código a continuación), conduciendo los LED directamente desde los pines GPIO 0,1,2.
Estoy seguro de que debería ser un contador muy simple, pero como está escrito, no contará más allá de las 7, la octava vez que pasa por la función de demora, simplemente se reinicia.
Si configuro el contador delayMax a un número mucho más bajo (512, por ejemplo), funciona como se esperaba, contando hasta 15 (0x000F).
También funciona si configuro mi contador de bucle innerCtr en un número pequeño (como 3).
Mi instinto es que un contador o variable se está quedando sin bits o que la memoria se está llenando, pero soy nuevo en los PIC, así que simplemente no puedo averiguar dónde mirar
Todos los puntos de ruptura y la observación de variables que se me ocurren en el simulador no muestran nada realmente incorrecto: todos los valores de todas las variables parecen correctos, pero simplemente no funcionan.
Se comporta exactamente igual en el hardware, así que sé que no es un error del simulador.
Estoy usando MPLab X IDE en OSX, usando el compilador XC8.
Estoy seguro de que me estoy perdiendo algo realmente simple.
¿Alguien puede ver lo que he hecho mal?
/*
* File: pic12BinaryCounter.c
* Author: BungledB
*
* Created on March 18, 2018, 17:34
*
* Chip: 12F629I/O
*/
#include <stdio.h>
#include <stdlib.h>
// CONFIG
#pragma config FOSC = INTRCIO // Oscillator Selection bits (INTOSC oscillator: I/O function on GP4/OSC2/CLKOUT pin, I/O function on GP5/OSC1/CLKIN)
#pragma config WDTE = ON // Watchdog Timer Enable bit (WDT enabled)
#pragma config PWRTE = OFF // Power-Up Timer Enable bit (PWRT disabled)
#pragma config MCLRE = ON // GP3/MCLR pin function select (GP3/MCLR pin function is MCLR)
#pragma config BOREN = ON // Brown-out Detect Enable bit (BOD enabled)
#pragma config CP = OFF // Code Protection bit (Program Memory code protection is disabled)
#pragma config CPD = OFF // Data Code Protection bit (Data memory code protection is disabled)
#include <xc.h>
// Prototypes
void delay(void);
void init_ports(void);
// Globals
unsigned int delayMax = 2048;
int main(void) {
unsigned int clockCtr;
//Set the ports up
init_ports();
while (1)
{
for (clockCtr = 0; clockCtr < 16; clockCtr++)
{
GPIO = clockCtr;
delay ();
}
}
}
void delay(void)
{
unsigned int outerCtr,innerCtr;
for (outerCtr = 0; outerCtr < delayMax; outerCtr++)
{
for (innerCtr = 0; innerCtr < 8; innerCtr++);
}
}
void init_ports(void)
{
// Set all GPIOs to Outputs - although for this chip, 3 is always an input or mclr.
TRISIO = 0;
}