Hallo. Ich habe bald meine Technikerprüfung und schaue mir momentan alte Prüfungen an und dabei bin ich auf folgende Aufgabe gestoßen. Ich verstehe dort den Quelltext nicht so richtig und wie man auf die richtige Lösung kommt. Ich wäre euch sehr dankbar wenn mir jemand helfen kann. Aufgabe II.A.2 Beim Drücken der Tastenkappen können die dahinterliegenden Tasten „prellen“. Die Tasten sollen durch Software entprellen werden. Dazu wird eine Software benutzt, deren Quelltext in Abb.2 beschrieben ist. Beim Betätigen einer Taste wird der Anschlüssen mit dem Bezugspotential der Schaltung verbunden. Die zugehörige Funktion uint8_t entprellen() wird jede Millisekunde durch das „Betriebssystem“ des Mikrocontrollers gestartet. Analysieren Sie den zeitlichen Verlauf des Wertes in der Variablen „TastenStatus“, indem Sie die fehlenden Werte in der Zeile „Tastenstatus“ in Tabelle 1 ergänzen. Sie Brauchen jeweils nur die 4 niederwertigsten Bits des Wertes anzugeben. Bei jedem Aufruf von „entprellen()“ nimmt die Variable „temp“ den nächsten Wert aus der zugehörigen Zeile der Tabelle an. (Die Werte der Variablen temp werden über die Eingänge von PortC gelesen und anschließend negiert. Hinweis: Zum Startzeitpunkt t=0 haben alle Variablen den Wert 0. Die Variablen „temp“ und „Tastenstatus“ sind 8-Bit-Variablen. Für diese Aufgabe reicht es, die vier niederwertigsten Bit zu kennen, deshalb werden in der Zeile „temp“ nur die 4 niederwertigsten Bits beschrieben. Sie können selbstverständlich die 4 fehlenden führenden Nullen nach Bedarf ergänzen.
Da fehlt doch was. Das Programm schaut nur, ob die Tasten gedrückt wurden. Nicht aber, ob sie wieder losgelassen werden. Dadurch wird das Zaehler[i]=0 ziemlich unsinnig. Wo liegt das Problem? Findest du das Programm unsinnig? Oder fehlen dir die Grundlagen wie ~PINC oder 1<<i ?
Was genau verstehst du denn nicht? Oder habe ich deine Frage überlesen? Es ist doch eine sehr übliche Routine zum Entprellen. Die findest du auch sehr gut erklärt hier auf MC.net in den Artikeln. Dort ist der Quelltext aber sehr viel trickreicher geschrieben. Deiner hier funktioniert und ist gut zu lesen aber eben auch nicht besonders performant...
Die Funktion zum Entprellen wird ja jede Millisekunde neu gestartet und dann wird immer diese for Schleife abgearbeitet. Unzwar immer bis die Variable i den Wert 8 erreicht oder? Verstehe ich das soweit richtig? Danach diese if Abfrage verstehe ich nicht so genau. If((Temp & (1<<i)) != 0) Meiner Meinung nach ist diese if Abfrage ja immer erfüllt weil ich die Temp Variable ja mit der 1<<i verknüpfe und dann schaue ob dieser Wert dann ungleich 0 ist oder? Ist der Wert nicht immer ungleich 0?
Bei der Formatierung und der Schriftart des SourceCodes bekomme ich Augenkrebs... Mit so was muss sich ein angehender Techniker rumschlagen? ? Ernstgemeint...
Ja mit sowas muss ich mich rumschlagen. Mir bleibt nunmal nichts anderes übrig. =(
Bambi schrieb: > If((Temp & (1<<i)) != 0) > > Meiner Meinung nach ist diese if Abfrage ja immer erfüllt weil ich die > Temp Variable ja mit der 1<<i verknüpfe und dann schaue ob dieser Wert > dann ungleich 0 ist oder? Moin, Bitte nochmal den Unterschied zwischen einer UND- und einer ODER- Verknuepfung vergegenwaertigen. Dann sollte das klar sein. & ist ein bitweises UND && ist ein logisches UND | ist ein bitweises ODER || ist ein logisches ODER Das (1 << i) wird ja in den durchlaefen zu: 0: 0b00000001 1: 0b00000010 3: 0b00000100 4: 0b00001000 ...
Darth Moan schrieb: > Das (1 << i) wird ja in den durchlaefen zu: > 0: 0b00000001 > 1: 0b00000010 > 3: 0b00000100 > 4: 0b00001000 > ... Es muss natuerlich heissen: 0: 0b00000001 1: 0b00000010 2: 0b00000100 3: 0b00001000 ...
Das ganze erstmal in einen ordentlichen Editor kopieren, mit Syntax-Highligtning... und mal vernünftig Formatieren. Dann wird es wahrscheinlich schon auf den zweiten Blick :-) einfach verständlich.
Ja okay das ist jetzt schon mal klar geworden. Danke. Wann genau ist die if Abfrage denn jetzt wahr und wann springt der weiter zur Else Funktion? Selbst wenn Temp komplett 0 ist und ich das mit dem 1<<i verknüpfe ist das ja ungleich 0 oder? Also was für einen Wert muss Temp haben damit er die if Abfrage überspringt?
> Selbst wenn Temp komplett 0 ist und ich das mit dem 1<<i verknüpfe ist > das ja ungleich 0 oder? Nein. Da musst du wohl noch mal das Kapitel "Bitweise Verknüpfung" durcharbeiten. > Also was für einen Wert muss Temp haben... Diese Frage musst du selbst beantworten können. Falls du ohne diese Grundlagen durch die Prüfung kommen solltest, hätte dein Titel etwa so viel Wert, wie Loriots Jodeldiplom.
Also ich habe es mir nochmal aufgeschrieben und auf dem Papier mal bitweise mit dem & verknüpft. Es ist jetzt klar geworden wann die if Abfrage ungleich 0 ist. Wie folgende Abfrage: Temp = 0b00000000 Und 0b00000001 Gleich 0b00000000 Also ist die if Abfrage dann nicht ungleich 0 also springt er weiter. Alles klar. Danke für eure Hilfe. Ich stand da irgendwie am Schlauch. =(
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.