Member since May 2013
67 posts
|
![]()
Subject: Klausur 2013-03
Hi,
habe mich mal an der Aufgabe versucht. Irgendwie ist mein Code ziemlich lang geworden und ich habe das Gefühl, dass ich ziemlich kompliziert denkend an die Sache rangegangen bin. Mag das vielleicht mal jemand überprüfen? Liebe Grüße ingonör
|
Member since May 2011
41 posts
|
![]()
Hi,
die Idee is grundsätzlich gut, aber ein paar Sachen gibts zu kritisieren: Zeile 17: schau dir nochmal an, wie man eine Interruptbehandlungsfunktion (Interrupt Service Routine, ISR) anlegt. Du liest nie einen tatsächlichen Wert für "kipp" vom Schalter ein. In deinem Fall fährt das Tor immer bis ganz nach oben/unten und wartet dann wieder. Die Richtung sollte aber (auch während der Bewegung) änderbar sein). Frag das "PIN"-Register des entsprechenden Ports an der passenden Stelle ab. In Zeile 49 bzw. 54 ist "schalter" bei dir immer 0, da du es in Zeile 35 auf diesen Wert setzt. Außer jemand drückt zwischen den beiden Zeilen grade den Schalter, aber das ist wohl ein Spezialfall... Zeile 63: warum +1? Zeile 64: warum setzt du das Register erst auf 0, wenn du des danach eh überschreibst? Zeile 68/70: vorsicht, oben ist 0, unten 1023 (hat mich auch ziemlich verwirrt) Zeile 70: wann wechselt dein "sensor" auf den Wert 1? nicht erst beim adc-wert 0. Zeile 74: fehlt da ne Tilde ~ ? Zeile 84/85: warum setzt die Register so? Warum nicht alle auf Ausgang, alle mit Vcc? Zeile 87-93: vorsicht, du überschreibst die gesamten Register, egal, was vorher an den anderen Positionen stand. Das ist nicht gut... Zeile 95: Ich glaub, in der Angabe steht, dass der Taster gegen Masse verbindet, also fallende Flanke. Der Rest sieht auf den ersten Blick ganz gut aus ![]() |
Member since May 2013
67 posts
|
![]()
Uff, dann erst mal vielen Dank für die gründliche Korrektur!!! Ich gehe Schritt für Schritt darauf ein.
Ist das in meinem Fall nicht egal, ob kipp aus PORTD abgefragt wird? Ich gehe Initial ja davon aus, dass der Kippschalter auf "RUNTER" steht (s. Aufgabenstellung). Und in der zweiten while Schleife (nun ab Zeile 46) prüfe ich ja, ob einerseits der Kippschalter betätigt worden ist und in welche Richtung das Tor vorher fahren sollte (durch Abfragen von 'kipp'). Damit müsste es doch möglich sein, während des Betriebs die Richtung umkehren zu können oder nicht? Das müsste doch auch wieder OK sein. Er wurde betätigt und jetzt geht es los. Innerhalb der zweiten while-Schleife kann der Benutzer dafür sorgen, dass sich die Richtung umkehrt. Um Zahlen zw. 1 und 8 zu erzeugen. Und um die erste LED zu aktivieren, gilt doch PORTC = (1 << 1); oder nicht?Habe jetzt die Position der Abfrage verändert und prüfe nun, ob 'sensor == 1023'. Das sollte passen oder? Eigentlich nicht, denn ich will ja Pin 1 auf 0 setzen, aber Pin 0 auf dem Wert lassen, auf dem er vorher war. Was ist daran jetzt falsch? Habe ich in der Übung auch so gemacht. Alles auf Ausgang und, da Active Low, sollte überall erst mal eine 1 stehen. Ok, habe es nun geändert. Aber eigentlich kann mir das in der Klausur doch egal sein oder nicht? Ich soll ja von keinem Initialen Zustand der Hardware-Register ausgesehen. Danke! Total übersehen!!! Jo, wie sieht es denn jetzt allgemein aus?
|
Member since May 2011
41 posts
|
![]() Zum einen steht der aktuelle Wert nicht in PORTD, sondern in PIND und zum anderen könnte es ja auch passieren, dass jemand zwei mal hintereinander auf die "runter"-taste des Schalters drückt. Bei dir würde sich trotzdem die Richtung ändern, oder? Genauso am Anfang. Wenn das Tor bereits unten ist und jemand nochmal auf "runter" drückt, läuft das Tor trotzdem nach oben los. Ah, ja, wenn mans so sieht, ist das okay:) um die erste LED zu aktivieren ja. Die Sprache C fängt aber bei 0 zum zählen an. Also ist die "unterste" LED die nullte LED. D.h. dein Wertebereich geht von (1<<0) bis (1<<7). Mal dir das am besten mal auf Papier auf, dann siehst du sofort, was passiert, wenn du eine 1 um null shiftest und was passiert, wenn du sie in einer 8-bit-variable um 8 shiftest. jop, besser:) ah, ich dachte, du willst pin1 auf 0 setzen. So wie du das aktuell machst, setzt du aber die restlichen bits (2-7) auch auf null. und auch hier weißt du nicht, was dranhängt, ist also nicht gut...die könnten irgendwas angeschlossen haben, von dem du nicht willst, dass es auf Masse gelegt wird. Also Register, an denen du nicht die komplette Pinbelegung kennst immer so bearbeiten, dass die unbekannten Pins nicht verändert werden. Bits auf 0 setzen immer mit &=~(1<<n), auf 1 immer mit |=(1<<n), wechseln immer mit ^=(1<<n), wenn du nur das n-te Bit verändern willst. hm..ich hätt mir das bitmuster anschaun sollen, dass 0x7f liefert, dann wäre meine Antwort gleich deutlicher ausgefallen. Pins 0 bis 7 sind 8 Pins. Du setzt aber nur die ersten sieben davon auf 1 (Pin 0 bis Pin6). Das richtige Bitmuster für acht Einsen wäre 0xff. Der Rest passt dann. Hier ist das Überschreiben des gesamten Registers okay, da du weißt, wie das komplette Register belegt ist. Nein, kann dir nicht egal sein. "kein initialer Zustand" heißt nur, dass du nicht weißt, welcher Wert vorher in dem Registert drin war. Vielleicht hat den jemand vorher aus guten Gründen auf 1 gesetzt (z.B. im Startup-Code) und will nicht, dass du das jetzt überschreibst. Beispiel: Vielleicht hängt einfach nur eine active-high "Betriebsbereit"-LED dran, die beim einschalten des µC angeht und dann ausgehen würde, sobald du ne 0 an die Stelle schreibst.. ja, Angabe gründlich lesen, bringt viele Punkte;) Jetzt hast du aber das ISC00 vergessen. Hier greift der Satz "kein initialer Zustand", d.h. du weißt nicht, ob vorher an der Stelle eine 0 stand, also musst du diese auch noch explizit reinschreiben.
Was mir grad noch einfällt: Die LEDs solltest du am Schluss wieder ausschalten ![]() |
Member since May 2013
67 posts
|
![]() Wie kann man denn bei einem Kippschalter zwei mal auf "runter" drücken? Der kennt doch nur rauf ODER runter. Ich könnte ihn höchstens mal ganz schnell auf rauf verschieben und dann gleich wieder auf runter. Aber das wird ja so gesehen bei mir abgefangen. Ist ja kein Taster, sondern ein Kippschalter. Laut Angabe. Ok, also '+1' rausgeschmissen. Toll, danke für die gute Zusammenfassung! Schalte den Motor nun über ^= aus.
Upps, verzählt. Natürlich 0xff!
Korrigiert!
Natürlich! ![]() Puh, also in der Klausur hätte ich das ja mal echt verkackt! ![]() |
Member since May 2011
331 posts
|
![]() Hmm, es war wohl ein Kipptaster gemeint (Für Informatiker ist das alles das gleiche ![]() ![]() |
Member since May 2013
67 posts
|
![]()
Oha, das wäre aber echt ein Problem, wenn da Kippschalter steht und ein Taster gemeint ist. Wenn ich Maschinenelemente berechne, steht da auch nicht: "Berechnen Sie den Bolzen auf Dauerfestigkeit!" und am Ende war aber eine Schraube gemeint. Na ja, irgendwie fand ich die gate Aufgabe nicht so dolle. In der Klausur hätte es mich da ganz schön zerlegt. Hoffe der safe (s. anderer Thread) ist mir nun besser gelungen. |
Member since May 2011
41 posts
|
![]() Joar, die Aufgabe war nicht so optimal gestellt... |
Member since May 2011
331 posts
|
![]()
ingnör: Da sind einige Aufgaben dabei die nicht sehr gut gestellt sind. Das ist halt nicht unproblematisch wenn Informatiker versuchen für nicht-Informatiker anschauliche Aufgabenstellungen zu entwerfen. In sofern hinkt ja auch dein Vergleich mit ME ein wenig. Aber ich glaube irgendwelche Akademischen aufgaben wäre auch nicht besser.... Aber im Zweifel für den Angeklagten - Mit der Begründung, dass da Schalter steht und dieser ja nur zwei Zustände haben kann, hättest du wohl deine Punkte bekommen.
|
Member since May 2013
67 posts
|
![]()
Hurra! ![]() |
Member since Oct 2010
76 posts
|
![]()
In reply to post #3
Was macht eigewntlich folgende Zeile?
Ist das eine if-Abfrage inklusive Veränderung des Status von kipp?
Muss mann eigentlich gegebene Makros benutzen? Ich habe zu spät gesehen, dass es hier "HOCH" und "RUNTER" gibt. Ich habe immer PORTD an den Stellen 3 und 4 ausgelesen um an den Zustand des Schalters zu kommen. Wofür waren die also gedacht? |
Member since May 2013
67 posts
|
![]()
Sozusagen, ja! Es handelt sich hier bei um einen bedingten Ausdruck. |
Member since Oct 2010
76 posts
|
![]()
Also in Langform:
|
Member since May 2013
67 posts
|
![]()
Exakt!
|
Powered by the Unclassified NewsBoard software, 20110527-dev,
© 2003-8 by Yves Goergen