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

7

Ich versuche damit Überläufe TMR1zu zählen TMR0. Zu diesem Zweck verwende ich TMR1mit aktiviertem Gate und mit TMR0Überlauf als Gate-Quelle.

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

TMR1 zählt korrekt ohne aktiviertes Gate und stoppt, wenn ich die Gate-Steuerung aktiviere - soweit so gut.

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

Ich TMR1laufe bei Fosc und ich habe das Gate nicht im Umschaltmodus oder Einzelimpulsmodus ... TMR0läuft bei instruction clock / 256, obwohl ich davon ausgehe , 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 konfiguriere TMR1

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
Tsiflana
quelle
3
Treten Sie zurück und denken Sie an das eigentliche Problem. Sie können Timer 0-Überläufe in der Software zählen, die dann beliebige RAM-Bytes als Zähler verwenden können. Ich sehe keinen Grund, warum Timer 1 das Zählen durchführen muss, zumal es umständlich ist. Sie lassen eine Implementierungsidee das Design bestimmen. Es sollte umgekehrt sein. Was versuchst du wirklich zu erreichen?
Olin Lathrop
Touché, Olin;) Weiser Rat, und ich habe das getan. Ich möchte immer noch wissen, warum es nicht so funktioniert hat, wie ich es versucht habe ... Vielleicht sollte ich meine Frage umformulieren ... Wofür ist diese Funktion, wenn nicht so etwas? Es scheint immer noch die elegantere Lösung ...
Tsiflana
Wofür ist welche Funktion?
Olin Lathrop
Die Fähigkeit, Timer0 Überlauf als Tor für Timer1 zu verwenden ...
Tsiflana
1
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 Gate von Timer 1 für eine bekannte Zeit zu öffnen. Die während dieser Zeit auf Timer 1 akkumulierten Zählwerte sind dann proportional zur Frequenz.
Olin Lathrop

Antworten:

8

Ich denke, Ihr Problem beruht auf Verwirrung darüber, was genau das TMR1-Gate-Signal tatsächlich tut. Es ist nicht von selbst, verursacht der Timer zu zählen, ist es nur erlaubt , es zu zählen , wenn es 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 kommt am Flip-Flop rechts neben dem TMR1-Register zusammen, wo das Gate-Signal den EN (Freigabe) -Eingang dieses Flip-Flops und das Taktsignal den D (Daten) -Eingang ansteuert.

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

Es gibt einfach keine Möglichkeit es zu Überlaufereignissen von TMR0 auf die Taktlogik TMR1, entweder innerhalb oder außerhalb des Chips.

EDIT: OK, etwas tiefer graben (veranlasst durch die Kommentare unten), ich stelle fest, dass Sie das T1SYNC-Bit im T1CON-Register auf Null gesetzt haben. Dadurch wird die Taktquelle mit Fosc synchronisiert. Wenn diese Taktquelle tatsächlich Fosc selbst ist, ist der Ausgang des Synchronisierers ein konstanter Pegel - immer hoch oder immer niedrig, aber nicht umschaltbar.

Ich glaube, das ist die Hauptursache für Ihr Problem. Versuchen Sie, T1CON auf einzustellen b'01000101'. Dies sollte das erreichen, was Sie wollen, vorausgesetzt, der Überlaufimpuls von TMR0 ist genau eine Fosc-Periode lang.

Dave Tweed
quelle
Richtig, ich verstehe was du meinst und denke es ist richtig! Ich werde jedoch mit dem Kopfgeld warten, bis auch andere Leute geantwortet haben können.
Ich sehe nicht, wie dies die Frage beantwortet. Die Gate-Logik sollte einen Impuls mit der gleichen Dauer wie eine TMR1-Taktperiode (über einen stillschweigenden Impulssynchronisator) erhalten, wenn TMR0 überläuft, und die Taktlogik erhält einen Takt. Es sollte bei jedem Überlauf einmal zählen. Warum sollte es nicht funktionieren? Vielleicht fällt der Simulator einfach aus (es fehlt notorisch, wenn Peripheriegeräte simuliert werden). Das OP hat nie gesagt, dass er es mit Hardware versucht hat.
Apalopohapa
@apalopohapa: Nein, die Taktlogik bekommt keine Uhr. Das ist das fehlende Stück hier.
Dave Tweed
Ok, lass uns ein wenig zurücktreten. Der Kern von TMR1 ist ein Zähler. Dieser Zähler zählt immer, solange er eine Uhr bekommt ... (Fortsetzung des nächsten Kommentars)
Apalopohapa
Diese Uhr wird durch ein D-Flipflop bereitgestellt. Dieser FF hat drei Eingänge: (1) Aktivieren , (2) Daten und MUSS vom (3) Systemtakt getaktet werden (andernfalls würde der TMR1 überhaupt nicht funktionieren). Enable kommt von der Gate-Logik. D kommt aus der Taktlogik. Ein Überlaufimpuls geht in die Gate-Logik und endet am Enable- Eingang. Eine Uhr, FOSC, leitet über Muxes in den D- Eingang. Ich sehe nichts, was FOSC (oder eine andere wählbare Taktquelle) daran hindert, den D- Eingang zu erreichen, sodass der Zähler immer dann zählt, wenn Enable aktiviert wird.
Apalopohapa