Schreiben Sie eine delay-subroutine?
Schreiben brauche ich ein delay-subroutine. Es sollte die Verzögerung etwa 1 Sekunde. Es werden für die 8051-Umgebung, DS89C430 micrcontroller ( 11.0592 MHz Quarz). Wie kann ich dies Schreibe Unterprogramm?
Delay1sec: ...
....
...
....
...
InformationsquelleAutor Yunus Eren Güzel | 2011-02-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zur genauen 1 Sekunde Verzögerung, das funktioniert auch bei interrupts, müssen Sie einen hardware-timer, kein software-timer. Ich würde Ihnen raten, nutzen Sie die verfügbaren on-board-Timer vorgeschlagen von Jerry Sarg.
Hier ist ein Ansatz mit einem integrierten timer und zählen der timer überläuft. Seit dem läuft der timer wird immer dann aktualisiert, 12 Taktzyklen standardmäßig, um die Kompatibilität mit den 8051, wird es aktualisiert, 921,600 mal pro Sekunde. Ein bit der Multiplikation sagt uns, dass es dauert 50 ms zu zählen von 0 bis 46080, die sagt uns auch, dass wir beginnen können, eine 16-bit-timer bei 19456 und warten, bis es zu einem überlauf 20-mal, um die Verzögerung für 1 Sekunde*.
Den code könnte in etwa so Aussehen:
Note: Overhead-Anweisung Ausführungszeit ausgeschlossen Beispiel.
* Wie die Mathe-Panne:
11059200 /12 = 921600
0.05 * 921600 = 46080
65536 - 46080 = 19456 = 0x4C00
Software-delay-Schleifen Abfall Prozessor-Zeit und sind durch interrupts gestört. , Die being said, Sie können es tun, die hardcoded Weg.
Einen Ansatz beinhaltet, zu wissen, die Anzahl der Taktzyklen pro Maschinenzyklus und die Anzahl der Maschinen-Zyklen verschiedene Anweisungen zur Ausführung. Nach der Datenblatt, die DS89C430 in der Regel verwendet eine Maschine Zyklus für jeden Befehl byte und erfordert einen Zyklus für die Ausführung. Die Anzahl der Zyklen für jeden der Unterricht in der Ultra-High-Speed-Flash-Microcontroller User ' s Guide.
Da der crystal-Frequenz 11.0592 MHz, Ihre routine brauchen, um die Verzögerung für 11,059,200 Taktzyklen. Dies erfolgt Häufig über nested loops bekannter Länge und darunter dann irgendwelche extra-loop-setup und möglicherweise Unterprogramm-Aufruf und return-Anweisungen*.
Die Funktion könnte wie folgt Aussehen:
Lassen Sie uns sehen, wie die Mathematik bricht**:
l1
= 4 * 256 = 1024 Zyklenl2
= (1024 + 4) * 256 = 263168 Zyklenl3
= (263168 + 4) * 42 = 11053224 ZyklenDelay1sec
= 11072668 + 3 + 2 + 2 + 2 + 3 = 11053236 Zyklen11053236 Zyklen * 1/11059200 Sekunden/Zyklus = 999.461 ms
* Der Unterprogramm-Aufruf und return-Anweisungen können auch weggelassen werden, wie erforderlich.
** ich habe Microsoft Excel zur Unterstützung bei Berechnungen im Zusammenhang mit der Bestimmung loop-Zähler.
InformationsquelleAutor jschmier
Dieser mikrocontroller hat drei on-board-Timer (siehe Abschnitt 11 des Bedienungsanleitung) verbunden, um die system-Uhr (geteilt durch 12), so ist es Sache des Programmieren Sie einen interrupt erzeugt, wenn die Zeit abläuft. Da die geteilten Eingang knapp unter 1 MHz, und die größte Zähler ist 16 bits, die Sie brauchen, um count 14 interrupts nach erreichen einer Sekunde (zumindest, wenn ich getan habe, die Mathematik richtig).
Im Allgemeinen hast du Recht, aber in diesem Fall zählen zu 65.536 14-mal gibt eine Zeit, die (wie Glück es haben würde) ist wirklich ziemlich präzise (basierend auf der "etwa eine Sekunde", wahrscheinlich genauer als er kümmert sich um).
InformationsquelleAutor Jerry Coffin
A) Verweis auf einen hardware-timer.
B) Verweis ein CPU-timer. Einige Prozessoren haben eine sehr Breite timer, d.h. 64-bit, das läuft auf die Uhr ticken.
C) Software-Schleife. Für beste Ergebnisse, die code und alle Daten, die sich im internen Speicher, hat vorhersagbaren timing. Ausführen von SDRAM kann die Ursache für timing-Probleme.
Sie müssen nicht count Montage-Zyklen zu tun. Stattdessen können Sie "ziehen" einen Impuls auf einem pin (pull high vor der Schleife, ziehen, niedriger, nachdem die Schleife), Messen der Impulsbreite Verwendung eines Logik-anlayzer, dann ändern, loop-Anzahl zu optimieren, Ihre timings. Für beste Ergebnisse sollten Sie Ausgleich gegen den externen CPU-Takt/Kristall, indem Sie mit einem Frequenzzähler Messen, dann kompensieren sich auch weit entfernt von der Mittenfrequenz, weil die meisten Billig-Kristalle sind nicht tot-on.
Könnten Sie selbst-Kalibrieren, indem Sie mit einem timer zum berechnen der loop-timing.
InformationsquelleAutor Enlightenment