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