Ich versuche damit Überläufe TMR1
zu zählen TMR0
. Zu diesem Zweck verwende ich TMR1
mit aktiviertem Gate und mit TMR0
Überlauf als Gate-Quelle.
Mit MPLAB SIM kann ich sehen, dass TMR0
gezählt wird und überläuft. Das TMROIF
Bit in INTCON
wird 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 T1GVAL
Bit von T1GCON
wird nie gesetzt.
Ich TMR1
laufe bei Fosc und ich habe das Gate nicht im Umschaltmodus oder Einzelimpulsmodus ...
TMR0
lä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
Antworten:
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.quelle