Im Absch. 7.8.1 über das automatische Positioniermodul wird beschrieben, wie die Steuerungslogik das Erreichen einzelner Steuerungsphasen kontrollieren muss. Wenn eine Endposition der Drehbewegung im vorhinein bekannt ist, kann eben dieser hier verwendete Zähler zum Kontrollieren der bestimmten Position verwendet werden.
Durch Programmierung des OCR1B-Registers (Output Compare Register 1B) kann eine Position definiert werden, bei deren Erreichung der Interrupt 0x08 (Output Compare1B Interrupt Vector Address) ausgelöst wird. Dazu muss im Kontrollregister TIMSK (Timer Interrupt Mask) das Bit OCIE1B (Output Compare Interrupt Enable 1B) gesetzt werden.
Das Setzen dieses Registers erfolgt im Unterprogramm setup_counter_value.
; ---------------------------------
; set the next counter interrupt value
; ---------------------------------
; input: REG_A - initial rotation angle
; output: none
; affected: none
; ---------------------------------
setup_counter_value:
push temp2 ; used in macro SBIP
OUTWR OCR1B, REG_A ; write new value to OCR1B
SBIP TIMSK, (1<<OCIE1B) ; OCIE1B bit in TIMSK will be
pop temp2 ; reset if OCIE1B value (REG_A)
ret ; value is reached
Diese Routine aktiviert den o. g. Interrupt und setzt den erwarteten
,,Endwert'' des Zählers TCNT1, der direkt über den Winkelschrittgeber
(Absch. 5.5) getriggert wird, in
dem sie das 16-Bit Register OCR1B ,,programmiert''.
Die dazugehörige Interrupt-Service-Routine macht nichts anderes, als den Interrupt wieder zu deaktivieren, indem das entsprechenden Bit im Timer Interrupt Mask Register (TIMSK) wieder gelöscht wird.
; ---------------------------------
; rotation angle is reached, we disable the interrupt
; ---------------------------------
T1_step_isr:
PUSHF
push temp2 ; used in macro CBIP
CBIP TIMSK, (1<<OCIE1B)
pop temp2
POPF
reti ; return from interrupt...
Da für die Steuerung nur die Information über das Erreichen der Endposition
des jeweiligen Winkels von Interesse ist, kann dieser Umstand direkt
aus dem TIMSK-Bit abgelesen werden. Diese Abfrage erfolgt im Rahmen
der Assemblermakros ,,AFTER_POSITION'' und ,,BEFORE_POSITION'',
diese werden im Abschnitt 7.8.1.3
noch ausführlicher erläutert.
Die Timer-ISR Routinen sind in lib/systimer.inc abgelegt, die Makros ,,AFTER_POSITION'' und ,,BEFORE_POSITION'' sind in inc/macros.inc definiert.
gerhard.reithofer@tech-edv.co.at