Main

;Startbedingung (Busübernahme)

i2c_on
    bsf TRISC,5         ;SCL        SCL & SDA auf High
    bsf TRISC,4


    btfss  PORTC,5
  goto  i2c_on    ; Taktleitung frei?
  btfss  PORTC,4
  goto  i2c_on    ; Datenleitung frei?

    bsf TRISC,5         ;SCL       ---> Startbedingung (Busübernahme)
    bcf TRISC,4         ;SDA
    bcf PORTC,4         ;Port auf 0 zum Low ziehen

;Warten auf Busübernahme

i2c_t1
    btfss   PIR1, SSPIF     ; Testen, ob Bus schon übernommen wurde
    goto    i2c_t1          ; wenn nicht dann wiederholen
    bcf     PIR1, SSPIF     ; ja, der Bus ist mein! nun noch 
Interruptflag zurücksetzen

;Adresse mit lesebefehl an Slave senden

;    bsf TRISC,4         ;SDA

        movlw   B'11000001'     ;Slave-Adresse + 1=Read    (Adresse Mag. 
Sensor:  60h=01100000) werden

i2c_tx
        movwf   SSPBUF          ; -> zum I2C-Slave übertragen

i2c_t2
        btfss   PIR1, SSPIF     ; ACK schon empfangen?
        goto    i2c_t2          ; nein, noch nicht
        bcf     PIR1, SSPIF     ; ja, Daten sind im Slave, nun noch 
SSPIF zurücksetzen




;ein Byte vom Slave empfangen

;i2c_rx
;        bsf     SSPCON2, RCEN   ; Daten Empfang einschalten

i2c_r7
        btfss   PIR1, SSPIF     ; Daten Empfang fertig?
        goto    i2c_r7          ; nein, noch nicht
        bcf     PIR1, SSPIF     ; ja, nun noch SSPIF zurücksetzen

        movf    SSPBUF, w       ; empfangene Daten -> W
        movwf   RXData          ; empfangene Daten -> RXData

;ACK-Signal Senden (für weitere Daten)

         bsf    TRISC,4          ;SDA
         nop
         nop
         nop
         nop
         bsf    TRISC,5          ;SCL


;Daten an LEDs ausgeben


        btfsc RXData,0          ;Überspringe nachfolgenden Befehl wenn 
ADRESH,0=0
        call LEDB2on            ;Einschalten
;        btfss RXData,0         ;Überspringe nachfolgenden Befehl wenn 
ADRESH,0=1
;        call LEDB2off          ;Ausschalten
        btfsc RXData,1          ;Überspringe nachfolgenden Befehl wenn 
ADRESH,1=0
        call LEDB3on
;        btfss RXData,1
;        call LEDB3off

        btfsc RXData,0          ;Überspringe nachfolgenden Befehl wenn 
ADRESL,0=0
        call LEDA0on
;        btfss RXData,0
;        call LEDA0off
        btfsc RXData,1          ;Überspringe nachfolgenden Befehl wenn 
ADRESL,1=0
        call LEDA2on
;        btfss RXData,1
;        call LEDA2off
        btfsc RXData,2          ;Überspringe nachfolgenden Befehl wenn 
ADRESL,2=0
        call LEDA4on
;        btfss RXData,2
;        call LEDA4off
        btfsc RXData,3          ;Überspringe nachfolgenden Befehl wenn 
ADRESL,3=0
        call LEDA6on
;        btfss RXData,3
;        call LEDA6off
        btfsc RXData,4          ;Überspringe nachfolgenden Befehl wenn 
ADRESL,4=0
        call LEDA8on
;        btfss RXData,4
;        call LEDA8off
        btfsc RXData,5          ;Überspringe nachfolgenden Befehl wenn 
ADRESL,5=0
        call LEDA10on
;        btfss RXData,5
;        call LEDA10off
        btfsc RXData,6          ;Überspringe nachfolgenden Befehl wenn 
ADRESL,6=0
        call LEDB0on
;        btfss RXData,6
;        call LEDB0off
        btfsc RXData,7          ;Überspringe nachfolgenden Befehl wenn 
ADRESL,7=0
        call LEDB1on
;        btfss RXData,7
;        call LEDB1off





; I2C-Bus wieder freigeben ---> STOP-Bedingung

i2c_off
        bsf TRISC,5         ;SCL        SCL & SDA auf High
        bsf TRISC,4
i2c_t8
        btfss   PIR1, SSPIF     ; Bus schon freigegeben?
        goto    i2c_t8          ; nein, noch nicht
        bcf     PIR1, SSPIF     ; fertig
