-         

Ergebnis 1 bis 2 von 2

Thema: Serielle Senderoutine mit dynamischer Tabelle, Zeitproblem

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    07.01.2007
    Beiträge
    27

    Serielle Senderoutine mit dynamischer Tabelle, Zeitproblem

    Anzeige

    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

  2. #2
    Neuer Benutzer Öfters hier
    Registriert seit
    07.01.2007
    Beiträge
    27
    hab das Problem durch den Austausch der Warteschlange von 25µs auf 4µs behoben


    just, t0b4d

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •