Forum: Mikrocontroller und Digitale Elektronik Wasserwaage auf 3x7-Segment-Anzeige


von Simner (Gast)


Lesenswert?

Hallo,

wir müssen zurzeit im Studium folgende Aufgabe erledigen. Wir sollen auf 
einer 3x7 Segment-Anzeige eine "Wasserwaage" implementieren. Dafür haben 
wir einen Sensor, welcher uns (mithilfe einiger Umrechnungen) einen 
ziemlich genauen Winkel gibt. Mit diesem Winkel wollen wir die Anzeige 
dann ansteuern und die Anzeige steuern. Je nach Neigung sollen die 
"Striche" auf der Anzeige dann nach links/rechts und oben/unten wandern. 
Y-Richtung ist links/rechts und X-Richtung ist oben/unten.
Dabei haben wir jetzt jedoch folgendes Problem: standardmäßig soll in 
der Mitte ein "H" angezeigt werden. Jedoch bleibt das "H" bei beliebiger 
Neigung in y Richtung immer stehen. Außerdem kommt die Anzeige nie zu 
dem Punkt, dass sie die Seite der äußeren 7-Segment-Anzeige anzeigt, die 
zur Mitte zeigt. (Quasi "-|--" und "--|-", es springt dann immer direkt 
auf die äußersten Seiten ("|---" und "---|").

Der Code dazu (x und y sind die Winkel, die wir bekommen)
1
 void viewBalance(double x, double y){
2
  // TODO
3
  //X  3 steps of resolution
4
  //Y  6 Steps of resolution
5
 char horizontal[3] = {0b00010000, 0b00000010, 0b10000000};
6
 char vertikal[3] = {0b01100000, 0b01101100, 0b00001100};
7
 char cDisplayBuffer[3]={ 0 };
8
9
  if(x >= 45) x = 44;
10
  if(x < -45) x = -45;
11
12
  x+= 45;
13
14
  int xhelp = x/(90/3);
15
16
  for(int i = 0; i < 3; i++) {
17
    cDisplayBuffer[i] = horizontal[xhelp];
18
  }
19
20
  if (-15 < y < 15) {
21
    cDisplayBuffer[1] |= vertikal[1];
22
  }
23
  if ( -30 < y < -15) cDisplayBuffer[1] |= vertikal[2];
24
  if ( -45 < y < -30) cDisplayBuffer[2] |= vertikal[0];
25
  if ( y < -45) cDisplayBuffer[2] |= vertikal[2];
26
27
  if ( 30 > y > 15) cDisplayBuffer[1] |= vertikal[0];
28
  if ( 45 > y > 30) cDisplayBuffer[0] |= vertikal[2];
29
  if ( y > 45) cDisplayBuffer[0] |= vertikal[0];
30
  
31
 writeDigitsToDisplay(cDisplayBuffer[2], cDisplayBuffer[1], cDisplayBuffer[0]);
32
33
}

Hat zufällig jemand eine Idee, woran das liegen könnte?

: Verschoben durch User
von Karl M. (Gast)


Lesenswert?

Hallo,

double auf einem AVR oder auf welchen Zielsystem ?

Deine Vergleiche finden aber "nur" als Integer statt.

Dann würde ich die Vergleiche alle Sauber ordnen und in eine 
if-then-else-endif Konstruktion packen.

von Karl M. (Gast)


Lesenswert?

Ach ja, da werden auch noch Werte ausgelassen.


eine <= bringt dann schon auf einer Seite Abhilfe.

von Karl M. (Gast)


Lesenswert?

Dann habe ich noch etwas übersehen:

Diese schreibweise ist meines Wissen nach nicht C Konform.
1
if ( -30 < y < -15) { }

Also dann doch eher so:
1
if ( (-30 < y)  && (y <= -15)) { 
2
 } else {
3
 }

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Karl M. schrieb:
> Diese schreibweise ist meines Wissen nach nicht C Konform.
> if ( -30 < y < -15) { }

Das kann man in C schon schreiben, es macht bloß etwas *komplett 
anderes*, als sich der Schreiber vorstellt.

Also, ja: Nicht machen.

> if ( (-30 < y)  && (y <= -15)) {

Aber nicht <= verwenden. Denn dann trifft der Ausdruck auch zu, wenn y 
-15 ist, was es aber wohl nicht sein soll.

Der erste Audruck versucht,

y € ]-30 .. -15[

zu beschreiben,
der zweite hingegen beschreibt

y € ]-30 .. -15]

Das ist nicht das gleiche

von Simner (Gast)


Lesenswert?

Rufus Τ. F. schrieb:
> Karl M. schrieb:
>> Diese schreibweise ist meines Wissen nach nicht C Konform.
>> if ( -30 < y < -15) { }
>
> Das kann man in C schon schreiben, es macht bloß etwas *komplett
> anderes*, als sich der Schreiber vorstellt.
>
> Also, ja: Nicht machen.
>
>> if ( (-30 < y)  && (y <= -15)) {


Gut danke, dann probieren wir das mal aus :)
ob es nun < oder <= ist, macht erstmal keinen großen Unterschied, weil 
immer nur 1 Grad damit abgedeckt wird.

von Simner (Gast)


Lesenswert?

Es funktioniert jetzt so wie es soll, danke nochmal für die schnelle 
Hilfe :)

von Karl M. (Gast)


Lesenswert?

Hallo Rufus Τ. F. schrieb:
> y € ]-30 .. -15[
>
> zu beschreiben,
> der zweite hingegen beschreibt
>
> y € ]-30 .. -15]
>
> Das ist nicht das gleiche

Da der TO genau keine stetige Abbildung des Zahlenbereichs angegeben 
hatte, denke ich, dass er sich dessen nicht bewusst ist und somit Werte 
nicht beachtet werden.

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.