Ich habe im Simulator dieses Programm getestet:

Code:
.include "m8def.inc"

.def tmp = r16
.def tmp2 = r17
.def status_reg = r18
;BIT 0 zeigt an, ob PINB,1 während der ISR LOW war, dann = 1
;BIT 1 warten auf dcf Anfang =1 => freigabe
;Bit 2 Fehlerbit
;BIT 3 wird auf rising edge 1
;BIT 4 wird in dcf_einholen gesetzt, wenn 59 Bits da. enable für dcf_auswerten
;BIT 5 Signal wird ignoriert, bis 1
;BIT 6
;BIT 7 warten auf 2 komplette Signale
.def pw = r19
.def pw2 = r20
.def pw_alt = r21

.def dcf_shift_reg = r24
.def sreg_save = r25

.equ dcf_BIT_counter = 104
.equ eins = 1
.equ zwei = 2
.equ vier = 4
.equ acht = 8
.equ zehn = 10
.equ zwanzig = 20
.equ vierzig = 40

.org 0x000
  rjmp reset
.org OC1Aaddr
     rjmp timer1_int

;*****************************************	
;*****************************************	
;         Pointer Z
; 
;              ms = RAM 100
;              sc = RAM 101
;             min = RAM 102
;          stunde = RAM 103
; dcf_BIT_counter = RAM 104
;         dcf_min = RAM 113     
;     dcf_min_alt = RAM 114
;         dcf_stu = RAM 115   
;    flag_counter = RAM 116   
;
;******************************************

;******************************************
;        Pointer Y

;     dcf BIT 0-7 = RAM 105
;    dcf BIT 8-15 = RAM 106
;   dcf BIT 16-23 = RAM 107
;   dcf BIT 24-31 = RAM 107
;   dcf BIT 32-39 = RAM 108
;   dcf BIT 40-47 = RAM 109     
;   dcf BIT 48-55 = RAM 110
;   dcf BIT 56-59 = RAM 111

reset:
   ;Stack wird bei Interrupts benötigt! 
   ldi tmp,HIGH(RAMEND) 
   out SPH,tmp 
   ldi tmp,LOW(RAMEND) 
   out SPL,tmp
   ldi tmp,0xFF
   out DDRD,tmp
   ldi tmp,0

   ldi r28,105
   ldi r29,0

   ldi r31,0
   ldi r30,100
   st Z+,tmp
   st Z+,tmp
   st Z+,tmp 
   st Z+,tmp 
   st Z,tmp
   ldi r30,100
   
   ldi tmp,0
   out DDRC,tmp
   ldi tmp,0b00110000
   out PORTC,tmp
   ldi tmp,0
   out DDRB,tmp
   ldi tmp,0
   out PORTB,tmp
   ldi tmp,0b00110000
   out TIMSK,tmp
   
ldi tmp,0b00000010
   out OCR1AH,tmp
   ldi r17,0b01110001
   out OCR1AL,r17

   ldi tmp,0b00000000
   out TCCR1A,tmp
   ldi tmp,0b01001011 ;input capture enable
   out TCCR1B,tmp
   ldi r17,0
   ldi status_reg,0
   
   ldi r28,105
   
ldi dcf_shift_reg,0
st Y+,dcf_shift_reg
st Y+,dcf_shift_reg
st Y+,dcf_shift_reg
st Y+,dcf_shift_reg
st Y+,dcf_shift_reg
st Y+,dcf_shift_reg
st Y+,dcf_shift_reg
st Y,dcf_shift_reg
ldi r28,105

ldi pw_alt,0
   sei

   main:
;**********************************  
   
   
   
   
   rjmp main




 

 timer1_int:
in sreg_save,SREG
ldi r30,116;Interruptcounter laden
ld tmp,Z
inc tmp

st Z,tmp
in tmp,TIFR
sbrs tmp,0b00000101
rjmp same
ori tmp,0b00100000;das Verhalten ändert sich nicht, wenn ich die T1 Flags ändere...
out TIFR,tmp
ld tmp,Z
out PORTD,tmp
ldi tmp,0
st Z,tmp
same:

ldi r30,100
 out SREG,sreg_save
reti
da läuft auch alles so wie geplant.
Die Sache mit
sbis TIFR,ICF1
geht nicht, da bekomme ich die meldung, dass der Operand out of Range ist.
Was die bebutzten Register aneht, habe ich ohnehin für jeen Zweck eine Speicherstelle im RAM benutzt.
Also immer
st und ld über die Pointerregister.