Verwenden des Timer0-Überlaufs zum Gattern von Timer1 auf PIC12F1822

Ich versuche zu verwenden , um Überläufe TMR1zu zählen . TMR0Dazu verwende ich TMR1Gate aktiviert und TMR0Überlauf als Gate-Quelle.

Mit MPLAB SIM kann ich sehen, dass TMR0es zählt und überläuft. Das TMROIFBit in INTCONwird korrekt gesetzt.

TMR1zählt ohne aktiviertes Gate korrekt und stoppt, wenn ich die Gate-Steuerung aktiviere - so weit, so gut.

Das TMR0Überlaufen scheint jedoch das Tor nicht auszulösen. Das T1GVALBit von T1GCONwird nie gesetzt.

Ich TMR1laufe bei Fosc und das Tor läuft nicht im Toggle-Modus oder im Einzelpulsmodus ... TMR0läuft bei instruction clock / 256, obwohl ich vermute, dass dies keine Rolle spielt ...

Hier sind meine Konfigurationsbits:

__CONFIG _CONFIG1, _FOSC_INTOSC & _WDTE_OFF & _PWRTE_OFF & _MCLRE_ON & _CP_OFF & _CPD_OFF & _BOREN_OFF & _CLKOUTEN_OFF & _IESO_OFF & _FCMEN_OFF</code>
__CONFIG _CONFIG2, _WRT_OFF & _PLLEN_OFF & _STVREN_OFF & _BORV_19 & _LVP_OFF

und hier sind die relevanten Zeilen, in denen ich konfiguriereTMR1

banksel T1CON
movlw   b'01000001' ; source = Fosc, prescale 1:1, LP osc - no, Timer on
movwf   T1CON

banksel T1GCON
movlw   b'11000001' ; gate enabled, active high, toggle no, pulse mode no, source TMR0
movwf   T1GCON
Treten Sie zurück und denken Sie an das eigentliche Problem. Sie können die Überläufe des Timers 0 in der Software zählen, die dann alle gewünschten RAM-Bytes als Zähler verwenden kann. Ich sehe keinen Grund, warum Timer 1 zählen muss, zumal es umständlich ist. Sie lassen eine Implementierungsidee das Design vorantreiben. Es sollte umgekehrt sein. Was versuchst du wirklich zu erreichen?
Touché, Olin ;) Weiser Rat, und ich habe dies getan. Ich möchte trotzdem wissen, warum es nicht so funktioniert hat, wie ich es versucht habe ... Vielleicht sollte ich meine Frage anders formulieren ... Wofür ist diese Funktion, wenn nicht so etwas? Scheint immer noch die elegantere Lösung zu sein...
Wozu dient welche Funktion?
Die Möglichkeit, den Timer0-Überlauf als Gate für Timer1 zu verwenden ...
Die Verwendungsmöglichkeiten sind nur durch Ihre Vorstellungskraft begrenzt. Ich weiß nicht, warum die Designer es hinzugefügt haben, aber das spielt sowieso keine Rolle, da es hier ist. Das erste, woran ich dachte, war eine Frequenzzähleranwendung. Timer 0 wird verwendet, um das Tor von Timer 1 für eine bekannte Zeit zu öffnen. Die während dieser Zeit auf Timer 1 akkumulierten Zählungen sind dann proportional zur Frequenz.
In der Tat könnte man das tun (obwohl es auch in Software möglich wäre), aber es würde immer noch davon abhängen, dass das verdammte Ding tatsächlich funktioniert;) In dieser Angelegenheit denke ich, dass wir einer Lösung immer noch nicht näher gekommen sind ...
Auch wenn dies Ihrem Problem nicht hilft: Das Datenblatt des PIC12F1822 erklärt (in Teil 27.6), dass dieser Modus für kapazitive Sensoren verwendet werden kann (wo Frequenzänderungen erkannt werden müssen).
Dinge, die Sie überprüfen/ausprobieren sollten: Verwenden Sie andere Peripheriegeräte, die einen der Timer stören könnten (z. B. ADC, CCP)? Können Sie den Gate-Toggle-Modus aktivieren - dies verlängert den Überlaufimpuls - vielleicht ist es nur eine Taktperiode (obwohl ich das bezweifle). Außerdem können Sie versuchen, den Zustand des T1GVAL-Flags auf einen Ausgangspin zu kopieren, um zu beobachten, was passiert (möglicherweise durch Verwendung eines vom Gate ausgelösten Interrupts). Vielleicht hilft das, um zu sehen, was falsch ist.
Können Sie den Code posten, der TMR0 konfiguriert?
Führen Sie dies auch in Hardware oder MPLAB SIM aus?
@Camil Ich sehe, dass Sie das Kopfgeld eingerichtet haben, aber das OP hat sich seit dem 9. Oktober 2012 nicht mehr angemeldet. Dies macht es etwas schwierig, es zu lösen.
Ich simuliere dies und habe das gleiche Problem.

Antworten (1)

Ich denke, Ihr Problem beruht auf Verwirrung darüber, was das TMR1-Gate-Signal tatsächlich tut. Es bewirkt nicht von sich aus, dass der Zeitgeber zählt, sondern ermöglicht ihm lediglich zu zählen, wenn geeignete Ereignisse an seinem Takteingang auftreten.

Es ist subtil, aber wenn Sie sich „ABBILDUNG 21-1: TIMER1-BLOCKDIAGRAMM“ im Datenblatt (S. 179) ansehen, sehen Sie das TMR1H/TMR1L-Register in der Mitte. Die gesamte Logik darüber bezieht sich auf das Gating, und die gesamte Logik darunter bezieht sich auf das Takten. Alles läuft am Flip-Flop direkt rechts neben dem TMR1-Register zusammen, wo das Gate-Signal den EN-Eingang (Enable) dieses Flip-Flops und das Taktsignal den D-Eingang (Daten) ansteuert.

Dies bedeutet, dass der Ausgang des Flip-Flops nur umschaltet (und TMR1 zum Inkrementieren veranlasst), wenn das Gate-Signal hoch ist und das Taktsignal umschaltet.

Es gibt einfach keine Möglichkeit, Überlaufereignisse von TMR0 an die Taktlogik von TMR1 zu leiten , weder innerhalb noch außerhalb des Chips.

BEARBEITEN: OK, etwas tiefer graben (aufgefordert durch die Kommentare unten), stelle ich fest, dass Sie das T1SYNC-Bit im T1CON-Register auf Null gesetzt haben. Dadurch wird die Taktquelle auf Fosc synchronisiert. Wenn diese Taktquelle tatsächlich Fosc selbst ist, hat der Ausgang des Synchronizers einen konstanten Pegel – immer hoch oder immer niedrig, aber nicht umschaltend.

Ich glaube, das ist die Ursache deines Problems. Versuchen Sie, T1CON auf einzustellen b'01000101'. Dies sollte das erreichen, was Sie wollen, vorausgesetzt, dass der Überlaufimpuls von TMR0 genau eine Fosc-Periode lang ist.

Richtig, ich verstehe was du meinst und finde es richtig! Ich werde jedoch mit dem Kopfgeld warten, bis andere Leute auch geantwortet haben können.
Ich sehe nicht, wie dies die Frage beantwortet. Die Gatterlogik sollte einen Impuls mit derselben Dauer wie eine TMR1-Taktperiode (über einen stillschweigenden Impulssynchronisierer) erhalten, wenn TMR0 überläuft, und die Taktlogik erhält einen Takt. Es sollte bei jedem Überlauf einmal zählen. Also, warum sollte es nicht funktionieren? Vielleicht scheitert der Simulator einfach daran (es fehlt notorisch bei der Simulation von Peripheriegeräten). Das OP hat nie gesagt, dass er es in Hardware versucht hat.
@apalopohapa: Nein, die Uhrenlogik bekommt keine Uhr. Das ist das fehlende Stück hier.
Ok, treten wir ein wenig zurück. Der Kern von TMR1 ist ein Zähler. Dieser Zähler zählt immer, solange er eine Uhr bekommt... (Fortsetzung beim nächsten Kommentar)
Dieser Takt wird von einem D-Flip-Flop bereitgestellt. Dieses FF hat drei Eingänge: (1) Enable , (2) Data , und MUSS von der (3) Systemuhr getaktet werden (sonst würde der TMR1 überhaupt nicht funktionieren). Enable kommt von der Gate-Logik. D kommt aus der Uhrenlogik. Ein Überlaufimpuls geht in die Gate-Logik und landet am Enable -Eingang. Ein Takt, FOSC, leitet über Multiplexer in den D -Eingang. Ich sehe nichts, was FOSC (oder eine andere wählbare Taktquelle) daran hindert, den D -Eingang zu erreichen, wodurch der Zähler zählt, wenn Enable aktiviert wird.
Mit anderen Worten, ein TMR0-Überlaufereignis sendet einen Impuls an den Enable -Eingang, wodurch TMR1 einmal zählen kann.
Intern sollte dieser Impuls synchronisiert oder lang genug sein, damit er das High des D -Eingangs einmal erfasst.
@apalopohapa: OK, ich verstehe deinen Punkt. Ich habe meine Antwort oben geändert.
Das funktioniert wie ein Zauber! Danke Dave Tweed und @apalopohapa!