4 Winkelschrittzählung durch Zählerprogrammierung des ATMega8

Der 16-Bit Zähler Timer/Counter1 ist in der Lage vollkommen unabhängig von externen Interrupts Signale am Takt-Eingang T1 zuverlässig zu zählen, wobei verschiedene Modi unterstützt werden. Im gegenständlichen Fall reicht ein automatisiertes Hochzählen des Counters, bis ein bestimmter Wert erreicht ist (der Winkelmaximalwert), danach wird der Wert automatisch von der Controllerhardware wieder zurückgesetzt und der Zählzyklus beginnt von vorne.

Die notwendige Initialisierung der ATMega8-Register wird nun im Sourcecode von lib/systimer.lib dargestellt.

	; --------------------------------- 
	; Counter1 settings 
	; --------------------------------- 
	; TCCR1A Timer/Counter 1 Control Register A 
	; Mode CTC (ATmega manual p. 97) 
	; ...
	; bits 7   6   5   4   3   2   1   0 
	;    | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 
	  OUTB TCCR1A,0b00000000 ; normal mode (no PWM,WGM,...)
	; TCCR1B Timer/Counter 1 Control Register B 
	; bits 7   6   5   4   3   2   1   0 
	;    | X | X | X | 0 | 1 | X | X | X | 
	; 0b00001000 - WGM13 
	; 0b00000100 - WGM12 = CTC *** USED! 
	; CTC mode (Clear Time on Compare) 
	; WGM13:0 WGM12:1 - WGM11:0 WGM10:0 = 01 - 00 
	; see also TCCR1A settings above WGM10, WGM11
	; TCCR1B Clock Select bits 
	;    | X | X | X | X | X | 1 | 1 | 1 | 
	; 0b00000110 - ext. clock pin T1 - falling edge
	; 0b00000111 - ext. clock pin T1 - rising edge *** USED! 
	; 
	; 0b000xxxxx                       - no ICNC1, ICES1 
	; 0bxxx01xxx|xxxxx00 TCCR1B|TCCR1A - mode 4 = CTC mode 
	  OUTB TCCR1B,0b00001111 
	; see Table 39 ATmega8 manual p. 97 
	; ---------------------------------
	; TIMSK Timer/Counter Interrupt Mask Register 
	; bits 7   6   5   4   3   2   1   0 
	;    | X | X | X | 1 | 0 | X | X | 1 | 
	; 0b00010000 - OCIE1A Timer/Counter1, Output Capture A Match Enable 
	; 0b00001000 - OCIE1B Timer/Counter1, Output Capture B Match Enable 
	; 0b00000001 - TOIE0  Timer/Counter0, Overflow Interrupt Enable 
	  OUTB  TIMSK,(1<<OCIE1A)|(1<<TOIE0)
	; --------------------------------- 
	; set timer 1 output compare register A value to angle max. value
	  LDIWR REG_A, RotationOver-1
	  OUTWR OCR1A, REG_A  
Hinweis:
Bei den Assembleranweisungen LDIWR und OUTWR handelt es sich um Assemblermakros, die ein 16-Bit Register mit einem 16-Bit IMMEDIATE Wert laden (siehe dazu auch Absch. 7.5.6 zum Thema Namenskonventionen), bzw. den Inhalt eines 16-Bit Registers in ein Port schreiben, was nach einer definierten Reihenfolge beim Schreiben der beiden 8-Bit Werte verlangt [15] S. 77. Das OUTB Makro schreibt ein Byte in ein Ausgaberegister.
Der verwendete CTC-Modus (Clear Timer on Compare Mode) inkrementiert das Zählregister TCNT1(H/L) des Timer/Counter 1 und stellt den Zähler wiederum beim Erreichen des Vergleichregisters OCR1A(H/L) (Output Compare Register 1A) auf 0 zurück und sorgt somit automatisch für den korrekten Zählerüberlauf.

Ein Zwei-Richtungsbetrieb ist mit dieser einfachen Timerprogrammierung allerdings nicht möglich, da bei einer Richtungsänderung auch der Zähler umprogrammiert werden müsste, damit er ,,negativ'' zählt.

Mit dieser Maßnahme erfolgt das Zählen unabhängig von anderen Ereignissen und Interrupts.

gerhard.reithofer@tech-edv.co.at