www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Probleme mit Array in C


Autor: elko (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallöchen!
Und schon wieder hab ich ein Problem....
...was ziemlich unangenehm ist: Ich habe ein Array von unsigned char, in 
der Größenordnung array[16][8]. Wenn ich auf das array einfach zugreife
FoundROM[numDev][i] = ROM_NO[i];
, gibt es keine Auffälligkeit. Nutze ich das array aber in der 
for-Schleife
    numDev=0;
    for (i = 0; i<8; i++)
            FoundROM[numDev][i] = ROM_NO[i];
, so blinkt die LED an einem Timer-Ausgang des AN2131 viel zu schnell.
Fällt jemandem ein, an was das liegen könnte? Falls nicht, was für 
berüchtigte oder oft Vorkommende Probleme oder Fehler gibt es bei der 
Verwendung von (mehrdimensionalen) Arrays?

Viele Grüße,
elko

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mehr code bitte.

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
dann solltest du den zusammenhang erklären ...


es ist nicht ersichtlich was das array mit ROM , einem timerausgang und 
der LED zu tun hat

Autor: elko (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also: Das ist ein Ausschnitt aus einer Funktion, die aus einem 
Temperatursensor die in dessen ROM abgespeicherte Seriennummer auslesen 
soll und danach vom Puffer ROM_NO in den Speicher FoundROM ablegen soll.
Die LED ist an einen Ausgang des µC (nicht an den Temperatursensor) 
angeschlossen und wird durch auslösen des Timerinterrupts im µC ein- 
bzw. ausgeschaltet, wodurch sich ein Blinken ergibt.

Hier die komplette Funktion:
//--------------------------------------------------------------------------
// Find all present devices.
// Return value  : number of present devices
//
unsigned char OWFindAll(){
  unsigned char numDev, rslt, i, j; 

  numDev=0;
  // reset search-state (no found roms)
  for (i = 0; i < NUM_OF_ROMCODES; i++)
    for (j = 0; j < 8; j++)
      FoundROM[i][j] = 0;
  
  // begin search
  rslt = OWFirst();
  if (!OWVerify()) rslt = OWVerify(); // Try to verify presence of ROM_NO; after 2 failed attempts resign

  while (rslt)
  {         
          numDev=0;
          for (i = 0; i<8; i++)  // Store found ROM-number of ROM_NO-buffer in FoundROM
      FoundROM[numDev][i] = ROM_NO[i];
    numDev++;
    rslt = OWNext();
    if (!OWVerify()) rslt = OWVerify();
  }
  return numDev;
}

Viele Grüße,
elko

Autor: Marius Wensing (mw1987)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dir wird so niemand helfen können und wollen. Es wird immer noch nicht 
klar, was die LED mit dem Stück Code zu tun hat.

MfG
Marius

Autor: Stefan S. (stefanst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Okay, dann hier auch noch die Interrupt-Fkt...
static void T0_isr (void) interrupt 1
{
  TL0 = 0xC0;    // L-Register laden insgesamt: 0xF831
  TH0 = 0xA0;    // H-Register laden
  if (LED_BLINK)
  {
    if (LED_COUNT-- == 0)  // Zähler zurücksetzen
    {  LED_COUNT = 50;    // Schleifenzähler neu setzen
      OUTA ^= 0x10;    // LED umschalten
    }
  }
}

Jetzt kann ich höchstens noch das gesamte Programm posten ;-) (dagegen 
hab ich nichts ;-))

EDIT:
Was ich vergessen habe zu erwähnen: Eben die Tatsache, dass die 
Interrupt-Fkt. eigentlich nichts mit der "FindAll()" funktion zu tun 
hat, macht das ganze so komisch...

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist der Rest des Codes so geheim?
Die Einrückungen verwirren etwas.
Und zuletzt find ich es persönlicher entspannter wenn die geschweiften 
Klammern eingesetzt werden.

Reduzier deinen Code doch mal soweit bis das Problem noch auftritt und 
es ein Helfender bei sich compilieren kann.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In
 while (rslt)
  {         
      numDev=0;
      for (i = 0; i<8; i++)
          FoundROM[numDev][i] = ROM_NO[i];
      numDev++;
      rslt = OWNext();
      if (!OWVerify()) rslt = OWVerify();
  }
kann ja wohl nie was anderes als numdev=1 rauskommen, oder 0 wenn gleich 
abgewiesen.

Und wenn du das soweit repariert hast, dann fehlt der Test auf Überlauf 
von numDev.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eine Möglichkeit für die LED-Sache wäre, dass LED_COUNT durch 
irgendeinen falschen Index überschrieben wird. Das ist aus dem hier 
gezeigten Code aber nicht ersichtlich.

Dazu ist es nützlich, im Mapfile nachzusehen, was um LED_COUNT herum an 
Daten im RAM liegt.

Autor: Stefan S. (stefanst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier eine Einschränkung meines Problems:
Variante 1:
while(1){
  numDev=0;
  rslt = OWFirst() & OWVerify();

  while (rslt)
  {
    numDev++;
      rslt = OWNext() & OWVerify();
  }   
  var0=numDev;

}

Variante 2:
while(1){      
  numDev=0;
  if(OWFirst()){
    rslt=OWVerify();
    while (rslt)
    {
      numDev++;
        OWNext();
      rslt = OWVerify();
    }   
  }

}

Zur Erläuterung: OWNext() und OWFirst() liefern bei Erfolg "1", 
ansonsten "0" zurück. OWVerify() überprüft den Erfolg von den beiden 
Funktionen und liefert bei Bestätigung des Erfolges "1", ansonsten "0" 
zurück.
Obwohl beide Codes meiner Meinung nach das gleiche bewirken müssten und 
keinen Einfluss auf das Blinken der LED haben dürften, fängt bei 
Variante 1 die LED wie verrückt an zu blinken (DAS ist seltsam). Ich 
hoffe, das beschreibt mein Problem ganz gut ;-)

VG,
Stefan

PS: Im Anhang ist das komplette Programm.

Autor: Stefan S. (stefanst)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
jetzt aber: der Anhang...

Autor: Stefan S. (stefanst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jaaaa? Es hat doch bestimmt jemand ne Idee ;-)

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.