Variable wird überschrieben

Gast #74723
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
Gast #74724
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
Gast #74726
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren