Hallo, ich bin neu in der Mikrocontroller-Programmierung, deshalb habe ich einige grundlegenden Fragen. Ich soll in Assembler ein Programm schreiben, welches die Suchzeit eines bestimmten Wertes in einem einem Array bestimmt. Zur Verfügung steht mir ein Mikrocontroller mit einem internen Takt von 50 MHz. Der Interrupt Timer, mit welchem ich arbeite löst eine Unterbrechung alle 30ms aus. Soweit die technischen Daten - aber wie kann ich das Ganze realisieren? Bisher bin ich soweit gekommen: 1. Interrupt Timer initialisieren - ist klar 2. Ich habe den Timer vor und nach einem nop ausgelesen und erhalte eine Differenz von 117184 Was fange ich mit dieser Differenz von 117184 an? Oder anders gefragt: was sagt diese Zahl aus? Sind es ms? Oder doch Kartoffeln ;-)? Bin für jede Hilfe dankbar! Grüße Patrick
Patrick schrieb: > 1. Interrupt Timer initialisieren - ist klar > 2. Ich habe den Timer vor und nach einem nop ausgelesen und erhalte eine > Differenz von 117184 > Was fange ich mit dieser Differenz von 117184 an? Oder anders gefragt: > was sagt diese Zahl aus? Sind es ms? Oder doch Kartoffeln ;-)? Hängt von der Initialisierung des Timers ab.
Jetzt mal vom Assembler-Krams abgesehen, ein Tipp: Falls es vorkommen kann, dass der Wert gar nicht vorhanden ist und falls deine Vorgaben es zulassen, mach dein Array um ein Element länger, schreibe den gesuchten Wert an die erste Stelle und durchsuche das Array von hinten. Dann brauchst du nicht in jedem Schritt prüfen, ob du dich noch innerhalb des Arrays befindest.
Patrick schrieb: > 2. Ich habe den Timer vor und nach einem nop ausgelesen und erhalte eine > Differenz von 117184 > Was fange ich mit dieser Differenz von 117184 an? Oder anders gefragt: > was sagt diese Zahl aus? Sind es ms? Oder doch Kartoffeln ;-)? Das ist 1 Mal NOP Befehl und 1 Mal die nötigen Befehle um Timer auszulesen, ev. noch die Zeit um den zuerst ausgelesenen Timerwert in eine Variable reinzuschreiben. Eine Differenz von 117184 dafür ist sehr unwahrscheinlich, entweder machst du noch etwas dazwischen oder du hast falsch gemessen. Bei 50MHz und Vorteiler 1:1 wären das ganze 2.34368 ms. Was ist das überhaupt für ein Mikrocontroller ?
Patrick schrieb: > Was fange ich mit dieser Differenz von 117184 an? Oder anders gefragt: > was sagt diese Zahl aus? Sind es ms? Oder doch Kartoffeln ;-)? Diese Zahl entspricht der Anzahl an Takte die vergangen sind, in Abhaengigkeit von dem Vorteiler des Timers. Hat der Timer einen Vorteiler von 1, und die Differenz betraegt 2, so sind 2 Takte vergangen. 2 Takte bedeutet: 2 * 1/50MHz = Vergangene Zeit => 40ns Hat der Timer z.B. einen Vorteiler von 8, und die Differenz betraegt 2, so sind 16 Takte vergangen: 16 * 1/50MHz => 320ns
Patrick schrieb: > Hallo, > > ich bin neu in der Mikrocontroller-Programmierung, deshalb habe ich > einige grundlegenden Fragen. > Ich soll in Assembler ein Programm > schreiben, welches die Suchzeit eines bestimmten Wertes in einem einem > Array bestimmt. Ich interessiere mich dafür, in welcher Situation Du konkret bist. Studierst Du Informatik? Lernst Du einen Beruf? Willst Du das programmieren als Hobby betreiben? Das Wörtchen "soll" deutet auf eine Ausbildung hin. > Zur Verfügung steht mir ein Mikrocontroller mit einem internen Takt von > 50 MHz. Der Interrupt Timer, mit welchem ich arbeite löst eine > Unterbrechung alle 30ms aus. Soweit die technischen Daten - aber wie > kann ich das Ganze realisieren? Bisher bin ich soweit gekommen: > 1. Interrupt Timer initialisieren - ist klar > 2. Ich habe den Timer vor und nach einem nop ausgelesen und erhalte eine > Differenz von 117184 > Was fange ich mit dieser Differenz von 117184 an? Oder anders gefragt: > was sagt diese Zahl aus? Sind es ms? Oder doch Kartoffeln ;-)? Was war denn Deine Absicht, als Du die Differenz des Timerstandes bei Ausführung eines NOPs gebildet hast? Eine bestimmte Timerdifferenz sagt allein noch nichts aus, solange man nicht weiß, wie schnell der Timer getaktet wird, auch wenn man weiß, welche Befehle zwischen dem loslaufen des Timers und dem erneuten auslesen ausgeführt wurden. Ausserdem: Der "interne Takt" eines uC muss nicht zwingend auch der Timertakt sein, oder der mit dem Befehle ausgeführt werden (mal davon abgesehen, das Befehle meist mehrere Takte benötigen um ausgeführt zu werden). So etwas musst Du für Dich klarstellen, damit Du mit den Ergebnissen etwas anfangen kannst. Und damit wir Deine Gedankengänge beurteilen können, müssten wir auch wissen, was für eine CPU Du genau verwendest. Es ist auch nicht ungewöhnlich, dass man den Zusammenhang zwischen Taktquelle und "internem Takt" irrtümlich falsch beurteilt. Damit wir das beurteilen können, müsstest Du auch Angaben zu der Takterzeugung machen. Die Aufgabenstellung bedeutet meiner Ansicht nach, dass Du die Differenz zwischen dem Timerzählerstand unmittelbar vor Beginn des Suchvorgangs und Stand unmittelbar nach dem auffinden des gesuchten Elements benötigst; aber nicht die Zeit, die zum ausführen eines NOPs benötigt wird. Dazu kommt, dass bei längeren Zeiten, der Timer überlaufen wird; das ist der Grund warum man in Timerinterrupts eine zusätzliche Variable hochzählt - man erweitert den Zählbereich des Timers.
Vielen, vielen Dank euch allen für die Erklärungen - ihr seid super! Ich habe zwar das Problem noch nicht gelöst, aber da muss ich jetzt selbst dran arbeiten. Für das Verständnis habt ihr mich aber einen Riesenschritt weitergebracht! Daumenhoch @Theor: es ist weder beruflich noch studiere ich. Ich versuche mich einfach in die Mikrokontroller-Programmierung einzuarbeiten, persönliches Interesse, und dafür habe ich mir gebraucht ein kleines "Spielzeug" gekauft. Die Aufgabenstellung habe ich aus dem Internet.
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.