mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Array nach passenden Codes durchsuchen


Autor: TOM (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Zusammen,

ich möche mit einem MEGA128 ein Transponder System fernsteuertn bzw per 
MC steuern.
Ich habe mir folgendes gedacht.
Der MC soll das Transpondersystem selbständig abfragen nur ab und an für 
Testzwecke oder Änderungen verschiedener Variablen möchte ich das System 
auch per Commando per PC steuern.
Ich habe mir gedacht ich speichere alle Steuerbefehle in ein Array wird 
nun ein Steuerbefehl empfangen durchsucht er das Array nach diesem 
Befehl wenn er ihn findet führt er dann etwas bestimmtes aus.
Nur habe ich keinen Ansatz wie ich das Array am besten durchsuchen soll.
Eigenlich wollte ich zuerst die erste Spalte durchsuchen wird dann etwas 
passendes gefunden dann die gleiche Zeile jedoch die nächste Spalte 
stimmt dies dann nicht weiter die erste spalte durchsuchen usw.
Jedoch wie kann ich sowas programmieren?

Ich programmiere mit AVR Studio AVR GCC.

Gruss

TOM

Autor: F. Kriewitz (freddy436)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hmm, bin mir nicht sicher ob ich dich richtig verstanden habe.

Tuts eventuell ein switch(command) und dann eventuelle "sub" 
switch()'es?

Ein paar mehr Details über das Protokoll wären interessant.

Autor: Alexander Liebhold (lippi2000)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also du willst meinetwegen 5 Bewehle o.Kommandos in der 1.Spalte und 5 
Zeilen ablegen. Wird ein Kommando empfangen, so werden nacheinander alle 
Werte der 5 Zeilen in Spalte 1 verglichen. Enthält eine Zeile den Wert, 
soll ein anderes Kommando ausgeführt werden was dann in der gleichen 
Zeile eine Spalte weiter steht???

Hab lange kein C gemacht. Aber was du brauchst ist vielleicht so etwas:

int  A[6,6];                 //Array 6x6 Felder
int  Befehl;                 //Empfangener Befehl
int  i,j;                    //Zählvariablen

i=0;                    //Spalte auf Null wenn nichts gefunden wird
                       //steht dieser Wert immer noch auf Null
for(j=1;j=5;j++)
   {                     //Beginn in Spalte 0
    if( A[i,j]==Befehl;      //Befehl gefunden?
       then
           {for(i=1;i=5;i++) //Alle 5 Werte dieser Spalte werden durchl.
               {..........
                ..........
               }
           }
   }                         //nächste Spalte vergleichen

Ist das Programm beendet und i steht immer noch auf 0, so wurde kein 
Befehl gefunden.

Autor: Thomas S. (thomass)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ all,

bin leider erst heute wieder dazu gekommen etwas weiter zu machen.

@Alexander

Dein Vorschlag sieht zwar gut aus jedoch gibt es THEN in c nicht 
wahrscheinlich jedoch in c++.

Zu meinem Protokoll.

es werden 12 Hexwerte übertragen.

Nun stehen in einem Array ebenfalls Referenzwerte also 12 Werte und das 
ganze x Mal.

Nun soll der erste Hexwert mit der ersten Spalte des Arrays überprüft 
werden wird der gleiche Wert z.B. in der Zeile 6 gefunden soll die 
zweite Spalte dieser Reihe mit dem zweiten Hexwert verglichen werden 
wenn der auch stimmt die 3 Spalte mit dem 3 Hexwert usw bis zum 12 
Hexwert.
Ist jedoch ein Hexwert falsch soll die erste Spalte des Arrays nach dem 
1 Hexwert weiter durchsucht werden.

Wird ein passender Datensatz(12 Hexwerte) ermittelt soll etwas gemacht 
werden wenn nicht gibt es eine Fehlermeldung.

Danke schon mal


Thomas

Autor: TheMason (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@stricker

ich habe einen parser geschrieben, der allerdings nicht ganz einfach (zu 
verstehen) ist, aber dafür einiges an möglichkeiten bietet. leider ist 
der nicht für den avr geschrieben (problematik das zeiger nicht 
transparent auf RAM oder Flash zeigen können)
schau mal in der codesammlung unter "uShell - unvierseller Parser für 
uC's".
falls interesse besteht (und etwas wartezeit in keuf genommen wird :-) 
mache ich noch eine anpassung für die avr's.

das funktionsprinzip (so wie ich es deiner erklärung nach verstande 
habe) ist dort auch nochmal ausführlich erklärt

gruß
rene

Autor: F. Kriewitz (freddy436)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dann brauchst du im wesentlichen zwei verschachtelte Schleifen.
Die erste Schleife geht durch jede Zeile, die zweite vergleicht dann die 
jeweiligen spalten der Zeile.

Hier mal ein grobes Standrad C code Beispiel:
unsigned char array[rows][12]; // die "tabelle"
unsigned char data[12]; // die zu vergleichenden werte

int row, column;
unsigned char found = 0;
for(row=0; row < rows; ++row) // alle zeilen prüfen
{
  for(column=0; column < 12; ++column) // alle spalten prüfen
  {
    if(array[row][column] != data[column]) // werte stimmen nicht überein
    {
      break; // spalten schleife verlassen (mit der nächsten Zeile weitermachen)
    }
    else if(column == 11) // werte stimmen überein (else if) + letzte spalten
    {
      found = 1; // gefunden!
      break; // spalten schleife verlassen
    }
  }
  if(found) // wenn gefunden)
  {
    break; // Zeilen Schleifen verlassen
  }
}

Das array packst du aber am besten fest in den flash rein.

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.