Hallo zusammen. Bin gerade dabei, für meine Abi-Klausur in E-Technik zu lernen. Leider Gottes gehört da auch C-Programmierung zu. Habe mir jetzt alte Abi-Klausuren rausgesucht und versuche diese zu lösen. Allerdings bin ich gerade beim Punkt C-Programmierung des Mikrocontrollers angekommen und bin am verzweifeln. Also folgendes: Für die Interruptserviceroutine (ISR) soll der Timer 0 als 16-Bit Timer verwendet werden. Gehen Sie im Folgenden davon aus, dass der Takt des verwendeten Mikrocontrollers den Timerstand (TH0, TL0) pro Sekunde um eine Million erhöht. - Berechnen Sie, auf welche Werte TH0 und TL0 gesetzt werden müssen, wenn der Schrittmotor in 100ms für eine Umdrehung 200 Schritte benötigt. (In der Aufgabe geht es um die Regluierung der Luftzufuhrt eines Ofens, die mit Hilfe eines Schrittmotors geregelt werden soll!)
Erstmal Textaufgabe zerlegen, d.h. - Wie lange dauert ein Takt vom T0? - Wie lange muß ein Schritt des Schrittmotors dauern? - Wieviele Takte muß T0 dann für einen Schritt des Schrittmotors laufen?
- Wie lange dauert ein Takt vom T0? - Wie lange muß ein Schritt des Schrittmotors dauern? - Wieviele Takte muß T0 dann für einen Schritt des Schrittmotors laufen? 1. Ein Takt von T0 dauert 1 mikroSekunde (Da TH0 und TL0 jeweils um 1 Million pro Sekunde erhöht werden) 2. Ein Schritt des Motors dauert 0,5 ms (Da 200 Schritte in 100ms. Also 100ms / 200 Schritte) 3. 500 Takte pro Schritt (0,5 ms / 1 mikrosekunde) ?
Das sieht doch alles gut aus. Und was fehlt dir jetzt noch? Die 500 ist nicht mehr als 8-Bit Zahl darstellbar, also reicht ein 8-Bit Timer alleine dafür auch nicht aus. Nebenbei: Komische Formulierung der letzten Teilaufgabe > - Berechnen Sie, auf welche Werte TH0 und TL0 gesetzt werden müssen, > wenn der Schrittmotor in 100ms für eine Umdrehung 200 Schritte benötigt. Da könnte man glatt ins Grübeln kommen, wieviel Schritte der Schrittmotor für eine Umdrehung in 200 ms braucht ;-) Lehrer ....
In der Aufgabe steht ja, ein 16-bit Timer. Also haben wir 2^16 Zählschritte maximal, ergibt also 65.536. Dann: 65.536 - 500 = 65.036 -> Also der Nachladewert! Mit Taschenrechner umgewandelt: 0xFE0C Ahh :) Besten Dank ! :) Hab für die Berechnung nur eine Formel bekommen und bisher nur damit gerechnet. So scheint mir die Berechnung auch viel logischer und einfacher ! Super! P.s.: Die Formulierung kommt mehr oder weniger vom Schulministerium. Aber die haben ja generell ein bisschen Ahnung von der Realität. Bin auch 2 -3 mal über die Formulierung gestolpert und musste mir das öfters durchlesen.
So ich bins nochmal. Im nächsten Schritt soll man das beigelegte Mikrocontroller-Programm analysieren. Hierbei habe ich allerdings auch so meine Probleme, da es dabei Befehle gibt, die ich noch nie gesehen, geschweige denn angewandt habe. if ((P1&0x01) !=0) also mit dem P1&0x01, wird ja abgefragt ob P1 gerade 0x01 beträgt. Aber was soll das "!=0" ? P1=P1 | 0x02 ; mit diesen beiden zeilen weiß ich auch rein garnichts P1=P1 & 0xFD; an zu fangen
Oh Sorry, die Formatierung war etwas daneben. P1=P1 | 0x02 ; P1=P1 & 0xFD; Gemeint waren diese beiden Zeilen. In der 2. könnte ich höchstens vermuten, dass abgefragt wird, ob P1 den Wert 0xFD hat?
Azurox schrieb: > Besten Dank ! :) Hab für die Berechnung nur eine Formel bekommen und > bisher nur damit gerechnet. So scheint mir die Berechnung auch viel > logischer und einfacher ! Super! Ja, Formeln sind zwar praktisch, wenn man das ganze kompakt aufschreiben will, fördern aber nicht unbedingt das Verständnis. Außerdem können ohne das Verständnis leicht Fehler einschleichen. Zu deinen Portabfragen: Guck mal unter http://de.wikibooks.org/wiki/C-Programmierung bei Referenzen / Ausdrücke und Operatoren und dort unter Bitmanipulation > if ((P1&0x01) !=0) also mit dem P1&0x01, wird ja abgefragt ob P1 > gerade 0x01 beträgt. Aber was soll das "!=0" ? Nicht ganz. Mit P1 & 0x01 wird ja erstmal eine bitweise UND Operation durchgeführt, d.h. das unterste Bit wird herausmaskiert. z.B. P1 binär 01100110 Maske 00000001 & -> 00000000 oder P1 01101011 Maske 00000001 & -> 00000001 Mit ... !=0 wird dann geprüft, ob das Ergebnis ungleich Null ist. Insgesamt wird also geprüft, ob das unterste Bit von P1 gesetzt ist. Die anderen Bits spielen durch die Maskierung keine Rolle. Bei diesen beiden Zeilen P1=P1 | 0x02 ; P1=P1 & 0xFD; läuft es entsprechen. Im ersten Fall findet eine bitweise ODER statt, im zweiten eine Maskierung mit 0xFD. Das Ergebnis aber nicht für einen Vergleich verwendet, sondern als neuer Wert in P1 geschrieben.
Wow, super! Dank Dir :) Hast mir wirklich weiter geholfen! Jetzt ergibt das Programm auch einen Sinn ;)
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.