Inhalt
- Einführung in das Timer-Modul in dsPic30f- und dsPic33f-Geräten
- Timer-Betriebsmodi in dsPic30f- und dsPic33f-Geräten
- Beispielcode zum Initialisieren eines Timers für dsPic30f und dsPic33f
- Allgemeine Vorgehensweise zum Initialisieren eines Timers in dsPic30f und dsPic33f MicroController
- 1) Welcher Timer soll verwendet werden?
- 2) 16-Bit-Timer oder 32-Bit-Timer?
- 3) Timer-Betriebsart
- 4) Clock-Prescaler
- 5) Initialisieren Sie den Timer-Interrupt
- Beispielcode zum Initialisieren des Interrupts in den Controllern dsPic30f und dsPic33f
- Vollständiges Codebeispiel zum Initialisieren und Testen eines Timers und eines Timer-Interrupts für dsPic30f und dsPic33f
Der Autor schloss sein letztes Ingenieurjahrsprojekt mit den dsPic-Mikrocontrollern ab und erhielt umfassende Einblicke in diese Geräte.
Ein Timer-Modul ist ein wichtiges Peripheriegerät in einem dsPic-Mikrocontroller und kann in einer Vielzahl von Anwendungen verwendet werden.
In diesem Lernprogramm werden fertige C-Sprach-Codebeispiele verwendet, die in MplabX IDE codiert und auf einem Microchip dsPic30f4011-Mikrocontroller getestet wurden, um Sie durch den Prozess der Initialisierung und Konfiguration von Timern für Ihre dsPic-Anwendungen zu führen.
Einführung in das Timer-Modul in dsPic30f- und dsPic33f-Geräten
Das Timer-Modul in Geräten der dsPic30f-Serie enthält insgesamt fünf 16-Bit-Timer, nämlich:
- Timer 1 bis 5.
In ähnlicher Weise enthält ein Gerät der dspic33f-Serie bis zu neun 16-Bit-Timer, nämlich:
- Timer 1 bis 9.
Jeder dieser Timer ist abhängig von seinen besonderen Eigenschaften in drei Typen unterteilt: Typ A, Typ B und Typ C.
Tippe A | Typ - B. | Typ - C. |
---|---|---|
Kann mit einem 32-kHz-Oszillator mit geringer Leistung betrieben werden. | Kann mit dem Typ-C-Timer verkettet werden, um einen 32-Bit-Timer zu bilden. * * | Kann mit dem Timer vom Typ B verkettet werden, um einen 32-Bit-Timer zu bilden. * * |
Kann im asynchronen Modus mit externer Quelle ausgeführt werden. | - | Hat die Fähigkeit, eine A / D-Wandlung auszulösen. |
Die externe Taktquelle kann mit der internen Uhr synchronisiert werden | Die externe Taktquelle wird immer mit der internen Uhr synchronisiert. * | Die externe Taktquelle wird immer mit der internen Uhr synchronisiert. * |
Timer-Betriebsmodi in dsPic30f- und dsPic33f-Geräten
Jeder Timer kann nicht nur in Typ A, B oder C gruppiert werden, sondern auch in vier verschiedenen Modi betrieben werden:
- Timer-Modus
- Gated Timer-Modus
- Synchroner Zählermodus
- Asynchroner Zählermodus
Timer-Modus | Gated Timer-Modus | Synchroner Zählermodus | Asynchroner Zählermodus |
---|---|---|---|
Inkrementiert um eins bei jeder ansteigenden Flanke des Eingangstakts | Inkrementiert um eins bei jeder ansteigenden Flanke des Eingangstakts, solange das externe Gate-Signal am TxCK-Pin hoch ist | Inkrementiert um eins bei jeder ansteigenden Flanke des Eingangstakts | Inkrementiert um eins bei jeder ansteigenden Flanke des Eingangstakts |
Interne Uhr wird verwendet | Interne Uhr wird verwendet | Die externe Uhr wird am TxCK-Pin verwendet | Die externe Uhr wird am TxCK-Pin verwendet |
_ | _ | Externe und interne Geräteuhr werden synchronisiert | Externe und interne Geräteuhr sind nicht synchronisiert |
Interrupt wird bei Periodenübereinstimmung generiert | Bei fallender Flanke des TxCK-Pins wird ein Interrupt erzeugt | Interrupt wird bei Periodenübereinstimmung generiert | Interrupt wird bei Periodenübereinstimmung generiert |
Beispielcode zum Initialisieren eines Timers für dsPic30f und dsPic33f
void init_Timer (void) {T1CONbits.TON = 1; // Aktiviere das Timer Modul T1CONbits.TCKPS = 0; // Eingangstakt-Prescaler als 1: 1 auswählen T1CONbits.TGATE = 0; // Gate Time Accumulation Mode deaktivieren T1CONbits.TCS = 0; // Interne Uhr als Timer-Taktquelle auswählen T1CONbits.TSYNC = 0; // Externe Taktquelle bleibt nicht synchronisiert PR1 = 0xFFFF; }}
Allgemeine Vorgehensweise zum Initialisieren eines Timers in dsPic30f und dsPic33f MicroController
Das folgende allgemeine Verfahren kann befolgt werden, wenn ein Timer für eine beliebige Anwendung initialisiert wird:
- Entscheiden Sie, welchen Timer Sie verwenden möchten.
- Entscheiden Sie, ob ein 16-Bit-Timer oder ein 32-Bit-Timer erforderlich ist.
- Legen Sie den Timer-Betriebsmodus fest.
- Stellen Sie den Uhrenskalierer ein.
- Entscheiden Sie, ob ein Timer-Interrupt oder ein anderer besonderer Ereignisauslöser erforderlich ist.
1) Welcher Timer soll verwendet werden?
Jeder der Timer kann durch das TON-Bit im TxCON-Register aktiviert werden, wobei 'x' die Anzahl der Timer ist, die aktiviert werden sollen.
In unserem Beispielcode haben wir Timer 1 aktiviert, indem wir das TON-Bit im T1CON-Register auf 1 gesetzt haben.
2) 16-Bit-Timer oder 32-Bit-Timer?
Timer vom Typ B und Typ C können kombiniert werden, um als ein einziger 32-Bit-Timer zu arbeiten. In Kombination hat die Konfiguration des Typ-B-Timers Vorrang vor dem Typ-C-Timer.
- In einem dsPic30f-Gerät können die Timer 2 und 3 in einem 32-Bit-Timer verkettet werden.
- dsPic33f-Geräte verfügen über mehr als ein 32-Bit-Zeitgeberpaar, wobei die Zeitgeber 2/3, 4/5, 6/7 und 8/9 auch 32-Bit-Zeitgeberpaare bilden können.
Zu diesem Zweck sollte das T32-Bit im TxCON-Register eines Typ-B-Timers auf 1 gesetzt werden.
TxCON.T32 * | Timer-Konfiguration |
---|---|
1 | Verkettet mit seinem anderen Timer-Paar. |
0 | Funktioniert als unabhängiger 16-Bit-Timer. |
3) Timer-Betriebsart
Der Timer-Betriebsmodus kann gemäß der folgenden Tabelle ausgewählt werden.
Bitname | Bitwert | Ausgewählter Modus |
---|---|---|
TxCON.TCS | 0 | Timer-Modus |
TxCON.TGATE, TxCON.TCS | 1, 0 | Gated Timer-Modus |
TxCON.TCS, TxCON.TSYNC * | 1, 1 | Synchroner Zählermodus |
TxCON.TSYNC | 0 | Asynchroner Zählermodus |
4) Clock-Prescaler
Ein Taktvor-Skalierer kann verwendet werden, um die Frequenz zu erhöhen oder zu verringern, bei der die Taktquelle den Zeitbasiswert erhöht.
Sie kann mit Hilfe der folgenden Tabelle ausgewählt werden.
TxCON.TCKPS * | Prescaler-Wert |
---|---|
3 | 1 : 256 |
2 | 1 : 64 |
1 | 1 : 8 |
0 | 1 : 1 |
5) Initialisieren Sie den Timer-Interrupt
Jeder Timer kann so programmiert werden, dass er einen Interrupt auslöst.
- Vergleichen Sie die Übereinstimmung zwischen dem Wert des Timer-Zählerregisters (TMRx) und des Periodenregisters (PRx).
- Erkennen einer fallenden Flanke im Gated Time Accumulation-Modus.
Dieser Interrupt kann mit Hilfe der folgenden Register und Bits in dsPic-Mikrocontrollern initialisiert werden.
Bitname | Register- und Bitidentifikation | Wert |
---|---|---|
Interrupt Enable Control Bit | IEC0 / 1.TxIE | 1 = Aktivieren 0 = Deaktivieren |
Interrupt Flag Status Bit | IFS0 / 1.TxIF | Dieses Bit muss nach jedem Interrupt-Trigger in der Software zurückgesetzt werden |
Interrupt Priority Control Bit | IPC0 / 1 / 5.TxIP | 6 - 0 je nach Priorität |
Dieser Beispielcode kann verwendet werden, um eine Interrupt-Serviceroutine für Timer 1 zu initialisieren. (Wählen Sie die Timer-Initialisierungsfunktion von oben aus und rufen Sie die Funktionen in main () entsprechend auf.)
Befolgen Sie die Anweisungen für Interrupts
Beispielcode zum Initialisieren des Interrupts in den Controllern dsPic30f und dsPic33f
void Interrupt_Init (void) {IEC0bits.T1IE = 1; IPC0bits.T1IP = 6; } void __attribute __ ((Interrupt, auto_psv)) _T1Interrupt (void) {// Dein Code hier IFS0bits.T1IF = 0; }}
Vollständiges Codebeispiel zum Initialisieren und Testen eines Timers und eines Timer-Interrupts für dsPic30f und dsPic33f
[Getestet vom Autor am: 22/09/2018]
Der folgende Code kann verwendet werden, um Timer 1 im Betriebsmodus 'Timer' zu initialisieren und zu testen. Es wird durch Einbeziehen der beiden oben angegebenen Codefragmente erstellt.
Dieser Code erzeugt einen Interrupt, wenn eine Vergleichsübereinstimmung zwischen dem Wert des PR1-Registers und den TMR1-Registern auftritt.
- Der Interrupt wurde so programmiert, dass eine LED 10 Millisekunden lang blinkt.
- Wert des PR1-Registers: 0x8FF4 wurde so eingestellt, dass alle 20 Millisekunden eine Vergleichsübereinstimmung erfolgt.
Daher sollte die LED 10 Millisekunden lang eingeschaltet sein (solange der Programmzähler in der Interrupt-Funktion bleibt) und weitere 10 Millisekunden lang ausgeschaltet sein, wenn der Programmzähler den Interrupt verlässt. Die Ausschaltzeit wird von Timer 1 gesteuert.
#define FCY 1842500 #include xc.h> #include delay.h> #include libpic30.h> #include p30F4011.h> _FOSC (CSW_FSCM_OFF & FRC); // Fosc = 7,37 MHz, interner schneller RC-Oszillator void init_Timer (void) {T1CONbits.TON = 1; // Aktiviere das Timer Modul T1CONbits.TCKPS = 0; // Eingangstakt-Prescaler als 1: 1 auswählen T1CONbits.TGATE = 0; // Gate Time Accumulation Mode deaktivieren T1CONbits.TCS = 0; // Interne Uhr als Timer-Taktquelle auswählen T1CONbits.TSYNC = 0; // Externe Taktquelle bleibt nicht synchronisiert PR1 = 0x8FF4; } void Interrupt_Init (void) {IEC0bits.T1IE = 1; IPC0bits.T1IP = 6; } void __attribute __ ((Interrupt, auto_psv)) _T1Interrupt (void) {_LATD0 = 1; __delay_ms (10); _LATD0 = 0; IFS0bits.T1IF = 0; } void main (void) {init_Timer (); Interrupt_Init (); während (1) {}} Dieser Artikel ist genau und nach bestem Wissen des Autors. Der Inhalt dient nur zu Informations- oder Unterhaltungszwecken und ersetzt nicht die persönliche Beratung oder professionelle Beratung in geschäftlichen, finanziellen, rechtlichen oder technischen Angelegenheiten.