Forum: Mikrocontroller und Digitale Elektronik Sensorspannung in bcd


von Fabian T. (hayruh)


Lesenswert?

Hallo,

ich habe hier eine Übungsaufgabe:
Realisieren Sie ein Tankfüllmessgerät. Pro dm Länge(Höhe) erhäht sich 
die Spannung um 0,5V.
Der Durchmesser beträgt 20 dm.
Geben Sie die Füllmenge in Liter als BCD-Wert aus.
1
V=D^2 * Pi / 4 * h

Wenn ich D einsetze kommt raus:
1
 V = 400/4 * Pi * h = 314 * h
Wenn ich 5V als U_max annehme ist h_max = 10
somit gilt für V_max = 3140 Liter

Das Struktogramm dazu soll wie folgt aussehen:
1
Initialisierung
2
  Messwert einlesen
3
  6-Stellen nach rechts
4
  *3140D
5
  :1023D
6
  :1000D
7
  Ergebnis in A
8
  :100D
9
  Akku 4 Stellen nach links
10
  Ergebnis mit A verodern
11
  An P5 ausgeben
12
  Rest :10D
13
  Akku 4 Stellen nach links
14
  Verodern von A und B
15
  An P6 ausgeben
Meine Fragen dazu sind:
Wie kommt man auf die Zahlen?
Was berechnetman da überhaupt?

: Bearbeitet durch User
von Fabian T. (hayruh)


Lesenswert?

wie komme ich auf die 1023?
warum nicht beispielsweise 511?

von Max H. (hartl192)


Lesenswert?

Fabian Tetzert schrieb:
> wie komme ich auf die 1023?
Vllt. weil der ADC 10bit hat...

von Falk B. (falk)


Lesenswert?

@ Fabian Tetzert (hayruh)

>Realisieren Sie ein Tankfüllmessgerät. Pro dm Länge(Höhe) erhäht sich
>die Spannung um 0,5V.
>Der Durchmesser beträgt 20 dm.
>Geben Sie die Füllmenge in Liter als BCD-Wert aus.
>V=D^2 * Pi / 4 * h

Wo sit das Problem?

>Wenn ich D einsetze kommt raus: V = 400/4  Pi  h = 314 * h

Stimmt, aber viel zu einfach.

>Wenn ich 5V als U_max annehme ist h_max = 10
>somit gilt für V_max = 3140 Liter

Klingt logisch.

>Das Struktogramm dazu soll wie folgt aussehen:

das ist kein Struktogramm, das ist Kauderwelsch.

>Wie kommt man auf die Zahlen?

siehe Festkommaarithmetik

>Was berechnetman da überhaupt?

Was weißt du überhaupt von den Grundlagen der Programmierung?

von Karl H. (kbuchegg)


Lesenswert?

Fabian Tetzert schrieb:

> Wenn ich D einsetze kommt raus: V = 400/4  Pi  h = 314 * h
> Wenn ich 5V als U_max annehme ist h_max = 10
> somit gilt für V_max = 3140 Liter

Schön.

Jetzt liefert aber deine 'Messwert einlesen' aber offenbar nicht die 
Spannung direkt, sondern

>   :1023D

als Buchteil von 1023. (Im Grunde eine Prozentrechnung. Nur nicht mit 
100% sondern mit 1023% [eigentlich 1024%])
D.h. wenn dein Messwert 1023 war, dann lagen am Messeingang 5V an.

> Wie kommt man auf die Zahlen?

Ich versteh die Frage nicht.
Ganz offensichtlich wird hier mit Fix Point Arithmetik gerechnet, um 
sich Fliesskomma zu ersparen.
Vereinfacht gesagt: Anstatt in Euro €2.80 plus €3.45 zu rechnen (und 
dazu Fliesskomma zu benötigen), rechnet man einfach in der kleineren 
Einheit Cent, und berechnet dort 280 + 345 gleich 625. Man erhält ein 
Ergebnis ausgedrückt in Cent, welches man zu Anzeigezwecke wieder in 
Euros verwenadelt, indem man durch 100 dividiert um das gedachte Komma 
wieder an die richtige Stelle zu kriegen. Auf der Anzeige steht dann 
wieder €6.25
Für den Benutzer sieht es so aus, als ob mit Kommazahlen gerechnet 
wurde. Intern hat man aber nur mit ganzen Zahlen hantiert. Aber: an 
geeigneten Stellen sind dann ein paar Multiplikationen bzw. Divisionen 
mit 10, 100, 1000, etc. fällig. Je nachdem was gerechnet wird.

: Bearbeitet durch User
von Fabian T. (hayruh)


Lesenswert?

Bin gerade am Durchrechnen mit 1V
1V = 204D

204*3140=640560
640560/1023=626
626/1000=0 ???
habe ich was falsch gemacht?

von Karl H. (kbuchegg)


Lesenswert?

Fabian Tetzert schrieb:
> Bin gerade am Durchrechnen mit 1V
> 1V = 204D
>
> 204*3140=640560
> 640560/1023=626
> 626/1000=0 ???
> habe ich was falsch gemacht?

Nein, stimmt schon. Rechne weiter.

200 ist ca. 1/5 von 1023. D.h. dein Ergebnis ist ca. 1/5 von 3140. 
Offenbar wird das Ergebnis aber nicht in Liter ausgegeben, denn bei nur 
2 Anzeigestellen wäre das recht schnell überlaufen. Das Ergebnis wird 
offenbar in m^3 (Kubikmeter) ausgegeben. 1000l sind 1 m^3. Und 1/5 von 
3140 ist daher weniger als 1 m^3. Circa 600 Liter, oder eben 0.6 m^3

Wenn du nur 2 Anzeigestellen hast, muss eben irgendwas auf der Strecke 
bleiben.

: Bearbeitet durch User
von Fabian T. (hayruh)


Lesenswert?

Fabian Tetzert schrieb:
> Bin gerade am Durchrechnen mit 1V
> 1V = 204D
>
> 204*3140=640560
> 640560/1023=626
> 626/1000=0 ???
> habe ich was falsch gemacht?

0 in A ablegen

0:100=0
0 um 4 Stellen nach links, bleit doch 0 oder nicht?

Ergebnis mit A verodern, also 0 mit 0 verodern 0
0 an P5

0:10=0
0 um 4 Stellen nach links, ist immer noch 0
Verodern bleibt 0
0 an P6

von Karl H. (kbuchegg)


Lesenswert?

Fabian Tetzert schrieb:

> 0:100=0
> 0 um 4 Stellen nach links, bleit doch 0 oder nicht?

0 durch irgendwas ergibt wieder 0


Das Problem in deinem 'Struktogram' ist, das das kein Struktogram ist, 
sondern ein Sauhaufen.
Da tauchen auf einmal A und B auf und kein Mensch weiß, welche Werte A 
bzw. B eigentlich darstellen sollen. D.h. welches Ergebnis in A bzw. 
welches Ergebnis in B abgelegt wurde und womit weiter gerechnet werden 
soll.
Mit viel Phantasie kann man ungefähr erahnen, wie das ganze gedacht ist. 
Allerdings auch nur, wenn man das Prinzip verstanden hat.

Und ich seh gerade, dass da 2 Ausgaben stattfinden. Einmal an P6 und 
einmal an P5. D.h. du hast wohl doch 4 Ausgabestellen. Vergiss also 
bitte die m^3 wieder. Die waren ein Schnellschuss, der sich mit dem 
erweiterten Hintergrund von 4 Stellen als Schuss in den Ofen entpuppte.

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

Fabian Tetzert schrieb:


> [code]
> Initialisierung
>   Messwert einlesen
>   6-Stellen nach rechts
>   *3140D
>   :1023D

Hier an dieser Stelle ist offenbar das Volumen ermittelt.

Der Rest des Codes beschäftigt sich nur noch damit, die einzelnen 
Stellen zu ermitteln. Die Zahl 2487 in die Ziffern 2, 4, 8 und 7 zu 
zerlegen und die geordnet in 2-er Gruppen für die Ausgabe 
zusammenzubauen.
Zumindest sollte er das, wenn er korrekt geschrieben wäre. Welches 
Teilergebnis in weiterer Folge dann an welcher Stelle weiter verwendet 
wird, damit sich etwas annähernd sinnvolles ergibt, darfst du dir selber 
raussuchen.

: Bearbeitet durch User
von Fabian T. (hayruh)


Lesenswert?

genau,
ich habe 4 Ausgabestellen.
In der Vorlesung habe ich das "Struktogramm" einfach abgeschrieben wegen 
dem Zeitdruck, aber jetzt macht es halt keinen Sinn, wie man sieht.

von Karl H. (kbuchegg)


Lesenswert?

Fabian Tetzert schrieb:
> genau,
> ich habe 4 Ausgabestellen.
> In der Vorlesung habe ich das "Struktogramm" einfach abgeschrieben wegen
> dem Zeitdruck, aber jetzt macht es halt keinen Sinn, wie man sieht.

Richtig. Das ist auch kein Struktogram, sondern maximal eine schnell 
hingekritzelte Skizze.

Dann schreib es eben neu.
Eine 4 stellige Zahl in die 4 Ziffern zu zerlegen ist ja nicht gerade 
Raketentechnik.
1
2487 / 1000  ->  2      Tausenderstelle
2
2487 % 1000  -> 487  (Rest bei der Division durch 1000)
3
                 |
4
  +--------------+
5
  v
6
487 / 100    ->  4      Hunderterstelle
7
487 % 100    -> 87
8
                 |
9
  +--------------+
10
  v
11
87 / 10      ->  8      Zehnerstelle
12
87 % 10      ->  7      (Rest bei der Division, gleichzeitig Einerstelle)

Alles was du brauchst, ist Rechnen wie in der Grundschule:
Eine Mutter hat 14 Äpfel und 3 Kinder. Wenn jedes Kind gleich viele 
Äpfel kriegt, wieviele kriegt dann jedes Kind und wieviele Äpfel bleiben 
der Mutter.
1
  14 / 3   ->  4   Jedes Kind kriegt 4 Äpfel
2
  14 % 3   ->  2   und 2 Äpfel bleiben übrig
Du hast eben nicht 3 Kinder, sondern 10 :-)

Die ganzen Divisionen aus deinem Code finden sich hier wieder. Und sogar 
die, die entweder dein Dozent vergessen hat aufzuschreiben, oder die du 
nicht abgeschrieben hast.

: Bearbeitet durch User
von Fabian T. (hayruh)


Lesenswert?

DANKEEEE

von Fabian T. (hayruh)


Lesenswert?

Denst du das passt so?

Initialisierung
  Messwert einlesen
  6-Stellen nach rechts
  *3140D (Maximalwert)
  :1023D (wg. 10-bit)
  :1000D
  Ergebnis in A
  A 4 Stellen nach links
  Rest in B
  B:100
  Ergebnis mit A verodern
  An P5 ausgeben
  Rest in B
  B:10D
  Ergebnis in A
  A 4 Stellen nach links
  Rest in B
  A mit B verodern
  An P6 ausgeben

von Karl H. (kbuchegg)


Lesenswert?

Solange du es auf dieser Ebene beschreibst (also noch nicht zu konkret 
in eine Programmiersprache gehst), würde ich ehrlich gesagt dringenst zu 
der Notation raten, dass arithmetische Ausdrücke immer aus 3 'Teilen' 
bestehen, die sich mit den 3 großen W-s zusammenfassen lassen:

mit Wem wird Welche operation gemacht und Was passier mit dem Ergebnis

Also irgendwas in der Form
1
  A <-  A / 1000

oder
1
  B <-  A / 100

ob du jetzt einen Pfeil benutzt um anzudeuten, an wen das Ergebnis einer 
Berechnung zugewiesen wird, oder ob du schreibst
1
   B = A / 100

ist eher zweitrangig. Auch die Tradition, dass das "Wohin" als erstes 
(also links vom Ausdruck) genannt wird, ist nicht wirklich in Stein 
gemeisselt.
Man kann auch schreiben
1
   A / 100   -> B
solange nur klar ist, dass hier mit dem Inhalt von A die Division 
gemacht wird und das Ergebnis dieser Division in B abgelegt wird.

Aber solche Impliziten namentlichen Erwähnungen, wie zb
1
Ergebnis in A
2
A 4 Stellen nach links
3
Rest in B
sind einfach nur ein Graus und ganz schwer und schlecht 
nachzuvollziehen. Ich lese das mal so, dass A um 4 Stellen geschoben 
wird (also durch 10? dividiert wird) und der Rest dieser Division in B 
landen soll. So weit so gut (was passiert eigentlich mit dem Ergebnis 
der Verschiebung, wird das wieder in A abgelegt?). Hier hat also die 
Phrase 'Rest in B' die Bedeutung dort kommt ein Ergebnis hin, in B wird 
etwas abgespeichert
Aber was ist hier?
1
Ergebnis mit A verodern
2
An P5 ausgeben
3
Rest in B
Da kommt schon wieder die Phrase 'Rest in B' vor. Aber ganz 
offensichtlich hat es vorher keine arithmetische Operation gegeben. Was 
ist dieser Rest, der in B gespeichert werden soll.
Oder sollte hier gar nichts in B gespeichert werden, sondern gemeint war 
eigentlich: Nimm den Inhalt von B her, der weiter oben als Rest einer 
Operation entstanden ist.
Nun, das weiter oben eine Operation war, deren Rest in B gespeichert 
wurde, ist hier im 'Code' uninteressant. Hier wird mit dem Inhalt von B 
weiter gerechnet, egal wie der entstanden ist. Maximal kann man das noch 
in einem Kommentar dazugeben, um sich selbst eine Merkhilfe zu geben, 
welchen erwarteten Wert den B an dieser Stelle eigentlich hat.

Fazit: Eines der um und auf in der Programmierung ist eine klare, 
konsistente Sprache. Wenn du eine Phrase für einen Zweck benutzt, dann 
kannst du nicht 3 Zeilen weiter dieselbe Phrase für einen anderen Zweck 
benutzen.

Und sieh zu, dass in deinen Berechnungen immer klar ist, was die 3 'W'-s 
sind: Wer, Was, Wohin   (Wer - also mit wem, wird was gerechnet und 
wohin geht das Ergebnis). Damit vermeidest du derartige Stolperfallen 
(auch für dich selbst!) von vorne herein.

: Bearbeitet durch User
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.