كود:
;;; programme communication entre pic16f877a et circuit rtc DS1307 viaI2C;;;;
list p=16f877a
#include<p16f877a.inc>
org 0x00
DATA0 equ PORTA
DATA1 equ PORTB
DATA2 equ PORTD
DATA3 equ 0X0C
DATA4 equ 0X0E
DATA5 equ 0X0F
DATA6 equ 0X1F
;; programme principale;;
bsf STATUS,RP0 ;bank 1
bcf STATUS,RP1 ;;bank 1
clrf TRISB
clrf TRISD
clrf TRISA
bsf TRISC,RC4
bsf TRISC,RC5
BCF SSPSTAT,CKE ;;Control des niveaux de tension à l'entrée, 0 : I2C, 1 : SMBUS ** travaille avec I2c;;
Bsf SSPSTAT,SMP;;Control de frq signal: 1 pour 100 kHz et 1 MHz, 0 pour 400 kHz ( la signal que on utilise pour SCL c'est 100 KHz or 1MHz;;
movlw 0X02
movwf SSPADD ;; on calcul la valeur avec cette relation ={ Fosc-4*F(scl)}-1
bcf STATUS,RP0 ;; bank 0
bcf STATUS,RP1 ; bank 0
movlw 0X28
movwf SSPCON ;;1110 : I2C master, adresse 7 bits, interruption sur START et STOP
clrf PORTD
CLRF PORTB
debut call I2C_start ;; cofiguration de i2c debut " mais dans ce programme je utilise juste une seul adresse donc "je crois" nous sommes pas obliger de ecrire une adresse
;;mais dans notr projet on doit met adresse parece que on utiliseront 3 circuit DS18B20/DS1307/.. 3 bus one wire
;; MOVLW 0X00
;; call I2C_ecrire ;; appele fonction d'ecrire qui'est base sur copie le donne ou la adresse dans registre SSPBUF et lui occupe de reste..
;;;;;;;;;;;;;;الكتابة علي دي اس;;;;;;;;;;
; Ecriture dans le registre de contrôle (adresse 0x07) du DS1307
call I2C_start
movlw B'11010000' ; 8 bits à écrire (7 bits d'adresse + bit 0 Write)
call I2C_write
call I2C_ACK_slave_to_master
movlw B'00000000' ; 8 bits à écrire
call I2C_write
call I2C_ACK_slave_to_master
movlw B'00100111' ; 8 bits à écrire
call I2C_write
call I2C_ACK_slave_to_master
movlw B'00100111' ; 8 bits à écrire
call I2C_write
call I2C_ACK_slave_to_master
movlw B'00100111' ; 8 bits à écrire
call I2C_write
call I2C_ACK_slave_to_master
movlw B'00000001' ; 8 bits à écrire
call I2C_write
call I2C_ACK_slave_to_master
movlw B'00000101' ; 8 bits à écrire
call I2C_write
call I2C_ACK_slave_to_master
movlw B'00101001' ; 8 bits à écrire
call I2C_write
call I2C_ACK_slave_to_master
movlw B'00101001' ; 8 bits à écrire
call I2C_write
call I2C_ACK_slave_to_master
call I2C_stop
;;;;;;القراءة (القيم);;;;;;;;
call I2C_start
movlw B'11010000' ; 8 bits à écrire (7 bits d'adresse + bit 0 Write)
call I2C_write
call I2C_ACK_slave_to_master
movlw B'00000000' ; 8 bits à écrire
call I2C_write
call I2C_ACK_slave_to_master
call I2C_Repeated_Start
movlw B'11010001' ; 8 bits à écrire (7 bits d'adresse + bit 1 Read)
call I2C_write
call I2C_ACK_slave_to_master
call I2C_read
movwf DATA0 ; les 8 bits lus sont transférés dans le registre d'usage général DATA0
call I2C_ACK_master_to_slave
call I2C_read
movwf DATA1 ; les 8 bits lus sont transférés dans le registre d'usage général DATA1
call I2C_ACK_master_to_slave
call I2C_read
movwf DATA2 ; les 8 bits lus sont transférés dans le registre d'usage général DATA2
call I2C_ACK_master_to_slave
call I2C_read
movwf DATA3 ; les 8 bits lus sont transférés dans le registre d'usage général DATA
call I2C_ACK_master_to_slave
call I2C_read
movwf DATA4 ; les 8 bits lus sont transférés dans le registre d'usage général DATA4
call I2C_ACK_master_to_slave
call I2C_read
movwf DATA5 ; les 8 bits lus sont transférés dans le registre d'usage général DATA5
call I2C_ACK_master_to_slave
call I2C_read
movwf DATA6 ; les 8 bits lus sont transférés dans le registre d'usage général DATA6
call I2C_NOACK
call I2C_stop
I2C_idle
bsf STATUS , RP0 ; passage en banque 1
bcf STATUS , RP1 ; passage en banque 1
I2C_idle0
btfsc SSPCON2 , ACKEN
goto I2C_idle0 ; le bit ACKEN n'est pas nul
btfsc SSPCON2 , RCEN
goto I2C_idle0 ; le bit RCEN n'est pas nul
btfsc SSPCON2 , PEN
goto I2C_idle0 ; le bit PEN n'est pas nul
btfsc SSPCON2 , RSEN
goto I2C_idle0 ; le bit RSEN n'est pas nul
btfsc SSPCON2 , SEN
goto I2C_idle0 ; le bit SEN n'est pas nul
btfsc SSPSTAT , R_W
goto I2C_idle0 ; le bit R_W n'est pas nul
bcf STATUS , RP0 ; passage en banque 0
bcf STATUS , RP1 ; passage en banque 0
return
I2C_start
call I2C_idle ; on attend que le bus I2C soit libre
bsf STATUS , RP0 ; passage en banque 1
bcf STATUS , RP1 ; passage en banque 1
bsf SSPCON2 , SEN ; SEN = 1 (lancement d'une opération Start)
bcf STATUS , RP0 ; passage en banque 0
bcf STATUS , RP1 ; passage en banque 0
return
I2C_read
call I2C_idle ; on attend que le bus I2C soit prêt
bsf STATUS , RP0 ; passage en banque 1
bcf STATUS , RP1 ; passage en banque 1
bsf SSPCON2 , RCEN ; on lance la réception
I2C_read0
btfsc SSPCON2 , RCEN
goto I2C_read0 ; on attend la fin de la réception
bcf STATUS , RP0 ; passage en banque 0
bcf STATUS , RP1 ; passage en banque 0
movf SSPBUF ,0
return
I2C_stop
call I2C_idle ; on attend que le bus I2C soit prêt
bsf STATUS , RP0 ; passage en banque 1
bcf STATUS , RP1 ; passage en banque 1
bsf SSPCON2 , PEN ; PEN = 1 (lancement d'une opération Stop)
bcf STATUS , RP0 ; passage en banque 0
bcf STATUS , RP1 ; passage en banque 0
return
I2C_write
call I2C_idle ; on attend que le bus I2C soit prêt
movwf SSPBUF
call I2C_ACK_slave_to_master
return
I2C_Repeated_Start
call I2C_idle ; on attend que le bus I2C soit prêt
bsf STATUS , RP0 ; passage en banque 1
bcf STATUS , RP1 ; passage en banque 1
bsf SSPCON2 , RSEN ; RSEN = 1 (lancement d'une opération Repeated Start)
bcf STATUS , RP0 ; passage en banque 0
bcf STATUS , RP1 ; passage en banque 0
return
I2C_ACK_slave_to_master
call I2C_idle ; on attend que le bus I2C soit prêt
bsf STATUS , RP0 ; passage en banque 1
bcf STATUS , RP1 ; passage en banque 1
I2C_ACK_slave_to_master0
btfsc SSPCON2 , ACKSTAT
goto I2C_ACK_slave_to_master0 ; on attend la réception du bit ACK
bcf STATUS , RP0 ; passage en banque 0
bcf STATUS , RP1 ; passage en banque 0
return
I2C_NOACK
call I2C_idle ; on attend que le bus I2C soit prêt
bsf STATUS , RP0 ; passage en banque 1
bcf STATUS , RP1 ; passage en banque 1
bsf SSPCON2 , ACKDT ; ACKDT = 1
bsf SSPCON2 , ACKEN ; ACKEN = 1 (lancement d'une opération Acknowledge)
bcf STATUS , RP0 ; passage en banque 0
bcf STATUS , RP1 ; passage en banque 0
return
I2C_ACK_master_to_slave
call I2C_idle ; on attend que le bus I2C soit prêt
bsf STATUS , RP0 ; passage en banque 1
bcf STATUS , RP1 ; passage en banque 1
bcf SSPCON2 , ACKDT ; ACKDT = 0
bsf SSPCON2 , ACKEN ; ACKEN = 1 (lancement d'une opération Acknowledge)
bcf STATUS , RP0 ; passage en banque 0
bcf STATUS , RP1 ; passage en banque 0
return
END
برنامج فيما يخص الحوار مع ds1307 لكن الصعوبة الوحيدة في التعامل مع القيم التي يعطيها ds1307 فهي bcd لو استطعت التعامل معها يكون احسن فيما يخص البرنامج ان لم تفهم اي جزء فقل لي دالك لكي اشرحه . هذا ايمايلي faid_59*hotmail.com
لو تريد البرنامج بي سي اعمله لك
هذا والله اعلم