Bienvenue aux nouveaux arrivants sur FantasPic !

- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.

--- L’équipe FantasPic ---
Forum général en BASIC et PASCAL !

Modérateur : Gérard

Communication entre deux PICs en I²C
Serge
Amateur
Amateur
Messages : 163
Enregistré en : septembre 2018

#1 Message par Serge » jeu. 13 sept. 2018 11:29

Bonjour.

J'utilise MICROCODE Studio (PicBasic)

Je débute et ne connais presque rien, je n'ai aucune formation dans le domaine.

Je m'amuse et me passionne pour les PIC.

Je voudrais faire communiquer deux (ou trois) pic 18F2520 par l'I2c (RC3/RC4) SCL SDA prévus sur le PIC.

Je veux pouvoir communiquer entre les deux pic avec une distance de 30m environ, sur un câble ordinaire.
Pour ce faire je voudrais augmenter la tension de communication à 24V et un courant d'environ 10mA afin de ne pas être trop perturbé par les éventuels parasites.
Je me pose les questions suivantes avant d'approfondir:
est-ce utopique ?
est-ce réalisable ?
L'adresse des pic se configure comment ? Simple variable ?...
si quelqu'un à du temps à perdre et connais bien le domaine, merci de me répondre.

Communication entre deux PICs en I²C
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#2 Message par Jérémy » jeu. 13 sept. 2018 11:53

 ! Message de modération :
Bonjour Serge et bienvenue à toi,

J'ai déplacé ton message et trouvé un titre. Tu peux le changer au besoin et éditant ton message !
Le lien vers la DS de ton PIC est certainement utile : procédure


Si tu débutes et que tu connais presque rien, comme tu l'as dit , cela va être compliqué..... il faut d'abord faire clignoter une led puis mettre un bouton poussoir etc ....

Sinon pour 30métres de fils tu vas avoir du mal avec l'I²C à mon avis . le RS-232 ou RS-485 me parait plus judicieux, mais attendons l'avis de personnes plus expérimentée.
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Communication entre deux PICs en I²C
pspic
Passioné
Passioné
Messages : 357
Âge : 77
Enregistré en : septembre 2017
Localisation : 68

#3 Message par pspic » jeu. 13 sept. 2018 13:16

Bonjour,
Pour 30 m tu peux utiliser la solution sans fil avec une liaison série.
En utilisant deux modules HC12 : https://www.ebay.fr/itm/433Mhz-HC-12-SI ... SwxsRbc-uQ
Ce module est relié en TTL avec le PIC.
Exemple avec 4 PICs qui sont interrogés par un PC.
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.

Communication entre deux PICs en I²C
Gérard
Avatar de l’utilisateur
Expert
Expert
Messages : 1640
Âge : 65
Enregistré en : septembre 2015
Localisation : Alsace - Haut-Rhin

#4 Message par Gérard » jeu. 13 sept. 2018 15:20

Bonjour et bienvenu Serge,
Je suis aussi de cet avis, avant de faire des choses compliquées, il faut commencer par les bases.
Je pense aussi que 30m en I2C n'est pas possible. La solution proposée par pspic me semble bien adaptée, maintenant si tu souhaites rester en filaire, une liaison en RS485 ou en boucle de courant est adaptée à ta distance.

Content de trouver quelqu'un qui fait du Basic.
Le 18/04/19 je suis devenu papy de jumeaux, le 01/09/23 une petite cousine des jumeaux est née.

Communication entre deux PICs en I²C
Serge
Amateur
Amateur
Messages : 163
Enregistré en : septembre 2018

#5 Message par Serge » lun. 17 sept. 2018 11:47

Bonjour, et merci pour vos réponses.

EN fait, quand on ne maitrise pas complètement un domaine, je préfére dire que je n'y connais rien.
Mais je bricole un peu les PIC.
J'ai réalisé trois cartes équipées de PIC 18F2520 pour avoir un maximum de portes entrées/Sorties dans un minimum de place.
Ces trois cartes doivent communiquer entre-elles car les entrées de l'une interfèrent sur les deux autres et vice et versa.

Je veux utiliser le module MSSP du pic, et ne veux pas utiliser les fonctions Basique de MicroStudio qui paraissent plus lentes, et ne me permettent pas de maitriser au mieux ce qui se passe.

Le module EUSART ne convient pas, car ma liaison à besoin de se faire sur plus de 2 cartes.

L'i2c me parait mieux adapté.
J'ai ajouté le module PCA9600 sur le circuit afin de communiquer avec des courants plus forts (12V et 20mA)
J'arrive à émettre des signaux très propres sur un câble ordinaire de 20m (4x2,5mm²).
Mon problème ne se situe pas sur le hard que j'arrive à maitriser, mais sur les commandes de configuration des PIC.

Une led clignote par interruption(TMR0) toutes les secondes, afin de vérifier que le PIC tourne correctement, et ne reste pas planté sur une commande.
J'ai essayé de comprendre cette configue, mais manifestement, ma compréhension n'est pas bonne.
Voici ce que j'ai écris pour configurer mon PIC:

Code : Tout sélectionner

' Module I2c

TXSTA.7 = 1 '
CSRC Mode maitre avec horloge interne attribuée par BRG
TXSTA.6 
= 0 'TX9 Transmission sur 8bits ou si =1 sur 9bits
TXSTA.5 = 1 '
TXEN Transmission "Enable" SCREN ou CREN ignorent TXEN en mode synchro
TXSTA.4 
= 1 'SYNC Transmission Synchrone'i2c ou asynchrone =0 UART ou SPI
TXSTA.3 
= 0 'SENDB sans importance en mode synchrone (caractère BREAK pour l'assynchrone)
TXSTA.2 = 0 'BRGH Haute vitesse pour le Baud (400KHz au lieu de 100KHz) Incompatible sur plusieurs capteurs
TXSTA.1 = 1 '
TRMT Registre de transmission vide si =0=plein
TXSTA.0 
= 0 'TX9D 9ème bit de transmission peut être data ou parité ...

RCSTA.7 = 0 '
SPEN 1= Sérial port Enabled (configure RX/DT et TX/CK en port série
RCSTA.6 
= 0 'RX9 1= Réception sur 9 bits
RCSTA.5 = 1 '
SREN Mode MAITRE Synchrone: 1= Enable réception simple (Bit effacé après réception complète)
RCSTA.4 = 0 'CREN 1=Enabled Réception continue (CREN Ignore SREN)
RCSTA.3 = 0 '
ADDEN Adresse détect 9ème bit 1=Enabled interruption 0=9ème bit pour parité...
RCSTA.2 = 0 'FERR 1=Framing error (can be cleared by reading RCREG register and receiving next valid byte)
RCSTA.1 = 0 '
OERR 1=Overrun error (can be cleared by clearing bit, CREN)
RCSTA.0 = 0 'RX9D 9ème bit d'adresse ou de parité à calculer par soft

'ADRESSE ' en Esclave mettre l'adresse de la carte dans SSPADD
SSPADD = $27 '
 en Maitre $27=100kHz $0C=308kHz $09=400kHz @ 8 MHz 'si Maitre, ce registre contient la vitesse du réseau et si Esclave, contient l'adresse de l'esclave
SSPSTAT.7 = 1 '
 SMP: Controle de la vitesse du bus: 1=vitesse standard 100 Khz 0=vitesse haute 400 Khz
SSPSTAT.6 
= 0 ' CKE: SMBus Select 1=enable SMBus 0=desable SMBus
SSPSTAT.5 = 0 '
 D/A: Data/Address en mode Maitre: (réservé). en esclave: 1=dernier byte reçu ou transmis est des DATA si non 0= Adresse
SSPSTAT.4 
= 0 ' P: Stop bit si=1 StB à été détecté si=0 n'as pas été détecté
SSPSTAT.3 
= 0 ' S: Start bit(1) si=1 StB à été détecté si=0 n'as pas été détecté
SSPSTAT.2 
= 0 ' R/W: Read/Write Information bit (I2C mode only) en mode Esclave 1=Read 0=Write en mode Maitre 1= Transmission en cours 0= pas de transmission en cours
SSPSTAT.1 = 0 '
 UA: Update Address bit (10-Bit Slave mode only) 1=Indique que l'utilisateur doit mettre à jour l'adresse dans le registre de SSPADD' 0=L'adresse ne doit pas être mise à jour
SSPSTAT.0 
= 0 ' 0=BF: Buffer Full Status bit en mode Transmission 1= SSPBUF est plein 0=Vide'en mode Réception 1= SSPBUF est plein (sans inclure l'ACK et le StB) 0=vide

'
Config I2c
SSPCON1.7 
= 0 'WCOL Maitre: 1= Ecriture dans SSPBUF en transmission non valide (erreur) effacer le bit par soft
                 '
 Esclave: 1= le registre SSPBUF est écrit en transmission non finie (erreur) effacer le bit par soft
SSPCON1.6 
= 0 'SSPOV Réception: 1= SSPBUF contient toujours un octet tandis qu'il en reçois un autre. (erreur) effacer le bit par soft
                
' Transmission: 1= Sans importance.
SSPCON1.5 = 1 '
SSPEN 1= I2c Enable et configure les pins SDA et SCL
SSPCON1.4 
= 0 'CKP Esclave: 1= Horloge de sortie 0= temps bas utilisé pour monter les données
                  '
 Maitre: 1= Non utilisé
SSPCON1.3 
= 1 'SSPM 1111 = I2C Slave mode, 10-bit address with Start and Stop bit interrupts enabled
              '
1110 = I2C Slave mode, 7-bit address with Start and Stop bit interrupts enabled
SSPCON1.2 
= 0 '1011 = I2C Firmware Controlled Master mode (Slave Idle)
SSPCON1.1 = 0 '
1000 = I2C Master mode, clock = FOSC/(* (SSPADD + 1))
SSPCON1.0 = 0 '0111 = I2C Slave mode, 10-bit address
              '
0110 = I2C Slave mode, 7-bit address
              
'Bit combinations not specifically listed here are either reserved or implemented in SPI mode only.

'
Gestion I2c
SSPCON2.7 
= 0 'GCEN en mode Esclave seulement si =1 Enable Interruption si appel général à l'adresse(0000h) réception dans le SSPSR si=0 Desable l'appel générale
SSPCON2.6 = 0 '
ACKSTAT Transmission Maitre seulement 1= pas d'acknowledge reçu de l'esclave 0= acknowledge reçu
SSPCON2.5 
= 0 'ACKDT En Réception Maitre seulement 1= Pas d'acknowledge 0= acknowledge
SSPCON2.4 
= 0 'ACKEN En Réception Maitre seulement 1= acknowledge sur SDA et SCL et transmission ACKDT Automatiquement (clear Hardwaire) 0= bus inocupé
SSPCON2.3 = 0 '
RCEN Mode Maitre seulement 1= Enable mode réception I2c
SSPCON2.2 
= 0 'PEN Mode Maitre seulement 1= Condition STOP sur SDA et SCL 0= libre (clear hardwaire)
SSPCON2.1 = 0 '
RSEN Mode Maitre seulement 1= Condition Repeated START sur SDA et SCL 0= libre (clear hardwaire)
SSPCON2.0 = 0 'SEN Maitre: 1= Condition START sur SDA et SCL Esclave: 1= maintient l'horloge tant que l'esclave transmet
Modifié en dernier par Serge le mar. 18 sept. 2018 11:44, modifié 4 fois.

Communication entre deux PICs en I²C
Serge
Amateur
Amateur
Messages : 163
Enregistré en : septembre 2018

#6 Message par Serge » lun. 17 sept. 2018 16:22

J'ai également configuré pour la partie "Maitre":

Code : Tout sélectionner

        OSCCON=%01110010  

        TRISA=%00000011       
        TRISB=%11111111        
        TRISC=%11111000        '
3 et 4 en entrée c'est le MSSP qui gère

        INTCON=%11110000       ' 
7=Interruptions 6=Interruptions Périphériques 5=Compteur_0 4=Int_B0 3=Int_B4-7 2-1-0=Flag_Bit (Drapeaux)
        
INTCON2=%11100000                                                                                                                                                                                                   
       
'''' 'INTCON3=%10001000
   
        PIE1.7=0      '
PSPIE  1=Enable Interruption Port Parallèle Lecture/Ecriture 
        PIE1.6
=0      'ADIE   1=Enable A/D Convertisseur  
        PIE1.5=0      '
RCIE   1=Enable EUSART Interruption Receive 
        PIE1.4
=0      'TXIE   1=Enable EUSART Interruption Transmit 
        PIE1.3=1      '
SSPIE  1=Enabled Interruption Port Série synchrone Maitre
        PIE1.2
=0      'CCP1IE 1=Enabled Interruption CCP1 Comparateur 
        PIE1.1=0      '
TMR2IE 1=Enabled Interruption TMR2 vers PR2 
        PIE1.0
=0      'TMR1IE 1=Enabled Interruption TMR1 Overflow
      
        IPR1.7=0    '
PSPIP Interruption Prioritaire port Parallèle
        IPR1.6
=0    'ADIP Interruption Prioritaire A/D Convertisseur
        IPR1.5=0    '
RCIP Interruption Prioritaire EUSART Réception
        IPR1.4
=0    'TXIP Interruption Prioritaire EUSART Transmission
        IPR1.3=0    '
SSPIP Interruption Prioritaire Port série Maître
        IPR1.2
=0    'CCP1IP Interruption Prioritaire Comparateur CCP1
        IPR1.1=0    '
TMR2IP Interruption Prioritaire TMR2 vers PR2 Match
        IPR1.0
=0    'TMR1IP Interruption Prioritaire TMR1 Overflow
     
        '''''
IPR2=%00000000
      
        PIR1.7
=0    'PSPIF 1=Flag interrupt à lecture ou écriture  port Parallèle
        PIR1.6=0    '
ADIF 1=Flag Interrupt A/D conversion complete
        PIR1.5
=0    'RCIF 1=Flag EUSART Réception buffer
        PIR1.4=0    '
TXIF 1=Flag EUSART Transmission TXREG est Vide
        PIR1.3
=0    'SSPIF 1=Flag Synchrone Transmission/Réception complète (effacer par soft)
        PIR1.2=0    '
CCP1IF 1=Flag de capture sur TMR1   (effacer par soft)   ou Comparaison effectuée avec TMR1
        PIR1.1
=0    'TMR2IF 1=Flag de TMR2 dans PR2  (effacer par soft)
        PIR1.0=0    '
TMR1IF 1=Flag du registre de TMR1 Overflow
        
        Sort1 
var PORTC.2
        Sort2 
var PORTC.1
        Sort3 
var PORTC.0
        Sort4 
var PORTA.6
        Sort5 
var PORTA.5
        Sort6 
var PORTA.4
        Sort7 
var PORTA.3
        Sort8 
var PORTA.2
        LED 
var PORTA.7
        SCL 
var PORTC.3
        SDA 
var PORTC.4

        Cli 
var bit
        Bip 
var bit

       On Interrupt 
Goto Int

Programme
:

           
led=cli
           
goto Programme

I2CSTART
:
           
SSPCON2.0 SEN Start Condition Enable Bit
           
WHILE SSPCON2.0 WEND Wait for Start to complete
           sort2
=1
           
RETURN
;-----------------------------------------------------------
I2CWR:
          
SSPBUF I2CDATA Move data to SSPBUF
          
WHILE SSPSTAT.2 WEND SSPSTAT 1 Transmit in progress
          sort3
=1
          
While SSPCON2.6 WEND Wait for Acknowledge from slave 1=NotAck
          sort4
=1
          
RETURN

;-----------------------------------------------------------
I2CSTOP:
         
SSPCON2.2 PEN send stop bit
         
While SSPCON2.2 Wend Wait for SSP to complete
         sort5
=1
         
Return

'''''''Interruptions
     disable   
     Int:
     if intcon.2=1 then   '
interruption tempo    TMR0
        intcon.2
=0
        t0
=t0+1
        t1
=t1+1

        select 
case t0
            
case 1
                bip
=1
                cli
=1
            
case 32
                bip
=0
            
case 64
                bip
=1
                cli
=0
            
case 96
                bip
=0
            
case 128
                t0
=0
                t2
=t2+1
        end select

    
endif
    
    if 
PIR1.3 then    'Flag de l'I2c
        sort8
=1    'pour voir si l'interruption à bien eu lieu (pour développement)
        
PIR1.3=0
    
endif

    if 
intcon.1=1  then    'interruption RB0  entrée 9
        sort8=1 
        gosub I2CSTART
        gosub I2CWR   
        gosub I2CSTOP

        intcon.1=0  '
RAZ de l'interruption B0'
    
endif
        
    
resume
    enable          
    End
Modifié en dernier par Serge le mar. 18 sept. 2018 11:47, modifié 1 fois.

Communication entre deux PICs en I²C
Serge
Amateur
Amateur
Messages : 163
Enregistré en : septembre 2018

#7 Message par Serge » lun. 17 sept. 2018 20:02

Et voici la partie Esclave:

Code : Tout sélectionner

OSCCON=%01110010

TRISA
=%00000011 '1= entrée
TRISB=%11111111 '
sortie
TRISC
=%11111000 '

INTCON=%11110000 ' 
7=Interruptions 6=Interruptions Périphériques 5=Compteur_0 4=Int_B0 3=Int_B4-7 2-1-0=Flag_Bit (Drapeaux)
INTCON2=%11000000 ' 7=PullUp du port B (Desabled=1) 6=B0_Montant 5=B1_Montant 4=B2_Montant 3=0 2=TMR0_Haute_Priorité 1=0
'
INTCON3=%10001000 ' 7=Int2_Haute_Priorité 6=Int1_Haute_Priorité 5=0 4=B2_Interruption_Enabled 3=B1_Interruption_Enabled 2=0

PIE1.7=0 '
PSPIE 1=Enable Interruption Port Parallèle Lecture/Ecriture
PIE1.6
='ADIE 1=Enable A/D Convertisseur
PIE1.5=0 '
RCIE 1=Enable EUSART Interruption Receive
PIE1.4
='TXIE 1=Enable EUSART Interruption Transmit
PIE1.3=1 '
SSPIE 1=Enabled Interruption Port Série synchrone Maitre
PIE1.2
='CCP1IE 1=Enabled Interruption CCP1 Comparateur
PIE1.1=0 '
TMR2IE 1=Enabled Interruption TMR2 vers PR2
PIE1.0
='TMR1IE 1=Enabled Interruption TMR1 Overflow

'
PIE2=%00000000 ' 7=Interruption Fail Oscillateur 6=Interruption Comparateur Enabled 5=0 4=Interruption Data Flash/EEprom Write Enabled
2=Interruption défaut tension Enabled 1=Interruption Overflow TMR3 Enabled 0=Interruption Comparateur2 CCP2 Enabled

IPR1.7
='PSPIP Interruption Prioritaire port Parallèle
IPR1.6=0 '
ADIP Interruption Prioritaire A/D Convertisseur
IPR1.5
='RCIP Interruption Prioritaire EUSART Réception
IPR1.4=0 '
TXIP Interruption Prioritaire EUSART Transmission
IPR1.3
='SSPIP Interruption Prioritaire Port série Maître
IPR1.2=0 '
CCP1IP Interruption Prioritaire Comparateur CCP1
IPR1.1
='TMR2IP Interruption Prioritaire TMR2 vers PR2 Match
IPR1.0=0 '
TMR1IP Interruption Prioritaire TMR1 Overflow

'IPR2=%00000000

PIR1.7=0 '
PSPIF 1=Flag interrupt à lecture ou écriture
PIR1.6
='ADIF 1=Flag Interrupt A/D conversion complete
PIR1.5=0 '
RCIF 1=Flag EUSART Réception buffer
PIR1.4
='TXIF 1=Flag EUSART Transmission TXREG est Vide
PIR1.3=0 '
SSPIF 1=Flag Synchrone Transmission/Réception complète (effacer par soft)
PIR1.2='CCP1IF 1=Flag de capture sur TMR1 (effacer par soft) ou Comparaison effectuée avec TMR1
PIR1.1=0 '
TMR2IF 1=Flag de TMR2 dans PR2 (effacer par soft)
PIR1.0='TMR1IF 1=Flag du registre de TMR1 Overflow

'
PIE2=%00000000

'ADCON0 = %11000001 ' Configure+ and turn on A/D Module
ADCON1
=%00001101 'bit 4 et 5 référence tension + et - et config portA 0 et 1
ADCON2=%00100100 ' 
bit 7à0 Justifie à gauche le résultat dans ADRH ou ADRL ensuite 8 TAD et Fosc/' a confirmer selon mesures réalisées
T0CON=%11000101

Module I2c


TXSTA.7 
'CSRC 1= Mode maitre avec horloge interne attribuée par BRG 0=Esclave (adresse dans SSPADD)
TXSTA.6 = 0 '
TX9 Transmission sur 8bits ou si =1 sur 9bits
TXSTA.5 
'TXEN Transmission "Enable" SCREN ou CREN ignorent TXEN en mode synchro
TXSTA.4 = 1 '
SYNC Transmission Synchrone'i2c ou asynchrone =0 UART ou SPI
TXSTA.3 = 0 '
SENDB sans importance en mode synchrone (caractère BREAK pour l'assynchrone)
TXSTA.2 = 0 '
BRGH Haute vitesse pour le Baud (400KHz au lieu de 100KHzIncompatible sur plusieurs capteurs
TXSTA.1 
'TRMT Registre de transmission vide si =0=plein
TXSTA.0 = 0 '
TX9D 9ème bit de transmission peut être data ou parité ...

RCSTA.7 'SPEN 1= Sérial port Enabled (configure RX/DT et TX/CK en port série
RCSTA.6 = 0 '
RX9 1Réception sur 9 bits
RCSTA.5 
'SREN Mode MAITRE Synchrone: 1= Enable réception simple (Bit effacé après réception complète)
RCSTA.4 = 0 '
CREN 1=Enabled Réception continue (CREN Ignore SREN)
RCSTA.3 'ADDEN Adresse détect 9ème bit 1=Enabled interruption 0=9ème bit pour parité...
RCSTA.2 = 0 '
FERR 1=Framing error (can be cleared by reading RCREG register and receiving next valid byte)
RCSTA.1 'OERR 1=Overrun error (can be cleared by clearing bit, CREN)
RCSTA.0 = 0 '
RX9D 9ème bit d'adresse ou de parité à calculer par soft

'
ADRESSE ' en Esclave mettre l'adresse de la carte dans SSPADD
SSPADD 
61 'en Maitre $27=100kHz $0C=308kHz $09=400kHz @ 8 MHz 'si Maitrece registre contient la vitesse du réseau et si Esclavecontient l'adresse de l'esclave

SSPSTAT.7 
' SMP: Controle de la vitesse du bus: 1=vitesse standard 100 Khz 0=vitesse haute 400 Khz
SSPSTAT.6 = 0 ' 
CKESMBus Select 1=enable SMBus 2=desable SMBus
SSPSTAT.5 
' D/A: Data/Address en mode Maitre (réservé) en esclave, 1=dernier byte reçu ou transmis est des DATA si non 0= Adresse
SSPSTAT.4 = 0 ' 
PStop bit si=1 StB à été détecté si=0 n'as pas été détecté
SSPSTAT.3 = 0 ' 
SStart bit(1si=1 StB à été détecté si=0 n'as pas été détecté
SSPSTAT.2 = 0 ' 
R/WRead/Write Information bit (I2C mode onlyen mode Esclave 1=Read 0=Write en mode Maitre 1Transmission en cours 0pas de transmission en cours
SSPSTAT.1 
' UA: Update Address bit (10-Bit Slave mode only) 1=Indique que l'utilisateur doit mettre à jour l'adresse dans le registre de SSPADD 0=' L'adresse ne doit pas être mise à jour
SSPSTAT.0 = 0 ' 
0=BFBuffer Full Status bit en mode Transmission 1SSPBUF est plein 0=Vide
              
'en mode Réception 1= SSPBUF est plein (sans inclure l'ACK et le StB0=vide
SSPCON1.7 
'WCOL Maitre: 1= Ecriture dans SSPBUF en transmission non valide (erreur) effacer le bit par soft
                 ' 
Esclave1le registre SSPBUF est écrit en transmission non finie (erreureffacer le bit par soft
SSPCON1.6 
'SSPOV Réception: 1= SSPBUF contient toujours un octet tandis qu'il en reçois un autre. (erreureffacer le bit par soft
                
' Transmission: 1= Sans importance.
SSPCON1.5 = 1 '
SSPEN 1I2c Enable et configure les pins SDA et SCL
SSPCON1.4 
'CKP Esclave: 1= Horloge de sortie 0= temps bas utilisé pour monter les données
                  ' 
Maitre1Non utilisé
SSPCON1.3 
'SSPM 1111 = I2C Slave mode, 10-bit address with Start and Stop bit interrupts enabled
                   '
1110 I2C Slave mode7-bit address with Start and Stop bit interrupts enabled
SSPCON1.2 
1      '1011 = I2C Firmware Controlled Master mode (Slave Idle)
SSPCON1.1 = 1      '
1000 I2C Master modeclock FOSC/(* (SSPADD 1))
SSPCON1.0 0      '0111 = I2C Slave mode, 10-bit address
                   '
0110 I2C Slave mode7-bit address
                   
'Bit combinations not specifically listed here are either reserved or implemented in SPI mode only.




SSPCON2.7 = 0 '
GCEN en mode Esclave seulement si =1 Enable Interruption si appel général à l'adresse(0000h) réception dans le SSPSR si=0 Desable l'appel générale
SSPCON2.6 
'ACKSTAT Transmission Maitre seulement 1= pas d'acknowledge reçu de l'esclave 0= acknowledge reçu
SSPCON2.5 = 0 '
ACKDT En Réception Maitre seulement 1Pas d'acknowledge 0= acknowledge
SSPCON2.4 = 0 '
ACKEN En Réception Maitre seulement 1acknowledge sur SDA et SCL et transmission ACKDT Automatiquement (clear Hardwaire0bus inocupé
SSPCON2.3 
'RCEN Mode Maitre seulement 1= Enable mode réception I2c
SSPCON2.2 = 0 '
PEN Mode Maitre seulement 1Condition STOP sur SDA et SCL 0libre (clear hardwaire)
SSPCON2.1 'RSEN Mode Maitre seulement 1= Condition Repeated START sur SDA et SCL 0= libre (clear hardwaire)
SSPCON2.0 = 0 '
SEN Maitre1Condition START sur SDA et SCL Esclave1maintient l'horloge tant que l'esclave transmet

On Interrupt 
Goto Int


Programme
:
led=cli
return


I2CSTART:
SSPCON2.0 SEN Start Condition Enable Bit
WHILE SSPCON2.0 WEND Wait for Start to complete
RETURN
;-----------------------------------------------------------
I2CRD:
SSPCON2.3 RCEN Enable receive mode
WHILE SSPCON2.3 WEND Wait for Read to complete
I2CDATA 
SSPBUF
Return
;-----------------------------------------------------------
I2CWR:
SSPBUF I2CDATA Move data to SSPBUF
WHILE SSPSTAT.2 WEND SSPSTAT 1 Transmit in progress
While SSPCON2.6 WEND Wait for Acknowledge from slave 1=NotAck
RETURN ; Acknowledge recieved
Return
;-----------------------------------------------------------
I2CSTOP:
SSPCON2.2 PEN send stop bit
While SSPCON2.2 Wend Wait for SSP to complete
Return
;-----------------------------------------------------------
I2CACK:
SSPCON2.5 ACKDT Set Ack bit to Ack
SSPCON2.4 
ACKEN send ACKDT bit
While SSPCON2.4 Wend Wait for SSP to complete
Return


disable
Int
:

if 
intcon.2=1 then 'interruption tempo TMR0
intcon.2=0
t0=t0+1
t1=t1+1


select case t0
case 1
bip=1
cli=1
case 32
bip=0
case 64
bip=1
cli=0
case 96
bip=0
case 128
t0=0
t2=t2+1
end select

endif

if PIR1.3 then '
Flag de l'I2C
sort8=1
gosub I2CACK
PIR1.3=0
endif


resume
enable
End
Modifié en dernier par Serge le mar. 18 sept. 2018 11:54, modifié 1 fois.

Communication entre deux PICs en I²C
Serge
Amateur
Amateur
Messages : 163
Enregistré en : septembre 2018

#8 Message par Serge » lun. 17 sept. 2018 20:03

Merci Jérémy.

En fait les communications se font entre 2 à 10 pic.

C'est la raison de mon choix pour l'I2C

Communication entre deux PICs en I²C
Serge
Amateur
Amateur
Messages : 163
Enregistré en : septembre 2018

#9 Message par Serge » lun. 17 sept. 2018 20:18


Communication entre deux PICs en I²C
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#10 Message par Jérémy » mar. 18 sept. 2018 07:15

 ! Message de modération :
Bonjour Serge,

Merci de bien vouloir mettre ton code entre les balise [code ] prévues à cet effet en, suivant cette procédure : viewtopic.php?p=1020#p1020

Pareil pour la DS de ton PIC : Procédure

Merci à toi


Pour ton soucis l'I²C me parait tout indiqué , mais par contre l'utilisation entre plusieurs PICS est déjà bien plus compliqué ! J'ai essayé il y a quelques temps mais j’ai laissé tombé !! J'y reviendrais un jour , mais je vais suivre ton post car cela m’intéresse .
C'est en faisant des erreurs, que l'on apprend le mieux !!!


Retourner vers « Langage BASIC & PASCAL »

Qui est en ligne

Utilisateurs parcourant ce forum : Bing [Bot] et 24 invités