Hallo,

bin schon den ganzen Nachmittag am verzweifeln. Ich versuche mit einem 16F676 einen srf02 über I2C abzufragen. Eine Verbindung kann ich aufbauen und der srf02 sendet auch sein Ultraschallsignal auf Befehl, aber ich kann die Entfernung nicht auslesen. Leider hab ich nirgens ein Beispiel gefunden für eine Ansteuerung in Assembler und selber ist es mein erstes Projekt mit i2c.

Wär schön wenn hier mal jemand einen Blick drüber werfen könnte und schauen wo mein Fehler liegt. Das Register, dass ich auslesen möchte lasse ich zum Test auf PortB legen. Ansonsten ist der ganze Quellcode größtenteils von sprut übernommen, aus dem Beispiel zum ansteuern eines Eeproms.

Code:
	__CONFIG        _BODEN_ON & _CP_OFF & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _XT_OSC

;==========================================================================

TIMER1		EQU	H'20'		;Used in delay routine
TIMER2		EQU	H'21'		; "	"	"	

;==========================================================================



RESET		BSF	STATUS,RP0	;
		MOVLW	B'11010111'	;
		MOVWF	OPTION_REG	;
		;
		CLRF	INTCON		;

    movlw   B'00011100'         ; RC3,4,2 inputs
    iorwf   TRISC, f            ; + RC2=CCP1 output
 
    movlw   d'2'               ; 
    movwf   SSPADD              ; für I2C

		MOVLW	B'00000000'
		MOVWF	TRISB	

		BCF	STATUS,RP0	;
		MOVLW	B'11111111'
		MOVWF	PORTB	

    movlw   B'00001000'         ; master mode, clock=Fosc/(4*(SSPADD+1))
    movwf   SSPCON              ;

		CALL	DELAY_ROUTINE
		MOVLW	B'0000000'
		MOVWF	PORTB	
		CALL	DELAY_ROUTINE

   bsf     SSPCON, SSPEN       ; MSSP-Modul enable

		GOTO	START	


;***I2C UNTERPROGRAMME************************************************************
;
; I2C-Bus im Master-Mode übernehmen
i2c_on  bcf     PIR1, SSPIF     ; SSPIF Bit löschen
        bsf     STATUS, RP0
        bsf     SSPCON2, SEN    ; Bus Übernahme anweisen
        bcf     STATUS, RP0
        goto    i2c_warte

; ein Byte aus W senden
i2c_tx
        movwf   SSPBUF          ; -> zum I2C-Slave übertragen
        goto    i2c_warte

;ein Byte vom Slave empfangen (nach SSPBUF)
i2c_rx
        bsf     STATUS, RP0
        bsf     SSPCON2, RCEN   ; Daten Empfang einschalten
        bcf     STATUS, RP0
        goto    i2c_warte

; I2C-Bus wieder freigeben
i2c_off
        bsf     STATUS, RP0
        bsf     SSPCON2, PEN    ; Bus Freigabe anweisen
        bcf     STATUS, RP0

i2c_warte
        btfss   PIR1, SSPIF     ; fertig?
        goto    i2c_warte       ; nein, noch nicht
        bcf     PIR1, SSPIF     ; ja, alles fertig, nun noch SSPIF zurücksetzen
        return


DELAY_ROUTINE   MOVLW   D'255'      ;
                MOVWF   TIMER2
DEL_LOOP1       MOVLW   D'255'       ;	
                MOVWF   TIMER1
DEL_LOOP2      	nop
		nop
		nop
		nop
		nop
		nop
		DECFSZ  TIMER1,F
                GOTO    DEL_LOOP2
                DECFSZ  TIMER2,F
                GOTO    DEL_LOOP1
		RETLW   0
;***ENDE UNTERPROGRAMME**********************************************************



Start		BTFSS	PORTC,02   ;Start der Messung durch Tastendruck
		GOTO	START

		CALL 	DELAY_ROUTINE
		

        call    i2c_on          ; Bus aktiv

        movlw   D'224'           
        call    i2c_tx          ; SRF02 zum Schreiben adressieren

        movlw   D'0'            ; Befehlsregister
        call    i2c_tx
        movlw   D'81'           ; Messung in cm
        call    i2c_tx

        call    i2c_off         ; Bus freigeben 

;=========== Bis hierhin funktionierts

		CALL 	DELAY_ROUTINE     ; Wartezeit zur Messung

;**Stelle SRF02 auf REGISTER 2 ein*************
        call    i2c_on          ; Bus aktiv

        movlw   D'224'           
        call    i2c_tx          ; SRF02 zum Lesen adressieren


        movlw   H'02'            
        call    i2c_tx

        call    i2c_off         ; Bus freigeben


;**Lesen des Empfangsregisters*************
        call    i2c_on          ; Bus aktiv

        movlw   D'224'          
        call    i2c_tx          ; SRF02 zum lesen adressieren

        call    i2c_rx
        movfw   SSPBUF          ; I2C Empfangsregister auslesen
        movwf   PORTB		; Byte auf Ausgang legen

        call    i2c_off         ; Bus freigeben

;===========Jetzt hat PortB leider immer den Wert 255

GOTO Start

END
Schon mal Danke im voraus...