desbordamiento de memoria PIC12F629

0

Soy nuevo en la programación de microcontroladores PIC. Estoy tratando de programar PIC12F629. Tengo un archivo hexadecimal (tamaño 518bytes). Cuando intento escribir usando PICkit2, muestra un desbordamiento de memoria. Aquí está mi código:

int main()
{
    TRISIO=0b00000111;
   // ANSEL=0b00000000;
    GPIObits.GP0=0;
    GPIObits.GP1=0;
    GPIObits.GP2=0;
    int count;
    while(1)
    {
        jmp1:
        if(GP4==1)
        {
            goto jmp1;
        }
        else
        {
            jmp2 :
            GP1=1;
            __delay_ms(10000);
            GP0=1;
            count=0;
            jmp3:
            if(GP5==1)
            {
                count=0;
                GP2=1;
                __delay_ms(40000);
                goto jmp5;
            }
            else
            {
                count++;
                __delay_ms(5000);
                if(count==60)
                {
                    GP1=0;
                    goto jmp5;

                }
                else
                {
                    goto jmp3;
                }
            }
            jmp5:
            GP0=0;
            GP2=0;
            jmp4:
            if(GP3==1)
            {
                goto jmp2;
            }
            else
            {
                if(GP4==1)
                {
                    goto jmp1;
                }
                else
                {
                    goto jmp4;
                }
            }
        }
    }

   return 0; 
}

Diagrama de flujo del comportamiento deseado:

    
pregunta Sonu

1 respuesta

1

Ok, luego de los comentarios, aquí hay un poco de código que compila ok, aproximadamente sigue lo que entiendo de tu diagrama de flujo, y que no usa goto 's.

Necesitará verificar la lógica, calcular e insertar la configuración correcta para el temporizador y realizar cualquier otro cambio que haya sido causado por mi mala interpretación de la lógica.

Puede ver que goto solo sirve para hacer que el flujo sea más difícil de entender. Entonces, comience por algo que se parece más a mi código que al suyo y creo que su "problema de memoria" desaparecerá. Sospecho que el compilador está / estaba intentando hacer algo inteligente con la lógica goto y terminó con alguna implementación recursiva o algo así.

Aquí está mi código. ¡Ten en cuenta que esto es solo un ejemplo!

void main()
{
    // assumptions:
    //    I/P1 is GP4
    //    I/P2 is GP5
    //    I/P3 is GP3
    //    O/P1 is GP1
    //    O/P2 is GP0
    //    O/P3 is GP2

    // set inputs/outputs
    TRISIO = 0b111000;

    // reset O/P1, O/P2 and O/P3
    GP1 = 0;
    GP0 = 0;
    GP2 = 0;

    // main loop
    while (1)
    {
        // wait until I/P1 is low
        while (GP4 == 1);

        // set O/P1 and O/P2 with delay
        GP1 = 1;            // O/P1
        __delay_ms(10000L);
        GP0 = 1;            // O/P2

        // start 5 minute timer
        // NB - you need to set the registers according to your clock speed etc.
        // I'm not going to do the whole thing for you, but this is the idea:
        OPTION_REGbits.T0CS = 0;
        OPTION_REGbits.PSA = 0;
        OPTION_REGbits.PS = 0b111;  // you choose the correct prescaler value
        TMR0 = 0;                   // zeroise the timer

        // wait until timer expires or I/P2 goes high
        // NB - the 9999 value is what you need to calculate
        // to get a 5 min timeout with your clock and prescaler
        // it may be necessary to do this differently if your
        // clock is too fast, so maybe a loop with a counter
        while (TMR0 < 99999 && GP5 == 0);

        // check what just happened ...
        if (GP5 == 1)
        {
            // IP/2 went high, set O/P3
            GP2 = 1;
            __delay_ms(40000L);
        }

        // in all cases, reset O/P1, O/P2 and O/P3
        GP1 = 0;
        GP0 = 0;
        GP2 = 0;

        // the bottom two decision boxes in your flowchart don't
        // make sense, but I have assumed some logic and coded below
        // so you can see the general way to avoid goto's

        // wait until I/P3 or I/P1 goes high
        while (GP3 == 0 || GP4 == 0);
    };
}
    
respondido por el Roger Rowland

Lea otras preguntas en las etiquetas