Servus,

also irgendwie ist der Bereich der PIC schwach frequentiert. Ich habe nach wie vor das Problem mit dem EEPROM.

Ich habe mich jetzt noch mal im Detail mit I2C Programmierung auseinander gesetzt und bin bei sprut fündig geworden und versuche das Beispiel mit dem EEPROM umzusetzen, doch auch das mag nicht so recht klappen!

Code:
EPPROM_INIT
; einstellen von RC3 & RC4 auf input 
    bsf     STATUS, RP0         ; Bank 1 
    movlw   B'00011000'         ; RC3,4 inputs 
    iorwf   TRISC, f            ; + RC2=CCP1 output 
    bcf     STATUS, RP0         ; Bank 0 
;bcf			PORTC,3
;bcf			PORTC,4


; einstellen des I2C-Taktes auf knapp 400 kHz 
    bsf     STATUS, RP0         ; Bank 1 
    movlw   d'9'                ; clock = 4MHz/(4*(9+1)) = 100kHz 
    movwf   SSPADD              ; für I2C 
    bcf     STATUS, RP0         ; Bank 0 

	movlw   B'00001000'         ; master mode, clock=Fosc/(4*(SSPADD+1)) 
    movwf   SSPCON              ; 
	bsf     SSPCON, SSPEN       ; MSSP-Modul enable



EEPROM_SCHREIBEN
;**Schreibe Wert 5 auf Speicher-Adresse 3 in 24C04************* 
        call    i2c_on          ; Bus aktiv 
        movlw   H'A0'           ; 1010 0000 
        call    i2c_tx          ; 24C04 zum Schreiben adressieren 

        movlw   0x00            ; high Teil der Adresse (Page) 
        call    i2c_tx 
        movlw   0x03            ; low Teil der  Adresse 
        call    i2c_tx 

        movlw   0x05            ; Wert der auf Adresse 3 soll 
        call    i2c_tx 

        call    i2c_off         ; Bus freigeben 
; Fertig. Nun beginnt im EEPROM ein Lösch-Schreib-Zyklus 
; mit dem der Wert 5 in die EEPROM-Zelle 3 geschrieben wird. 
; Das wird etwa 10 ms dauern. Solange ist der 24C04 nicht ansprechbar. 
; 
 ;       ....                    ; das Programm geht dann irgentwie weiter 
EEPROM_LESEN  
 ;**Stelle EEPROM auf Speicher-Adresse 3 ein************* 
        call    i2c_on          ; Bus aktiv 
        movlw   H'A0'           ; 1010 0000 
        call    i2c_tx          ; 24C04 zum Schreiben adressieren 

        movlw   0x00            ; high Teil der Adresse 
        call    i2c_tx 
        movlw   0x03            ; low Teil der  Adresse 
        call    i2c_tx 

        call    i2c_off         ; Bus freigeben 

;Nun steht der Adress-Pointer im 24C04 auf dem Wert 3. 
;Nun können wir den I2C-Bus erneut aktivieren, um ein Byte aus dem 24C04 zu lesen. Das ist unser Datenbyte. 

;**Lesen des aktuellen Bytes aus 24C04************* 
        call    i2c_on          ; Bus aktiv 

        movlw   H'A0'           ; 1010 0001 
        call    i2c_tx          ; 24C04 zum lesen adressieren 

        call    i2c_rx 
        movfw   SSPBUF          ; I2C Empfangsregister auslesen 
        movwf   DATENPUFFER     ; Byte in Speicherzelle Datenpuffer retten 

        call    i2c_off         ; Bus freigeben
 

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

;***ENDE UNTERPROGRAMME**********************************************************
 





; End of I2C routines
Das ist der Code von der Seite, den ich versuche zum laufen zu bekommen. Dort wird die Initialisierung genauso gemacht, wie ich das in meinem Code mache.
Mein Problem ist, dass ich gleich bei der Aktivierung des Busses im Unterprogramm (voriger durchlauf von i2c_on) i2c_warte hängen bleibe und sich der PIC dann totläuft, wenn er das setzen von SSPIF wartet.
Jemand ne Idee?

Gruß und Danke