	LIST P=16F877A, R=DEC
	#include <p16f877a.inc>

	__config _BODEN_OFF & _CP_OFF & _PWRTE_ON & _WDT_OFF & _HS_OSC & _DEBUG_OFF & _CPD_OFF & _LVP_OFF  

	Datenpuffer	equ	32
	org 0x00
	goto begin

	org 0x04
        		retfie
	org 0x08
begin
	banksel	TRISB
	movlw	b'00000000'	;nastaveni PORTB jako vystup
	movwf	TRISB
	banksel	PORTB
    	bsf     STATUS, RP0         ; Bank 1
    	movlw   B'00011000'         ; RC3,4 inputs
    	iorwf   TRISC, f            ; + RC2=CCP1 output
    	bcf     STATUS, RP0         ; Bank 0 	


; einstellen des I2C-Taktes auf knapp 400 kHz
    	bsf     STATUS, RP0         ; Bank 1
    	movlw   d'11'               ; clock = 20/(4*(12+1)) = 385kHz
    	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
;=====================================================================
;**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   0x0f            ; Wert der auf Adresse 3 soll,asi zaslana data
        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
 ;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
 ;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
;			cteni
;**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 
;**Lesen des aktuellen Bytes aus 24C04*************
        call    i2c_on          ; Bus aktiv

        movlw   H'A1'           ; 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
	bsf	PORTB,1

	movlw	Datenpuffer 
	movwf	PORTB
	nop
	goto	$-1

;***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