Forum: Mikrocontroller und Digitale Elektronik 3 Byte nacheinander vergleichen und inkrementieren


von Joe S. (bubblejoe)


Lesenswert?

Hallo,

ich stehe gerade leider total auf dem Schlauch und möchte weiterkommen.
Ich habe auf einem PIC16F (XC8 Compiler) drei Byte, die ich von einem 
Startwert erhöhen möchte auf einen vorgegebenen Endwert.
Ich muss irgendwo einen Denk- bzw. Codefehler haben, da nicht das von 
mir erwartete (bzw. gewünschte) eintritt.
Vlt. fällt er jemanden von euch auf die Schnelle auf.

Vielen Dank und Grüße vorab.

Die xxx_byte werden vorher noch auf die Startwerte gesetzt (die 
niedriger als die Endwerte sind).
1
if(upper_byte<=upper_byte_end)
2
                {
3
                    if(high_byte<=high_byte_end)
4
                    {
5
                        if(low_byte<low_byte_end)
6
                        {
7
                            low_byte++;
8
                            if(low_byte==0)     // Check overflow
9
                            {
10
                                high_byte++;
11
                                if(high_byte==0)
12
                                {
13
                                    if(upper_byte<255)
14
                                    {
15
                                        upper_byte++;
16
                                    }
17
                                }
18
                            }
19
                        }
20
                    }
21
                }

von EAF (Gast)


Lesenswert?

Joe S. schrieb:
> if(low_byte<low_byte_end)
>                         {
>                             low_byte++;
>                             if(low_byte==0)     // Check overflow

Wie soll da ein Überlauf stattfinden, wenn low_byte_end kleiner 255 ist?

von EAF (Gast)


Lesenswert?

Nachtrag:

Ich kann solche If Kaskaden nicht leiden.
Der Grund: Nicht zu überblicken.
(offenbar auch für dich nicht)

von Teo D. (teoderix)


Lesenswert?

Nimm halt ne 16bit Var und gut is!

><(()°> ?-/

von Wolfgang (Gast)


Lesenswert?

Joe S. schrieb:
> Ich habe auf einem PIC16F (XC8 Compiler) drei Byte, die ich von einem
> Startwert erhöhen möchte auf einen vorgegebenen Endwert.

Und warum erhöhst du sie dann nicht einfach und prüfst am Ende, ob der 
Endwert erreicht ist?

von Joe S. (bubblejoe)


Lesenswert?

EAF schrieb:
> Wie soll da ein Überlauf stattfinden, wenn low_byte_end kleiner 255 ist?

Danke! Mit dem Tipp habe ich es nun hinbekommen.

Manchmal hat man so eine Denkblockade, oh weh oh weh...

von EAF (Gast)


Lesenswert?

Joe S. schrieb:
> Mit dem Tipp habe ich es nun hinbekommen.

Eigentlich war das kein Tipp, sondern ein offensichtlicher/markanter 
Sprung in der Logik, welcher eine ganze Latte Fragezeichen aufgeworfen 
hat.

Joe S. schrieb:
> Manchmal hat man so eine Denkblockade, oh weh oh weh...

Jetzt kommt ein Tipp:
Das sind die if Kaskaden.
Die machen Knoten in die Hirnwindungen.
Der Verzicht auf solche Kaskaden, schafft Klarheit.

Das Programmierer Genie zeichnet sich übrigens nicht dadurch aus, dass 
es beliebig tiefe Kontrollstrukturen im Blickfeld behalten kann, sondern 
dadurch dass er/sei/es diese Komplexität auflösen/abflachen kann.

von Wolfgang (Gast)


Lesenswert?

uint32 Zahl;

while (Zahl < Endwert)
  Zahl++;

von Gerald K. (geku)


Lesenswert?

Teo D. schrieb:
> Nimm halt ne 16bit Var und gut is!

Normalerweise sollte ein C Compiler deb Datentyp long unterstützen. long 
i++

Mit union kann man die Variable als long oder 4 bzw. 3 Bytes behandeln.

von Nasenarchitekt (Gast)


Lesenswert?

> while (Zahl < Endwert)
>  Zahl++;

Kwatsch.

Zahl = Endwert;

von Dietrich L. (dietrichl)


Lesenswert?

Teo D. schrieb:
> Nimm halt ne 16bit Var und gut is!

Bei mir ist 3x8=24...

von Gerald K. (geku)


Lesenswert?

1
union CNT
2
{ 
3
    long l;
4
    unsigned char b[4]; 
5
} myCnt;
6
7
8
myCnt.l++;

von Justus (Gast)


Lesenswert?

Wolfgang schrieb:
> uint32 Zahl;
>
> while (Zahl < Endwert)
>   Zahl++;
Seid ihr alle neben der Kappe?
GRÖL :-]]]]]

Nasenarchitekt schrieb:
> Zahl = Endwert;
Danke! Du hast den Tag gerettet.

von Teo D. (teoderix)


Lesenswert?

Dietrich L. schrieb:
> Teo D. schrieb:
>> Nimm halt ne 16bit Var und gut is!
>
> Bei mir ist 3x8=24...

Ja ja, is ja schon gut. Hab mich halt in dem Geschwurbel "verzählt"....

: Bearbeitet durch User
von A. S. (Gast)


Lesenswert?

EAF schrieb:
> Jetzt kommt ein Tipp:
> Das sind die if Kaskaden.
> Die machen Knoten in die Hirnwindungen.
> Der Verzicht auf solche Kaskaden, schafft Klarheit.

Ich habe zwar keine Ahnung, wie der Code des TO jetzt aussieht, aber 
eine gute Lösung wird kaum kleiner oder eleganter sein als im OP.

Oder hast Du eine alternative, unter der Annahme 3 einzelne Bytes? (Und 
ja, eine 16 Bit Variable macht es deutlich eleganter.

von EAF (Gast)


Lesenswert?

A. S. schrieb:
> aber
> eine gute Lösung wird kaum kleiner oder eleganter sein als im OP.
6 geschachtelte if scheinen mir nicht sonderlich elegant zu sein.

A. S. schrieb:
> der hast Du eine alternative
Da ich den Algorithmus/Problem/Aufgabe/Sinn/Zweck nicht verstehe, leider 
nein.
z.B. sind die Endwerte konstant, oder variabel?
Wohin soll optimiert werden? Lesbarkeit oder Speed?
Ohne Kontext keine Chance.

Einen Bock habe ich ja schon gezeigt.....
Den zweiten identischen schießt er mit high_byte
Das macht schon mal 2 if weniger, liegt damit deutlich auf meiner 
Wunschlinie.

Tendenziell, würde versuchen die Variablen irgendwie zusammen zu fassen.
z.B. in einem Array, einer Struktur, oder gar, wenn die Endwerte zu 2er 
Potenzen passen in ein Bitfeld. Wenn * oder / Rechnungen nicht zu teuer 
sind, auch in einer 32Bit Variablen, denn dann reicht ein Vergleich auf 
Endwert, und nur ein Increment.
Potentielle Möglichkeiten gibt es satt.

Als Hürde kommt hinzu, dass ich weder den µC noch den Compiler im 
Zugriff habe.


Also nein!
Ich habe keinen konkreten besseren Vorschlag. So ist das einzige 
"Besser" welches mir KONKRET einfällt, die Anzahl ifs zu reduzieren.

Mantra:
> Jedes vermiedene if ist ein gutes if.
> Jedes vermeidbare if ist ein böses if
Zwischen den beiden Grenzen findet sich eine Hysterese, dort wo die 
unvermeidbaren/notwendigen if stecken.

von Joe S. (bubblejoe)


Lesenswert?

Hallo,

ich habe die drei Byte letztendlich wie vorgeschlagen in einer (32bit, 
long) Variable zusammengefasst und mache damit die Berechnungen / 
Vergleiche.
Zuletzt lese ich aus der long Variable die einzelnen Byte wieder aus.

Danke für eure Hilfe, Viele Grüße Joe.

von A. S. (Gast)


Lesenswert?

Joe S. schrieb:
> Zuletzt lese ich aus der long Variable die einzelnen Byte wieder aus.

Darf man denn dann fragen, warum Du die Bytes einzeln brauchst? Falls es 
wegen Serialisierung ist, dann lieber dazu nachfragen.

Die Verwendung von 3 einzelnen Bytes (nicht mal ein Array oder eine 
Struktur) ist nur sehr selten zielführend. Manchmal unterstützen 
Compiler für kleine Prozessoren sogar 24 Bit Integer direkt

von Nasenarchitekt (Gast)


Lesenswert?

Am besten das ganze auf einem PIC in Assembler schreiben.
Da sieht mann dann die 'if's nicht so.
Und gegen ein gutes™ GOTO kann mann ja nichts haben.
Schon FORTRAN1 hatte das im Sprachstandard.

von Klaus H. (klummel69)


Lesenswert?

Gerald K. schrieb:
> union CNT

Nutze ich auch oft, man sollte jedoch Bedenken dass es zwischen little 
und Bug endian Unterschiede gibt.

von Gerald K. (geku)


Lesenswert?

Das probiert man am besten aus in dem man den Longwert auf 0x0815 setzt 
und sich den Wert der einzelnen Bytes ansieht. Danke für den Hinweiß!

von Torx (Gast)


Lesenswert?

Wittgenstein:
>Ich habe einen Schmerz in Ihrem Oberarm.

https://www1.wdr.de/radio/wdr5/sendungen/philosophisches-radio/wilhelm-vossenkuhl-100.html

Joe S. schrieb:
> ... total auf dem Schlauch.

EAF schrieb:
> Ich kann solche If Kaskaden nicht leiden.

Teo D. schrieb:
>><(()°> ?-/

Justus schrieb:
> Seid ihr alle neben der Kappe?
> GRÖL :-]]]]]

ack cfm Jöuh!

Weiter Lustig Und Vergnügt Bis Der Arsch Im Grabe Liegt.

von Dieter R. (drei)


Lesenswert?

A. S. schrieb:

> Die Verwendung von 3 einzelnen Bytes (nicht mal ein Array oder eine
> Struktur) ist nur sehr selten zielführend. Manchmal unterstützen
> Compiler für kleine Prozessoren sogar 24 Bit Integer direkt

Der Prozessor nicht direkt, aber der Compiler. Kann man sogar auf dieser 
Website nachlesen:

https://www.mikrocontroller.net/attachment/211304/MPLAB_XC8_C_Compiler_User_s_Guide_1_2.pdf

oder ganz aktuell beim Hersteller:

https://www.microchip.com/content/dam/mchp/documents/DEV/ProductDocuments/UserGuides/50002737D.pdf

S. 89, __uint24, little-endian

Dann braucht man exakt Null ifs und die Variable hat auch kein Byte zu 
viel.

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.