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
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
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.
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.?"
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.
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.
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
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 ?
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
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; }
Baer schrieb im Beitrag #4865573:
> Bist du der Originalpsychopath oder eine Kopie?
Ich bin der originale MaWin.
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
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.
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
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.
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.
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 ?
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
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
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.
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.
Sollte gehen.
1 | void High_Byte (unsigned char wert) |
2 | {
|
3 | PORTA &= 0x0f; |
4 | PORTA |= wert & 0xf0; |
5 | }
|
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.