mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Vereinfachung?


Autor: Frank (Gast)
Datum:

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

Autor: Stefan L. (piwinger)
Datum:

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

Autor: Rahul Der trollige (rahul)
Datum:

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


Autor: Stefan (Gast)
Datum:

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

Autor: Jörg X. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mal an
...
switch kennung[i]:

case 1:
... 
break;

case 2:
...
break;

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

Autor: Stefan L. (piwinger)
Datum:

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


Autor: Rahul Der trollige (rahul)
Datum:

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

Autor: Frank (Gast)
Datum:

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


Autor: Rahul Der trollige (rahul)
Datum:

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

Autor: Frank (Gast)
Datum:

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

Autor: F. Kriewitz (freddy436)
Datum:

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

Autor: Stefan L. (piwinger)
Datum:

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

Autor: Rahul Der trollige (rahul)
Datum:

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

Autor: Falk (Gast)
Datum:

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

Autor: Stefan L. (piwinger)
Datum:

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

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.