Forum: Compiler & IDEs Variable wird überschrieben


von Roland Röck (Gast)


Lesenswert?

Hallo,

ich kämpfe gerade mit meinen ? Anfängerproblemen ?
Der Wert einer Variablen kann über ein mit I2C verbundenes LCD oder die
UART ausgegeben werden - funktioniert soweit.

Die fragliche Variable ist ein Eintrag in einem Feld

volatile unsigned char Bg_ab_new[3];


Der Eintrag Bg_ab_new[2] - nur dieser Feld-Eintrag - macht Probleme.
Im main() wird initialisiert und im main() über das LCD ausgegeben.
Nicht 0, sondern 240 = 0xf0 erscheint!

Initialisiere ich nochmal weiter unten, z.B. vor
lcd_gotoxy(0, 0);   wird tatsächlich zunächst 0 ausgegeben.


int main(void)
{
        Bg_ab_new[0] = 0;
        Bg_ab_new[1] = 0;
        Bg_ab_new[2] = 0;

        ports_init();
        adc_init();
        uart_init();
        timer0_init();

        i2c_init();
        i2c_start(0x40);
        lcd_init(LCD_DISP_ON);
        lcd_clrscr();

        lcd_gotoxy(0, 0);
        lcd_puts("Steuerung");
        delay(1);

        lcd_gotoxy(0, 0);
        char str[6];
        lcd_puts(ltoa(Bg_ab_new[2], str, 10));

  sei();

  for (;;) {}             // loop forever
}


Im Folgenden wird die Variable über eine Timer-ISR ausgegeben:


INTERRUPT(SIG_OVERFLOW0)
// signal handler for Timer 0 overflow
{
  lcd_gotoxy(0, 1);
  char str[6];
  lcd_puts(ltoa(Bg_ab_new[2], str, 10));
}


und - wer ahnt es schon - Bg_ab_new[2] ist wieder einmal 0xf0
geworden!

Das Ergebnis ist das gleiche, egal ob ich über I2C/LCD oder über die
UART ausgebe.

Ich sollte noch erwähnen, daß an keiner weiteren Stelle im Programm auf
diese Variable zugegriffen wird.

Wem ist solches schon vorgekommen?

Grüsse
Roland

von Steffen Brüssel (Gast)


Lesenswert?

Ich hab ein ähnliches Problem.

Bei mir wird ein const uint8_t array beim schreiben in ein anderes
array auf 0 gesetzt. ich kann beeinflussen wieviele Elemente auf 0
gesetzt werden je nachdem wie viele Werte ich in das andere Array
schreibe.
Ist das bei dir der einzige Code? Mein programm ist schon mächtig voll
geworden. Evtl. haben wir beide ein Speicherleck.. irgendwo..

MfG

Steffen

von Steffen Brüssel (Gast)


Lesenswert?

Hi,

bei mir konnte ich das Problem grad lösen indem ich die betroffene
globale Variable als static deklariert hab.

Gruß

Steffen

von Richard (Gast)


Lesenswert?

My 2 cents:

GCC sieht dass die routine "SIG_OVERFLOW" nie aufgerufen wird und
"optimiert" die Variable als "nutzlos". Ich wuerde "aus Prinzip"
alle Variablen die mit Interrupt Routinen etwas zu tun haben als
"volatile" deklarieren.

Regards,
Richard
Cape Town

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.