list p=16F876 #include "p16F876.inc" ;------------------------------------------------------------------- ; 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 ; einstellen des I2C-Taktes auf knapp 400 kHz bsf STATUS, RP0 ; Bank 1 movlw d'2' ; 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 ;--------------------------------------------------------------------------- ; 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 i2c_t1 btfss PIR1, SSPIF ; Testen, ob Bus schon übernommen wurde goto i2c_t1 ; nein, noch nicht bcf PIR1, SSPIF ; ja, der Bus ist mein! nun noch SSPIF zurücksetzen ;---------------------------------------------------------------------------------- ; Adressbyte senden movlw B'01110000' ; '01110000' soll gesendet werden ; ein Byte aus W senden 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 ;----------------------------------------------------------------------------------- SCHL: ; Datenbyte senden movlw B'1011010' ; '10110101' soll gesendet werden ; ein Byte aus W senden i2c_tx1 movwf SSPBUF ; -> zum I2C-Slave übertragen i2c_t21 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 goto SCHL end