5 Positionskontrolle über Interrupts

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