INCF - Warum zählt der nicht hoch

flumm
Also hab da en Problem. Ich will meien PIC16F84a programmieren, der eine zeitanzeige steuert.
An dieser soll man die Zeit über einen Minuten, einen Sekunden und einen stelltaster einstellen können. Ist dies erfolgt und der startknopf PORTA,0 wird gedrückt sollte die zeit beginnen abzulaufen.
Jetzt habe ich geschrieben:
CBLOCK H'20'
a ; die variable für die positionserkennung des 4017
zaehl_m ; zählvariable minuten
zaehl_s ; zählvariable sekunden
seg_0 ;variable für siebensegment 0
seg_1 ;Variable für siebensegment 1
seg_2 ;Variable für siebensegment 2
seg_3 ;Variable für siebensegment 3

ENDC


;************************
;* Konstanten festlegen *
;************************

; Hier sollten alle im Verlauf des Programms verwendeten Konstanten deklariert werden.
; Die Deklaration sieht z.B. folgendermaßen aus:

zaehlwert EQU D'255'
bitmuster EQU B'01010101'
milliadresse EQU H'10'
microadresse EQU H'11'


; In diesem Beispiel wird dem Wort zaehlwert der Dezimalwert 255 zugewiesen. Das Wort
; bitmuster steht nach der Deklaration für die Dualzahl 01010101.
; Man muss also bei öfters verwendeten Werten nicht immer wieder den Wert angeben,
; sondern ruft einfach die Konstante auf, die ja nach der Deklaration stellvertretend
; für den Zahlenwert steht.
; Wie bei Variablen vereinfacht sich somit die Programmierarbeit, da man sich nicht
; irgendwelche Zahlenwerte, sondern wesentlich einfachere Namen merken muss.


; ***************************************************
; * Definition von einzelnen Bits in einem Register *
; ***************************************************

; hier kann mit Hilfe der #DEFINE Direktive einzelnen Bits in einem Register ein
; Name zugewiesen werden.
; Eine Definition sieht z.B. folgendermaßen aus:

#DEFINE sensor3 PORTA, 0
#DEFINE motor1 PORTB, 1
#DEFINE bank1 STATUS, RP0

; In diesem Beispiel steht das Wort lampe1 für Bit 1 von Port A und das Wort motor1
; für das Bit 2 von Port B.
; Beim Ansprechen einzelner Bits in einem Register muss also nicht mehr das Register
; und das anzusprechende Bit (z.B. BTFSC PORTB, 0), sondern nur noch das definierte
; Wort angegeben werden.
; Wie bei Variablen und Konstanten vereinfacht sich dadurch wieder die Programmierarbeit.


;*****************
;* Programmstart *
;*****************

ORG 00H ; Das Programm wird ab Speicherstelle 0 in den Speicher geschrieben
GOTO init ; Springe zur Grundinitialisierung der Ports A und B


;*******************
;* Initialisierung *
;*******************

init BSF bank1 ; wechsle zu Registerbank 1 (spezielle Register)
MOVLW B'00011111'
MOVWF TRISA ; RA0 .. RA4 Eingänge
MOVLW B'00000000'
MOVWF TRISB ; RB0-RB7 Ausgänge
BCF bank1 ; wechsle zu Registerbank 0 (normaler Speicherbereich)
CLRF PORTA ; Port A löschen
CLRF PORTB ; Port B löschen
CLRF zaehl_m


; Die Register TRISA und TRISB legen fest, welche Bits in den jeweiligen Ports Ein- bzw.
; Ausgänge sind. Eine '1' an der entsprechenden Stelle setzt das Bit des Ports als Ein-
; gang eine '0' setzt das Bit als Ausgang. Schreibt man z.B. das Bitmuster B'10101010'
; in das Register TRISB, so sind die Bits 1,3,5 und 7 Ausgänge, während die Bits 2,4,6 und 8
; Eingänge darstellen.

;*****************
;* Hauptprogramm *
;*****************

main

BTFSC PORTA,1 ;wird taster für Minuten gedrückt
GOTO minuten ;gehe zu unterprog. minuten
BTFSC PORTA,2 ;wird taster für Sekunden gedrückt
GOTO minuten ;gehe zu unterprog. sekunden
MOVLW B'0000'
MOVWF seg_0
MOVLW B'0000'
MOVWF seg_1
MOVLW B'0000'
MOVWF seg_2
MOVLW B'0000'
MOVWF seg_3
CALL multi_0
CALL multi_1
CALL multi_2
CALL multi_3
GOTO main ;fang von vorne an

;*********************************************************
;Minuten Einstellung *
;*********************************************************
minuten BTFSS PORTA,3 ;wird der stelltaster gedrückt
GOTO minuten ;prüfe weiter
BCF PORTA,3
INCF zaehl_m,F ; Inkrementiere 'zaehl'
MOVLW B'00000001' ; Maskiere untere vier Bit aus...
ANDWF zaehl_m,F ; ...so das von 000-111, bzw. 0-7 gezählt wird
MOVF zaehl_m,W
CALL table
MOVWF PORTB
CALL multi_1
CALL warte
CALL warte
CALL warte
CALL warte
CALL warte
CALL warte
CALL warte
CALL warte
CALL warte
CALL warte
CALL warte
BTFSC PORTA,1
GOTO minuten
GOTO main
;**********************************************************
weiter
;**********************************************************



;******************************************************
;Multiplex-Verfahren *
;******************************************************
multi_0 BSF PORTB,5 ;wenn er hier resettet hat iss er immer auf dem ersten siebensegment
BCF PORTB,5 ;hier ist der reset zu ende
MOVFW seg_0
MOVWF PORTB
CALL warte ;lässt dieses siebensegment 1ms aufleuchten
CALL warte
CALL warte
CALL warte
CALL warte
CALL warte
RETURN
multi_1 BSF PORTB,5
BCF PORTB,5
BSF PORTB,4 ;hier kommt der impuls um auf das zweite siebensegment zu springen
BCF PORTB,4 ;hier ist er auf dem zweiten siebensegment
;MOVFW seg_1
;MOVWF PORTB
CALL warte ;lässt dieses siebensegment 1ms aufleuchten
CALL warte
CALL warte
CALL warte
CALL warte
CALL warte
RETURN
multi_2 BSF PORTB,5
BCF PORTB,5
BSF PORTB,4
BCF PORTB,4
BSF PORTB,4 ;hier kommt der impuls um auf das dritte siebensegment zu springen
BCF PORTB,4 ;hier ist er auf dem dritten siebensegment
MOVFW seg_2
MOVWF PORTB
CALL warte ;lässt dieses siebensegment 1ms aufleuchten
CALL warte
CALL warte
CALL warte
CALL warte
CALL warte
RETURN
multi_3 BSF PORTB,5
BCF PORTB,5
BSF PORTB,4
BCF PORTB,4
BSF PORTB,4
BCF PORTB,4
BSF PORTB,4 ;hier kommt der impuls um auf das vierten siebensegment zu springen
BCF PORTB,4 ;hier ist er auf dem vierten siebensegment
MOVFW seg_3
MOVWF PORTB
CALL warte ;lässt dieses siebensegment 1ms aufleuchten
CALL warte
CALL warte
CALL warte
CALL warte
CALL warte
RETURN

;*******************************************************



;*******************************************************
;Warteschleife
;*******************************************************
warte MOVLW D'2'
MOVWF milliadresse
loop1 MOVLW D'249'
MOVWF microadresse
loop2 NOP
NOP
DECFSZ microadresse,F
GOTO loop2
DECFSZ milliadresse;F
GOTO loop1
RETURN
;*******************************************************



;*******************************************************
;Tabelle
;*******************************************************

table ADDWF PCL,F ;BCD-Code für Zahlen
RETLW B'0000'
RETLW B'0001'
RETLW B'0010'
RETLW B'0011'
RETLW B'0100'
RETLW B'0101'
RETLW B'0110'
RETLW B'0111'
RETLW B'1000'
RETLW B'1001'
;*******************************************************
END

Doch er zählt nicht hoch sondern macht gibt nur zufällig zahlen aus.
Ich weis nicht mehr weiter, währe schön wenn mir jemand unter die Arme greifen könnte.

Danke schon im Voraus.

MfG

Davi Flammann