variables PIC12F629 rebosantes de bucles anidados

1

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;
}
    
pregunta BungledB

1 respuesta

5

Como se comentó en los comentarios, estás golpeando el temporizador de vigilancia (WDT).

WDT se usa normalmente como una medida de último recurso para reiniciar los chips que se portan mal o se atascan. Normalmente, la causa del bloqueo es un error de software, pero en principio puede deberse a un evento aleatorio desafortunado (rayos cósmicos, inestabilidad causada por subtensión, etc.). El temporizador de vigilancia espera que lo borres periódicamente (básicamente, diciéndole "Estoy bien, no te preocupes" ). Hay una instrucción específica para realizar esta limpieza: CLRWDT, con la correspondiente llamada en lenguaje C (CLRWDT ()). Puede insertarlo dentro de su bucle principal para llamarlo regularmente. Si el WDT deja de funcionar sin CLRWDT, en algún momento se alcanza un tiempo de vencimiento establecido y WDT cree que algo malo le ha pasado a tu chip, por lo que se restablece.

En su caso, el WDT estaba encendido y su tiempo de caducidad se estableció en la configuración predeterminada para su chip (unos segundos). Dado que no llama a CLRWDT, en algún momento, el WDT se activó para restablecer su chip.

Solución

Por lo tanto, simplemente puede desactivar el WDT ( #pragma config WDTE = OFF ) o insertar CLRWDT en su ciclo while (1)... .

    
respondido por el anrieff

Lea otras preguntas en las etiquetas