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ß
... Aufgabe aus dem Zentralabitur ... Kannst du belegen, daß die Aufgabe aus dem Zentralabitur stammt?
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.php?fach=5 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.
Nun ja, wenn der Timer nicht automatisch nachgeladen wird (z.B. der Original 8051 16Bit Timer), dann muss dies in der ISR geschehen.
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
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
>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.
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.
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.
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: 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...
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 :-)
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
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.
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?
> 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
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
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 :-(
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
1 | 0 65525 |
2 | 1 65526 |
3 | 2 65527 |
4 | 3 65528 |
5 | 4 65529 |
6 | 5 65530 |
7 | 6 65531 |
8 | 7 65532 |
9 | 8 65533 |
10 | 9 65534 |
11 | 10 65535 |
12 | 11 0 bzw. Overflow |
oder 65536 - 10
>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? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.