Forum: Mikrocontroller und Digitale Elektronik Übergabe von Arrayeinträgen


von florian2840 (Gast)


Lesenswert?

Hallo,

ich hoffe jemand kann mir so kurz vor Weihnachten noch bei einem Problem 
helfen:)

Und zwar ist mein Ziel über ein Grafikdisplay die Slave-Adresse für I2C 
einstellen. Ich benutze den MSP430F5310. Diese muss als Hex-Wert ins 
passende Register eingetragen werden. Dabei handelt es sich eigentlich 
um 7 Bit.
1
char *slaveAdr_ausgabe[92] = { "08", "09", "0A", "0B", "0C", "0D", "0E", "0F",
2
    "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "1A", "1B",
3
    "1C", "1D", "1E", "1F", "20", "21", "22", "23", "24", "25", "26", "27",
4
    "28", "29", "2A", "2B", "2C", "2D", "2E", "2F", "30", "31", "32", "33",
5
    "34", "35", "36", "37", "38", "39", "3A", "3B", "3C", "3D", "3E", "3F",
6
    "40", "41", "42", "43", "44", "45", "46", "47", "48", "49", "4A", "4B",
7
    "4C", "4D", "4E", "4F", "50", "51", "52", "53", "54", "55", "56", "57",
8
    "58", "59", "5A", "5B", "5C", "5D", "5E", "5F", "60", "61", "62", "63"};

Allerdings habe ich hier schon probleme. Wenn das Array zu groß ist, 
also 128 Einträge hat, dann hab ich ein ganz seltsames Phänomen beim 
builden. Ich benutze Code Composer Studio und wenn ich auf debuggen 
gehe, compiliert er, aber ich bekomme den Resume-Butten nicht 
freigegeben. Nur der Pausen und Stopp Button sind da. Es entstehen 
keinerlei Fehlermeldungen.

In einer Methode will ich nun I2C mit der Slave Adresse initialisieren. 
Dazu habe ich ein zweites Array mit den passenden Hex-Werten. 
Kommentiere ich die zweite Zeile in meinem Code aus, kompiliert er ganz 
normal. Sonst bekomme ich den resume-Button nicht.
1
uint8_t slaveAdrer = slaveAdr_array1[array_index_receive];
2
    i2c_init(slaveAdrer, speicher_twi_receive[0], 1, 5, 5);

Das Array sieht so aus:
1
unsigned int slaveAdr_array1[128] = { 0x8, 0x9, 0xA, 0xB, 0xC, 0xD, 0xE, 0xF,
2
    0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B,
3
    0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
4
    0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, 0x30, 0x31, 0x32, 0x33,
5
    0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F,
6
    0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B,
7
    0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
8
    0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, 0x60, 0x61, 0x62, 0x63};

Ich wünsche euch schonmal ein frohes Fest und hoffe, dass mir jemand 
helfen kann.

von Juergen (Gast)


Lesenswert?

Hast du schonmal nachgerechnet, ob dein Speicher reicht?

von florian2840 (Gast)


Lesenswert?

Hab ich auch schon dran gedacht. Insgesamt habe ich ja 34 KB. Er zeigt 
mir beim kompilieren knapp 30 KB an. Mit einem etwas kleineren Array 
geht es, wenn ich es ein bisschen größer mache nicht mehr. Sollte er 
dann keine Fehlermeldung geben?

Was verbraucht so ein Array mit int-Werten?

128*16Bit= 2048 Bit = 256 Byte. Sollte doch eigentlich bei noch 
verbleibenden 4 KB ausreichen, oder übersehe ich was?

von Peter II (Gast)


Lesenswert?

florian2840 schrieb:
> 128*16Bit= 2048 Bit = 256 Byte. Sollte doch eigentlich bei noch
> verbleibenden 4 KB ausreichen, oder übersehe ich was?

hast du RAM oder Flash betrachtet? Beim Ram braucht man ja auch noch 
Platz für den Stack, diesen kann man nicht ablesen.

von jmp (Gast)


Lesenswert?

Hi,

warum brauchst Du dafür überhaupt ein Array?
So wie ich das sehe, sind die im Array hinterlegen Indices fortlaufend, 
also würde es reichen
1
slaveAdrer = array_index_receive + 8;
zu benutzen.
Ich vermute mal, dass das eigentliche Programm etwas anders aussieht, 
als das, was Du hier verrätst...

Weiters ist mir aufgefallen, dass Du slaveAdr_array1[128] mit nur 92 
Werten initialisierst, warum?

--jmp

von florian2840 (Gast)


Lesenswert?

Naja im Datenblatt steht Program Memory un dich korrigiere 32 KB. Also 
gibt es wirklich keine Fehlermeldung, wenn der Speicher voll ist?

von florian2840 (Gast)


Lesenswert?

Ja, das eigentliche Programm sieht anders aus nur viel zu lang, um 
dieses hier zu posten. Naja ich übergebe der Initialisierungsroutine den 
Wert aus dem Array, der vorher auf dem Display eingestellt wurde. Also 
ist da nichts fortlaufend.

Ja habe 92 Werte, weil es damit grad gepasst hat. Aber ich probiere das 
jetzt wirklich mal aus, ob der Programmspeicher einfach voll ist, indem 
ich einfach mal paar c dateien auskommentiere.

von ho ho ho (Gast)


Lesenswert?

char *slaveAdr_ausgabe[92]

das ist für mich ein array von Zeigern. Es liegt im RAM und benötigt 
92*2 Byte.



unsigned int slaveAdr_array1[128]

Das liegt auch im RAM, wird aber aus dem Flash initialisiert. Und genau 
da kann es haken. RAM zu klein? Initialisierung zu langsam, Watchdog 
schlägt zu?

Wie schon beschrieben, kannst du das erste Feld streichen. Die Werte 
sind fortlaufend.
Das zweite Feld kann mit sonst ins Flash geschickt werden. Oder 
beschreibst du es zur Laufzeit?

von ho ho ho (Gast)


Lesenswert?

const natürlich, sch... Android :-P

von Fabian O. (xfr)


Lesenswert?

Die beiden Arrays sind doch völlig überflüssig.

Das mit den Strings verbraucht 5 Byte pro Eintrag (zwei Zeichen + 
Stringendezeichen + zwei für den Zeiger). Das könnte man schon mal recht 
einfach auf drei Byte reduzieren, indem man als Typ nimmt:
1
char slaveAdr_ausgabe[3][92];
Wobei der Compiler die Anzahl der Einträge auch selber zählen kann:
1
char slaveAdr_ausgabe[3][];

Zahlen als Strings zu speichern ist aber ohnehin unnnötig, da Du diese 
Strings jederzeit (z.B. mit utoa() oder sprintf()) berechnen kannst:
1
char slaveAdr_str[3];
2
sprintf(slaveAdr_str, "%02X", slaveAdr[x]);

Schon mal ein Array gespart. Aber auch das zweite ist überflüssig, da es 
ja nur eine Reihe aufsteigender Zahlen beinhaltet. Die kann der 
Mikrocontroller sogar noch besser berechnen:
1
char slaveAdr_str[3];
2
unsigned int slaveAdr = x + 0x08;
3
sprintf(slaveAdr_str, "%02X", slaveAdr);

von florian2840 (Gast)


Lesenswert?

Ich würde ja gerne das erste Array streichen. Nur das Problem ist, dass 
meine Ausgabemethode am Display Char-Werte oder Strings erwartet. Der 
kann ich keine Hexwerte übergeben. Daher die beiden Arrays.

Nochmal zusammengefasst:

Meine Displayausgabemethode erwartet char oder String
Die Initialisierung des I2C Intwerte in Hexformat.

Meine Überlegung waren da die beiden Arrays. SIe verbrauchen nur 
unglaublich viel Speicherplatz. Gibt es da vll ne andere Möglichkeit?

Ne ich initialisiere schon beim Compilieren, nicht zur Laufzeit.

von florian2840 (Gast)


Lesenswert?

Ah perfekt Fabian O. Sowas hab ich gesucht und ist viel elleganter. Ja 
das stimmt, die Arrays verbrauchen viel zu viel Speicher. Werde ich 
nachher gleich mal umsetzen. Melde mich dann nochmal:) Erstmal ganz 
großen Dank!!

von ho ho ho (Gast)


Lesenswert?

Uuuups, ich würde die ersten Kapitel des Lehrbuchs noch einmal 
aufschalgen. :-(

von ho ho ho (Gast)


Lesenswert?

ho ho ho schrieb:
> Uuuups, ich würde die ersten Kapitel des Lehrbuchs noch einmal
> aufschalgen. :-(

Zu dem Kram:
meine Ausgabemethode am Display Char-Werte oder Strings erwartet. Der
kann ich keine Hexwerte übergeben.

von Fabian O. (xfr)


Lesenswert?

Weils mir gerade noch auffällt: Für 8-Bit-Werte ist der Datentyp 
unsigned char angemessener als unsigned int, denn letzterer braucht 
(mindestens) 16 Bit. Das würde bei dem Array die Hälfte an Speicher 
sparen. Wenn sich die Daten zur Laufzeit nicht ändern, gehört außerdem 
noch ein "const" dazu.

Falls im richtigen Programm in dem Array also doch keine fortlaufenden 
Werte stehen sollten, besser statt
1
unsigned int slaveAdr_array1[128] = {...}
das hier nehmen:
1
const unsigned char slaveAdr_array1[] = {...}

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

ho ho ho schrieb:
> meine Ausgabemethode am Display Char-Werte oder Strings erwartet. Der
> kann ich keine Hexwerte übergeben.

Andere Leute schreiben sich in dieser Situation eine kleine Funktion, 
die aus einem "Hexwert" einen String erzeugt.

Oder sie schauen in die Dokumentation ihres Compilers, ob es nicht 
möglicherweise in der C-Runtime-Library eine Funktion gibt, die genau 
das erledigt.

von ho ho ho (Gast)


Lesenswert?

Rufus Τ. Firefly schrieb:
> ho ho ho schrieb:
>> meine Ausgabemethode am Display Char-Werte oder Strings erwartet. Der
>> kann ich keine Hexwerte übergeben.
>
> Andere Leute schreiben sich in dieser Situation eine kleine Funktion,
> die aus einem "Hexwert" einen String erzeugt.

Man, man, man, du musst schon dem Faden folgen: Der Spruch war *nicht 
von mir, sondern vom TE*. Ich gab ihm den Tipp, in seinem Buch zu lesen.

Also mehr Ruhe zu den Feiertagen! ;-)

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

ho ho ho schrieb:
> Man, man, man, du musst schon dem Faden folgen:

Und Du musst zitieren lernen.

von florian2840 (Gast)


Lesenswert?

Ich danke euch allen. Es klappt wunderbar. Wünsche euch allen frohe 
Weihnachten:))))

von ho ho ho (Gast)


Lesenswert?

Rufus Τ. Firefly schrieb:
> Und Du musst zitieren lernen.

Probier das mal mit Android. Die schönen Scipts laufen damit nicht 
richtig. :-(

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.