Wasserwaage auf 3x7-Segment-Anzeige

Gast #4810924
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?
Gast #4810970
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.
Persönliche Seite #4811141
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
Gast #4811356
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren