PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Subtrahieren unter Null



BlaueLed
14.02.2010, 22:45
Hallo,

ich habe eine Kette mit 580 Kettengliedern. An dieser Kette ist ein Sensor befestigt, der mir pro Kettenglied ein Signal gibt. Jetzt möchte ich gerne berechnen, welches Kettenglied ( Nummer ) 125 Takte vor dem Sensor ist.

Also wenn am Sensor Kettenglied 150 ankommt, dann ist das klar:

150 - 125 = 25

Wenn aber jetzt am Sensor das Kettenglied 25 ankommt, dann müsste das Ergebnis 480 sein, da ich ja nur 580 Kettenglieder insgesamt habe. Ich steh gerade voll auf dem Schlauch und habe keine Ahnung wie ich das in Bascom umsetzen kann. Kann mir jemand bitte einen Tip geben, wie ich die Rechnung am besten angehen kann ?

Danke und Gruß
BlaueLed

for_ro
14.02.2010, 22:54
Hallo BlaueLED,
deine Rechnung wäre ja

Kettenglied > 125 dann
Kettenglied - 125
Kettenglied <= 125 dann
580 + Kettenglied - 125 = 455 + Kettenglied

Also machst du

If Kettenglied > 125 Then
Gesuchtes_Kettenglied= Kettenglied - 125
Else
Gesuchtes Kettenglied = 455 + Kettenglied
End If

Wichtig ist noch, ob du mit 0 oder mit 1 anfangst.
Wenn dein erstes Kettenglied die Nr. 0 hat, musst du auf > 124 vergleichen und 456 + Kettenglied rechnen.

uwegw
14.02.2010, 23:09
Du rechnest ja implizit modulo 580. Ich würde also erst mal ganz normal subtrahieren (vorzeichenbehaftete Datentypen verwenden), und dann eine entsprechende Korrekturfunktion aufrufen:
-> solange der Wert negativ ist, wird 580 addiert
-> solange der Wert größer als 580 ist, wird 580 subtrahiert.

MagicWSmoke
15.02.2010, 08:29
Geht auch noch einfacher, einfach die Rechnung in den positiven Bereich verschieben, quasi eine gleiche Kette dazulegen:


Erg = Kettenglied + 580
Erg = Erg - 125
If Erg > 580 Then Erg = Erg - 580

for_ro
15.02.2010, 11:20
Erg = Kettenglied + 580
Erg = Erg - 125
Viele Wege führen nach Rom, auch Umwege.
Wenn du die beiden Schritte in einen zusammenfasst, wirst du merken, dass dein Erg = Kettenglied + 455 ist. Siehe oben.

BlaueLed
15.02.2010, 12:17
Hi,

danke an alle für die Antworten.

Gruß BlaueLed

MagicWSmoke
15.02.2010, 12:19
Ja, da hast Du recht, das ist noch einfacher. Ich denke aber meine 3 Schritte sind für jemand, der sich bezüglich der richtigen Rechenweise unsicher ist, einfacher nachzuvollziehen als die gekürzte Version.

Die Kurzversion ist dagegen, wenn's Prinzip einmal verstanden wurde, am einfachsten.

BlaueLed
15.02.2010, 12:45
Hi ich nochmal,

ich hätte da schon die nächste Frage ( möchte deswegen, aber nicht gleich einen neuen Thread aufmachen ).

Ich habe ja 580 Kettenglieder. Jetzt will ich jedem Kettenglied einen Status geben. Ich dachte ich mache das mit einem array. Also:

DIM Kettenglied(580) as byteDas funktioniert soweit.

Jetzt haben ich aber auch eine Kette mit 3500 Kettengliedern. Wenn ich jetzt ein Array mit 3500 angebe, dann meckert Bascom wegen dem nicht ausreichendem SRAM meines Mega644p. Gibt es einen Möglichkeit außer dem Array, jedem Kettenglied einen Status zu geben und diesen zu einem späteren Zeitpunkt wieder auszulesen ?

Gruß BlaueLed

for_ro
15.02.2010, 13:05
Brauchst du denn überhaupt ein ganzes Byte als Status, oder kommst du evtl. mit 0 und 1 aus. Dann könntest du dir ein Byte Array machen mit 3500/8=437,5 Elementen, wovon jedes den Status von 8 Kettengliedern hält.

for_ro
15.02.2010, 13:08
Ja, da hast Du recht, das ist noch einfacher. Ich denke aber meine 3 Schritte sind für jemand, der sich bezüglich der richtigen Rechenweise unsicher ist, einfacher nachzuvollziehen als die gekürzte Version.

Die Kurzversion ist dagegen, wenn's Prinzip einmal verstanden wurde, am einfachsten.

Sowohl die Erklärung als auch der Kurzweg stehen oben.

Ich finde es halt überflüssig, wenn Leute schon gesagtes wiederholen, nur weil sie sich nicht durchlesen, was andere geschrieben haben. Ohne etwas Neues dazu beizutragen. Das müllt doch nur den Thread zu.

MagicWSmoke
15.02.2010, 15:20
Ja, stimmt, meine Version ist nicht viel anders wie Deine, also wäre der Mehrnutzen meines Beitrags diskussionsfähig. Ich finde allerdings meine Erklärung besser.
Nur, unabhängig davon ob Du einen Nutzen in meinem Beitrag siehst, Du willst mir doch sicher jetzt damit nicht sagen daß Du entscheiden möchtest, wer was postet ?
Und wie Du lesen konntest, war der Threadsteller zufrieden mit dem Ergebnis, der Thread ist prinzipiell beendet und ist bei nicht mal einer Seite ganz sicher auch nicht zugemüllt.