Prüfungsaufgabe

Gast #4865518
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 :-)
Gast
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.
Gast
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.
Gast
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;

}
(Firma: matzetronics)
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.
Gast
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.
(Firma: matzetronics)
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
}
Gast
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.
Gast
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.
Gast
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
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.

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.