Hallo zusammen, hoffe irgendwer hat eine Idee hierzu.
Empfangen werden ein ReihenByte sowie n SpaltenBytes. Die Anzahl der
SpaltenBytes ist abhängig von der Anzahl der gesetzten BITs im
ReihenByte.
Beispiel 1: ReihenByte = 0x01, SpaltenByte = 0x0A. Anhand der gegebenen
Matrix sollte nun der Wert 4 und 2 zurückgegeben werden.
Beispiel 2: ReihenByte = 0x0A, erstes SpaltenByte = 0x0A... liefert das
Ergebnis 28 und 26. Nun kommt ein 2tes SpaltenByte 0x0B... liefert die
Treffer 12, 10, 9.
Es können also mehrere Treffer in einer Reihe sein. Im Beispiel 2 wird
beim 2ten Durchlauf aus 0x0A = 0x02. Mit anderen Worten, im ersten
Durchlauf ist 0x0A = 0x08. Die Reihe wird also BITwise abgetastet.
Ich suche also nach einem Algorythmus, welcher die Werte anhand der
Tabelle zurückgibt.
Hoffe es kommt irgendwie rüber was gemeint ist, bekomme es nicht gelöst.
SpaltenByte
BIT: 7 6 5 4 3 2 1 0
___________________
7| 64 63 62 61 60 59 58 57
6| 56 55 54 53 52 51 50 49
5| 48 47 46 45 44 43 42 41
4| 40 39 38 37 36 35 34 33
Reihe 3| 32 31 30 29 28 27 26 25
2| 24 23 22 21 20 19 18 17
1| 16 15 14 13 12 11 10 9
0| 8 7 6 5 4 3 2 1
Danke für die schnelle Antwort, ich fürchte das meine C Kenntnisse hier
nicht ausreichen. Ich verwende den SDCC, läßt sich das Ganze als
einzelne Funktion bauen wie z.B.
1
voiddecode(uint8_tRowByte,uint8_tColumnByte){
2
3
Algorythmus;
4
display_Ausgabe(Treffer);
5
6
}
Der Code von Dir ist arg... jedenfalls für mich (Anfänger). Kannst Du
mir den ein bischen erläutern ?
Mein Code sieht derzeit so aus... hat aber einen Schönheitsfehler
(funktioniert noch nicht ganz.
int main(int argc, char* argv[])
Ich versteh das nicht, wie sieht das in einer funktion aus ?, wie
gesagt, nicht GCC, SDCC.
for(int m=0; m<64; m++)
Selbst sowas geht nicht... gut, m kann ich mir auch vorher anlegen.
Nicht böse sein aber ich kapiers mit deiner Syntax nicht.
Die Berechnung erfolgt jeweils nur in den Schleifen.
Das
1
z=0xff;// Zeilenbitmuster
2
s=0x55;// Spaltenbitmuster
dient nur zur Eingabe der Spalten und Reihen.
1. Idee
Die Zeilen werden in der äusseren Schleife druchlaufen,
Wenn das entsprechende Bit gesetzt ist werden die Spalten in der inneren
Schleife abgeklappert.
Wenn dann ein Bit gesetzt ist, wird der Wert berechnet und in ein Feld
eingetragen.
1
idx=0;
2
for(intmz=7;mz>=0;mz-=1){
3
if(z&(1<<mz)){
4
for(intms=7;ms>=0;ms-=1){
5
if(s&(1<<ms))
6
r[idx++]=mz*8+ms+1;
7
}
8
}
9
}
2. Idee
Ein Zähler läuft alle Felder durch.
Jedesmal wird geschaut, ob das entsprechende Bit gesetzt ist.
Falls ja: Eintrag ins Feld.
1
for(intm=0;m<64;m++)
2
if(z&(1<<((m&0x38)>>3))&&s&(1<<(m&3)))
3
r[idx++]=m+1;
>Mein Code sieht derzeit so aus... hat aber einen Schönheitsfehler>(funktioniert noch nicht ganz.
Glaub ich dir.
while(ColumnByte>>=1)crosspoint++;// ColumnByte sollte mal wieder auf 0x80 gesetzt werden????
12
int_dsp(crosspoint);
13
}
14
base-=8;
15
RowByte<<=1;// wird in die falsch Richtung geschoben???
16
}
17
}
Ich habe das mit einem C++ Compiler (Visual-C) getestet,
der kann die Inline-Deklaration.
Sonst eben wie gehabt: vorher deklarieren.
Und das Ganze ist doch ein Dreizeiler,
da brauchts doch keine extra Funktion ;-)
Wenn doch, dann:
Vielleicht nochmal zu meiner Lösung... die ist ok aber Danke für deine
Hinweise.
Wenn mein ReihenByte nur ein BIT enthält passt es schon. Ich müßte eine
Schleife drumherum bauen die folgendes macht.
Beispiel: ReihenByte = 0x0A = 00001010... es müßte also 00001000 und
dann 00000001 übergeben werden... dann stimmt es.
Die 57 kommt hierher... ist der Basis Wert.
7| 64 63 62 61 60 59 58 57
Mein Problem... ne Schleife in der Schleife :-)
Danke Dir für deine Lösung, vielleicht kannst du Dir meine nochmal
ansehen (für mich zum Verstehen).
Der Unterschied zwischen meinem damals geposteten Code und deinem:
Meine Routine von damals hat die Reihen- und Spaltenbytes von einer
Schnittstelle gelesen, erst ein Reihenbyte und dann in einer Schleife
eine der Anzahl der 1-Bits entsprechende Anzahl von Spaltenbytes.
Du übergibst 1 Reihenbyte als Funktionsargument, was ok ist. Du
übergibst weiterhin 1 Spaltenbyte, aber wo sollen die restlichen
Spaltenbytes herkommen, wenn mehrere erwartet werden?
Kopiere es nochmal von oben:
Die Anzahl der SpaltenBytes ist abhängig von der Anzahl der gesetzten
BITs im ReihenByte. Die habe ich bereits im RAM liegen. Somit muß ich
die Funktion eben beliebig oft aufrufen.
Beispiel 1: ReihenByte = 0x01, SpaltenByte = 0x0A. Anhand der gegebenen
Matrix sollte nun der Wert 4 und 2 zurückgegeben werden.
Beispiel 2: ReihenByte = 0x0A, erstes SpaltenByte = 0x0A... liefert das
Ergebnis 28 und 26. Nun kommt ein 2tes SpaltenByte 0x0B... liefert die
Treffer 12, 10, 9.
Es können also mehrere Treffer in einer Reihe sein. Im Beispiel 2 wird
beim 2ten Durchlauf aus 0x0A = 0x02. Mit anderen Worten, im ersten
Durchlauf ist 0x0A = 0x08. Die Reihe wird also BITwise abgetastet.
Mich würde mal interessieren, wo dies Problem einegsetzt wird.
Hat das irgendwie eine praktische Anwendung? Wenn ja würde mich ein Link
auf die Projektseite total reizen. Wenns einen gibt, bitte her damit,
scheint spannend zu sein und ich wüsste jetzt wirklich gerne was man so
macht.
Alternativ, wenns schnell gehen muss, würde ich noch einen lookup table
ins rennen schmeißen, wo man für jedes gesetzte bit als y die Werte
rausholt. Entsprechend der y-bits kann man ja Analog zu letztem Jahr die
Xse versuchen zu empfangen.
Ich befürchte aber fast, daß das irgendwie ne rein akademische Aufgabe
ist, weil yalu ja schon mal das gleiche Ding voriges Jahr bearbeitet
hatte.
@icke:
> Mich würde mal interessieren, wo dies Problem einegsetzt wird. Hat> das irgendwie eine praktische Anwendung?
Zitat aus dem Thread vor einem Jahr von dem dortigen Hilfesuchenden:
> Das Ganze ist ein ziemlich schräges Protokoll aus einem japanischen> Gehirn. Ich denke ich werde noch ein paar "Nüsse" knacken müssen.>> http://bssc.sel.sony.com/Professional/docs/brochures/mvs8000.pdf