Forum: Mikrocontroller und Digitale Elektronik Taster entprellen // Techniker Abschluss // Quelltext verstehen und Lösung


von Bambi (Gast)



Lesenswert?

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.

von Noch einer (Gast)


Lesenswert?

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 ?

von Matthias K. (mkeller)


Lesenswert?

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...

von Bambi (Gast)


Lesenswert?

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?

von hc (Gast)


Lesenswert?

Bei der Formatierung und der Schriftart des SourceCodes bekomme ich 
Augenkrebs...

Mit so was muss sich ein angehender Techniker rumschlagen?

?

Ernstgemeint...

von Bambi (Gast)


Lesenswert?

Ja mit sowas muss ich mich rumschlagen.
Mir bleibt nunmal nichts anderes übrig. =(

von Darth Moan (Gast)


Lesenswert?

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
...

von Darth Moan (Gast)


Lesenswert?

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
...

von hc (Gast)


Lesenswert?

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.

von Bambi (Gast)


Lesenswert?

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?

von Noch einer (Gast)


Lesenswert?

> 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.

von Bambi (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.