Forum: Mikrocontroller und Digitale Elektronik Vereinfachung?


von Frank (Gast)


Lesenswert?

Hi,

ich möchte mehrere Komponenten am mein Mikrocontrollersystem über UART 
anbinden. Die Komponenten melden sich über eine ID an. Diese ID lege ich 
in einem Arrayfeld ab. Später kann ich mich durch drücken eines Tasters 
mit dem gewünschten Modell verbinden.

Im Moment mache ich das so:

if((Kennung[0] == 0))
{
   Kennung[0] = ID;

}

if(!(ID == Kennung[0]))
{
   Kennung[1] = ID;

}

if((!(ID == Kennung[0])) && (!(ID == Kennung[1])))
{
   Kennung[2] = ID;

}

usw.

Bei drei bis vier Komponenten auch nicht so das Problem. Wenn es aber 
mal 20 werden sollen, gibt das schon eine Menge Code und der Part frisst 
ganz schön viel Speicher.

Kann man das vielleicht irgendwie eleganter lösen?

von Stefan L. (piwinger)


Lesenswert?

Hi,

Vielleicht solltest du das mit einer einfachen While-Konstruktion 
erledigen :

i = 0;

while(Kennung[i]!=0)
  i++;
Kennung[i] = ID;

nur so eine Idee, aber sollte funktionieren

von Rahul D. (rahul)


Lesenswert?

Wäre es möglich etwas mehr über dein Protokoll zu erfahren?

>Im Moment mache ich das so:

>if((Kennung[0] == 0))
>{
>   Kennung[0] = ID;
>
>}
>
>if(!(ID == Kennung[0]))
>{
>   Kennung[1] = ID;
>
>}
>
>if((!(ID == Kennung[0])) && (!(ID == Kennung[1])))
>{
>   Kennung[2] = ID;
>
>}
>
>usw.

Soll man daran irgendein Schema erkennen können?

>i = 0;
>
>while(Kennung[i]!=0)
>{
>  i++;
>  Kennung[i] = ID;
>}

So würde ich das auch in etwa verstehen...


von Stefan (Gast)


Lesenswert?

So eine Aufgabe wird gerne mit verketteten Listen (linked lists) 
erledigt.
http://de.wikipedia.org/wiki/Liste_(Datenstruktur)
http://www.pronix.de/pronix-827.html

Es gibt dann Listenelemente (mit der ID ggf. weiteren Nutzdaten und 
einem Zeiger zum nächsten Listenelement) sowie Funktionen zum Anlegen, 
Löschen und Suchen eines Listenelements.

In Sonderformen werden doppelt verkettete Listen verwendet, die ausser 
dem nächsten Element auch auf das vorhergehende Element verweisen.

Manchmal gibt es in der Library der verwendeten Programmiersprache schon 
Unterschützung für solche Listen. Bei C++ wäre sicher sowas dabei, bei C 
für µC ist eher Selberschreiben angesagt.

von Jörg X. (Gast)


Lesenswert?

Mal an
1
...
2
switch kennung[i]:
3
4
case 1:
5
... 
6
break;
7
8
case 2:
9
...
10
break;
11
12
//etc....
gedacht?
das ganze in 'ne Schleife um alle IDs abzuarbeiten (bei den Cases NUR 
die eintragen, die es auch gibt). und dei switch -konstruktion unbedingt 
in einem buch nachschlagen :) die ist so wahrscheinlich nicht korrekt

von Stefan L. (piwinger)


Lesenswert?

> if((Kennung[0] == 0))
> {
>    Kennung[0] = ID;
>
> }
>
> if(!(ID == Kennung[0]))
> {
>    Kennung[1] = ID;
>
> }
>
> if((!(ID == Kennung[0])) && (!(ID == Kennung[1])))
> {
>    Kennung[2] = ID;
>
> }
>

Ich versuch das nochmal zu interpretieren :

Für mich sieh das so aus, dass versucht wird, die nächste freie ID zu 
finden.

>i = 0;
>
>while(Kennung[i]!=0)
>{
>  i++;
>  Kennung[i] = ID;
>}

Vorsicht ! hier würdest du dir auch alle ID's überschreiben, da das oben 
nicht gleich dem ist :

>i = 0;
>
>while(Kennung[i]!=0)
>  i++;
>Kennung[i] = ID;

Hier wird wirklich die nächste "freie ID" gesucht.


von Rahul D. (rahul)


Lesenswert?

>Für mich sieh das so aus, dass versucht wird, die nächste freie ID zu
>finden.

Das wird es sein...

>Vorsicht ! hier würdest du dir auch alle ID's überschreiben, da das oben
>nicht gleich dem ist :
Meine Raterei halt...

von Frank (Gast)


Lesenswert?

Hey, erst einmal Danke!

>Wäre es möglich etwas mehr über dein Protokoll zu erfahren?

Klar, also ich möchte möchte mehrere mikrocontrollerbasierte 
Geräte/Komponenten(Modellautos, Beleuchtung einer Eisenbahnanlage, 
LCD-Anzeigen usw.) mit Bluetooth ausstatten. Diese melden sich nach dem 
Einschalten an einen Controllpult, Terminal oder Fernbedienung an und 
vereinbaren eine zufällige ID.

Sobald diese ausgetauscht ist, wird das angemeldete Gerät auf diese ID 
gesetzt und wartet. Am Controllpult wird diese in einem Feld des Array's 
gespeichert. Nun möchte ich durch drücken eines Tasters durch die 
verschiedenen Komponenten zappen, also durch das Array um die 
entsprechenden Geräte zu steuern.

Diese Methode:

>i = 0;
>
>while(Kennung[i]!=0)
>{
>  i++;
>  Kennung[i] = ID;
>}

würde nicht funktionieren.

Diese Methode

>i = 0;
>
>while(Kennung[i]!=0)
>  i++;
>Kennung[i] = ID;

ist schon besser, jedoch reicht es ja nicht aus nur auf ungleich Null zu 
vergleichen. Wenn ich zwischendurch auf die ID wechsel, die schon 
abgespeichert ist, wird sie erneut in ein Feld geschrieben und ist somit 
doppelt vorhanden.

>Für mich sieh das so aus, dass versucht wird, die nächste freie ID zu
>finden.

Nicht nur, es soll die ausgehandelte ID, die noch nicht vorhanden ist in 
das nächste freie Feld geschrieben werden. Also keine doppelten 
Belegungen.


Gruß


von Rahul D. (rahul)


Lesenswert?

for(i=0;i<maxI;i++)
{
 if (Kennung[i]==ID)) break; // Schleife verlassen, wenn ID schon im 
Feld vorhanden ist
 if (Kennung[i]==0) // bei erstem Auftreten eines leeren Eintrages ID 
hinzufügen und Schleife verlassen
  {
   Kennung[i]=ID;
   break;
  }
}

von Frank (Gast)


Lesenswert?

Super! Danke,

so etwas hab ich gesucht. Ist es möglich in der for_Schleife ne doppelte 
Bedingung mit einzubringen?

Etwa wie

for(i=0; i<maxI && a==1; i++)

von F. K. (freddy436)


Lesenswert?

Frank wrote:
> so etwas hab ich gesucht. Ist es möglich in der for_Schleife ne doppelte
> Bedingung mit einzubringen?

ja ist es, macht man aber eher selten. Setze lieber in die Schleife noch 
ein if für die entsprechende Bedingung, falls die Schleife abgebrochen 
werden soll einfach "break;" aufrufen, damit verlässt man schleifen. 
Eventuell könnte auch "continue;" interessant sein (springt zum nächsten 
Schleifen Durchgang).

von Stefan L. (piwinger)


Lesenswert?

Mein alter C Pauker würde mich lünchen, wenn ich aus einer 
for/While-Schleife mit einem break; rausspringen würde ;)

von Rahul D. (rahul)


Lesenswert?

>Mein alter C Pauker würde mich lünchen, wenn ich aus einer
>for/While-Schleife mit einem break; rausspringen würde ;)

Niemand hat etwas von einem Schönheitspreis erwähnt, und dass es die 
einzig mögliche Lösung ist...

von Falk (Gast)


Lesenswert?

@Stefan Lücke

>Mein alter C Pauker würde mich lünchen, wenn ich aus einer
>for/While-Schleife mit einem break; rausspringen würde ;)

Warum? C ist ja nicht gerade das Parade beispiel für eine strukturierte, 
möglichst wasserdichte Programmiersprache.

MfG
Falk

von Stefan L. (piwinger)


Lesenswert?

Ich hab ja nicht gesagt, dass ich sowas nicht auch öfter mal nutze und 
teilweise sogar sinnvoll finde. Aber er war ein verfechter des, wie er 
immergesagt hat "sauberen und struktorierten" programmierens.

Naja ... er hat auch bis zum Schluss geglaubt, dass ich meine 
Struktugramme immer vorher gemacht hab =)

War auch Off-Topic, von daher : Sorry das ich jetzt hier sowas 
losgetreten hab.

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.