No se pueden modificar las variables globales en interrupción, a pesar de haberlas declarado volátiles

2

Parece que no puedo cambiar mis variables globales (baja, alta) dentro de mi interrupción, a pesar de haberlas declarado volátiles. A continuación se muestra mi código.

Me parece extraño que pueda modificar mi variable global 'cambiar' pero las modificaciones a 'bajo' y 'alto' no parecen funcionar. Estoy seguro de que mi interrupción se está completando, ya que el texto se está reimprimiendo en la pantalla LCD, solo que los números no se están modificando.

Marqué las ubicaciones más relevantes con "AQUÍ", donde creo que el problema es más probable. También probé si es solo porque el giro de la variable siempre es 0 al agregar un código al final del ISR para ver si las variables globales cambian o no. Ellos no

#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include "lcd.h"
int state;
volatile int low; //HERE
volatile int high;
char scount[5];
char snum[5];
char mode;
volatile char change=0;//HERE
int main()
{
    char b_high;
    char b_low;
    DDRD=0xf0;
    DDRB=0b00000011;
    PORTD |= 0b00001000; 
    PORTC |= (1 << PC1);
    PORTC |= (1 << PC2);
    PORTB |= 0b00100000;
    PCICR=0b00000010;
    PCMSK1=0b00000110;
    sei();
    init_lcd();
    writecommand(0x01);
    moveto(0x80);
    stringout("Low:    ");
    stringout("High:    ");
    moveto(0xc0);
    stringout("Change:high");
    int low=70;
    int high=85;
    moveto(0x84);
    itoa(low, scount, 10);
    stringout(scount);
    moveto(0x8d);
    itoa(high, scount, 10);
    stringout(scount);
    while(1){
        b_high = PIND & 0b00001000; 
        b_low = PINB & 0b00100000;
        if(!b_high)
        {
            moveto(0xc7);
            stringout("high");
            mode=0;
        }
        if(!b_low)
        {
            moveto(0xc7);
            stringout("low ");
            mode=1;
        }
        if(change)//HERE
        {
            if(mode)
            {
                //low+=turn;
                itoa(low, snum, 10);//HERE
                moveto(0x84);
                stringout("   ");
                moveto(0x84);
                stringout(snum);
            }
            else
            {
                //high+=turn;
                itoa(high, snum, 10);//HERE
                moveto(0x8d);
                stringout("   ");
                moveto(0x8d);
                stringout(snum);
            }
            change=0;
        }
    }
    return 1;
}
ISR(PCINT1_vect)
{
    int turn=0;
    int pstate=state;
    int bitA = PINC & 0b00000010;
    int bitB = PINC & 0b00000100;
    bitA=bitA>>1;        
    bitB=bitB>>1;
    state=bitA+bitB;
    if((pstate==0&&state==1)||(pstate==1&&state==3)||(pstate==3&&state==2)||(pstate==2&&state==0))
    {
        turn=1;
    }
    if((state==0&&pstate==1)||(state==1&&pstate==3)||(state==3&&pstate==2)||(state==2&&pstate==0))
    {
        turn =-1;
    }
    if(mode)
    {
        low+=turn;//HERE
    }
    else
    {
        high+=turn;//HERE
    }
    high++;//test code, high is still not modified in the main()
    change=1;//HERE
}
    
pregunta Noidontknow

1 respuesta

9

Has vuelto a declarar 'bajo' y 'alto' como variables separadas en tu función principal. Las variables globales no se mostrarán en main () si haces eso. Elimine las declaraciones duplicadas y vuelva a intentarlo.

    
respondido por el Adam Haun

Lea otras preguntas en las etiquetas