Forum: Mikrocontroller und Digitale Elektronik Zahl zwischen 0 und 255 finden


von Elzaar (Gast)


Lesenswert?

Abend,
Ich bin am verzweifeln ... ich muss einfach einfach nur ein Zahl 
zwischen 0 und 255 also eine 8bit Zahl finden.

Ich kann Fragen ob die "Zufalls Zahl" <= "Such Zahl" ist, der Ansatz ist 
mir klar aber ich habe ein off by 1 Fehler.

ich Gehe so Vor:
1. Such Zahl = 255;
2. Testen (OK es geht weiter), Fail -> Abbruch

Gehen wir davon aus es gibt min. 1 Slave.
3. Such Zahl /= 2 (also 127)
4. Testen OK (wieder halbieren), Fail (Such Adresse +=  Such Adresse/2)

wo ist den da mein Fehler und wie nennt sich so eine Näherungen damit 
ich mal googel befragen kann.

Gruß Elzaar

von Mike (Gast)


Lesenswert?

Elzaar schrieb:
> wie nennt sich so eine Näherungen

Binäre Suche oder sukzessive Approximation

von Zweierkomplement (Gast)


Lesenswert?

Naja, versuchs doch einfach mal herzuleiten:

Du checkst, ob die Zahl <= "10000000" ist. Wenn ja, dann ziehst Du 128 
ab und addierst 64 dazu (also ziehst du 64 ab). Wenn nein, dass addierst 
Du 64 dazu.
Anmerkung: In einer Loop von 7 downto 0 ist 128=2^7 und 64=2^6, also 
ziehst du 2^6 ab oder addierst es dazu.
Dasselbe mit 6, 5, 4, ... usw
Und schon hast du dein kleines Programm selbst geschrieben.

Abgesehen davon: Wie wird denn die Zahl repräsentiert. Naja letztendlich 
sagt die Zahl ja schon wie sie heißt, also was du findest ist die zahl 
an sich, so wie sie ggf. auch schon dargestellt ist.

Elzaar schrieb:
> ich Gehe so Vor:
> 1. Such Zahl = 255;
> 2. Testen (OK es geht weiter), Fail -> Abbruch
>
> Gehen wir davon aus es gibt min. 1 Slave.
> 3. Such Zahl /= 2 (also 127)
> 4. Testen OK (wieder halbieren), Fail (Such Adresse +=  Such Adresse/2)

Kann ich leider nix min anfangen bzw weiss nicht was du damit meinst.

Elzaar schrieb:
> off by 1 Fehler.

Dito

Bischen mehr info wäre hilfreich ...

von Zweierkomplement (Gast)


Lesenswert?

Zweierkomplement schrieb:
> Wie wird denn die Zahl repräsentiert.

Also wenn sich beispielsweise jemand diese Zahl denkt, und dein 
Algorithmus denjenigen dann fragt, dann macht er das mit obiger Methode. 
Sind dann genau 8 Abfragen. (gleichbedeutend mit: Ist bit7=1? Ist 
bit6=1?, ... Ist bit0=1?)

Wenn die Zahl als Parameter übergeben wird, dann liegt sie halt schon 
vor --> Fertig.

Wenn die Zahl als Parameter übergegen wird, und du suchts ne Dezimalzahl 
dazu, gibts auch entsprechende Umwandlungsroutinen ...

von Karl H. (kbuchegg)


Lesenswert?

Elzaar schrieb:

> wo ist den da mein Fehler

das weiß keiner, weil niemand dein Programm kennt und aus deiner 
konfusen Beschreibung keiner schlau wird.

Aber: es hilft oft extrem, wenn man als Programmierer sich Papier und 
Bleistift schnappt und sein Programm mal durchspielt. Also keine so 
windige Algorithmenbeschreibung, wie du sie hier abgeliefert hast, 
sondern tatsächlich dein Programm abarbeiten, mit allen Berechnungen 
(und zwar genau so wie sie in deinem Programm stehen). Und das was du 
laut Programm tust, das vergleichst du mit dem wie du dir vorstellst, 
dass die Dinge eigentlich laufen müssten.

> und wie nennt sich so eine Näherungen damit
> ich mal googel befragen kann.

Google kann dir nicht helfen deine Gedanken zu ordnen. Das kannst du nur 
selber.

von Elzaar (Gast)


Lesenswert?

Also zur Hardware,

ich habe bis zu 16 Slaves auf einem Bus mit einem Rand Befehl such sich 
jeder Slave eine Adresse zwischen 0- 2^16-1 also eine 16 bit Adresse

zu Vorstellung:

Slave 1: Rand Adresse: 6000
Slave 2: Rand Adresse: 4000
Slave 3: Rand Adresse: 3000
Slave 4: Rand Adresse: 2000
Slave 5: Rand Adresse: 1000
Slave 6: Rand Adresse: 500

ps.: das das glatte Zahlen sind ist Tippfaulheit und nicht relevant.

Der Master Setz nun eine Suchadresse und sende diese an alle Slaves dann 
fragt er ein vergleich an, jeder Slave der eine kleinere oder gleiche 
Rand Adresse hat schreibt auf den Bus und der Master guckt ob auf dem 
Bus irgendwas kommt nur ein Timeout heißt das keine leuchte da ist.

Im Moment mach ich das so:
1
//ps ist aus einer Statemaschien raus gerissen
2
Serch_Step = 0x80;
3
SerchADD_H = 0x80;
4
SerchADD_L = 0xFF;
5
SET_Serch_ADD();
6
7
case suche_H:
8
               Serch_Step /= 2;
9
10
                if( !(Interface_tmp->flag & RX_TIMEOUT) ){   //OK -> Serch Address / 2
11
                    SerchADD_H  -= Serch_Step;
12
                }else{
13
                    SerchADD_H += Serch_Step;
14
                }
15
16
                if(Serch_Step == 0){ //Suchstep ist 0 und Antwort -> Suche Low Byte
17
                    if( !(Interface_tmp->flag & RX_TIMEOUT) ){   
18
                        Interface_tmp->APP_Error = 0;
19
                        SerchADD_L       = 0xFF;
20
                        Serch_Step       = 0x80;
21
                        SET_Serch_ADD();
22
                    }
23
                    else{                    //Suchstep ist 0 und keine Antwort -> wieder erhöhen und zurück
24
                        if(Interface_tmp->APP_Error++ < ERROR_ITER_CNT){
25
                            Interface_tmp->APP_State -= 2; //Step Back)
26
                            SerchADD_H++;
27
                            SET_Serch_ADD();
28
                        }
29
                        else{
30
                            Interface_tmp->APP_State = STATE_Random_Adressing+21; //neustart
31
                        }
32
                    }
33
                }else{
34
                    SET_Serch_ADD();
35
                    Interface_tmp->APP_State -= 2;   //und zurück
36
                }

und irgendwie finde ich das doch sehr umständlich, und dan gehts nicht 
mal richtig ...

von MaWin (Gast)


Lesenswert?

> > ich Gehe so Vor:
> > 3. Such Zahl /= 2 (also 127)
> > 4. Testen OK (wieder halbieren), Fail (Such Adresse +=  Such Adresse/2)
> Binäre Suche oder sukzessive Approximation

Im Prinzip versucht er das, aber mit fehlerhaft hingeschriebenem 
Aktionen.

Man würde sowieso mit 128 anfangen.

von Elzaar (Gast)


Lesenswert?

Sry mach ich ich ja ich Fange mit 0x80 an.

von Elzaar (Gast)


Lesenswert?

Oh je ich muss auch mal meine Sprache sortieren ... xD

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.