Hallo,


ich habe vor 3-4 Wochen mir eine Senderoutine gebastellt die auf einer dynamischen Tabelle aufbaut. Ich benutze dazu die indirekte Adressierung.

Als ich sie fertig gecoded hatte hatt alles wunderbar funktioniert! Nur ich hab in der Zwischenzeit ein paar Sachen geändert und jetzt hab ich das Problem das diese Senderoutine einfach zu viel Verarbeitungszeit braucht...

Könnt ihr mal schaun, welche Befehle viel Zeit benötigen oder ob ich vlt einen anderen dummen Fehler gemacht habe.

Den Code könnt ihr auch eingerückt anschaun unter

Senderoutine

Tabelle

Code:
UP_PSC_send_tabelle
	
	MOVLW	D'0'
	MOVWF	zaehler_tab
	
PSC_st1	

		
;#########		
;	BCF	debug3;;;;;;;;;	;-----DEBUGGING

	MOVLW	D'8'
	MOVWF	zaehler_bit
	
	BCF      STATUS, IRP	; Bank 0 oder 1 (alle Register aus der
 		        		; Tabelle sind in Bank 0)
	
	MOVF	zaehler_tab,W	;wird mit dem PCL addiert
	
	CALL	tab_PSC		;Öffnet die "dynamische Tabelle"
				;Im Workregister steht jetzt die Adresse
    				;des Registers dessen Inhalt
			     	;Übertragen werden soll
			     	
	MOVWF	FSR		;der Zeiger zeigt jetzt auf das Register
				;dessen Inhalt Übertragen werden soll
				
	MOVF	INDF,W		;mit dem virtuellen Register INDF kann der
				;Inhalt des Registers ausgegeben werden,
    				;auf das der Zeiger FSR zeigt

	MOVWF	sPSC		;Inhalt wird in sende Register kopiert,
				;da ein weiteres Register aus der Tabelle
				;benötigt wird um die empfangenen Bits zu
				;speichern
	
	INCF	zaehler_tab	;nächste Tabellenreihe
	
	MOVF	zaehler_tab,W	;wird mit dem PCL addiert
	CALL	tab_PSC		;Öffnet die "dynamische Tabelle"
				;Im Workregister steht jetzt die Adresse
    				;des Registers in das geschrieben wird
				    
	MOVWF	FSR		;der Zeiger zeigt jetzt auf das Register
				;in das die empfangenen Bits gespeichert
				;werden
				;-
				;mit dem virtuellen Register INDF kann der
				;Inhalt des Registers geändert werden,
    				;auf das der Zeiger FSR zeigt
				    
;#########		
;	BSF	debug3;;;;;;;;;	;-----DEBUGGING				
					
PSC_1	RRF	sPSC		;verschiebe sende Register nach rechts...
	BTFSS	STATUS,C		;prüfe Wertigkeit des rausgeworfenen Bits
	GOTO	PSC_sende_0	;(STATUS,C=0)-> Übertrage 0 an Controller...
	GOTO	PSC_sende_1	;(STATUS,C=1)-> ansonsten Übertrage '1'	

PSC_2	DECF	zaehler_bit
	MOVF	zaehler_bit,F	; Zähler ...
	BTFSS	STATUS,Z		; ... auf 0 prüfen,
	GOTO	PSC_1		; <-- Zähler != 0 --> nächstes Bit übertrag.
				; <-- Zähler == 0
				 

	INCF	zaehler_tab
	MOVLW	D'18'		;PS2-Analog-Mode Controller
	SUBWF	zaehler_tab,W
	BTFSS	STATUS,Z		
	GOTO	PSC_st1		;zaehler_tab < 18
	RETURN			;zaehler_tab = 18
;###########################################################	
PSC_sende_0
	BCF	a_COMMAND	;auf 0 setzten
	BCF	a_CLOCK		;negative Flanke (Controller ließt COMMAND)
	CALL	UP_wait_25us	;aber erst nach 25µs !!!
	BTFSC	e_DATA		;e_DATA prüfen
	GOTO	INDF_0_write_1	;empfangenes Bit in Carry-Flag setzen
	GOTO	INDF_0_write_0	;empfangenes Bit in Carry-Flag setzen
PSC_sende_0_next	
	RRF	INDF		;empfangenes Bit in Register hinzufügen
	BSF	a_CLOCK
	CALL	UP_wait_25us
	GOTO	PSC_2
;######################################	
INDF_0_write_1
	BSF	STATUS,C
	GOTO	PSC_sende_0_next

INDF_0_write_0			;zur Übersicht, hier geschrieben!!!
	BCF	STATUS,C
	GOTO	PSC_sende_0_next	
;###########################################################
PSC_sende_1
	BSF	a_COMMAND	;auf 1 setzten
	BCF	a_CLOCK		;negative Flanke (Controller ließt COMMAND)
	CALL	UP_wait_25us	;aber erst nach 4µs !!!
	BTFSC	e_DATA		;e_DATA prüfen
	GOTO	INDF_1_write_1	;empfangenes Bit in Carry-Flag setzen
	GOTO	INDF_1_write_0	;empfangenes Bit in Carry-Flag setzen
PSC_sende_1_next	
	RRF	gTYPE		;empfangenes Bit in Register hinzufügen
	BSF	a_CLOCK
	CALL	UP_wait_25us
	GOTO	PSC_2
;######################################
INDF_1_write_1
	BSF	STATUS,C
	GOTO	PSC_sende_1_next

INDF_1_write_0			;zur Übersicht, hier geschrieben!!!
	BCF	STATUS,C
	GOTO	PSC_sende_1_next
;###############################################################################


Code:
;############################***********************############################
;###########################       PSC-Tabelle       ###########################

tab_PSC				;Tabellenlänge: 18; -> zaehler_tab max. 18!
	BCF	PCLATH,0		;PCLATH auf ...
	BSF	PCLATH,1		;... 0x2 stellen
	MOVWF	PCL		;PCL ist jetzt 0x200 + zaehler_tab
	
	
	
ORG	0x200			; Tabelle in Speicherblock 3
	
	RETLW	sSTART		; Playstation Controller - Startbefehl
	RETLW	gSTART		; empfange... irgentwas

	RETLW	sTYPE		; Playstation Controller - Typebefehl
	RETLW	gTYPE		; empfange Type des Controllers

	RETLW	sIDLE		; übertrage 0 Signal
	RETLW	gSTATUS		; empfange Status des Controllers 

	RETLW	sIDLE		; übertrage 0 Signal
	RETLW	gLEFT		; empfange Status der Tasten LINKS

	RETLW	sIDLE		; übertrage 0 Signal
	RETLW	gRIGHT		; empfange Status der Tasten RECHTS

	RETLW	sIDLE		; übertrage 0 Signal
	RETLW	gRJoyX		; empfange : Joystick rechts, x-Achse

	RETLW	sIDLE		; übertrage 0 Signal
	RETLW	gRJoyY		; empfange : Joystick rechts, y-Achse

	RETLW	sIDLE		; übertrage 0 Signal
	RETLW	gLJoyX		; empfange : Joystick links, x-Achse

	RETLW	sIDLE		; übertrage 0 Signal
	RETLW	gLJoyY		; empfange : Joystick links, y-Achse
THX !

just, t0b4d