PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Serielle Senderoutine mit dynamischer Tabelle, Zeitproblem



t0b4d
25.04.2007, 20:54
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 (http://layes.la.funpic.de/ps_controller/Assembler/senderoutine/PSC_sende_tabelle.txt)

Tabelle (http://layes.la.funpic.de/ps_controller/Assembler/senderoutine/PSC_tabelle.txt)




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
;################################################# ##############################






;############################********************* **############################
;########################### 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

t0b4d
26.04.2007, 18:54
hab das Problem durch den Austausch der Warteschlange von 25µs auf 4µs behoben


just, t0b4d