Schreiben in den Timer-Zähler, während der Timer läuft

Ich verwende PIC16F1947 für ein Projekt. Das Projekt erfordert Echtzeit-Tracking, sodass ein stabiler 32768-Hz-Quarz mit dem Timer1-Oszillator verbunden ist. Die Timer1-Oszillatorschaltung und der Kristall liefern eine stabile Uhr für unser Projekt.

Timer1 kann nur Interrupt bereitstellen, wenn der Timer-Zähler überläuft. Es ist ein 16-Bit-Zähler, daher wird jedes Mal ein Interrupt gegeben, wenn der Zähler von 0xFFFF auf 0x0000 übergeht.

Da der Timer vom Anfang bis zum Ende des Produkts zur Zeitmessung verwendet wird, kann Timer1 nicht gestoppt werden. Außerdem muss es ausgeführt werden, während der Prozessor schläft. Also müssen wir es im asynchronen Modus verwenden.

In unserem Projekt brauchen wir auch Interrupts alle 0,5 Sekunden. Wir planen also, den Timer1-Zähler auf 0xC000 zu initialisieren und ihn dann zu starten. Jedes Mal, wenn ein Interrupt gegeben wird, planen wir ein bitweises ODER 0xC0 mit dem hohen Byte des Registers.

Laut Datenblatt:

Das Lesen von TMR1H oder TMR1L, während der Zeitgeber von einer externen asynchronen Uhr läuft, stellt ein gültiges Lesen sicher (in der Hardware erledigt). Der Benutzer sollte jedoch bedenken, dass das Lesen des 16-Bit-Timers in zwei 8-Bit-Werten selbst gewisse Probleme aufwirft, da der Timer zwischen den Lesevorgängen überlaufen kann.

Für Schreibvorgänge wird empfohlen, dass der Benutzer einfach den Timer anhält und die gewünschten Werte schreibt. Eine Schreibkonkurrenz kann auftreten, indem in die Zeitgeberregister geschrieben wird, während das Register inkrementiert wird. Dies kann einen unvorhersehbaren Wert im Registerpaar TMR1H:TMR1L erzeugen.

Ist es in Ordnung, bitweise OR 0xC0 mit dem High-Byte zu machen, während der Timer läuft? Oder sollten wir einen anderen Timer für einen 0,5-Sekunden-Interrupt verwenden?

Danke.

Antworten (1)

Bei den PICs mit zwei 32-kHz-Timern (TMR1 und TMR3) würde ich empfehlen, einen der Timer „freilaufend“ zu verwenden (nie darauf zu schreiben) und den anderen zum Generieren von Aufwachereignissen zu verwenden. Wenn Sie nur einen Timer zur Verfügung haben, wird es sehr schwierig sein, einen zuverlässigen Betrieb ohne kumulative Fehler zu erreichen. Unterschiedliche Teilrevisionen haben unterschiedliche Verhaltensweisen, wenn es um das Schreiben von Timer 1 geht, und daher kann ein Ansatz, der mit einer Revision funktionieren würde, durch eine zukünftige Revision gebrochen werden. Was schön gewesen wäre, wenn Microchip dem Timer erlaubt hätte, zwischen synchronem und asynchronem Modus umzuschalten, ohne einen Zähler zu verlieren (einfach zu bewerkstelligen: Anstatt einen Multiplexer zu verwenden, um zwischen Sync- und Async-Modus umzuschalten, fügen Sie asynchrones Set/Clear zum synchronisierendes Latch, und verwenden Sie diese im asynchronen Modus, um den Ausgang zu zwingen, dem Eingang zu folgen). Soweit ich weiß, ist keiner ihrer Teile so dokumentiert. Folglich würde ich erwarten, dass das Umschalten zwischen synchronem und asynchronem Modus zufällig eine Zählung gewinnen oder verlieren kann.