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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Simner (Gast)


Bewertung
0 lesenswert
nicht 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 Moderator
von Karl M. (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
Ach ja, da werden auch noch Werte ausgelassen.


eine <= bringt dann schon auf einer Seite Abhilfe.

von Karl M. (Gast)


Bewertung
0 lesenswert
nicht 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) (Moderator) Benutzerseite


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


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

von Karl M. (Gast)


Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.