.INCLUDE "M8DEF.INC" .EQU PWMCONFIG = 0B01101001 ; TO BE LOADED INTO TCCR2 FOR PWM ;PWM Mode 3 (FastPWM) ;Clear on compare Match(nichtinvertieren) ;keien Vorteiler .EQU TMR0LOAD = 0x04 ; TIMER0 RELOAD Wert(Zählschritte des Counters. Hoher Wert = schnelle Änderung) .DEF TEMP1 = R16 ; temporaer genutzes Register .DEF TEMP2 = R17 ; temporaer genutzes Register .DEF CNTR = R18 ; OCR2 REG = CNTR .DEF FLAG = R19 ; Schaltschwelle incrementieren oder decrementieren .CSEG .ORG 0X0000 RJMP RESET .ORG 0X009 ; TMR0 ISR VECTOR RJMP TMR0ISR RESET: LDI TEMP1,HIGH(RAMEND) ;Stackpointer aktivieren OUT SPH,TEMP1 LDI TEMP1,LOW(RAMEND) OUT SPL,TEMP1 SER TEMP1 ;SER => Set Register mit 0xff OUT DDRB,TEMP1 ;Alle B-Ports als Ausgänge OUT PORTB,TEMP1 ;Alle B-Ports auf High MAIN: LDI TEMP1,TMR0LOAD ; Lade RELOAD Wert TCNT0 in Temp1 OUT TCNT0,TEMP1 ; TCNT0= TMR0LOAD LDI TEMP1,0x01 ; ENABLE TMR0 INTERRUPT IN TIMSK OUT TIMSK,TEMP1 LDI TEMP1,0B00000101 ; SET PRESCALER BITS AND START TIMER0 OUT TCCR0,TEMP1 ; Freq / 258 SEI ;Erlaube Interrups SER CNTR ; Set Register CNTR mit 0xff (Anfangswert) OUT OCR2,CNTR ;Schiebe den Wert von CNTR (0xff) ins OCR2 Register ("Schaltschwelle auf anfangswert") CLR FLAG ; CLEAR FLAG LDI TEMP1,PWMCONFIG ; START PWM OUT TCCR2,TEMP1 LOOP: NOP RJMP LOOP TMR0ISR: PUSH TEMP1 IN TEMP1,SREG PUSH TEMP1 ; Schreibe Adresse in den Stack LDI TEMP1,00 OUT TCCR0,TEMP1 ; STOP TIMER0 LDI TEMP1,TMR0LOAD ; RELOAD OUT TCNT0,TEMP1 LDI TEMP1,0B00000100 ; START TIMER0 OUT TCCR0,TEMP1 TST FLAG ; CHECK IF FLAG IS ZERO BRNE DOWN UP: DEC CNTR ; BRIGHTEN THE LED BRNE GO CLR CNTR SER FLAG RJMP GO ; DIM THE LED DOWN: INC CNTR ; Incrementiere Schaltschwelle(ocr2) CPI CNTR,0XFF ; Vergleich Ocr2 mit 0xff BRNE GO ; Springe wenn "nicht gleich" nach GO SER CNTR ; Setze CNTR auf 0xff CLR FLAG ; lösche Flag RJMP GO GO: OUT OCR2,CNTR ; WRITE CNTR VALUE TO OCR2 BACK: POP TEMP1 OUT SREG,TEMP1 ; RESTORE SREG STATUS POP TEMP1 ;Lade Rücksprungadresse RETI