Hallo oberallgeier,

das ist ein AT89C5131A aus der 8051 Baureihe. Theorethisch kann der Controller mehr, aber die von der Schule vorgeschriebene Platine hat nur ein 12 MHz Quarz drauf, womit maximal 2 MHz Systemtakt möglich sind.

Die Zeit Messe ich wie folgt:
Code:
				;Calculate time since last call
				mov A,TL1
				subb A,PULS1_TIME
				mov R0,A
				
				mov A,TH1
				subb A,PULS1_TIME+1
				mov B,A
				
				mov A,THH
				subb A,PULS1_TIME+2
				
				;Change in direction?
				jnb PULS1_CHANGE,mPStore
				
				;Calculate time difference
				xch A,R0
				push ACC
				clr C
				subb A,PULS1_DIF
				mov A,B
				subb A,PULS1_DIF+1
				mov A,R0
				subb A,PULS1_DIF+2
				pop ACC
				
				;C set: Umschalten
				jnc mPStore
				mov C,MOTOR1_DIRECTION
				mov PULS1_COUNTER,C
				mov P0.0,C
				
mPStore:		;Store time
				mov PULS1_DIF,A
				mov PULS1_DIF+1,B
				mov PULS1_DIF+2,R0
				
				;Store Timestamp
				mov PULS1_TIME,TL1
				mov PULS1_TIME+1,TH1
				mov PULS1_TIME+2,THH
Diese Routine wird immer bei eine Flanke des Inkrementalgebers aufgerufen. TL1, TH1 gehören zu einem 16 Bit Timer, der bei Überlauf THH um 1 erhöht. PULS1_TIME, PULS1_DIF haben je 3 Byte reserviert. In PULS1_TIME wird immer der Zeitpunkt (TL1, TH1, THH) des letzten Aufrufs gespeichert. In PULS1_DIF wird die Differenz zum letzten Aufruf gespeichert. Die neue Differenz wird berechnet und liegt dann in A, B und R0. Dann findet der Vergleich statt. Wenn die vorherige Differenz in PULS1_DIF größer ist, wird das Carry-Flag gesetzt und dann findet die Umschaltung des Zählers statt.
Direkt hinter dieser Routine wird dann PULS1_COUNTER abgefragt. Wenn es gesetzt ist, wird erhöht, wenn nicht, dann erniedrigt.

MfG
Der Eisvogel