Code:
	#define  fkHz           20000       ; Clock-Frequenz in kHz
#define  fOCR2A         1000        ; 1 MHz: 1 us  auf phiCP == OC2A
#define  f1OCR2A        500         ; 0,5 MHz: 2 us  auf phiCP == OC2A
#define  c_OCR2A        (fkHz/fOCR2A /2) -1 ; Comparewert für OCR2A => 9
#define  c1_OCR2A        (fkHz/f1OCR2A /2) -1 ; Comparewert1 für OCR2A => 19
#define  phiSP_high      1 ; SP soll 1 Takt von CP High sein
#define  phiSP_cnt      3000 ; nach 3000 Takten von CP soll neuer SP kommen
#define  c_OCR1A        phiSP_cnt -1 ; 1 Takt wird benötigt um SP zu HIGH zu schalten
#define  c_OCR1B        phiSP_cnt - phiSP_high -1 ; 1 Takt wird benötigt um SP wieder auf LOW zu setzen
.equ  DDR_phiCP       = DDRB  ; Datadirectionregister von CP 
.equ  phiCP           = 3       ; (PIN PB3 = CP) = Ausgang
.equ  DDR_phiSP       = DDRD  ; Datadirectionregister von SP
.equ  phiSP           = 0    ; (PIN PD0 = SP) = Ausgang
.equ  PORT_phiSP      = PORTD  ; Definiert den PORTD für SP um dort Werte zu setzen
.def  tmp0            = r16    ; Tmp0 zum arbeiten definieren
.def  tmp1            = r17    ; Tmp0 zum arbeiten definieren
;----------Interrupttable--------
.org $0000
  rjmp  reset
.org PCI0addr
  rjmp PCI0addr_
.org OC1Aaddr
  rjmp  OC1Aaddr_
.org OC1Baddr
  rjmp  OC1Baddr_
;--------------------------------
;+++++++++++++++++Interrupthandler++++++++++++++++++++++
;----------SP- Erzeugung---------
; Bei erreichen des Vergleichswertes c_OCR1A wird folgender
; Interrupt ausgelöst:
OC1Aaddr_:  
  cbi    PORT_phiSP,phiSP ; Bit in PORTD0 wird gelöscht
  reti
; Bei erreichen des Vergleichswertes c_OCR1B wird folgender
; Interrupt ausgelöst:
OC1Baddr_:
  sbi    PORT_phiSP,phiSP ; Bit in PORTD0 wird gesetzt
  reti
;--------------------------------
;-------Frequenzwechslung--------
; Bei jedem Flankenwechsel an PD2 soll die 
; CP-Frequenz gewechselt werden
PCI0addr_:
  push tmp1             ; Das SREG in tmp1 sichern. Vorher
  in   tmp1, SREG       ; muss natürlich tmp1 gesichert werden
  
  ldi  tmp0,OCR2A
  ldi  tmp1,c1_OCR2A
  CP  tmp0,tmp1    ; Vergleiche Konstante mit Vergleichsregister
  BRNE  ungleich    ; Wenn Ergebniss gleich überspringe das hier
  BREQ  istgleich    ; Ergebniss war gleich
istgleich:
    ldi tmp0,c_OCR2A    ; Lade c1_OCR2A in tmp0
    sts OCR2A,tmp0      ; speichere tmp0 in Vergleichsregister OCR2A
    out SREG, tmp1        ; Die Register SREG und tmp1 wieder
    pop tmp1              ; herstellen
    reti  
    
ungleich:
    ldi tmp0,c1_OCR2A    ; Lade c1_OCR2A in tmp0
    sts OCR2A,tmp0      ; speichere tmp0 in Vergleichsregister OCR2A
    out SREG, tmp1        ; Die Register SREG und tmp1 wieder
    pop tmp1              ; herstellen
    reti  
      
;-------------------------------
;-------Bei Reset/Start µC------
reset:
  ldi tmp0, LOW(RAMEND)
  out SPL, tmp0
  ldi tmp0, HIGH(RAMEND)
  out SPH, tmp0
  sbi    DDR_phiCP,phiCP  ; Setze Bit phiCP in DDR_phiCP DDRB=0b00001000
  sbi    DDR_phiSP,phiSP  ; Setze Bit phiCP in DDR_phiCP DDRD=0b00000001
  
  ldi  tmp0,(1<<ISC00)    ; Jeder Flankenwechsel löst INT aus [tmp0 = 0b00000001]
  sts  EICRA,tmp0      ; speichere tmp0 ins InterruptControlRegister EICRA
  ldi   tmp0,(1<<INT0)    ; PD2 ist für Interrupt verantwortlich [tmp0 = 0b00000001]
  out  EIMSK,tmp0      ; speichere tmp0 ins InterruptMaskRegister EIMSK
  
  ;    8-Bit-Timer-2 (CP-Erzeugung)
  ldi    tmp0,c_OCR2A        ; Lade c_OCR2A in tmp0
  sts    OCR2A,tmp0          ; speichere tmp0 in Vergleichsregister OCR2A
  ldi    tmp0,(1<<COM2A0)+(1<<WGM21) ; toggle OC2A, CTC per OCR2A [tmp0 = 0b01000010]
  sts    TCCR2A,tmp0        ; speichere tmp0 ins Controlregister TCCR2A
  ldi    tmp0,(1<<CS20)             ; Prescaler = 1 [tmp0 = 0b00000001]
  sts    TCCR2B,tmp0        ; speichere tmp0 ins Controlregister TCCR2B
  ;    16-Bit-Timer-1 (SP-Erzeugung)
  ldi    tmp0,high(c_OCR1A)      ; Lade Highanteil c_OCR1A in tmp0
  sts    OCR1AH,tmp0        ; speichere tmp0 in Vergleichsregister OCR1AH
  ldi    tmp0,low(c_OCR1A)      ; Lade Lowanteil c_OCR1A in tmp0
  sts    OCR1AL,tmp0        ; speichere tmp0 in Vergleichsregister OCR1AH
  ldi    tmp0,high(c_OCR1B)      ; Lade Highanteil c_OCR1B in tmp0
  sts    OCR1BH,tmp0        ; speichere tmp0 in Vergleichsregister OCR1BH
  ldi    tmp0,low(c_OCR1B)      ; Lade Lowanteil c_OCR1B in tmp0
  sts    OCR1BL,tmp0        ; speichere tmp0 in Vergleichsregister OCR1BH
  ldi    tmp0,(1<<WGM12)+(1<<CS12)+(1<<CS11) ; CTC per OCR1A, ext. T1 fallend
                      ; [tmp0 = 0b00001110]
  sts    TCCR1B,tmp0          ; speichere tmp0 ins Controlregister TCCR1B
  ldi    tmp0,(1<<OCIE1B)+(1<<OCIE1A)  ; Aktiviere Interrupts für Comparematch bei
                    ; OCR1A & OCR1B [tmp0 = 0b00000110]
  sts    TIMSK1,tmp0        ; speichere tmp0 ins InterruptMaskRegister TIMSK1
  sei                ; Aktiviere Globale Interrupts
;----------------------------
;++++++++++++++++++++++++++++++++++++++++++++++++++++++
;-------Hauptschleife--------
main_loop:
  rjmp  main_loop
 Könntet Ihr mir dabei vlt. helfen ?
Lesezeichen