www.mikrocontroller.net

Forum: Offtopic Abitur-Klausur


Autor: L. G. (labetigu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

würde gerne eure Meinung hören, zu einer Aufgabe aus dem Zentralabitur, 
die ich ich am Mittwoch geschrieben habe.

Die Ausgangssituations ist folgende:

Ein Modelbahnmuseum hat eine Ausstellungsmodelbahn. Die einzelnen Loks 
haben einen Sender, der die Zugnummer sendet. Am Bereich wo Loks mit 
bestimmten Zugnummern nicht fahren dürfen ist ein Empfänger aufgebaut.
Das Signal ist in 10 Bit aufgeteilt und wird mit einem Takt von 100 Hz 
gesendet, also 10 ms pro einzelnem Bit.

[quote Originaltext der Aufgabe]
Mit Hilfe des 16 Bit Timers soll die Verzögerung von 10 ms
realisiert werden. Schreiben Sie eine Interrupt-Service-Routine (ISR),
die eine Zeitverzögerung von 10 ms realisiert. Beschreiben Sie, wie Sie
den Startwert des 16 Bit Zählers berechnen. In dieser Aufgabe soll nur
die ISR erstellt werden, die vollständige Funktion kennung_lesen() ist
nicht erforderlich.
[/quote]

Der Timer hat folgende Definitionen:
Ein Zählschritt benötigt exakt 1µs.
Bei Überlauf wird der Interrupt ausgelöst.
Es gibt ein Highbyte und ein Lowbyte, das einen neuen Höchstwert für den 
Timer einstellt.
Er kann nur vorwärts zählen.
Mit einem Bit wird der Timer an/ausgeschaltet und mit einem anderen Bit 
der Interrupt.

Ich für meinen Teil finde die Aufgabe falsch gestellt, aber bevor ich, 
dass an die Lehrer weitergebe, hätte ich gerne eure Meinung.

Meiner Meinung nach ist die ISR des Timers dafür da, um die einzelnen 
Bits der Zugnummer einzulesen.
Der Timer wird hierfür vorher schon auf die 10 ms eingestellt und nicht 
erst in der ISR, wie in der Aufgabe beschrieben wird.

Bin dankbar für jede Antwort.

Gruß

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...  Aufgabe aus dem Zentralabitur ...

Kannst du belegen, daß die Aufgabe aus dem Zentralabitur stammt?

Autor: L. G. (labetigu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein, ich habe keine Unterlagen darüber und werde auch keine bekommen 
(da ich im Moment noch nicht meinen Lehrer drauf ansprechen will).

Ich kann dir nur Beweisen, dass ich im Moment an einem Berufskolleg in 
NRW
Abitur mache und als LK Datenverarbeitungstechnik habe.

http://www.standardsicherung.nrw.de/abitur-bk/fach...

und wenn dir, dass nicht ausreicht kann ich notfalls auch noch mein 
letztes Zeugnis einscannen

wobei es tut eigentlich auch nix zur Sache ob es aus dem Zentralabitur 
ist oder? Entweder die Aufgabe ist falsch formuliert oder nicht.

Autor: A. N. (netbandit)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nun ja, wenn der Timer nicht automatisch nachgeladen wird (z.B. der 
Original 8051 16Bit Timer), dann muss dies in der ISR geschehen.

Autor: L. G. (labetigu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das müsste dann doch bei der Timer Definition stehen oder?

Beim MSP430 mit dem wir in der Schule gearbeitet haben, war dies nicht 
der Fall.

Nachtrag das Interruptbit wird automatisch zurückgesetzt beim Aufruf der 
ISR

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ein einfaches "Ja" oder "Nein" hätte mir gereicht. An deinem Zeugnis bin 
ich nicht interessiert. Scheint ja auch nicht so toll zu sein, wenn ich 
die gepostete Aufgabe und deine Einlassungen dazu lese.

EOP

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Meiner Meinung nach ist die ISR des Timers dafür da, um die einzelnen
>Bits der Zugnummer einzulesen.

Das kann man vielleicht machen, muss man aber nicht.
Es wäre sinnvoll, die Bits per ISR einzulesen, man kann es aber auch 
anders machen.
Ob das Problem nun mit ner Modelleisenbahn oder mit einer Schafherde zu 
tun hat, spielt doch gar keine Rolle.
Die Aufgabe betrifft einen Timer, der nach 10ms einen Überlauf hat und 
damit einen Interrupt auslöst. Mehr eigentlich nicht.
Das Drumherum ist nur "Verpackungsmaterial".

>[quote Originaltext der Aufgabe]
>Mit Hilfe des 16 Bit Timers soll die Verzögerung von 10 ms
>realisiert werden. Schreiben Sie eine Interrupt-Service-Routine (ISR),
>die eine Zeitverzögerung von 10 ms realisiert. Beschreiben Sie, wie Sie
>den Startwert des 16 Bit Zählers berechnen. In dieser Aufgabe soll nur
>die ISR erstellt werden, die vollständige Funktion kennung_lesen() ist
>nicht erforderlich.
>[/quote]

Klingt irgendwie nach einem einfach (interruptgesteuerten) Delay.
Der Vorteil dabei ist, dass dieses Delay immer 10ms dauert und scheinbar 
von keinem anderen Interrupt "gestört" werden kann, was bei einem 
schleifenbasierten natürlich passieren kann.

Autor: L. G. (labetigu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
STK500-Besitzer wrote:
>>Meiner Meinung nach ist die ISR des Timers dafür da, um die einzelnen
>>Bits der Zugnummer einzulesen.
>
> Das kann man vielleicht machen, muss man aber nicht.
> Es wäre sinnvoll, die Bits per ISR einzulesen, man kann es aber auch
> anders machen.
> Ob das Problem nun mit ner Modelleisenbahn oder mit einer Schafherde zu
> tun hat, spielt doch gar keine Rolle.
> Die Aufgabe betrifft einen Timer, der nach 10ms einen Überlauf hat und
> damit einen Interrupt auslöst. Mehr eigentlich nicht.
> Das Drumherum ist nur "Verpackungsmaterial".
>
>>[quote Originaltext der Aufgabe]
>>Mit Hilfe des 16 Bit Timers soll die Verzögerung von 10 ms
>>realisiert werden. Schreiben Sie eine Interrupt-Service-Routine (ISR),
>>die eine Zeitverzögerung von 10 ms realisiert. Beschreiben Sie, wie Sie
>>den Startwert des 16 Bit Zählers berechnen. In dieser Aufgabe soll nur
>>die ISR erstellt werden, die vollständige Funktion kennung_lesen() ist
>>nicht erforderlich.
>>[/quote]
>
> Klingt irgendwie nach einem einfach (interruptgesteuerten) Delay.
> Der Vorteil dabei ist, dass dieses Delay immer 10ms dauert und scheinbar
> von keinem anderen Interrupt "gestört" werden kann, was bei einem
> schleifenbasierten natürlich passieren kann.

Also meine Idee ist nicht falsch, dass hört sich schonmal gut an.^^

Der andere Lösungsvorschlag von dir ist für mich logisch verständlich.

Schade, dass ich keine Blick in die Musterlösung bekomme.

Autor: SuperUser (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die ISR die beim Overflow aufgerufen wird soll einfach den Timer wieder 
mit dem passenden Wert vorladen so dass er 10ms läuft...

Finde die Formulierung nicht falsch....

Ist in der Praxis natürlich ein Risiko da die Reaktonszeit auf den 
Interrupt unter 1µs sein muss weil sonst schon wieder Ticks verloren 
gehen.

Autor: Daniel -------- (root)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Alle 100Hz wird ein aus 10Bit bestehendes Signal gesendet.
Bitdauer ist dann 1ms, wie kommst du auf 10 ms?

Ob der Wert nachgeladen muss oder nicht, ist denke ich mal nicht so
wichtig wenn man seine Vermutung explizit in der Klausur darlegt!

Ich mache das oft so, wenn mir die Aufgabe suspekt erscheint, zB
anscheindend widersprüchliche oder unzureichende Angaben enthält.
Dann vermerke ich das in paar Sätzen. Auch bei Rechnungen, wenn ich
merke meine Einheiten oder der Wert nicht "passen", auch hinschreiben.

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Autor: Daniel -------- (root)
>Datum: 25.04.2009 02:09

Ich vermeide es inzwischen zu solchen Uhrzeiten im Forum zu posten - es 
kommt nur Mist dabei heraus...

Autor: Micky (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo labetigu.

Im Prinzip musst Du doch nur dafür sorgen, dass der Zähler startet, nach 
10ms einen Interrupt auslöst, und in der ISR dafür sorgen, dass die 
Geschichte weiter läuft. Von dem Scannen der übermittelten Daten bist Du 
doch laut Aufgabenstellung ausdrücklich entbunden.

Wie starte ich einen Zähler: Lade Endwert (10ms/1us=10000), setze 
Freigabe, setze IRQ-Enable.

Du musst also beschreiben, wie der Teilerwert berechnet wird, aufgeteilt 
auf zwei Bytes; das ist (war) aber wohl kein Problem.

In der ISR musst Du ggf. die Freigabebits nochmal setzen. Den Endwert 
des Zählers nochmal angeben ist eher unüblich.


Die einzige Unklarheit liegt IMHO nur darin, dass nicht eindeutig klar 
ist, was der Zähler macht wenn der Endwert erreicht ist.


Nochmal: die Abtastung des Signals wird nicht verlangt! Die wäre in 
dieser Ausführung auch garnicht machbar, denn nach dem Abtasttheorem 
muss mindestens mit der doppelten Frequenz der Signalfrequenz abgetastet 
werden. Aber zum Glück war das ja nicht gefragt :-)

Autor: Chris K. (chrisk86)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe die gleiche Klausur geschrieben (auch DVT LK, NRW) und finde an der 
Aufgabe überhaupt nichts uneindeutig.
Es geht hier nur darum, zu berechnen, mit welchen Werten der 16bit Timer 
initialisiert wird, damit er alle 10ms überläuft.
Die Angaben drumherum haben erstmal überhaupt NICHTS damit zu tun. Sie 
sollen nur rechtfertigen, warum du den Timer so programmieren sollst ;)

Also, 16bit => 2^16 Schritte maximal (65.536), 1 µS pro Schritt
10ms => 10.000 µS => es muss immer von 65.535 - 10.000 = 55535 
losgezählt werden.
In Hex ist das: 0xD8EF, also Highbyte auf 0xD8, Lowbyte auf 0xEF
Oder auch Highbyte auf (55535 >> 8) & 0xff und Lowbyte auf 55535 & 0xff.

Diesen Wert muss man innerhalb der ISR neu in die Register schreiben, da 
der Timer keinen autoreload hat.

Liebe Grüße,
Chris

Autor: L. G. (labetigu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
so hab ich es auch gemacht und lese in der ISR die einzelnen Bits ein.
Das Interruptbit wird ja automatisch bei Eintritt in die ISR gelöscht, 
laut Definition des Timers, sodass ich das da nicht zurücksetzen muss.

Aber laut Aufgabenstellung ist nur die ISR zu schreiben.

labetigu wrote:
>Schreiben Sie eine Interrupt-Service-Routine (ISR),
>die eine Zeitverzögerung von 10 ms realisiert.
>In dieser Aufgabe soll nur
>die ISR erstellt werden, die vollständige Funktion kennung_lesen() ist
>nicht erforderlich.

Und was soll man den dann in die ISR schreiben?

Wenn ich im Hauptprogramm den Timer initialisiere muss (nicht 
erforderlich, laut Aufgabenstellung), wüsste ich nicht mehr, was außer 
den oben genannten Sachen: Interruptbit zurücksetzen(nicht erfordelich, 
laut Definition des Timers) + Signal einlesen (nicht erforderlich, laut 
Aufgabenstellung) noch in die ISR schreiben könnte.

An das Abtasttheorem hab ich noch gar nicht gedacht. Und damit weiss ich 
gar nicht mehr was diese Timer-ISR in diesem Aufgabenbeispiel bewirken 
soll.

Autor: L. G. (labetigu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Chris K. wrote:
> Diesen Wert muss man innerhalb der ISR neu in die Register schreiben, da
> der Timer keinen autoreload hat.

verdammt^^

ok, thanks

stand das bei der Definition dabei?

Autor: Chris K. (chrisk86)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> so hab ich es auch gemacht und lese in der ISR die einzelnen Bits ein.
Da stand nirgendwo, dass wir etwas einlesen sollen. Da stand sogar 
extra, dass dies NICHT gemacht werden soll. Es ging einzig und allein um 
die Einstellung des Timers

> stand das bei der Definition dabei?
Meine mich daran zu erinnern. Hätte ich aber eh gemacht, weil der 16bit 
Timer unseres Controllers (AT89S52) keinen autoreload hatte. Außerdem 
wäre die Aufgabe sonst sinnlos gewesen ^^

Chris

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also mal erhrlich, was zu Kukuck soll an DER Aufgabenstellung schwierig 
sein und vor allem Abiturniveau?

Ne simple Prozentrechung für nen Timer und 0815 Code für en ISR?!?
Wir sollten dann vielleicht doch besser Computerinder einstellen, die 
sind wenigstens billiger, wenn gleich oft genauso schlecht qualifiziert.

MFG
Falk

Autor: L. G. (labetigu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Chris K. wrote:
>> stand das bei der Definition dabei?
> Meine mich daran zu erinnern. Hätte ich aber eh gemacht, weil der 16bit
> Timer unseres Controllers (AT89S52) keinen autoreload hatte. Außerdem
> wäre die Aufgabe sonst sinnlos gewesen ^^
>
> Chris

unser microcontroller leider nicht. (scheiß automatisierung^^)

scheiße^^

damit war diese aufgabe auch einfach^^
danke, für die auflösung, in meiner klasse hat es damit glaub ich keiner 
richtig :-(

Autor: Arc Net (arc)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Chris K. wrote:
> Also, 16bit => 2^16 Schritte maximal (65.536), 1 µS pro Schritt
> 10ms => 10.000 µS => es muss immer von 65.535 - 10.000 = 55535
> losgezählt werden.
> In Hex ist das: 0xD8EF, also Highbyte auf 0xD8, Lowbyte auf 0xEF
> Oder auch Highbyte auf (55535 >> 8) & 0xff und Lowbyte auf 55535 & 0xff.

Klassischer Fehler...
Beispiel Overflow alle 10 * 1/f.
65535 - 10 = 65525
0  65525                     
1  65526                      
2  65527                      
3  65528
4  65529
5  65530
6  65531
7  65532
8  65533
9  65534
10 65535
11 0 bzw. Overflow 
oder 65536 - 10

Autor: Chris K. (chrisk86)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Klassischer Fehler...
Cool, in meiner Lösung habe ich auch mit 65.536-10.000 = 55.536 = 0xD8F0 
gerechnet. Hatte aber im Nachhinein gedacht, es wäre falsch gewesen.

Damit habe ich dann doch die volle Punktzahl für diesen Teil =)

Chris

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, Yahoo oder Facebook? Keine Anmeldung erforderlich!
Mit Google-Account einloggen | Mit Yahoo-Account einloggen | Mit Facebook-Account einloggen
Noch kein Account? Hier anmelden.