hallo

hab ein kleines prob. mit meinem countdown programm.
ich währe euch sehr dankbar wenn ihr mir einen tip geben würdet wie ich es meistern kann.

ich hab mir ein platinenbelichter zusammen geschustert und bin dabei einen timer zu basteln der 2 7seg. anzeigen, 3 taster(t1=-1s, t2=+1s und t3=starten) und in der lage ist den belichter nach runterzählen aus zuschalten.

nun das prob. ist das jedes mal wenn eine 10 vorhanden ist, die 0 beibehält und die 1 dec. also hab ich statt 09 auf einmal 00.
das gleiche gillt auch wenn ich inc. will wenn zb. eine 09 vorhanden ist und ich t2 drücke hab ich eine 19 statt 10.

ich hab das noch nicht in den AVR geladen und auch nicht in AVR studio laufen lassen...ich habe den code stück für stück gelesen und dann ist es mir aufgefallen!
probiert hab ich auch vieles aber bin nie auf die richtige bahn gekommen!!

mein problem code:

Code:
;ZÄHLPROZEDUR
zähler-:

	cpi einer, 0
	breq zehnerdown
	dec einer
	rjmp einer_füll

zähler+:

	cpi einer, 9
	breq zehnerup
	inc einer
	rjmp einer_füll

zehnerup:

	cpi zehner, 9
	breq input
	inc zehner
	rjmp zehner_füll

zehnerdown:
	
	cpi zehner, 0
	breq input
	dec zehner
	rjmp zehner_füll
ganzer code:
Code:
.include "m8def.inc"

.org 0x000
	rjmp start

.org ovf1addr
	rjmp zähler-
start:
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;DEN REGISTERN NAMEN ZUORDNEN ZUR BESSEREN ERKENNUNG
.def null = r0
.def eins = r1
.def zwei = r2
.def drei = r3
.def vier = r4
.def funf = r5
.def sechs = r6
.def sieben = r7
.def acht = r8
.def neun = r9
.def ausgabeE = r10
.def ausgabeZ = r11
.def eingabe = r15
.def einer = r16
.def zehner = r17
.def sichern = r12
.def prog = r13
.equ taster = pind
.equ t1 = 0x01							;taster für -5s
.equ t2 = 0x02							;taster für +5s
.equ t3 = 0x04							;taster für das starten des programmes


;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;NUMMERN FÜR DIE 7SEGMENTE EINGEBEN

	ldi null, 

;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; STACK, EIN- UND AUSGÄNGE FESTLEGEN

	ldi r18, high (ramend)			;stack
	out sph, r18
	ldi r18, low (ramend)
	out spl, r18
	
	ldi r18, oxff					;pb0 bis pb7 als ausgang
	out ddrb, r18					;für die kathoden am 7segmen

	ldi r18, 0x03					;pc0 und pc1 als ausgang
	out ddrc, r18					;für die gem. anode am 7segmend

	ldi r18, 0x00					;pd0 bis pd2 als eingang
	out ddrd, r18					;für die taster t1 bis t3

	ldi r18, 0x07					;mit den internen pull up widerständen
	out portd, r18
	
	ldi r18, (1<<cs11) | (1<<cs10)  ;prescaller ist auf 1024 gesetzt für 1s
	out tccr1b, r18					;tccr1b ist für prescaller zuständig
	ldi r18, (1<<toie1)				;toie1 = 1 d.h. int. ist eingeschaltet
	out timsk, r18					;timst ist für int. einstellung zusaändig
	
	ldi prog, 0

;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;VOREINSTELLUNGEN NACH WAHL
;
;10s AUSWAHL
;	ldi einer, 0
;	ldi ausgabeE. null
;	ldi zehner, 1
;	ldi ausgabeZ. eins
;
5s AUSWAHL
	ldi einer, 5
	ldi ausgabeE, funf
	ldi zehner, 0
	ldi ausgabeZ, null
;
;0s AUSWAHL
;	ldi einer, 0
;	ldi ausgabeE. null
;	ldi zehner, 0
;	ldi ausgabeZ. Null
;
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;TASTEN ABFRAGEN UND AUSGEBEN DER ZIFFERN

input:
	rcall 5ms						;warten 5ms
	cbi portc, 0					;zehneranzeige ausschalten
	
	sbi portc, 1					;eineranzeige einschalten
	out portb, ausgabeE				;einer anzeigen
	rcall 5ms						;warten 5ms

	cbi portc, 1					;eineranzeige ausschalten
	sbi portc, 0					;zehneranzeige einschalten
	out portb, ausgabeZ				;zehner anzeigen
	cpi prog, 1
	breq programm
;----------------------------------------------------------------------------------------	

	in eingabe, taster				;an portd anliegende werte einlesen
	cpi eingabe, t1					;ist t1 gedrückt?
	breq zähler-						;spring zu -5s
	cpi eingabe, t2					;ist t2 gedrückt?
	breq zähler+						;spring zu +5s
	cpi eingabe, t3					;ist t3 gedrückt?
	breq programm					;spring zum programm
	rjmp input						;weiter einlesen

;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;ZÄHLPROZEDUR
zähler-:

	cpi einer, 0
	breq zehnerdown
	dec einer
	rjmp einer_füll

zähler+:

	cpi einer, 9
	breq zehnerup
	inc einer
	rjmp einer_füll

zehnerup:

	cpi zehner, 9
	breq input
	inc zehner
	rjmp zehner_füll

zehnerdown:
	
	cpi zehner, 0
	breq input
	dec zehner
	rjmp zehner_füll
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;ZEHNERREGISTER MIT DEN ZAHLEN FÜLLEN
zehner_füll:
	cpi zehner, 0
	breq zehnernull
	cpi zehner, 1
	breq zehnereins
	cpi zehner, 2
	breq zehnerzwei
	cpi zehner, 3
	breq zehnerdrei
	cpi zehner, 4
	breq zehnervier
	cpi zehner, 5
	breq zehnerfunf
	cpi zehner, 6
	breq zehnersechs
	cpi zehner, 7
	breq zehnersieben
	cpi zehner,8
	breq zehneracht
	cpi zehner, 9
	breq zehnerneun
;-----------------------------------------
zehnernull:
	ldi ausgabeZ, null
	rjmp input
zehnereins:
	ldi ausgabeZ, eins
	rjmp input
zehnerzwei:
	ldi ausgabeZ, zwei
	rjmp input
zehnerdrei:
	ldi ausgabeZ, drei
	rjmp input
zehnervier:
	ldi ausgabeZ, vier
	rjmp input
zehnerfunf:
	ldi ausgabeZ, funf
	rjmp input
zehnersechs:
	ldi ausgabeZ, sechs
	rjmp input
zehnersieben:
	ldi ausgabeZ, sieben
	rjmp input
zehneracht:
	ldi ausgabeZ, acht
	rjmp input
zehnerneun:
	ldi ausgabeZ, neun
	rjmp input
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;EINERREGISTEN MIT DEN ZAHLEN FüLLEN
einer_füll:
	cpi einer, 0
	breq einernull
	cpi einer, 1
	breq einereins
	cpi einer, 2
	breq einerzwei
	cpi einer, 3
	breq einerdrei
	cpi einer, 4
	breq einervier
	cpi einer, 5
	breq einerfunf
	cpi einer, 6
	breq einersechs
	cpi einer, 7
	breq einersieben
	cpi einer, 8
	breq eineracht
	cpi einer, 9
	breq einerneun
;-----------------------------------------
einernull:
	ldi ausgabeE, null
	rjmp input
einereins:
	ldi ausgabeE, eins
	rjmp input
einerzwei:
	ldi ausgabeE, zwei
	rjmp input
einerdrei:
	ldi ausgabeE, drei
	rjmp input
einervier:
	ldi ausgabeE, vier
	rjmp input
einerfunf:
	ldi ausgabeE, funf
	rjmp input
einersechs:
	ldi ausgabeE, sechs
	rjmp input
einersieben:
	ldi ausgabeE, sieben
	rjmp input
eineracht:
	ldi ausgabeE, acht
	rjmp input
einerneun:
	ldi ausgabeE, neun
	rjmp input
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;HAUPTPROGRAMM
programm:
	ldi sichern, sreg
	push sichern
	ldi prog, 1
	sei
	sbi portb, 7


ende:
	
	cli
	cbi portb, 7
	ldi prog, 0
	pop sichern
	ldi sreg, sichern
	rjmp input
	
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;WARTEZEIT FÜR DIE ANZEIGE
5ms:
		ldi r30, 0x21
loop0:	ldi r31, 0xC9
loop1:	dec r31
		brne loop1
		dec r30
		brne loop0
		ret