uffz...
sekunde2 wird nur in der bcd-routine genutzt, ansonsten gar nicht.

also insgesamt sieht es so aus:

Code:
.nolist
.include"m16def.inc"

.equ	xtal	= 8000000
.equ	debounce = 256
.equ	remainder = xtal - xtal / debounce * debounce

.def	isreg = r15
.def	wr0	= r16
.def	iwr0 = r17
.def	prescaler = r18

.def	sekunde = r19
.def    sekunde2 = r20
.def    minute = r21
.def    stunde = r22

.list
	rjmp	init
	.org	OC1Aaddr
	rjmp	OC1Aint
;-------------------------------------------------------------------------
OC1Aint:
	in	isreg, sreg

	ldi	iwr0, high( xtal / debounce - 1 )
	out	ocr1ah, iwr0
	ldi	iwr0, low( xtal / debounce - 1 )
	out	ocr1al, iwr0

	dec	prescaler
	brne	_oci1

	ldi	prescaler, debounce
	inc	sekunde

	ldi	iwr0, high( xtal / debounce + remainder - 1 )
	out	ocr1ah, iwr0
	ldi	iwr0, low( xtal / debounce + remainder - 1 )
	out	ocr1al, iwr0
_oci1:
	out	sreg, isreg
	reti
;-------------------------------------------------------------------------
init:
	ldi	wr0, 0x0
	out	ddra, wr0
	out ddrb, wr0
	out ddrc, wr0
	ldi sekunde, 0


	ldi	wr0, high( ramend )
	out	sph, wr0
	ldi	wr0, low( ramend )
	out	spl, wr0

	ldi	wr0, 1<<WGM12^1<<CS10
	out	TCCR1B, wr0

	ldi	wr0, high( xtal / debounce - 1 )
	out	ocr1ah, wr0
	ldi	wr0, low( xtal / debounce - 1 )
	out	ocr1al, wr0
	out	tcnt1l, wr0
	ldi	prescaler, debounce

	ldi	wr0, 1<<OCIE1A
	out	TIMSK, wr0
	sei




main:
	ldi	sekunde, 0
	
sekunden:
	cpi sekunde, 60
    breq minuten 
	rcall bcd
	out ddra, sekunde
	rjmp sekunden


bcd:
	ser sekunde2
to_bcd:
	inc sekunde2
	subi sekunde, -10
	brpl to_bcd
	swap sekunde2
	subi sekunde, -10
	or sekunde, sekunde2
	ret



minuten:
    inc minute
	cpi minute, 60
	breq stunden
	out ddrb, minute
	rjmp main



stunden:
    ldi minute, 0
	out ddrb, minute
	inc stunde
	cpi stunde, 24
	breq tag
	out ddrc, stunde
	rjmp main


tag:
    ldi stunde, 0
	out ddrc, stunde
	rjmp main