Fortsetzung

.include "AtMega328_timercounter.asm" Fortsetzung
Code:
;******************************Init-Modes des Timers1***************************************************************
mode0_T1_init:;NORMAL_MODE  OCR1A h:l,OCR1B h:l update ocrxH:L sofort oder im INT
		;rcall		A1_ch_en						;out aktivieren
		;rcall		B1_ch_en						;out aktivieren
		;rcall		A1_ch_load					;Zeitwert laden
		;rcall		B1_ch_load					;Zeitwert laden
		ldi			temp0,(0<<ICNC1|0<<ICES1|0<<WGM13|0<<WGM12)	;zum Toggeln COM1xA/B Einstellungen beachten!!!!!!!!!
		sts			TCCR1B,temp0	
		lds			temp0,TCCR1A
		ori			temp0,(0<<COM1A1|1<<COM1A0|0<<COM1B1|1<<COM1B0|0<<WGM11|0<<WGM10)	;zum Toggeln COM1xA/B Einstellungen beachten!!!!!!!!!
		sts			TCCR1A,temp0
		lds			temp0,TIMSK1
		ori			temp0,(0<<ICIE1|0<<OCIE1B|0<<OCIE1A|1<<TOIE1)	;INT für ICP=off, OCIE1A=off, OCIE1B=off, OVFL=1
		sts			TIMSK1,temp0						
		ret

mode1_T1_init:;8bit phase correct mode OCR1A h:l,OCR1B h:l update ocrxH:L on top oder im INT
		rcall		A1_ch_en						;out aktivieren
		rcall		B1_ch_en						;out aktivieren
		rcall		A1_ch_load					;Zeitwert laden
		rcall		B1_ch_load					;Zeitwert laden
		ldi			temp0,(0<<WGM13|0<<WGM12)	;zum Toggeln COM1xA/B Einstellungen beachten!!!!!!!!!
		sts			TCCR1B,temp0	
		lds			temp0,TCCR1A
		ori			temp0,(1<<COM1A1|0<<COM1A0|1<<COM1B1|0<<COM1B0|0<<WGM11|1<<WGM10)	;zum Toggeln COM1xA/B Einstellungen beachten!!!!!!!!!
		sts			TCCR1A,temp0
		lds			temp0,TIMSK1
		ori			temp0,(0<<ICIE1|1<<OCIE1A|1<<OCIE1B|0<<TOIE1)	;INT für ICP=off, OCIE1A=off, OCIE1B=off, OVFL=1
		sts			TIMSK1,temp0						
		ret

mode2_T1_init:;9bit phase correct mode OCR1A h:l,OCR1B h:l update ocrxH:L on top oder im INT
		rcall		A1_ch_en						;out aktivieren
		rcall		B1_ch_en						;out aktivieren
		rcall		A1_ch_load					;Zeitwert laden
		rcall		B1_ch_load					;Zeitwert laden
		ldi			temp0,(0<<WGM13|0<<WGM12)	;zum Toggeln COM1xA/B Einstellungen beachten!!!!!!!!!
		sts			TCCR1B,temp0	
		lds			temp0,TCCR1A
		ori			temp0,(1<<COM1A1|0<<COM1A0|1<<COM1B1|0<<COM1B0|1<<WGM11|0<<WGM10)	;zum Toggeln COM1xA/B Einstellungen beachten!!!!!!!!!
		sts			TCCR1A,temp0
		lds			temp0,TIMSK1
		ori			temp0,(0<<ICIE1|1<<OCIE1A|1<<OCIE1B|0<<TOIE1)	;INT für ICP=off, OCIE1A=off, OCIE1B=off, OVFL=1
		sts			TIMSK1,temp0						
		ret

mode3_T1_init:;10bit phase correct mode OCR1A h:l,OCR1B h:l update ocrxH:L on top oder im INT
		rcall		A1_ch_en						;out aktivieren
		rcall		B1_ch_en						;out aktivieren
		rcall		A1_ch_load					;Zeitwert laden
		rcall		B1_ch_load					;Zeitwert laden
		ldi			temp0,(0<<WGM13|0<<WGM12)	;zum Toggeln COM1xA/B Einstellungen beachten!!!!!!!!!
		sts			TCCR1B,temp0	
		lds			temp0,TCCR1A
		ori			temp0,(1<<COM1A1|0<<COM1A0|1<<COM1B1|0<<COM1B0|1<<WGM11|1<<WGM10)	;zum Toggeln COM1xA/B Einstellungen beachten!!!!!!!!!
		sts			TCCR1A,temp0
		lds			temp0,TIMSK1
		ori			temp0,(0<<ICIE1|1<<OCIE1A|1<<OCIE1B|0<<TOIE1)	;INT für ICP=off, OCIE1A=off, OCIE1B=off, OVFL=1
		sts			TIMSK1,temp0						
		ret

mode4_T1_init:;CTC mode OCR1A h:l,OCR1B h:l update ocrAH:L oder im INT
		rcall		A1_ch_en						;out aktivieren
		rcall		B1_ch_en						;out aktivieren
		rcall		A1_ch_load					;Zeitwert laden
		rcall		B1_ch_load					;Zeitwert laden
		ldi			temp0,(0<<WGM13|1<<WGM12)	;zum Toggeln COM1xA/B Einstellungen beachten!!!!!!!!!
		sts			TCCR1B,temp0	
		lds			temp0,TCCR1A
		ori			temp0,(0<<COM1A1|1<<COM1A0|0<<COM1B1|1<<COM1B0|0<<WGM11|0<<WGM10)	;zum Toggeln COM1xA/B Einstellungen beachten!!!!!!!!!
		sts			TCCR1A,temp0
		lds			temp0,TIMSK1
		ori			temp0,(0<<ICIE1|0<<OCIE1A|0<<OCIE1B|0<<TOIE1)	;INT für ICP=off, OCIE1A=off, OCIE1B=off, OVFL=1
		sts			TIMSK1,temp0						
		ret

mode5_T1_init:;FAST PWM 8bit OCR1A h:l,OCR1B h:l update ocrxH:L on bottom oder im INT
		rcall		A1_ch_en						;out aktivieren
		rcall		B1_ch_en						;out aktivieren
		rcall		A1_ch_load					;Zeitwert laden
		rcall		B1_ch_load					;Zeitwert laden
		ldi			temp0,(0<<WGM13|1<<WGM12)	;zum Toggeln COM1xA/B Einstellungen beachten!!!!!!!!!
		sts			TCCR1B,temp0	
		lds			temp0,TCCR1A
		ori			temp0,(0<<COM1A1|1<<COM1A0|0<<COM1B1|1<<COM1B0|0<<WGM11|1<<WGM10)	;zum Toggeln COM1xA/B Einstellungen beachten!!!!!!!!!
		sts			TCCR1A,temp0
		lds			temp0,TIMSK1
		ori			temp0,(0<<ICIE1|0<<OCIE1A|0<<OCIE1B|0<<TOIE1)	;INT für ICP=off, OCIE1A=off, OCIE1B=off, OVFL=1
		sts			TIMSK1,temp0						
		ret

mode6_T1_init:;FAST PWM 9bit OCR1A h:l,OCR1B h:l update ocrxH:L on bottom oder im INT
		rcall		A1_ch_en						;out aktivieren
		rcall		B1_ch_en						;out aktivieren
		rcall		A1_ch_load					;Zeitwert laden
		rcall		B1_ch_load					;Zeitwert laden
		ldi			temp0,(0<<WGM13|1<<WGM12)	;zum Toggeln COM1xA/B Einstellungen beachten!!!!!!!!!
		sts			TCCR1B,temp0	
		lds			temp0,TCCR1A
		ori			temp0,(1<<COM1A1|0<<COM1A0|1<<COM1B1|0<<COM1B0|1<<WGM11|0<<WGM10)	;zum Toggeln COM1xA/B Einstellungen beachten!!!!!!!!!
		sts			TCCR1A,temp0
		lds			temp0,TIMSK1
		ori			temp0,(0<<ICIE1|1<<OCIE1A|1<<OCIE1B|0<<TOIE1)	;INT für ICP=off, OCIE1A=off, OCIE1B=off, OVFL=1
		sts			TIMSK1,temp0						
		ret

mode7_T1_init:;FAST PWM 10bit OCR1A h:l,OCR1B h:l update ocrxH:L on bottom oder im INT
		rcall		A1_ch_en						;out aktivieren
		rcall		B1_ch_en						;out aktivieren
		rcall		A1_ch_load					;Zeitwert laden
		rcall		B1_ch_load					;Zeitwert laden
		ldi			temp0,(0<<WGM13|1<<WGM12)	;zum Toggeln COM1xA/B Einstellungen beachten!!!!!!!!!
		sts			TCCR1B,temp0	
		lds			temp0,TCCR1A
		ori			temp0,(1<<COM1A1|0<<COM1A0|1<<COM1B1|0<<COM1B0|1<<WGM11|1<<WGM10)	;zum Toggeln COM1xA/B Einstellungen beachten!!!!!!!!!
		sts			TCCR1A,temp0
		lds			temp0,TIMSK1
		ori			temp0,(0<<ICIE1|1<<OCIE1A|1<<OCIE1B|0<<TOIE1)	;INT für ICP=off, OCIE1A=off, OCIE1B=off, OVFL=1
		sts			TIMSK1,temp0						
		ret

mode8_T1_init:;PWM,PahseFrequenzyCorrect OCR1A h:l,ICRh:l update ocrxH:L on bottom oder im INT
		rcall		A1_ch_en						;out aktivieren
		rcall		B1_ch_en						;out aktivieren
		rcall		A1_ch_load					;Zeitwert laden
		rcall		B1_ch_load					;Zeitwert laden
		ldi			temp0,(1<<ICES1|1<<WGM13|0<<WGM12)	;zum Toggeln COM1xA/B Einstellungen beachten!!!!!!!!!
		sts			TCCR1B,temp0	
		lds			temp0,TCCR1A
		ori			temp0,(1<<COM1A1|0<<COM1A0|1<<COM1B1|0<<COM1B0|0<<WGM11|0<<WGM10)	;zum Toggeln COM1xA/B Einstellungen beachten!!!!!!!!!
		sts			TCCR1A,temp0
		lds			temp0,TIMSK1
		ori			temp0,(1<<ICIE1|0<<OCIE1A|0<<OCIE1B|0<<TOIE1)	;INT für ICP=off, OCIE1A=off, OCIE1B=off, OVFL=1
		sts			TIMSK1,temp0						
		ret

mode9_T1_init:;PWM,PahseFrequenzyCorrect OCR1A h:l,OCR1A h:l update ocrxH:L on bottom oder im INT
		rcall		A1_ch_en						;out aktivieren
		rcall		B1_ch_en						;out aktivieren
		rcall		A1_ch_load					;Zeitwert laden
		rcall		B1_ch_load					;Zeitwert laden
		ldi			temp0,(1<<WGM13|0<<WGM12)	;zum Toggeln COM1xA/B Einstellungen beachten!!!!!!!!!
		sts			TCCR1B,temp0	
		lds			temp0,TCCR1A
		ori			temp0,(1<<COM1A1|0<<COM1A0|1<<COM1B1|0<<COM1B0|0<<WGM11|1<<WGM10)	;zum Toggeln COM1xA/B Einstellungen beachten!!!!!!!!!
		sts			TCCR1A,temp0
		lds			temp0,TIMSK1
		ori			temp0,(0<<ICIE1|1<<OCIE1A|1<<OCIE1B|0<<TOIE1)	;INT für ICP=off, OCIE1A=off, OCIE1B=off, OVFL=1
		sts			TIMSK1,temp0						
		ret

mode10_T1_init:;PWM,PahseCorrect OCR1A h:l,ICRh:l update ocrxH:L on top oder im INT
		rcall		A1_ch_en						;out aktivieren
		rcall		B1_ch_en						;out aktivieren
		rcall		A1_ch_load					;Zeitwert laden
		rcall		B1_ch_load					;Zeitwert laden
		ldi			temp0,(1<<WGM13|0<<WGM12)	;zum Toggeln COM1xA/B Einstellungen beachten!!!!!!!!!
		sts			TCCR1B,temp0	
		lds			temp0,TCCR1A
		ori			temp0,(1<<COM1A1|0<<COM1A0|1<<COM1B1|0<<COM1B0|1<<WGM11|0<<WGM10)	;zum Toggeln COM1xA/B Einstellungen beachten!!!!!!!!!
		sts			TCCR1A,temp0
		lds			temp0,TIMSK1
		ori			temp0,(1<<ICIE1|0<<OCIE1A|0<<OCIE1B|0<<TOIE1)	;INT für ICP=off, OCIE1A=off, OCIE1B=off, OVFL=1
		sts			TIMSK1,temp0						
		ret

mode11_T1_init:;PWM,PahseCorrect OCR1A h:l,OCRah:l update ocrxH:L on top oder im INT
		rcall		A1_ch_en						;out aktivieren
		rcall		B1_ch_en						;out aktivieren
		rcall		A1_ch_load					;Zeitwert laden
		rcall		B1_ch_load					;Zeitwert laden
		ldi			temp0,(1<<WGM13|0<<WGM12)	;zum Toggeln COM1xA/B Einstellungen beachten!!!!!!!!!
		sts			TCCR1B,temp0	
		lds			temp0,TCCR1A
		ori			temp0,(1<<COM1A1|0<<COM1A0|1<<COM1B1|0<<COM1B0|1<<WGM11|1<<WGM10)	;zum Toggeln COM1xA/B Einstellungen beachten!!!!!!!!!
		sts			TCCR1A,temp0
		lds			temp0,TIMSK1
		ori			temp0,(0<<ICIE1|1<<OCIE1A|1<<OCIE1B|0<<TOIE1)	;INT für ICP=off, OCIE1A=off, OCIE1B=off, OVFL=1
		sts			TIMSK1,temp0						
		ret

mode12_T1_init:;CTC OCR1A h:l,ICRh:l update sofort oder im INT
		rcall		A1_ch_en						;out aktivieren
		rcall		B1_ch_en						;out aktivieren
		rcall		A1_ch_load					;Zeitwert laden
		rcall		B1_ch_load					;Zeitwert laden
		ldi			temp0,(1<<WGM13|1<<WGM12)	;zum Toggeln COM1xA/B Einstellungen beachten!!!!!!!!!
		sts			TCCR1B,temp0	
		lds			temp0,TCCR1A
		ori			temp0,(0<<COM1A1|1<<COM1A0|0<<COM1B1|1<<COM1B0|0<<WGM11|0<<WGM10)	;zum Toggeln COM1xA/B Einstellungen beachten!!!!!!!!!
		sts			TCCR1A,temp0
		lds			temp0,TIMSK1
		ori			temp0,(1<<ICIE1|0<<OCIE1A|0<<OCIE1B|0<<TOIE1)	;INT für ICP=off, OCIE1A=off, OCIE1B=off, OVFL=1
		sts			TIMSK1,temp0						
		ret

mode13_T1_init:;RESERVED not activated
	/*	;rcall		A1_ch_en						;out aktivieren
		;rcall		B1_ch_en						;out aktivieren
		;rcall		A1_ch_load					;Zeitwert laden
		;rcall		B1_ch_load					;Zeitwert laden
		ldi			temp0,(1<<WGM13|1<<WGM12)	;zum Toggeln COM1xA/B Einstellungen beachten!!!!!!!!!
		out			TCCR1B,temp0	
		in			temp0,TCCR1A
		ori			temp0,(1<<COM1A1|0<<COM1A0|1<<COM1B1|0<<COM1B0|0<<WGM11|1<<WGM10)	;zum Toggeln COM1xA/B Einstellungen beachten!!!!!!!!!
		out			TCCR1A,temp0
		in			temp0,TIMSK
		ori			temp0,(0<<TICIE1|1<<OCIE1A|1<<OCIE1B|0<<TOIE1)	;INT für ICP=off, OCIE1A=off, OCIE1B=off, OVFL=1
		out			TIMSK,temp0						
	*/	ret

mode14_T1_init:;FAST PWM OCR1A h:l,ICRh:l update ocrxH:L on bottom oder im INT
		rcall		A1_ch_en						;out aktivieren
		rcall		B1_ch_en						;out aktivieren
		rcall		A1_ch_load					;Zeitwert laden
		rcall		B1_ch_load					;Zeitwert laden
		ldi			temp0,(1<<WGM13|1<<WGM12)	;zum Toggeln COM1xA/B Einstellungen beachten!!!!!!!!!
		sts			TCCR1B,temp0	
		lds			temp0,TCCR1A
		ori			temp0,(1<<COM1A1|0<<COM1A0|1<<COM1B1|0<<COM1B0|1<<WGM11|0<<WGM10)	;zum Toggeln COM1xA/B Einstellungen beachten!!!!!!!!!
		sts			TCCR1A,temp0
		lds			temp0,TIMSK1
		ori			temp0,(1<<ICIE1|0<<OCIE1A|0<<OCIE1B|0<<TOIE1)	;INT für ICP=off, OCIE1A=off, OCIE1B=off, OVFL=1
		sts			TIMSK1,temp0						
		ret

mode15_T1_init:;FAST PWM OCR1A h:l,OCRah:l update ocrxH:L on bottom oder im INT
		rcall		A1_ch_en						;out aktivieren
		rcall		B1_ch_en						;out aktivieren
		rcall		A1_ch_load					;Zeitwert laden
		rcall		B1_ch_load					;Zeitwert laden
		ldi			temp0,(1<<WGM13|1<<WGM12)	;zum Toggeln COM1xA/B Einstellungen beachten!!!!!!!!!
		sts			TCCR1B,temp0	
		lds			temp0,TCCR1A
		ori			temp0,(0<<COM1A1|1<<COM1A0|0<<COM1B1|0<<COM1B0|1<<WGM11|1<<WGM10)	;zum Toggeln COM1xA/B Einstellungen beachten!!!!!!!!!
		sts			TCCR1A,temp0
		lds			temp0,TIMSK1
		ori			temp0,(0<<ICIE1|0<<OCIE1A|0<<OCIE1B|0<<TOIE1)	;INT für ICP=off, OCIE1A=off, OCIE1B=off, OVFL=1
		sts			TIMSK1,temp0						
		ret

prescaler_T1_on:
		lds			temp0,TCCR1B
		ori			temp0,(0<<CS12|0<<CS11|1<<CS10) ;schmeißt den counter an
		sts			TCCR1B,temp0
		sei
		ret

prescaler_T1_off:
		lds			temp0,TCCR1B
		andi		temp0,(0<<CS12|0<<CS11|0<<CS10) ;stoppt den counter an
		sts			TCCR1B,temp0
		ret

T1_clr:	clr			temp0
		sts			TCNT1h,temp0
		sts			TCNT1l,temp0
		ret

;**********Channel load 
A1_ch_load:
		ldi			temp0,$00		;Toggeln oder Clr/Set aktiv muss OCR1Ah-Register beachtet werden um
		sts			OCRa1h,temp0	;____--- oder _------ zu erreichen
		sts			OCR1ah,temp0
		ldi			temp0,$ff		;Toggeln oder Clr/Set aktiv muss OCR1Al-Register beachtet werden um
		sts			OCRa1l,temp0	;____--- oder _------ zu erreichen
		sts			OCR1al,temp0
		ret

A1_ch_en:
		sbi			ddrb,1			;output aktivieren wenn Toggeln am PINB1=OCR1A erwünscht
		ret

A1_ch_dis:
		cbi			ddrb,1			;output deaktivieren wenn Toggeln am PINB1=OCR1A erwünscht
		ret

B1_ch_load:
		ldi			temp0,$00		;Toggeln oder Clr/Set aktiv muss OCR1Bh-Register beachtet werden um
		sts			OCRb1h,temp0	;____--- oder _------ zu erreichen
		sts			OCR1bh,temp0
		ldi			temp0,$80		;Toggeln oder Clr/Set aktiv muss OCR1Bl-Register beachtet werden um
		sts			OCRb1l,temp0	;____--- oder _------ zu erreichen
		sts			OCR1bl,temp0
		ret

B1_ch_en:
		sbi			ddrb,2			;output aktivieren wenn Toggeln am PINB1=OCR1A erwünscht
		ret

B1_ch_dis:
		cbi			ddrb,2			;output deaktivieren wenn Toggeln am PINB1=OCR1A erwünscht
		ret

;**********ISR
INT_CPT1: ;$0014 Timer/Counter1 Capture Event
		;ICRH:L wird vom Counter TVCNT1H:L bei Steigender/Fallender Flanke beschrieben
		reti

INT_OC1A: ;$0016 Timer/Counter1 Compare Match A
		push		temp0
		lds			temp0,OCRa1h		;Toggeln oder Clr/Set aktiv muss OCR1Ah-Register beachtet werden um
		sts			OCR1Ah,temp0	;____--- oder _------ zu erreichen
		lds			temp0,OCRa1l		;Toggeln oder Clr/Set aktiv muss OCR1Al-Register beachtet werden um
		subi		temp0,$30
		sts			OCR1Al,temp0	;____--- oder _------ zu erreichen
		sts			OCRa1l,temp0
		pop			temp0
		reti

INT_OC1B: ;$0018 Timer/Counter1 Compare Match B
		push		temp0
		lds			temp0,OCRb1h		;Toggeln oder Clr/Set aktiv muss OCR1Bh-Register beachtet werden um
		sts			OCR1Bh,temp0	;____--- oder _------ zu erreichen
		lds			temp0,OCRb1l		;Toggeln oder Clr/Set aktiv muss OCR1Bl-Register beachtet werden um
		sts			OCR1Bl,temp0	;____--- oder _------ zu erreichen
		pop			temp0
		reti

INT_OVF1: ;$001A Timer/Counter1 Overflow
		reti

;*******************************************************************************************************************
;******************************Init-Modes des Timers2***************************************************************
mode0_T2_init:;NORMAL_MODE  OCR2 update sofort oder im INT
		rcall		A2_ch_en			;output aktivieren wenn Toggeln am PINB3=OCR2 erwünscht
		rcall		B2_ch_en		;Toggeln oder Clr/Set aktiv muss OCR2-Register beachtet werden um
		rcall		A2_ch_load		;____--- oder _------ zu erreichen
		rcall		B2_ch_load	

		lds			temp0,TCCR2B
		ori			temp0,(0<<WGM22)
		sts			TCCR2B,temp0
								
		lds			temp0,TCCR2A
		ori			temp0,( 0<<WGM21 | 0<<WGM20 )		
		sts			TCCR2A,temp0

		lds			temp0,TCCR2A
		ori			temp0,( 0<<COM2A1 | 0<<COM2A0 | 0<<COM2B1 | 0<<COM2B0 )	;zum Toggeln COM2x Einstellungen beachten!!!!!!!!!
		sts			TCCR2A,temp0

		lds			temp0,TIMSK2
		ori			temp0,( 0<<OCIE2B | 0<<OCIE2A | 1<<TOIE2 );OutputCompareInterrupt deaktiviert
		sts			TIMSK2,temp0

		ret

mode1_T2_init:;PWM-PhaseCorrect 
		rcall		A2_ch_en			;output aktivieren wenn Toggeln am PINB3=OCR2 erwünscht
		rcall		B2_ch_en		;Toggeln oder Clr/Set aktiv muss OCR2-Register beachtet werden um
		rcall		A2_ch_load		;____--- oder _------ zu erreichen
		rcall		B2_ch_load

		lds			temp0,TCCR2B
		ori			temp0,(0<<WGM22)
		sts			TCCR2B,temp0
								
		lds			temp0,TCCR2A
		ori			temp0,( 0<<WGM21 | 1<<WGM20 )		
		sts			TCCR2A,temp0

		lds			temp0,TCCR2A
		ori			temp0,( 1<<COM2A1 | 1<<COM2A0 | 0<<COM2B1 | 0<<COM2B0 )	;zum Toggeln COM2x Einstellungen beachten!!!!!!!!!
		sts			TCCR2A,temp0

		lds			temp0,TIMSK2
		ori			temp0,( 0<<OCIE2B | 1<<OCIE2A | 0<<TOIE2 );OutputCompareInterrupt deaktiviert
		sts			TIMSK2,temp0

		ret
		
mode2_T2_init:;CTC 
		;rcall		A2_ch_en			;output aktivieren wenn Toggeln am PINB3=OCR2 erwünscht
		;rcall		B2_ch_en		;Toggeln oder Clr/Set aktiv muss OCR2-Register beachtet werden um
		rcall		A2_ch_load		;____--- oder _------ zu erreichen
		;rcall		B2_ch_load
		
		lds			temp0,TCCR2B
		ori			temp0,(0<<WGM22)
		sts			TCCR2B,temp0
								
		lds			temp0,TCCR2A
		ori			temp0,( 1<<WGM21 | 0<<WGM20 )		
		sts			TCCR2A,temp0

		lds			temp0,TCCR2A
		ori			temp0,( 0<<COM2A1 | 1<<COM2A0 | 0<<COM2B1 | 1<<COM2B0 )	;zum Toggeln COM2x Einstellungen beachten!!!!!!!!!
		sts			TCCR2A,temp0

		lds			temp0,TIMSK2
		ori			temp0,( 0<<OCIE2B | 1<<OCIE2A | 0<<TOIE2 );OutputCompareInterrupt deaktiviert
		sts			TIMSK2,temp0

		ret
		
mode3_T2_init:;FastPWM 
		rcall		A2_ch_en			;output aktivieren wenn Toggeln am PINB3=OCR2 erwünscht
		rcall		B2_ch_en		;Toggeln oder Clr/Set aktiv muss OCR2-Register beachtet werden um
		rcall		A2_ch_load		;____--- oder _------ zu erreichen
		rcall		B2_ch_load
	
		lds			temp0,TCCR2B
		ori			temp0,(0<<WGM22)
		sts			TCCR2B,temp0
								
		lds			temp0,TCCR2A
		ori			temp0,( 1<<WGM21 | 1<<WGM20 )		
		sts			TCCR2A,temp0

		lds			temp0,TCCR2A
		ori			temp0,( 0<<COM2A1 | 1<<COM2A0 | 0<<COM2B1 | 1<<COM2B0 )	;zum Toggeln COM2x Einstellungen beachten!!!!!!!!!
		sts			TCCR2A,temp0

		lds			temp0,TIMSK2
		ori			temp0,( 1<<OCIE2B | 1<<OCIE2A | 0<<TOIE2 );OutputCompareInterrupt deaktiviert
		sts			TIMSK2,temp0

		ret

mode5_T2_init:;PWM PHASE CORRECT 
		rcall		A2_ch_en			;output aktivieren wenn Toggeln am PINB3=OCR2 erwünscht
		rcall		B2_ch_en		;Toggeln oder Clr/Set aktiv muss OCR2-Register beachtet werden um
		rcall		A2_ch_load		;____--- oder _------ zu erreichen
		rcall		B2_ch_load
	
		lds			temp0,TCCR2B
		ori			temp0,(1<<WGM22)
		sts			TCCR2B,temp0
								
		lds			temp0,TCCR2A
		ori			temp0,( 0<<WGM21 | 1<<WGM20 )		
		sts			TCCR2A,temp0

		lds			temp0,TCCR2A
		ori			temp0,( 0<<COM2A1 | 1<<COM2A0 | 1<<COM2B1 | 0<<COM2B0 )	;zum Toggeln COM2x Einstellungen beachten!!!!!!!!!
		sts			TCCR2A,temp0

		lds			temp0,TIMSK2
		ori			temp0,( 1<<OCIE2B | 1<<OCIE2A | 0<<TOIE2 );OutputCompareInterrupt deaktiviert
		sts			TIMSK2,temp0

		ret

mode7_T2_init:;FAST PWM
		rcall		A2_ch_en			;output aktivieren wenn Toggeln am PINB3=OCR2 erwünscht
		rcall		B2_ch_en		;Toggeln oder Clr/Set aktiv muss OCR2-Register beachtet werden um
		rcall		A2_ch_load		;____--- oder _------ zu erreichen
		rcall		B2_ch_load
	
		lds			temp0,TCCR2B
		ori			temp0,(1<<WGM22)
		sts			TCCR2B,temp0
								
		lds			temp0,TCCR2A
		ori			temp0,( 1<<WGM21 | 1<<WGM20 )		
		sts			TCCR2A,temp0

		lds			temp0,TCCR2A
		ori			temp0,( 1<<COM2A1 | 1<<COM2A0 | 1<<COM2B1 | 1<<COM2B0 )	;zum Toggeln COM2x Einstellungen beachten!!!!!!!!!
		sts			TCCR2A,temp0

		lds			temp0,TIMSK2
		ori			temp0,( 1<<OCIE2B | 1<<OCIE2A | 0<<TOIE2 );OutputCompareInterrupt deaktiviert
		sts			TIMSK2,temp0

		ret

prescaler_T2_on:
		lds			temp0,TCCR2B
		ori			temp0,(1<<CS22|1<<CS21|1<<CS20) ;schmeißt den counter an
		sts			TCCR2B,temp0
		sei
		ret

prescaler_T2_off:
		lds			temp0,TCCR2B
		andi		temp0,(0<<CS22|0<<CS21|0<<CS20) ;stoppt den counter an
		sts			TCCR2B,temp0
		ret

T2_clr:	clr			temp0
		sts			TCNT2,temp0
		ret

;**********Channel load 
A2_ch_load:
		ldi			temp0,$4d		;Toggeln oder Clr/Set aktiv muss OCR1Ah-Register beachtet werden um
		sts			OCR2A,temp0
		clr			temp0
		sts			ocra2,temp0
		ret

A2_ch_en:
		sbi			ddrb,3			;output aktivieren wenn Toggeln am PINB1=OCR1A erwünscht
		ret

A2_ch_dis:
		cbi			ddrb,3			;output deaktivieren wenn Toggeln am PINB1=OCR1A erwünscht
		ret

B2_ch_load:
		ldi			temp0,$40		;Toggeln oder Clr/Set aktiv muss OCR1Ah-Register beachtet werden um
		sts			OCR2B,temp0
		sts			ocrb2,temp0
		ret

B2_ch_en:
		sbi			ddrd,3			;output aktivieren wenn Toggeln am PINB1=OCR1A erwünscht
		ret

B2_ch_dis:
		cbi			ddrd,3			;output deaktivieren wenn Toggeln am PINB1=OCR1A erwünscht
		ret


;*******ISR
INT_OC2A: ;$000E
		reti
INT_OC2A2:
		reti

INT_OC2B: ;$0010
		reti

INT_OVF2: ;$0012
		reti

.include "AtMega328_uart_std.asm"
Code:
;************************Unterprogramme******************************
rx:		rcall		data_received	;warte auf daten von PC
		cpi			temp1,' '		;vergleich auf leerzeichen
		brne		rx				;sonst wenn falsch warte weiter
		ldi			temp1,'*'		;
		rcall		data_transmit	;sende * als ack
		ret

tx:		rcall		wait150ms
		ldi			temp1,'T'
		rcall		data_transmit	;sende T
		ldi			temp1,'S'
		rcall		data_transmit	;sende S
		ldi			temp1,'T'
		rcall		data_transmit	;sende T
		ret

;*********************Textausgabe aus DB***********************************
txt_out_rs_debug:
		rcall		debug_pnt		;Pointer für Debug laden wird alles in SRAM ab Adresse RSDEBUG geschrieben
txt_out_rs:
		lpm		    temp1,z+		;!!! muss in der .db *2 genommen werden
		cpi			temp1,$ff
		breq		txt_out_rs_end
	;	st			x+,temp1		;nur einschalten wenn debug angesprungen wird
		rcall		data_transmit	;z.b.: ldi ZH,high(out0*2)
		rjmp		txt_out_rs
txt_out_rs_end:
		ret

debug_pnt:
		ldi			xh,high(RSdebug)
		ldi			xl,low(RSdebug)
		ret

;***********This is an ENTER omg*******************************************
enter_rs232:
		ldi			temp1,$0d
		rcall		data_transmit
		ldi			temp1,$0a
		rcall		data_transmit
		ret

leer_zeichen_rs232:
		ldi			temp1,' '
		rcall		data_transmit
		ret

;***************************ZahlenAusgabe*************************
zahl_rs_load_out:
	;	ld			mathergll,y+	;alles in die Mathregs laden
	;	clr			mathergl
	;	clr			mathergh
	;	clr			matherghh
		rcall		hex_dez			;Zahlenwandlung
		push		yh				;on stack anderer AdressBereich
		push		yl				;on stack
		rcall		load_Y_ergk		;maximale Ausgabe an Zahlen also 5Byte; load_Y_ergk1(4byte),2(3byte),3(2byte),4(1byte)
		ldi			temp3,high(erg_k+5)
		ldi			temp4,low(erg_k+5)
zahl_rs_load_out2:
		rcall		zahl_out_rsx	;Dez in ASCII + Ausgabe
		cp			yl,temp4		;
		brne		zahl_rs_load_out2
		pop			yl				;from stack
		pop			yh				;from stack
		ret	

zahl_out_rsx:						;RSX Ausgabe mit Variabler BYTEZAHL durch load_Y_ergk festgelegt
		ld			temp1,y+
		rjmp		zahl_out_rs
zahl_out_rs1:						;rs Ausgabe 2er Zahlen = 1Byte
		ld			temp1,y			;   nur um 1byte auszugeben 
zahl_out_rs:						;wird nur rs1 angesprungen müssen die Daten vorher geladen werden  
		mov			temp2,temp1
		swap		temp1
		andi		temp1,$0f
		ori			temp1,$30
		rcall		data_transmit	;Zehnerausgabe
									;Ausgbabe 1er Zahl
		mov			temp1,temp2
		andi		temp1,$0f
		ori			temp1,$30
		rcall		data_transmit	;Einerausgabe
		ret

;*****************Wandlung von 1A-hex in 1A-ASCII = 31 , 41 Anzeige ist 1 A 
adr_hex_ASCII_rs:							;Daten vorher in Temp1 laden
pc_ser2:mov			temp2,temp1				;byte sichern 

		swap		temp1					;swapen
		andi		temp1,$0f				;ausanden
		cpi			temp1,$0a				;vergleich ob >= 10
		brsh		pc_ser21				;wenn ja mach ein HexBuchstabe zu ASCII-Buschstabe
		subi		temp1,-$30				;wenn nein mach HexZahl zu ASCII-Zahl
		rjmp		pc_ser22
pc_ser21:			
		subi		temp1,-$37				;HexBuchstabe zu ASCII-Buschstabe
pc_ser22:		
		rcall		data_transmit			;und ab damit zum PC
		mov			temp1,temp2				;gesichertes byte laden
		andi		temp1,$0f				;ausanden
		cpi			temp1,$0a				;vergleich ob >= 10
		brsh		pc_ser31				;wenn ja mach ein HexBuchstabe zu ASCII-Buschstabe
		subi		temp1,-$30				;wenn nein mach HexZahl zu ASCII-Zahl
		rjmp		pc_ser32
pc_ser31:
		subi		temp1,-$37				;HexBuchstabe zu ASCII-Buschstabe
pc_ser32:
		rcall		data_transmit			;und ab damit zum PC
		rcall		leer_zeichen_rs232		;leerzeichen
		rcall		enter_rs232				;wenn ja mach noch ein ENTER
		ret

;************************uart_init mit RX interrupt**********************
usart_init:
		ldi			temp0,high (UBRR0)
		ldi			temp1,low  (UBRR0)
		sts			UBRR0H,temp0				;9600 Baud einstellen PDF S.133 table52
		sts 		UBRR0L,temp1

		rcall		char_size8					;8 zeichen, 1 stoppbit
		
		lds			temp0,UCSR0A
		ori			temp0,(0<<U2X0|0<<MPCM0)	;no DoubleSpeed, no MultiProzComMode
		sts			UCSR0A,temp0
		
		ret

char_size5:
		ldi 		temp0,(0<<UMSEL01|0<<UMSEL00|0<<UPM01|0<<UPM00|0<<USBS0|0<<UCSZ01|0<<UCSZ00|0<<UCPOL0) ; UCSRC1 or UBRRH0,USBS=0 stoppbits1,
		sts 		UCSR0C,temp0	
		ldi 		temp0,(0<<RXCIE0|0<<TXCIE0|0<<UDRIE0|1<<RXEN0|1<<TXEN0|0<<UCSZ02)	;enable RX u TX  <=5bit(UCSZ2=0) 
		sts 		UCSR0B,temp0	;
		ret						
		
char_size6:
		ldi 		temp0,(0<<UMSEL01|0<<UMSEL00|0<<UPM01|0<<UPM00|0<<USBS0|0<<UCSZ01|1<<UCSZ00|0<<UCPOL0) ;UCSRC1 or UBRRH0,USBS=0 stoppbits1,
		sts 		UCSR0C,temp0	
		ldi 		temp0,(0<<RXCIE0|0<<TXCIE0|0<<UDRIE0|1<<RXEN0|1<<TXEN0|0<<UCSZ02)	;enable RX u TX  <=6bit(UCSZ2=0) 
		sts 		UCSR0B,temp0	
		ret												
			
char_size7:
		ldi 		temp0,(0<<UMSEL01|0<<UMSEL00|0<<UPM01|0<<UPM00|0<<USBS0|1<<UCSZ01|0<<UCSZ00|0<<UCPOL0) ;UCSRC1 or UBRRH0,USBS=0 stoppbits1,
		sts 		UCSR0C,temp0		
		ldi 		temp0,(0<<RXCIE0|0<<TXCIE0|0<<UDRIE0|1<<RXEN0|1<<TXEN0|0<<UCSZ02)	;enable RX u TX  <=7bit(UCSZ2=0) 
		sts 		UCSR0B,temp0	;
		ret											
		
char_size8:
		ldi 		temp0,(0<<UMSEL01|0<<UMSEL00|0<<UPM01|0<<UPM00|0<<USBS0|1<<UCSZ01|1<<UCSZ00|0<<UCPOL0) ;UCSRC1 or UBRRH0,USBS=0 stoppbits1,
		sts 		UCSR0C,temp0	
		ldi 		temp0,(0<<RXCIE0|0<<TXCIE0|0<<UDRIE0|1<<RXEN0|1<<TXEN0|0<<UCSZ02)	;enable RX u TX  <=7bit(UCSZ2=0) 
		sts 		UCSR0B,temp0	
		ret					

char_size9:
		ldi 		temp0,(0<<UMSEL01|0<<UMSEL00|0<<UPM01|0<<UPM00|0<<USBS0|1<<UCSZ01|1<<UCSZ00|0<<UCPOL0) ;UCSRC1 or UBRRH0,USBS=0 stoppbits1,
		sts 		UCSR0C,temp0	
		ldi 		temp0,(0<<RXCIE0|0<<TXCIE0|0<<UDRIE0|1<<RXEN0|1<<TXEN0|1<<UCSZ02)	;enable RX u TX  <=9bit(UCSZ2=1) 
		sts 		UCSR0B,temp0	
		ret								

;************************uart_deinit********************************
usart_all_aus:
		clr			temp0
		sts			UCSR0B,temp0
		sts			UCSR0C,temp0
		sts			UBRR0L,temp0
		sts			UBRR0H,temp0
		ret

usart_ofln:									;wenn unterprogramme nicht 
		clr			temp0					;gestört werden dürfen
		sts			UCSR0B,temp0				;nur usart offline
		ret

;**********************daten_senden*********************************
INT_USART_RX:
		;siehe data_transmit;** man kann in der wartezeit andere sachen erledigen
		;bis der int kommt im INT selbst könnte man ne art daten-lese-schleife implementieren
		;um weitere daten zu senden die dann an temp1>>>UDR weitergegeben werden
		sts 		UDR0,temp1			; Put LSB data (r17) into buffer, tranceived data
		reti
;(polling)
data_transmit:
		lds			temp0,UCSR0A
		sbrs		temp0,UDRE0			;**
		rjmp		data_transmit		;**
		sts 		UDR0,temp1			; Put LSB data (r17) into buffer, tranceived data
		ret

;**********************daten_empfangen **********************
INT_USART_TX:
		lds			temp1,UDR0			; Put data from buffer into r17, received Data
		;siehe data_received;** man kann in der wartezeit andere sachen erledigen
		;bis der int kommt im INT selbst könnte man ne art daten-schreib-schleife implementieren
		;um weitere daten zu empfangen die dann an UDR>>>temp1 weitergegeben werden
		reti
;(polling)
data_received:
		lds			temp0,UCSR0A
		sbrs		temp0,RXC0			;**
		rjmp		data_received		;**
		lds	 		temp1,UDR0			; Put data from buffer into r17, received Data
		ret

;********************DatenRegisterLeereInterrupt***********************
INT_UDRE:
		;SOLANGE dieses register leer ist wird diese routine aufgerufen
		;also eigentlich immer wenn UDR=0
		reti

.include "AtMega328_LCD_Txt_out.asm"
Code:
;Hier her kommen alle Texte und Zahlausgaben  für das LCD die so anfallen
;********************TextAusgabeLCD*********************************
werbe1:	ldi			temp1,Zeile1
		rcall 		lcd_DDR_AdrX  		
		ldi 		ZH,high(out0*2)
        ldi 		ZL,low(out0*2)
        rcall 		txt_out
		ret

;************************Zahlenausgabe
zahl_out_lcd:
		ldi			temp1,Zeile2
		rcall		lcd_DDR_AdrX   			;auf LCDadresse 00
;!!!!!!!!Um andere Werte zu wandeln, müssen diese in matherghh:h:l:ll geladen werden!!!!!!!!!!
		;clr		matherghh				;hhbyte löschen
		;clr		mathergh				;hbyte löschen
		;clr		mathergl				;lbyte löschen
		;lds		mathergll,***			;Wert laden
		rcall		hex_dez					;Wandlung von HEX in DEZ steht dierekt im RAM
		set									;T-Flag setzen damit von 8stellig 8/7te 
		rcall		lcd_zahlout_4			;Zahl auf LCD 4byte = 8stellig 
		set									;T-Flag setzen damit von 8stellig 6/5te
		rcall		lcd_zahlout_3			;Zahl auf LCD 4byte = 8stellig 
		ret

;************************direktwandlung*wort*in*ASCII***************
;						    *   +	*=16Stellen/+=20stellen
;   		"12345678901234567890"
out0:	.db "   AVR-Atmega328    ",$ff
;**************************ende**************************************************

.include "AtMega328_RS_Txt_out.asm"
Code:
;**************Zeichen AUSGABE PC**************************************
werbe_rs:
		ldi 		ZH,high(rs_out0*2)
        ldi 		ZL,low(rs_out0*2)
        rcall 		txt_out_rs
		;rcall 		txt_out_rs_debug
		rcall		enter_rs232
		ret

;************************direktwandlung*wort*in*ASCII***************
rs_out0: .db "TST AtMega328 BIB",$ff