www.mikrocontroller.net

Forum: Compiler & IDEs Variable wird überschrieben


Autor: Roland Röck (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Steffen Brüssel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Steffen Brüssel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

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

Gruß

Steffen

Autor: Richard (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.