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
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
Lesezeichen