Wasserwaage auf 3x7-Segment-Anzeige

Gast #4810924
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
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.
Gast #4810977
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
 }
Persönliche Seite #4811141
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
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.
Gast #4811536
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.