Forum: Mikrocontroller und Digitale Elektronik Programmierübung C Zahlenbereiche Algorithmus


von Micha (Gast)


Lesenswert?

Hallo Zusammen,

kann mir einer bei dieser Aufgabe weiterhelfen. Sollte in C gelöst 
werden.

Das Ergebnis einer Berechnung soll auf acht, an PORTD angeschlossenen 
LEDs angezeigt werden. Der hier darzustellende Wert liegt im Bereich 
zwischen 0 und 1023 und ist somit nicht direkt auf die Ausgabestruktur 
abbildbar. Daher gilt es, folgende Lösung zu implementieren:
 Zahlenbereich: 0 …127 LED 0
 Zahlenbereich 128 … 255 LED 1
 Zahlenbereich 256 … 383 LED 2
 Zahlenbereich 384 … 511 LED 3
 Zahlenbereich 512 … 639 LED 4
 Zahlenbereich 640 … 767 LED 5
 Zahlenbereich 768 … 895 LED 6
 Zahlenbereich 896 … 1023 LED 7
Liegt der Wert zwischen 0 und 127, so wird LED 0 angesteuert usw. 
Schreiben Sie eine C-Funktion, die diese Zuordnung realisiert. Der 
Übergabeparameter ist der berechnete Wert zwischen 0 und 1023, der 
Rückgabeparameter ist die Nummer der anzusteuernden LED. Die Berechnung 
der anzusteuernden LED soll mit einem Algorithmus und nicht mit einer 
switch- oder geschachtelten if-Anweisung erfolgen!


Vielen Dank.

von Thomas H. (Firma: CIA) (apostel13)


Lesenswert?

Wo steht denn da in der Aufgabe: "Suche Dir im Internet einen Blöden, 
der für die die Aufgabe löst"?

Ich kann ja verstehen, das man sich Hilfe holt wenn man seine Aufgabe 
mehr oder weniger gelöst hat und irgendwo an einem Detail festhängt. 
Aber so was ist Betrug und Pfusch und ein Armutszeugnis.

: Bearbeitet durch User
von Wolfgang (Gast)


Lesenswert?

Micha schrieb:
> Schreiben Sie eine C-Funktion, ...
Was meinst du, wer mit "Sie" angesprochen werden soll?

von Wollklaus (Gast)


Lesenswert?

Kleine Hilfe: Du kannst etwas (recht einfaches) mit 128 machen.

von Micha (Gast)


Lesenswert?

Thomas H. schrieb:
> Wo steht denn da in der Aufgabe: "Suche Dir im Internet einen
> Blöden,
> der für die die Aufgabe löst"?
>
> Ich kann ja verstehen, das man sich Hilfe holt wenn man seine Aufgabe
> mehr oder weniger gelöst hat und irgendwo an einem Detail festhängt.
> Aber so was ist Betrug und Pfusch und ein Armutszeugnis.

Wollklaus schrieb:
> Kleine Hilfe: Du kannst etwas (recht einfaches) mit 128 machen.

Hallo Wollklaus, ja da hast du recht ;-) Danke für die Hilfe!

von Noch einer (Gast)


Lesenswert?

Wahrscheinlich hat da der Prof in der verpassten Stunde seinen 
Lieblingsalgorithmus ausgebreitet, will nun genau diese Lösung sehen.

Mit unseren Lösungsvorschlägen hast du in der Schule bis in alle 
Ewigkeiten verschissen.

von user (Gast)


Lesenswert?

zahl / 128 = Nummer der Led

von Micha (Gast)


Lesenswert?

danke user darauf bin ich jetzt auch gekommen ;-) manchmal denk ich zu 
kompliziert ;-) aber danke für eure hilfe.

@Thomas, Wolfgang, Noch einer... ohne Worte zum GLÜCK gib es auch 
normale Menschen hier!

von Wolfgang (Gast)


Lesenswert?

Micha schrieb:
> danke user darauf bin ich jetzt auch gekommen ;-)

Und wenn du dem Mikrocontroller die Arbeit leicht machen willst, i.e. 
eine effiziente Lösung suchst und ohne aufwändige Rechenoperationen 
auskommen möchtest, vergiss das mit der Division durch 128 gleich 
wieder. Einem Mikrocontroller fällt es erheblich leichter, eine Zahl 7 
mal zu schieben, auch wenn die wahren Verfechter von C jetzt natürlich 
argumentieren werden, dass es die Aufgabe des Compilers ist, diese 
effiziente Möglichkeit selber zu erkennen und im Binärcode zu 
realisieren.

von Wolfgang (Gast)


Lesenswert?

user schrieb:
> zahl / 128 = Nummer der Led

p.s. Was nützt die Nummer der LED, wenn man Pins auf einem Port 
ansteuern möchte. Da fängt man dann wieder an, eine 1 spazieren zu 
schieben. Einfacher wäre es wohl in einer Schleife parallel eine 1 zu 
Schieben und von der Ausgangszahl 128 zu subtrahieren.

von Tom (Gast)


Angehängte Dateien:

Lesenswert?

Micha schrieb:
> manchmal denk ich zu
> kompliziert

Deshalb solche Zahlenreihen immer zuerst aufzeichnen. Geometrisch sieht 
man den Zusammenhang sofort.

von nicht"Gast" (Gast)


Lesenswert?

Wolfgang schrieb:
> Micha schrieb:
>> danke user darauf bin ich jetzt auch gekommen ;-)
>
> Und wenn du dem Mikrocontroller die Arbeit leicht machen willst, i.e.
> eine effiziente Lösung suchst und ohne aufwändige Rechenoperationen
> auskommen möchtest, vergiss das mit der Division durch 128 gleich
> wieder. Einem Mikrocontroller fällt es erheblich leichter, eine Zahl 7
> mal zu schieben, auch wenn die wahren Verfechter von C jetzt natürlich
> argumentieren werden, dass es die Aufgabe des Compilers ist, diese
> effiziente Möglichkeit selber zu erkennen und im Binärcode zu
> realisieren.

bla bla bla,

du weißt schon, dass der Compiler einen shift draus machen wird?

von Clarion (Gast)


Lesenswert?

Wolfgang schrieb:
> user schrieb:
>> zahl / 128 = Nummer der Led
>
> p.s. Was nützt die Nummer der LED, wenn man Pins auf einem Port
> ansteuern möchte. Da fängt man dann wieder an, eine 1 spazieren zu
> schieben. Einfacher wäre es wohl in einer Schleife parallel eine 1 zu
> Schieben und von der Ausgangszahl 128 zu subtrahieren.

Zeige doch einmal wie einfach das ist.

von Wolfgang (Gast)


Lesenswert?

Clarion schrieb:
> Zeige doch einmal wie einfach das ist.

Schleifenkonstrukte mit bedingter Ausführung kennst du?
Dann könnte das wohl sinngemäß so aussehen:

Pattern = 0x01

while (Wert>127)
  Pattern = shift (Pattern, 1)
  Wert = Wert - 128

PORTD = Pattern

von Clarion (Gast)


Lesenswert?

Wolfgang schrieb:
> Clarion schrieb:
>> Zeige doch einmal wie einfach das ist.
>
> Schleifenkonstrukte mit bedingter Ausführung kennst du?
> Dann könnte das wohl sinngemäß so aussehen:
>
> Pattern = 0x01
>
> while (Wert>127)
>   Pattern = shift (Pattern, 1)
>   Wert = Wert - 128
>
> PORTD = Pattern

Das nennst du einfach? ROFL

Das ist einfach: PORTD = 1 << (Wert >> 7);

5 Dollarfrage @ all: Wie geht es noch einfacher?

von Wolfgang (Gast)


Lesenswert?

Clarion schrieb:
> Das ist einfach: PORTD = 1 << (Wert >> 7);

Ich fürchte das übersteigt die Kenntnisse vom TO, wenn er mit der 
Grundaufgabe schon so viel Probleme hat, dass er sie hier ohne jeglichen 
Lösungsansatz postet.

von Clarion (Gast)


Lesenswert?

Wolfgang schrieb:
> Clarion schrieb:
>> Das ist einfach: PORTD = 1 << (Wert >> 7);
>
> Ich fürchte das übersteigt die Kenntnisse vom TO, wenn er mit der
> Grundaufgabe schon so viel Probleme hat, dass er sie hier ohne jeglichen
> Lösungsansatz postet.

Er kann sich beide Lösungen anschauen und in den verschiedenen 
Anleitungen (eigene Skipte, etc.) zu C versuchen diese zu verstehen. 
Gegebenenfalls einfach hier auf dem µCNet nachfragen :)

von Wolfgang (Gast)


Lesenswert?

Wolfgang schrieb:
> Clarion schrieb:
>> Das ist einfach: PORTD = 1 << (Wert >> 7);

Für nicht"Gast" könnte man das im Vertrauen auf den Compiler und damit 
selbiger auch zeigen kann, dass er das drauf hat, natürlich wieder als
1
PORTD = 1 << (Wert / 128);
formulieren, womit wir dann beim ursprünglichen Vorschlag wären ;-)

von Klaus (Gast)


Lesenswert?

Thomas H. schrieb:
> Wo steht denn da in der Aufgabe: "Suche Dir im Internet einen Blöden,
> der für die die Aufgabe löst"?

Da der Lehrer hier sicher mitliest, weiß er natürlich daß Micha keinen 
Dunst hat, selbst wenn er diesmal eine richtige Lösung liefert. Bei 
einer der nächsten Aufgaben wird er ihn schon kalt erwischen.

MfG Klaus

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.