Hi Ihr lieben,

ich wollte mal fragen, wie ich in Assembler in einem Byte die länge eines Bit herausfinden kann, also die Zeit die er braucht zum High-Low wechsel und Low-High?!

Das was ich bisher gemacht habe funktioniert.
Die Schleife die ich probiert hab zu machen geht leider nicht,
da sich der Statuswert und der Wert in W sich kurz vor der abfrage ändert und dadurch gehts nicht.

Das Problem was ich noch habe ist, das mein Timer nicht immer bei 125 anfängt.
Ich brauche aber 125 da ich einen 1/16 Vorteiler habe der dann die Zeit auf ca. 2ms bringt. Beim Anfang des Programms gehts, das der mit 125 starten, aber beim Überlauf springt er auf 0, obwohl ich in einer Abfrage eingestellt habe, das er dann wieder zu dem teil springen soll wo der timer auf 125 gesetzt wird, aber das funktioniert nicht.

Falls Ihr euch den Code anschauen wollt setz ich ihn hier mit rein.
Ich weiss das die Schleife falsch ist, aber ich weiss nicht wie ich das richtig machen soll.


Code:
	list      p=16F84A           	  ; list directive to define processor
	#include <p16F84A.inc>        	  ; processor specific variable definitions

	__CONFIG   _CP_OFF & _WDT_OFF & _PWRTE_ON & _RC_OSC

;***** VARIABLE DEFINITIONS *****
w_temp        Equ     0x0C        	  ; variable used for context saving 
status_temp   Equ     0x0D       	  ; variable used for context saving

w_copy  Equ     0x20            	  ; Backup für Akkuregister 
s_copy  Equ     0x21            	  ; Backup für Statusregister

T0SC	Equ		OPTION_REG

		ORG     0x000           	  ; processor reset vector
  		goto    main            	  ; go to beginning of program

;		Interrupt routine falls diese mal benötigt wird
		ORG     0x004           	  ; interrupt vector location
		movwf   w_temp          	  ; save off current W register contents
		movf	STATUS,w       		  ; move status register into W register
		movwf	status_temp    		  ; save off contents of STATUS register
		
		movf    status_temp,w   	  ; retrieve copy of STATUS register
		movwf	STATUS          	  ; restore pre-isr STATUS register contents
		swapf   w_temp,f
		swapf   w_temp,w        	  ; restore pre-isr W register contents
		retfie                   	  ; return from interrupt

main	
;       PortA wird hier initialisiert  
		BCF STATUS, RP0				  ; RP0=0
		CLRF PORTA					  ; Initialisierung von PortA
									  ; durch löschen des Data latches
		BSF STATUS, RP0				  ; Markiere Bank 1
		MOVLW 0x0F					  ; nutzen für den DatenVerzeichniss
		
		MOVWF TRISA&0x7f			  ; SET RA<3:0> als Input
									  ; SET RA4 als Output
;   	PortB wird hier initialisiert  
		BCF STATUS, RP0				  ; RP0=0
		CLRF PORTB					  ; Initialisierung von PortA
									  ; durch löschen des Data latches
		BSF STATUS, RP0				  ; Markiere Bank 1
		MOVLW 0xCF					  ; nutzen für den DatenVerzeichniss
		  
		MOVWF TRISB&0x7f			  ; SET RA<3:0> als Input
									  ; SET RB<5:4> als Output
									  ; SET RB<7:6> als Output
TIMER									  
		movwf   w_copy       		  ; w retten 
        swapf   STATUS, w      		  ; STATUS retten 
        movwf   s_copy      		  ;
		MOVLW 1
NOCHMAL 
		BCF STATUS, RP0				  ; auf Bank 0 wechseln
		MOVLW   0x7D			  	  ; 0x83 = 131 ; 0x7D = 125
		MOVWF   TMR0				  ; 131 oder 125 müsste hier drin stehen
   
		BSF STATUS, RP0				  ; auf Bank 1 wechseln
;		BCF OPTION_REG&0x7f, T0SE	  ; bin mir nich sicher ob ichs brauche beim Vorteiler

;		Flanke
		BSF OPTION_REG&0x7f, T0SE	  ; hier wird für RA4 die Low Flanke gewählt
		MOVF T0SE, F			  	  ; hier wird es unter der Speicherzelle gesichert
		
;		movf TMR0, F			 	  ; das ist das Timer-Register

;		Vorverteiler Aktivieren
		BCF OPTION_REG&0x7f, PSA	  ; hier mit wird der Vorverteiler auf 0 gesetzt und aktiviert
		BCF OPTION_REG&0x7f, PS2	  ; damit man den vorverteiler auf 16/1 einstellt
		BSF OPTION_REG&0x7f, PS1	  ; hier wird PS1 auf 1 gesetzt
		BSF OPTION_REG&0x7f, PS0	  ; hier wird PS0 auf 1 gesetzt	
		
;		Timer
;		BSF OPTION_REG&0x7f, T0CS	  ; T0SC wird auf 1 gesetzt damit der Vorverteiler mit benutzt werden kann
		BCF OPTION_REG&0x7f, T0CS     ; hier wird in der Speicherzelle T0SC die 0 gesetzt
		MOVF T0CS, F			      ; nun wird es unter der Speicherzelle gesichert
		
		NOP
		
		ADDWF TMR0,W  ; +1 ergibt 0x00 in w, wenn TMR0=0xFF 
		MOVLW 1
		BTFSS STATUS,Z  ; Sprung, wenn Z-Flag gesetzt 
		GOTO TIMER 
		GOTO NOCHMAL		
	END

Ich hoffe Ihr könnt mir helfen.
Ich bin total verzweifelt und bin für jede Hilfe von Euch DANKBAR.

Danke für Eure Hilfe schonmal.

Mit freundlichen Grüßen
Damian Stolarek

PS.:
Bitte Helft mir