... hier steht noch weiterer Code .def t_count0 = R3 ; Bit0 für Echtzeitcounter .def t_count1 = R4 ; Bit1 für Echtzeitcounter .def t_count2 = R5 ; Bit2 für Echtzeitcounter .def t_value0 = R18 ; Bit0 für Taktvorgabe Wert .def t_value1 = R19 ; Bit1 für Taktvorgabe Wert .def t_value2 = R20 ; Bit2 für Taktvorgabe Wert .EQU t_value_predef = 10000 .EQU multiplier_preset = 40 rjmp main rjmp endschalter_links ; springt zu entsprechender ISR bei Pegelwechsesl an PD2 rjmp endschalter_rechts ; springt zu entsprechender ISR bei Pegelwechsesl an PD3 reti ;TIMER2 COMP reti ;TIMER2 OVF reti ;TIMER1 CAPT reti ;TIMER1 COMPA reti ;TIMER1 COMPB reti ;TIMER1 OVF rjmp timer0_overflow ; springt zu entsprechender ISR bei timer0 Überlauf reti ;SPI, STC reti ;USART, RXC reti ;USART, UDRE reti ;USART, TXC rjmp ADC_conv_complete ; sprint zu entsprechender ISR bei ADC-Wandlungsergebnis reti ;EE_RDY reti ;ANA_COMP reti ;TWI reti ;SPM_RDY ... hier steht noch weiterer Code ;_______________________________________________________________________________ ; ISR für timer Überlauf von timer0 - Haupttakt ;------------------------------------------------------------------------------- timer0_overflow: push temp ; Inhalt aus Register 16 im Stack sichern in temp,SREG ; Statusregister Zustand einlesen push temp ; ebenfalls im Stack ablegen ldi temp, 0b01101000 ; Startwert für counter0 festlegen out TCNT0, temp ; und in Counter0 schreiben inc t_count0 ; unterstes Zählerbyte um 1 erhöhen brne go_on_C_compare ; wenn kein Überlauf: weiter bei Marke inc t_count1 ; mittleres Zählerbyte um 1 erhöhen brne go_on_C_compare ; wenn kein Überlauf: weiter bei Marke inc t_count2 ; oberstes Zählerbyte um 1 erhöhen go_on_C_compare: mov temp, t_value2 ; oberstes Byte von Counterendwert lesen sub temp, t_count2 ; von diesem Byte oberes Byte von Counter abziehen brmi is_higher ; bei negativem Ergebnis zuSprungmarke wechslen mov temp, t_value1 ; mittleres Byte von Counterendwert lesen sub temp, t_count1 ; von diesem Byte mittleres Byte von Counter abziehen brmi is_higher ; bei negativem Ergebnis zuSprungmarke wechslen mov temp, t_value0 ; unteres Byte von Counterendwert lesen sub temp, t_count0 ; von diesem Byte unteres Byte von Counter abziehen brpl cont_ISR ; wenn Ergebnis nicht negativ ISR verlassen is_higher: ldi temp, 0x00 mov t_count0,temp ; Zähler wieder auf 0 zurücksetzen mov t_count1,temp mov t_count2,temp rjmp clock_event ; Unterprogramm aufrufen (kehrt zu cont_ISR zurück) cont_ISR: pop temp ; alten Zustand des Status Registers vom Stack holen out SREG,temp ; SREG wiederherstellen pop temp ; ehemaligen Inhalt von R16 vom Stack zurückholen reti ; weiter im regulären Programm ;------------------------------------------------------------------------------- ; Ende timer0 overflow ;_______________________________________________________________________________ ... hier steht noch weiterer Code ;_______________________________________________________________________________ ;Start ADC_conv_comp: ISR für AD-Wandlung ;------------------------------------------------------------------------------- ADC_conv_complete: push temp ; Inhalt aus Register 16 im Stack sichern in temp,SREG ; Statusregister Zustand einlesen push temp ; ebenfalls im Stack ablegen ldi multiplier, multiplier_preset in temp, ADCL ; unteres Byte der A/D-Wandlung einlesen mul temp, multiplier ; und mit dem oben definierten Faktor multiplizieren mov t_value0, R0 ; unteres Byte der Multiplikation schreiben mov temp, R1 ; oberes Byte der Multiplikation sichern in temp2, ADCH ; zusätzlich oberes Byte der A/D-Wandlung einlesen mul temp2, multiplier ; oberes A/D Byte mit oben definiertem Faktor multiplizieren add temp, R0 ; unteres Byte der Multiplikation zum oberen Byte der vorigen Multiplkation addieren brcc continue ; bei Variablenüberlauf inc R1 ; oberes Byte der 2. Multiplikation um 1 hochzählen continue: mov t_value1, temp ; neues mittleres Byte des Counterendes schreiben mov t_value2, R1 ; neues oberes Byte des Counterendes schreiben pop temp ; alten Zustand des Status Registers vom Stack holen out SREG,temp ; SREG wiederherstellen pop temp ; ehemaligen Inhalt von R16 vom Stack zurückholen reti ; weiter im regulären Programm ;------------------------------------------------------------------------------- ; Ende ADC_conv_comp ;_______________________________________________________________________________ ... hier steht noch weiterer Code