Herunterladen Inhalt Inhalt Diese Seite drucken

Anwendungsbeispiele Zur Realisierung Von Timer Und Hardware Interrupts - Texas Instruments MSP430 Anleitung

Vorschau ausblenden Andere Handbücher für MSP430:
Inhaltsverzeichnis

Werbung

FH-Köln Campus Gummersbach
9.5 Anwendungsbeispiele zur Realisierung von Timer und Hardware
Interrupts:
In den nachfolgenden Beispielprogrammen wollen wir unter Berücksichtigung der zuvor
beschriebenen Betriebsarten und Register eine Timer Funktion realisieren und zusätzlich einen
Hardwareinterrupt implementieren.
Während unserer ausgiebigen Tests und Versuche haben wir z.B. folgende wichtige
Erkenntnisse erlangt, die man bei der Entwicklung einer Applikation für den MSP430 Controller
immer berücksichtigen sollte:
1.: Bei Verwendung von Timer Funktionen sollten immer alle Timer Interrupt Service Routinen
im Programm implementiert werden. Bei den von uns verwendeten Controllern also die
Interrupt Service Routine für den Timer A0 und den Timer A1. Denn auch wenn der CCTL1
Interrupt disabled ist, wird die Timer A1 Interrupt Service Routine z.B. bei Verwendung des
Up-Modus aufgerufen, sobald der Zählerwert im Register TAR den im Register (TA)CCR0
stehenden Soll-Zählwert erreicht und wieder auf 0 gesprungen ist. Voraussetzung dafür ist, dass
im TACTL-Register das TAIE Flag gesetzt ist. Die Timer A0 Interrupt Service Routine wird, wenn
freigegeben, unmittelbar davor aufgerufen, wenn TAR den Wert von (TA)CCR0 erreicht hat.
Ist eine der beiden Interrupt Service Routinen dann nicht implementiert, führt der Controller
einen Reset aus, was dann zu einem unerklärlichen Verhalten führt.
2.: Timer A0 IRQ wird durch das im (TA)CCTL0 stehende CCIFG Interrupt Flag ausgelöst,
wenn (TA)CCTL0 = CCIE, CCR0 mit Wert >0 geladen und TAR diesen Wert erreicht hat.
Dieses Flag wird automatisch wieder gelöscht und somit der IRQ quittiert, sobald die Interrupt
Service Routine aufgerufen, bzw. beendet wurde.
Timer A1 IRQ kann sowohl durch das im (TA)CCTL1 stehende CCIFG Interrupt Flag ausgelöst
werden, als auch durch das TAIFG Flag, dass im TAIV Register steht.
Für den 1. Fall muss (TA)CCTL1 = CCIE gesetzt werden und CCR1 mit einem Wert < CCR0
geladen werden. Wenn TAR diesen Wert erreicht hat wird dann der IRQ ausgelöst.
Im TAIV Register steht dann der Wert 0x02 (TACCR1 CCIFG Flag). Quittierung durch lesen
von TAIV erforderlich!
Für den Fall 2 muss das TAIE Flag im TACTL Register gesetzt werden. Der Timer A1 IRQ wird
dann, oder zusätzlich noch aufgerufen, wenn TAR nach Erreichen von CCR0 wieder auf 0
gesprungen ist. Also nahezu gleichzeitig zum Timer A0 IRQ, wenn dieser auch freigegeben ist.
Im TAIV Register steht dann der Wert 0x0A (TAIFG Flag). Quittierung durch lesen von
TAIV erforderlich!
Das lesen kann z.B. durch eine if- oder case-Anweisung erfolgen.
3.: Da für nahezu alle Anwendungen der Up-Mode (MC_1) benutzt werden kann, beziehen sich
die folgenden Beispiele auch nur auf diesen Modus. Das Verhalten in den anderen Modi ist
nur geringfügig anders und wurde vorab beschrieben (siehe 1.2. Timer-Modus).
Beim Starten des Timers in der Konfiguration TACTL = TASSEL_2 + MC_1 + TAIE + TACLR + ID_3;
(Taktquelle=TASSEL_2, Mode=MC_1 und Prescaler(8)=ID_3) haben wir eine Zeit
von 6,8µs/Clock Tick gemessen. D.h. wenn (TA)CCR0 mit 1000 geladen wurde wird Timer A0
und Timer A1 IRQ alle 6,8ms aufgerufen. Wird zusätzlich CCTL1 = CCIE (enabled) gesetzt
und (TA)CCR1 z.B. mit (TA)CCR0/2 geladen, dann wird Timer A1 IRQ bei einem zusätzlichen
Event aufgerufen, also zusätzlich auch nochmal nach 3,4ms in diesem Beispiel.
D.h. Timer A1 IRQ wird dann mit doppelter Frequenz wie Timer A0 aufgerufen da in diesen
Beispielen ja immer das TAIE im TACTL gesetzt wurde. Wäre dieses Flag nicht gesetzt, würde der
IRQ immer nur bei Erreichen von TAR/2 ausgelöst werden, also nur vorversetzt zum Timer A0 IRQ,
aber mit der gleichen Periodendauer
Juni 2012
MSP430 Mikrocontroller
20 |
S e i t e

Quicklinks ausblenden:

Werbung

Inhaltsverzeichnis
loading

Inhaltsverzeichnis