Forum: Offtopic Prüfungsaufgabe


von schüler (Gast)


Lesenswert?

Hi Leute,

nachdem ihr mir schon so oft super geholfen habt, hätte ich hier noch 
eine kleine Prüfungsaufgabe die ich gerne in die Runde werfen würde um 
zu sehen ob ich sie in der Prüfung richtig hatte.

Zu erstellen ist eine Funktion "High_Byte" die einen 8bit-Wert übergeben 
bekommt und nur die 4 höherwertigen Bits an Port A ausgibt. Die 
restlichen Bits am Port dürfen nicht geändert werden. Der Port A wurde 
in der Aufgabe davor bereits als Ausgang definiert.

Ach ja, in C programmieren :-)

: Verschoben durch User
von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Ja, super.
1. Das ist von Controller zu Controller unterschiedlich
2. Du Prüfung machst du, nicht wir. Wir können das alles schon :-P

Aber ich will ja nicht so sein. Hier kannst du was lesen dazu:
https://www.mikrocontroller.net/articles/Bitmanipulation

und dann noch das:
Beitrag "Einheitlicher Umgang mit faulen Schülern etc.?"

: Bearbeitet durch User
von Stephan (Gast)


Lesenswert?

Mov A,Port
ANL A,0Fh
Mov Port,A

von 01011100 (Gast)


Lesenswert?

port a = high_byte & 11110000

von THOR (Gast)


Lesenswert?

schüler schrieb:
> Hi Leute,
>
> nachdem ihr mir schon so oft super geholfen habt, hätte ich hier noch
> eine kleine Prüfungsaufgabe die ich gerne in die Runde werfen würde um
> zu sehen ob ich sie in der Prüfung richtig hatte.

Ich verrate dir einen Trick: Tipp' deine Lösung in einen Editor deiner 
Wahl,kompiliere das dann und guck obs funktioniert. Das nennt sich 
Testen! Wenn es nicht kompiliert, habe ich schlechte Nachrichten für 
dich.

von THOR (Gast)


Lesenswert?

Stephan schrieb:
> Mov A,Port
> ANL A,0Fh
> Mov Port,A

01011100 schrieb:
> port a = high_byte & 11110000

Och Leute. Wenn ihr eine Lösung liefert, dann bitte in INTERCAL und 
Brainfuck.

Wegen:

Matthias S. schrieb:
> und dann noch das:
> Beitrag "Einheitlicher Umgang mit faulen Schülern etc.?"

von schüler (Gast)


Lesenswert?

Matthias S. schrieb:
> und dann noch das:
> Beitrag "Einheitlicher Umgang mit faulen Schülern etc.?"

Zum Thema fauler Schüler, ich hatte heute Prüfung und wollte nur wissen 
ob meine Lösung richtig ist. Wenn dir Fragen eines Neulings zu trivial 
sind musst du ja nicht antworten.

von Cyblord -. (cyblord)


Lesenswert?

THOR schrieb:
> Och Leute. Wenn ihr eine Lösung liefert, dann bitte in INTERCAL und
> Brainfuck.

Das mit den Hausaufgaben funktioniert hier immer, weil dann auch ein 
kleiner Forenversager mal was weiß und ganz heiß drauf ist das zu 
posten.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Stephan schrieb:
> Mov A,Port
> ANL A,0Fh
> Mov Port,A

Blödsinn. Ich gratuliere dir zur Löschung der oberen 4 Bits - das war 
aber nicht die Aufgabe. Schreibfehler ist auch noch drin, falls das 
MCS51 sein soll.

schüler schrieb:
> ich hatte heute Prüfung und wollte nur wissen
> ob meine Lösung richtig ist

Dann poste sie doch mal.

: Bearbeitet durch User
von Stephan (Gast)


Lesenswert?

schüler schrieb:
> Funktion "High_Byte" die einen 8bit-Wert übergeben
> bekommt und nur die 4 höherwertigen Bits an Port A ausgibt. Die
> restlichen Bits am Port dürfen nicht geändert werden

01011100 schrieb:
> port a = high_byte & 11110000

ich kann zwar kein C aber Dein & mit F0 verändert doch das Low Nibble ?

von Stephan (Gast)


Lesenswert?

Stephan schrieb:
> Mov A,Port
> ANL A,0Fh
> Mov Port,A

shit, sollte F0sein.
Dann war mein Komentar zur C lösung auch falsch. Sorry

von schüler (Gast)


Lesenswert?

Also meine Lösung wäre:

void High_Byte (unsigned char wert)
{
  unsigned char high;

  high = (unsigned char) (wert>>4);
  high = (unsigned char) (wert<<4);

  PORTA |= wert;

}

von MaWin (Gast)


Lesenswert?

Baer schrieb im Beitrag #4865573:
> Bist du der Originalpsychopath oder eine Kopie?

Ich bin der originale MaWin.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Stephan schrieb:
> ich kann zwar kein C aber Dein & mit F0 verändert doch das Low Nibble ?

Beide angebotenen Codeschnipsel Lösungen waren falsch.

schüler schrieb:
> Also meine Lösung wäre:
>
> void High_Byte (unsigned char wert)
> {
>   unsigned char high;
>
>   high = (unsigned char) (wert>>4);
>   high = (unsigned char) (wert<<4);
>
>   PORTA |= wert;
>
> }

Und diese ist es auch. Du liest ja nicht von PortA, weisst also auch 
nicht was sich im Lownibble befindet.

: Bearbeitet durch User
von schüler (Gast)


Lesenswert?

Naja, schade dass sich manche von einer einfachen Frage im Forum gleich 
angepisst fühlen und es statt um Antworten dann nur noch um 
Beschimpfungen geht.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Das hat nichts mit angepisst zu tun. Aber du musst dein Hirn schon mal 
selber in Bewegung bringen, anstatt das andere tun zu lassen. Hier ist 
z.B. eine funktionierende Lösung:
1
void HighByte(uint8_t myByte) {
2
uint8_t save = PORTA & 0x0F;
3
myByte &= 0xF0;
4
PORTA = myByte | save;
5
}

: Bearbeitet durch User
von Pandur S. (jetztnicht)


Lesenswert?

Sowas kann man mit einem singlestep debugger nachvollziehen.

von MaWin (Gast)


Lesenswert?

schüler schrieb:
> Naja, schade dass sich manche von einer einfachen Frage im Forum gleich
> angepisst fühlen und es statt um Antworten dann nur noch um
> Beschimpfungen geht.

Wie wäre es, wenn er seine Lösung einfach mal ausprobiert hätte? Das 
wäre wohl zu einfach gewesen.
Mit einer anderen Lösung als seiner, die dann hier gepostet wird, kann 
er ja auch nicht erkennen, ob seine richtig ist.

von 01011100 (Gast)


Lesenswert?

Matthias S. schrieb:
> Das hat nichts mit angepisst zu tun. Aber du musst dein Hirn schon
> mal
> selber in Bewegung bringen, anstatt das andere tun zu lassen. Hier ist
> z.B. eine funktionierende Lösung:void HighByte(uint8_t myByte) {
>
> uint8_t save = PORTA & 0x0F;
>
> myByte &= 0xF0;
> PORTA = myByte | save;
> }

Man muss es auch extra schwer machen? ;)
Was sollte an meiner Lösung falsch gewesen sein?

Habe lediglich gezeigt wie man es Bitmaskieren soll.

von Stephan (Gast)


Lesenswert?

ANL FFh dann bleibt alles wie gewollt.

Nur geht das so einfach nicht weil nicht definiert ist wo der 
übergebenen 8 Bit Wert her kommt.
Ist es schon in A ?
kommt es mit einem anderen Register daher ?

von M. W. (rallini94)


Lesenswert?

1
 
2
3
void high_byte(byte x)
4
{
5
   unsigned uint8_t buf = 0;
6
7
   buf = PINA;         // alten wert einlesen
8
   buf &= 0x0F;        // oberes nibble löschen
9
   buf |= (x & 0xF0);  // oberes Nibbel von x einfügen
10
11
   PORTA = buf;
12
}


Um die Diskussion zu beenden und falls mich meine C-Kenntnisse gerade 
nicht enttäuschen, müsste das funktionieren

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

01011100 schrieb:
> Was sollte an meiner Lösung falsch gewesen sein?

Du löschst die unteren 4 Bits des Portes, die eigentlich erhalten 
bleiben sollen.

01011100 schrieb:
> port a = high_byte & 11110000

von S. R. (svenska)


Lesenswert?

schüler schrieb:
> Zum Thema fauler Schüler, ich hatte heute Prüfung und wollte nur wissen
> ob meine Lösung richtig ist.

Es gibt mehr als eine korrekte Lösung.

Poste deine Lösung und wir sagen dir, ob sie das tut, was du willst.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

S. R. schrieb:
> Poste deine Lösung und wir sagen dir, ob sie das tut, was du willst.

Hat er doch schon:
Beitrag "Re: Prüfungsaufgabe"

Und sie tut nicht das, was er wollte.

von Gu. F. (mitleser)


Lesenswert?

Sollte gehen.
1
void High_Byte (unsigned char wert)
2
{
3
  PORTA &= 0x0f;
4
  PORTA |= wert & 0xf0;
5
}

von Christian B. (luckyfu)


Lesenswert?

hat aber einen Nachteil: Für einen Taktzyklus (Wenn nicht gerade in dem 
Moment ein Interrupt zuschlägt, dann kann das auch deutlich länger 
dauern) werden die High Bytes low geschalten. Wenn das kein Problem ist 
ist diese Lösung ok. Wenn doch dann besser die mit Zwischenspeicherung.

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.