Forum: Mikrocontroller und Digitale Elektronik Probleme mit Array in C


von elko (Gast)


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
1
FoundROM[numDev][i] = ROM_NO[i];
, gibt es keine Auffälligkeit. Nutze ich das array aber in der 
for-Schleife
1
    numDev=0;
2
    for (i = 0; i<8; i++)
3
            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

von Gast (Gast)


Lesenswert?

Mehr code bitte.

von gast (Gast)


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

von elko (Gast)


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:
1
//--------------------------------------------------------------------------
2
// Find all present devices.
3
// Return value  : number of present devices
4
//
5
unsigned char OWFindAll(){
6
  unsigned char numDev, rslt, i, j; 
7
8
  numDev=0;
9
  // reset search-state (no found roms)
10
  for (i = 0; i < NUM_OF_ROMCODES; i++)
11
    for (j = 0; j < 8; j++)
12
      FoundROM[i][j] = 0;
13
  
14
  // begin search
15
  rslt = OWFirst();
16
  if (!OWVerify()) rslt = OWVerify(); // Try to verify presence of ROM_NO; after 2 failed attempts resign
17
18
  while (rslt)
19
  {         
20
          numDev=0;
21
          for (i = 0; i<8; i++)  // Store found ROM-number of ROM_NO-buffer in FoundROM
22
      FoundROM[numDev][i] = ROM_NO[i];
23
    numDev++;
24
    rslt = OWNext();
25
    if (!OWVerify()) rslt = OWVerify();
26
  }
27
  return numDev;
28
}

Viele Grüße,
elko

von Marius W. (mw1987)


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

von Stefan S. (stefanst)


Lesenswert?

Okay, dann hier auch noch die Interrupt-Fkt...
1
static void T0_isr (void) interrupt 1
2
{
3
  TL0 = 0xC0;    // L-Register laden insgesamt: 0xF831
4
  TH0 = 0xA0;    // H-Register laden
5
  if (LED_BLINK)
6
  {
7
    if (LED_COUNT-- == 0)  // Zähler zurücksetzen
8
    {  LED_COUNT = 50;    // Schleifenzähler neu setzen
9
      OUTA ^= 0x10;    // LED umschalten
10
    }
11
  }
12
}

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...

von Gast (Gast)


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.

von (prx) A. K. (prx)


Lesenswert?

In
1
 while (rslt)
2
  {         
3
      numDev=0;
4
      for (i = 0; i<8; i++)
5
          FoundROM[numDev][i] = ROM_NO[i];
6
      numDev++;
7
      rslt = OWNext();
8
      if (!OWVerify()) rslt = OWVerify();
9
  }
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.

von (prx) A. K. (prx)


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.

von Stefan S. (stefanst)


Lesenswert?

Hier eine Einschränkung meines Problems:
Variante 1:
1
while(1){
2
  numDev=0;
3
  rslt = OWFirst() & OWVerify();
4
5
  while (rslt)
6
  {
7
    numDev++;
8
      rslt = OWNext() & OWVerify();
9
  }   
10
  var0=numDev;
11
12
}

Variante 2:
1
while(1){      
2
  numDev=0;
3
  if(OWFirst()){
4
    rslt=OWVerify();
5
    while (rslt)
6
    {
7
      numDev++;
8
        OWNext();
9
      rslt = OWVerify();
10
    }   
11
  }
12
13
}

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.

von Stefan S. (stefanst)


Angehängte Dateien:

Lesenswert?

jetzt aber: der Anhang...

von Stefan S. (stefanst)


Lesenswert?

Jaaaa? Es hat doch bestimmt jemand ne Idee ;-)

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.