Variable wird überschrieben

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

Eine eigene Frage? Dieser Thread ist über 23 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.