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 ;###############################################################################
THX !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
just, t0b4d







Zitieren

Lesezeichen